mindfork mindfork

mindfork 0.22.0 — a platform for a companion

mindfork 0.22.0 is out. It makes a profile something you can keep talking to over weeks: it knows when you last spoke, remembers what you told it from the first message, comes back to you on its own, and answers from your phone. Every part of it is a switch of the profile, off by default: an assistant profile, and a fresh install, work as before.

It knows when, and what you told it

  • The time of messages. With Time of messages on, each of your messages reaches the model with when it was written and how long after the one before — "[Thursday, 22 October 2026, 18:40 · 2d 21h after the previous message]" — so it knows that three days have passed since you said the interview was tomorrow. The rows are worked out when the request is built; nothing is added to your chats, and the prompt cache holds.
  • Your notes, from the first message. Notes in the prompt puts the notes the assistant wrote about you that are close to how a conversation opens into its prompt. Measured on five models: Gemma 4, which never searched its notes on its own, used the fact it needed 13 times in 15 with the block, from once without. A "latest notes" fallback was measured too, and left out: it carried your freshest news into answers about TCP and the planets on every model.
  • Earlier conversations. Earlier conversations in the prompt lists the three before this one, so "let's pick up where we left off" works.
  • /notes shows every note the assistant keeps about you — search it, read where a note came from and what it replaced, edit it, delete it — and which of them this conversation's prompt carries.

It comes back, and tells you

  • Follow-ups. The assistant can plan to come back to something you told it — how the interview went, the reminder you asked for on Friday at 9 — and writes first when the time comes. It plans only on what you said, may decide there is nothing to say and then says nothing; quiet hours (22 to 8) and a cap of three a day are on from the start. Every planned follow-up is on the tasks screen (F7), where Del twice cancels it.
  • Notifications. Notify me tells you when the companion writes while you are not looking: a desktop notification through the terminal (OSC 777 or OSC 9 — Ghostty, WezTerm, kitty, foot, iTerm2, Windows Terminal Preview 1.26 with compatibility.allowOSC777, tmux with allow-passthrough all), the bell, and a push to your phone through ntfy if you give a topic. Only who wrote and where is sent, unless you ask for the words.

An instrument for watching a self

  • The self-model's history. Every change to the self-model is kept with who made it — which model, in which conversation, or a background reflection, or you. H on F3 lists the versions with what each changed; mindfork stats --self-model prints the whole timeline as JSON, from your data or from a backup.
  • Fork a companion. /profile fork copies a profile with its whole memory — notes, knowledge base, self-model and its history — without its chats. Give the fork another model and watch the two selves diverge; the history marks where the fork began.
  • Carry one. mindfork companion export writes one companion into an archive, encrypted if you give a password, and mindfork companion import adds it on another machine as a new profile.

Characters, and a voice

  • Character cards. mindfork import reads the community's cards — .json, .png with the card inside, .charx — into a new profile, shows what will become the system message before it asks, and runs nothing from a card. Example dialogue goes in as examples the character speaks, with the other side a nameless visitor: with your name there, one model of five took the examples for things you had told it. {{char}}, {{user}} and {{random:…}} work in any persona; /greeting moves to a card's next opening.
  • A voice of its own. A profile can have its own voice under each speech provider, and Speak replies reads each reply aloud as it arrives.

From your phone

Messenger bridge makes a profile a Telegram bot of its own while the app runs: make the bot with @BotFather, paste its token, type /bridge pair and open the link on your phone. Your messages get a conversation of their own, answered while the terminal does something else; typing…, then the whole reply; /new and /stop from the phone. A follow-up the companion planned there reaches your phone.

  • Pictures — a photo, an image file, an album — reach the companion with their captions.
  • Voice messages are heard by the speech recognition you pick under Model/server → Recognition: OpenAI (gpt-transcribe), any of OpenRouter's recognisers, or a server of your own such as Whisper on vLLM. Sixteen phone-shaped notes on fifteen recognisers chose that design: every transcription API took a Telegram note as it is, and no single model was best at Russian. The conversation keeps the words, marked as spoken, not the recording, and the model is told it reads a transcript — tried on a real phone in very noisy surroundings, it flagged a word the recogniser had dropped. With Speak replies on, a voice message is answered with one, after the text. Voice notes are read and written by the app itself, in Rust; nothing to install.
  • What a reply from the phone cannot do: run code, write files, edit a project or call an MCP server. Only your account is answered.
  • Who can read it. A chat with a bot is not end-to-end encrypted: Telegram can read it, and a voice message is heard by the recogniser you picked. The settings say so before the switch is on, and the privacy policy has the details.

Your data

No schema step: everything new is a field, a section or a table that an older version skips. Checked with 0.21.0 on a copy of data this version wrote: it reads all of it. The one thing it loses is the two new sections of settings.json — notifications and speech recognition — which it drops when it saves its settings, at start; a profile's companion settings are dropped only if 0.21.0 saves the profiles. Notes and backups do not change.

Four security advisories published after 0.21.0 no longer apply: the bundled root certificates and the certificate verifier refuse the distrusted emSign intermediates, and tokio and ctutils are past two more.

The full list is in the changelog; downloads are on the releases page, and cargo install mindfork builds the same version from crates.io.