mindfork mindfork

mindfork 0.9.8 — give it real work

mindfork 0.9.8 is out. It is a release about work: handing the assistant something real to do — your code project, a side-task big enough to delegate — and being able to watch every bit of it happen.

A code project, attached to a chat

/project attach <directory> gives the open conversation a project. With one attached, the assistant can see the project's structure, read its files with line numbers and search them by regular expression — confined to that directory, honouring .gitignore. It can change files too: an edit replaces an exact fragment, or writes a file whole, and every file's previous content is saved before it is first touched.

That last part is what makes the feature trustworthy. F4 (or /changes) opens a screen listing every file the assistant touched, each shown as a diff against the file as it was before — and r puts one file back the way it was, after asking. A file the assistant created is removed instead. If you would rather approve each change before it happens, the existing "confirm dangerous calls" switch covers project edits as well.

It can also build, run and test — but only through command lines you type: /project build-cmd cargo build, and the same for run-cmd and test-cmd. The assistant runs them exactly as written and can never compose a command of its own, add a flag, or chain a pipeline; a slot you have not filled gives it no such tool at all. A command that outruns its time limit is stopped together with everything it started, and whatever it printed still comes back.

Attaching is the permission: with no project attached, none of these tools even exist, and nothing changes about what the assistant can reach. Reading and editing the project deliberately do not spend the turn's tool-call budget — a fix takes as many steps as it takes.

Subagents grew up

call_subagent used to ask a persona one tool-less question. Now a delegation is a nested turn with the assistant's own tools — the same web, files, Python, project and plugin tools it has in that chat (except creating subagents of its own, reading the folded history and the self-model), over the same attached files, under a persona the assistant composes. A dangerous call inside the run asks you exactly as it would outside.

The transcript became a conversation of its own. Every delegation shows as a row nested under the chat that made it, opens like a chat — read-only — and is searchable everywhere a chat is: the list's content search, the message-level results, even the assistant's opt-in cross-chat tools. It gets a model-written title when it lands, carries a chat:// address you can follow, and old conversations join in: chats recorded before this release get a transcript reconstructed from what each call already stored.

And it is all visible while it runs. The transcript appears in the list the moment the assistant delegates, marked running, its message count growing round by round; open it and the subagent's reply streams word by word, thoughts and tool calls included — and stepping between the transcript and the parent chat no longer cancels the turn. The status bar shows a quiet chip with the subagent's name, the round it is on and the tool it is using. In the same spirit, every tool call's card now appears in the feed the moment the call starts, marked running…, and fills in when the result arrives — so a long build or delegation is visible where it happens.

The chat list keeps transcript rows folded under their chat by default, with a muted ▸ n saying how many it holds — Ctrl+O unfolds them, and the choice is remembered per chat.

Web search, with a key this time

The free search engines throttle automated requests hard — measured, they answer about twice in a row before blocking, and the block lasts far longer than a conversation. A long chain of searches used to fall apart on that.

Settings → Tools → Web search now takes an API key for Tavily — the free tier is 1000 searches a month, no card needed. With a key entered the assistant searches through Tavily first; the free engines stay as the fallback, so entering no key changes nothing. Blocks are also recognised for what they are now: a provider that just refused is told to the assistant as temporarily unavailable rather than as "the web has nothing on this", and it is tried last for a few minutes instead of being retried first on every call — but never dropped. Search results say which service answered.

Also in this release

  • The command is mindfork now. The binary lost the -rs suffix — that stays the project's name. The Linux packages symlink /usr/bin/mindfork, the Windows installer installs mindfork.exe; where your data lives is unchanged.
  • The auto theme really follows your terminal. The app asks the terminal for its background colour at start-up (Windows Terminal, VS Code's terminal, JupyterLab's, plain SSH and tmux all answer; the legacy Windows console does not, and is treated as the dark background it is), so code blocks and the selection backdrop stop being dark on a light terminal.
  • F1 opens the help from any screen, landing on that screen's own key section, marked you are here — and the settings, self-model, changes and search screens' keys are listed at all for the first time.
  • The licence and the disclaimer speak Russian when the interface does — on the F1 tabs and the Windows installer's legal pages. The translations are unofficial and say so; the English originals govern.
  • A model split across several GGUF parts loads by pointing the setting at the first part — and the two ways of getting it wrong are caught before launch instead of showing up as a server that quietly exits.
  • More typed commands: /autotitle for a model-written title, /impersonation list|new|delete|use|system for the personas Ctrl+U writes as, /profile system|greeting for the profile's texts — each usable where a browser tab or an embedded terminal keeps the chord for itself.
  • Starting without the database says so. A data folder copied without data.db used to open silently amnesiac; now the app says what is empty, what survived and how to get the rest back — and /reindex rebuilds an attached file's missing search index from the text the chat already holds.

One note on data: this release migrates two stored formats — chat files and settings.json, each schema 1 → 2. Both happen automatically on the first start, after a pre-migration backup, and nothing is removed; an older build refuses to open migrated data rather than misread it.

The full list is in the changelog. Downloads — Windows installer (64-bit now) and archive, Linux archive, .deb, .rpm and .pkg.tar.zst — are on the releases page.