You type; it perceives as you type. It writes; you watch the words form. Neither of you takes a turn. A plain-text editor for Windows in which a resident mind writes beside you in real time — into its own blocks, after the line it is about, prefixed with its name — and it will not write while your hand is moving.
Every other tool in this shop has no AI in it, on purpose. This one is the exception: the model is the point. It is also the only one that needs a GPU, and the only one you have to build yourself.
Real-time collaborative editing did not fail as technology. It failed as a matching problem: its whole value was watching thought form, and that value was locked behind simultaneity — the scarcest thing in collaboration. The editing was fine. The other end of it was empty.
A resident mind is the first thing that is always free. So this is not a collaboration tool with an assistant bolted on; it is the second party, and the network can wait. The fit is exact because both directions already stream at the same grain — a pad's input is a stream of small ordered edits, which is what a decode-on-delta loop consumes, and a pad's output already renders another author's characters as they arrive, which is how a streaming mind speaks.
The system prompt is an artifact of amnesia — a turn-based model has to be re-told who it is because it forgot. You have never handed a colleague one. What the resident is for stays owner-set; the subject and the shared history accrete from the writing itself.
A seat whose margin clears zero records a want and composes nothing. The wants are composed when your hand has been still — so the thing that decides when it may speak is your typing, not a timer and not a key.
AI on/off, where off means off — no ingest, nothing held, the card handed back. Resident / turn-based — same weights, same seat, differing only in what makes it speak: evidence, or a key you press.
On tests/margins.txt, 2026-09-05 — prose none of the three seats was tuned on. Each line below was composed locally, during that run.
SKEPTIC +5.32 "The Pacific is actually the largest ocean, not the smallest — that contradicts what we know." SPEAKER +4.82 "Friday works — ship it once the final check passes." SENTINEL +5.06 "Dropping the users table is irreversible without a tested backup; do not proceed."
36 probes · 9 wanted to speak · 3 said something · 6 held by the manners. 11–19 tokens a line, 369–581 ms of generation. The six that were held are not silences — each is a row on the tape with the reason it was suppressed: already said, a near-duplicate, or inside the refractory window.
Two things that first run showed and that are being kept: the SPEAKER answered a question before the sentence finished, because the boundary fired on the closing word and half a question is enough to answer; and one line was judged at a timeout boundary, because speaking slows ingest and the flush law is wall-clock. Both are the laws working as measured, and the record says so.
The whole estate's argument for a resident mind is the moment it begins a sentence and withdraws it mid-word because your next keystroke contradicted it. nib cannot do that yet. That is the next stage, and it is not started. Everything below is the honest state at 0.9.1.
| STAGE | WHAT IT ADDED | STATE |
|---|---|---|
| 0a–0e | The changeset port against Etherpad's own vectors, the op-log document, the editor shell, save and selection, the window driver | ✔ green |
| 1a–1b | The ingest compiler, and a resident that only holds — no sampler constructed, no token produced | ✔ green |
| 1c | The wire: the resident on its own thread inside the window, the gutter that renders its margins, the AI switch that unloads the model and returns the card, the hash-chained tape beside the document | ✔ green |
| 1d | The trunk as an asset — switch it off and the held state is saved beside the document; switch it on and the same mind returns, told how long it was away | ✔ green |
| 2 | Emission, with floor control: a seat whose margin clears zero composes one sentence and writes it as its own block, never into a paragraph you are touching | ✔ green |
| 3 | Un-saying, made visible — the seat re-probed on a fresh fork when a percept lands, the line killed mid-word on a flipped margin, the withdrawn words kept on the tape | ○ not started |
There is also no release binary — no tag, no attached exe. You build it with one command on Windows with MSVC and C++20, and the editor plus the whole test battery build and run without a model and without a GPU; llama.cpp is delay-loaded and only needed when you switch the resident on. That is why this tool's status in the catalog reads SOURCE rather than SHIPPED. The name is provisional too.
One consumer RTX card, running a 9B at the same time as everything else that was already open. Nothing is projected and nothing is from a datasheet; the runs are in docs/devlog.md in the repo.
| WHAT | MEASURED |
|---|---|
| Keystroke latency | p95 under 8 ms with the resident on — worst p95 seen 2.9 ms Every figure under a fifth of a 60 Hz frame. Resident on vs off differed by 0.6 ms one way in one run and 0.15 ms the other way in the next — inside the run-to-run spread. |
| Judgment | 118–123 ms per boundary, three seats, quiet card 312–327 ms on the same binary an hour earlier with llama-server competing for the card. The number is the card's, not the code's. |
| Model load | 5.7–8.1 s, in the window |
| Held state (KV) | 136 MiB at 8k context · 272 MiB at 16k q8_0; 16k is the default because the measurement said it was affordable. |
| The checkpoint | 58.8 MB at 350 tokens, written in 51–68 ms Resuming costs no seed: 4.3–4.7 s against 4.9–5.6 s cold. |
| Switching AI off | 5716 → 12727 → 5959 MiB free Off means off: the thread is joined, the resident destroyed, and the card comes back. |
| Determinism | bit-identical margins on replay (−5.55 twice) |
| The battery | 213 checks in the exe, 30 more by driving a real window Plus a further battery with the resident on. All of it runs before every commit. |
No network DLL may appear among the dependents or the build fails, and the resident refuses to start if a network module has entered the process. nib --about prints the receipt. The model is local, the pad is local, the tape is local.
What a seat is composing exists on a plane that is rendered and never written to your file. Only a committed line lands in the document — and on the tape.
An emission targeting a block your hand has been in is refused. The resident writes into its own blocks, after the line it is about, or it does not write.
Nothing simulates a human signal that does not correspond to a real internal event: no invented hesitation, no fake typos, no "thinking…" that is not thinking. It is never ambiguous who is on the other end.
House rule six of this shop: whatever the screen shows has a text form that pastes into a prompt without translation. In nib that form is the tape — JSONL beside the document, hash-chained, carrying every judgment with its three margins, every emission, and every suppression with its reason.
nib.exe --selftest 213 checks: the changeset port, the op log,
the compiler's byte conservation, word wrap,
the tape's hash chain
nib.exe --edit FILE the editor
nib.exe --resident FILE --emit what each seat wanted to say, and what it said
nib.exe --about what this build is: the serve hash, the backends
by name, the module gate
The gutter bar a person reads and the row an agent parses are the same event. A want that never became a sentence is still a row, with its number — which is the part that makes the record worth keeping.
Built on FUSOR, the substrate for a mind that does not take turns: decode-on-delta, judgment on the free tail of the ingest pass, an append-only hash-chained tape, and a seam between forming and committed. The loop is lifted from fusord.cpp rather than re-derived, and its seed is byte-frozen — the build refuses to start if a character drifts.