Original project
Meu Chat Pessoal

Artificial intelligencein your ownworkspace.

A desktop app to chat with AI models, with projects and history on your computer.

AI chat through an API, with projects and history on the computer.

Desktop appAI via APIPersonal

  • Tauri 2
  • React 19
  • Rust
  • TypeScript
Original project
Meu Chat Pessoal

Artificial intelligencein your ownworkspace.

A desktop app to chat with AI models, with projects and history on your computer.

  • Tauri 2
  • React 19
  • Rust
  • TypeScript

AI chat through an API, with projects and history on the computer.

Desktop appAI via APIPersonal

  • Tauri 2
  • React 19
  • Rust
  • TypeScript

PortfolioMeu Chat Pessoal

The conversation

The reply arrives in pieces.

The reply shows up while it's being written, and the Stop button cuts it in the middle, without waiting for the end. Pick the reasoning effort and ask a question; then switch on the full queue and watch the program wait and try again.

Reasoning effort

Simulate failure

Meu Chat Pessoal · Conversation

  1. Pick a question down below.

The rules are the program's (provedor/conversar.rs): the reply arrives as a stream; a queue 429 and errors 500, 502, 503 and 504 get up to three new attempts, with 1, 2 and 4 second waits; a quota 429 is shown right away. The replies here are written for the demo.

The cost first

What it will cost, before you send.

Before each send the program estimates how many tokens the conversation will use. Then the service reports the real number, and the estimate learns from the error. Tick what goes along and send a few times.

What goes along

Service

The estimate

4,472Estimated

0.4% of 1M · factor 1.00×

 

The factor learning

The math is the program's: characters ÷ 4.2 and each image up to 1,024 tokens; the factor stays between 0.5× and 4×, one per service (lib.rs, calibrar_tokens). How far each service is from the estimate here is an example.

Project scene: three windows of the program connected to a folder, with the history, the working folder and the settings

A space for every project. Conversations under your control.

Per-project settings, models through an API and a local history.

02 / WorkflowEverything stays on your computer.

For the model to understand a project, the program joins the folder into a single text. What is generated, heavy or secret stays out; what looks like a copy becomes a suggestion, and you decide. Change the choices and pack.

📁 my-project
  • ▸ .git640 files · 0 tokGenerated · always out
  • ▸ assets31 files · 0 tokNot text · out
  • ▸ old-backup39 files · 58,200 tok
  • chave.pem1 files · 600 tokKey · blocked
  • ▸ dist23 files · 310,400 tokGenerated · always out
  • ▸ docs6 files · 9,400 tok
  • ▸ node_modules12,480 files · 4,102,000 tokGenerated · always out
  • package-lock.json1 files · 98,300 tokGenerated · always out
  • package.json1 files · 420 tok
  • README.md1 files · 1,900 tok
  • ▸ src42 files · 61,300 tok
  • ▸ src-tauri18 files · 27,900 tok

61files

89,620tokens

The pack, in alphabetical order

# my-project
There are 61 files. The tree comes first and then the content of each one.

=== package.json ===
=== src ===
=== src-tauri ===

Remembered in the folder

.meuchat.json
{
 "excluir": [
  "old-backup"
 ],
 "semDocumentacao": true
}

The lists are the program's (projeto/varredura.rs): generated folders such as node_modules, dist and .git, images, archives and package lock files always go out; keys and certificates are blocked with no option; files above 400 KB stay out too. The alphabetical order exists because the service's cache only hits when the start of the text repeats.

Before writing

Every change is checked first.

When the model proposes changing a file, the program checks everything before writing: the excerpt must exist exactly once, nobody writes outside the folder and a new file overwrites nothing. Pick a proposal and apply.

src/enviar.ts1 match
export async function enviar(texto: string) {
  if (!texto.trim()) return;
  setCarregando(true);
  const resposta = await mandar(texto);
  setCarregando(false);
  mostrar(resposta);
  setCarregando(false);
  return "Enviado";
}
Git repository

The rules are the program's (edicao/verificar.rs and aplicar.rs): checked again at write time, all or nothing, no hidden backup copy; Git only warns when the write touches files you changed yourself; undo reverts only what the program wrote.

Balance and timing

The clock that saves money.

On DeepSeek, outside peak hours the price drops by half. The clock below is already in your time zone and shows now; drag the hour or switch the day to watch the band change. Beside it, the balance and the spending, always apart.

Peak hours, in your time zone

Off-peakUntil 22hThe service charges half now.

Your time zone: UTC−3.

Balance and spending, apart

BalanceUS$ 9.92

Spent todayUS$ 0.029

Spending this week

US$ 0.021Thu
US$ 0.048Fri
US$ 0.012Sat
US$ 0.094Sun
US$ 0.035Mon
US$ 0.006Tue
US$ 0.029Wed

The real screens

The rules are the program's (pico.ts and custo.rs): peak from 01:00 to 04:00 and from 06:00 to 10:00 UTC, Monday to Friday. Only DeepSeek has a balance address and a price table; for the others, the program shows tokens instead of inventing a value. The spending day is your time zone's. The week's values are an example.

The technologies

What it is made of, piece by piece

A lean desktop program: the screen is React inside Tauri 2, and everything that talks to the internet, reads the project or writes files is done in Rust, on the computer's side. Pick a piece to see what it does here and which file it is in.

10technologies, in 3 layers

Screen

Window and system

Conversation