Dulus
An AI agent for your desktop and terminal, on any model you choose. Hosted models run on Fuel, paid in $DULUS.
A brain in a tank that thinks in inner speech: narrow LLM voices talk a question through, and the conversation is the explanation. Static page, OpenRouter.
OtherGitHub @dirkprimbsAvailability needs another checkOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A brain in a tank that thinks in inner speech, as a static web page. A question or idea enters through the only open sense, the inspiration channel. Small, narrow voices then chatter about it on internal notice boards and in private messages, write things into shared memory, argue over a draft, lose interest, and finally one voice says the answer, out loud.
No voice knows it is part of a brain. Each one only knows its own temperament and job, the boards it follows, its private messages, the memory it is allowed to see, and the names of the others it can reach. The brain metaphor exists only in the observer UI.
Live: primbs.ca/tankbrain · Source: github.com/dirkprimbs/tankbrain-web
This is the static version of Norbert, the brain (it started out as Tankbrain). There is no server: the brain runs in your browser, every voice is a model on OpenRouter, and everything the app keeps stays in your browser.
npm install
npm run build # the site is in dist/
npm run dev # or: develop with hot reload (http://localhost:5178)
It starts on the dirksdefault profile. No key? The page offers Sign in with OpenRouter: you sign in on openrouter.ai, approve a key for Norbert, the brain, and come back with it saved in this browser (OpenRouter's OAuth PKCE flow; no client secret, no server, and the page's own address is the callback, so it works from any host). You can also paste a key in ⚙ Settings, or just replay the five demo sessions.
dist/ is plain files with relative paths: put it on any static host (GitHub Pages, Netlify, an S3 bucket, a folder behind nginx) or serve it locally, e.g. python3 -m http.server -d dist. Open it, add your OpenRouter key in ⚙ Settings, and ask something.
The app reads no environment variables and has no backend. The only hosts it talks to are openrouter.ai (the voices, embeddings, speech) and huggingface.co (a one-time download, only if you use the offline Kokoro voice).
| Voice | Region (UI only) | Job |
|---|---|---|
| Listener | Wernicke's area | restates what is really being asked (#focus) |
| Associator | right temporal lobe | free association (#associations) |
| Inventor | precuneus | vivid, concrete material: images, scenarios, analogies, twists (#sparks) |
| Curator | right prefrontal | keeps the useful associations and sparks, with reasons (#ideas) |
| Logician | left parietal | maths and logic checks (#logic) |
| Coordinator | left hippocampus | only writer of the notebook: tasks, decisions, questions |
| Recall | right hippocampus | brings up long-term memories; only writer of long-term memory |
| Drafter | left prefrontal | only writer of the versioned draft |
| Storyteller | right inferior frontal gyrus | how the answer should be told: hook, order, example, tone (#telling) |
| Critic | anterior cingulate | questions the draft (#critique) |
| Motivator | striatum | reports interest, which drives the energy level |
| Inhibitor | orbitofrontal | approves or sends the final draft back |
| Voice | Broca's area | speaks the reply on the output channel |
This is the beginning of the README. Read the rest at the original. Read the full README ↗