{"slug": "show-hn-1667-a-terminal-ui-for-writing-fiction-with-language-models", "title": "Show HN: 1667, a terminal UI for writing fiction with language models", "summary": "1667 0.9.8, a terminal UI for writing fiction with language models, is now available for macOS, Linux, and Windows, offering a tree-based interface that keeps every generated take and requires no account or telemetry. The open-source tool, released under Apache-2.0, lets users draft with a model and manage multiple versions of paragraphs, with installation via curl, PowerShell, npm, or git.", "body_md": "[newthe tree: every take you wrote, still there](#tree)\n\n# Write your novel\n\nin the terminal.\n\n1667 asks a model for the next paragraph, then keeps every take it gives you side by side on a tree you can walk back through. Your keys, your endpoint, your files on your disk. No analytics, no telemetry, no account anywhere in the source.\n\n`curl -fsSL https://1667.ai/install.sh | sh`\n\n`powershell -ExecutionPolicy Bypass -c \"irm https://1667.ai/install.ps1 | iex\"`\n\n`npm install --global @1667-ai/cli@latest`\n\n`git clone https://github.com/1667-ai/1667.git`\n\n`cd 1667 && npm ci`\n\n`cd tui && bun install --frozen-lockfile && bun start`\n\nInstalls 1667 0.9.8. Supports macOS arm64/x64 and glibc 2.17+ Linux arm64/x64. Run 1667 upgrade for later managed releases.\n\nInstalls 1667 0.9.8 on Windows x64. Exit 1667 and run this command again to install a later release.\n\nNeeds Node 22. npm manages this installation. Use npm to install later releases.\n\nNeeds Bun 1.3.14 or later, and Node 22. Git manages this installation.\n\n## verify the installer first\n\nThis optional path needs GitHub CLI. It verifies version 0.9.8 before it runs the local file.\n\nd=$(mktemp -d) && (trap 'rm -rf \"$d\"' EXIT && cd \"$d\" && gh release download v0.9.8 --repo github.com/1667-ai/1667 --pattern install-stable.sh && gh attestation verify install-stable.sh --hostname github.com --repo 1667-ai/1667 --signer-workflow 1667-ai/1667/.github/workflows/release-npm.yml --source-ref refs/tags/v0.9.8 --source-digest 5548e0565fd424725d1c86493060566e01667c62 --deny-self-hosted-runners && sh install-stable.sh)\n\n$d=Join-Path ([IO.Path]::GetTempPath()) ([Guid]::NewGuid()); New-Item -ItemType Directory -Path $d | Out-Null; try { gh release download v0.9.8 --repo 1667-ai/1667 --pattern install-stable.ps1 --dir $d; if ($LASTEXITCODE -ne 0) { throw 'GitHub release download failed.' }; gh attestation verify (Join-Path $d 'install-stable.ps1') --hostname github.com --repo 1667-ai/1667 --signer-workflow 1667-ai/1667/.github/workflows/release-npm.yml --source-ref refs/tags/v0.9.8 --source-digest 5548e0565fd424725d1c86493060566e01667c62 --deny-self-hosted-runners; if ($LASTEXITCODE -ne 0) { throw 'GitHub attestation verification failed.' }; powershell -ExecutionPolicy Bypass -File (Join-Path $d 'install-stable.ps1'); if ($LASTEXITCODE -ne 0) { throw '1667 install failed.' } } finally { Remove-Item -LiteralPath $d -Recurse -Force }- macOS · Linux · Windows\n- no account\n- no telemetry\n- Apache-2.0\n\nWhat it is\n\n## It drafts. You decide what stays.\n\nYou move through a manuscript, and the model writes a paragraph when you ask it to. Then it stops and waits for you.\n\n### Ask again, keep both\n\nAsk for another version of a paragraph and the one you were reading stays where it is. The new take sits beside it, and ← and → flip between them. Every take you generate stays on the tree, and d is the only thing that removes one.\n\n### The shape is a tree\n\nA story is a tree of parts and takes. The story line is the path you have selected through it. Branches you walked away from are still there, and still yours to come back to.\n\n### It lives in a folder\n\nStories sit in a directory you chose. Export writes Markdown next to them. There is no server to sign in to and nothing to migrate off later.\n\nThe tree\n\n## Every draft you didn't keep, still there.\n\nAsk for another take and the one you were reading does not go anywhere. It becomes a sibling. Press `m` and the shape of the whole thing opens up: the line you are on, the forks you made, and the paragraphs you wrote once and walked away from.\n\nThree views, cycled with the same key. Nothing is archived, nothing is pruned on your behalf, and `d` is the only thing that removes a take.\n\n- path\n- The story line as it reads now. One row per part, sibling takes as rings beside it, word counts down the right.\n- tree\n- Every fork you have made, with the quiet runs between them collapsed. Cold branches fold away, and l opens the one you pick.\n- mass\n- The same story by weight. Lines you kept writing, set against the ones you abandoned after a paragraph.\n\n[Start a story →](#install)\n\nNo tracking. At all.\n\n## Nothing in here is watching you write.\n\nEvery line below describes code that does not exist. Go and check.\n\n- analyticsno library, no endpoint, no events\n- telemetrynothing is measured and sent\n- crash reportererrors go to a local log you can read\n- install idnothing identifies your machine\n- accountthere is nothing to sign in to\n\nEvery request the program makes goes to the endpoint you configured. Nothing comes to us, because there is no server of ours to send it to.\n\nOne exception: an optional update check, which ships **off**. Turned on, it reads a version number and tells you. It downloads nothing and replaces nothing.\n\n- No account, ever. Nothing to create, nothing to delete.\n- We never see your prose. It goes to the provider you chose, and their policy is the one that governs it.\n- Apache-2.0 source. Every claim on this page is one you can check.\n\n[Read the source →](https://github.com/1667-ai/1667)\n\nModels\n\n## Your keys. Your prose style. Your machine.\n\n1667 includes no model and rents you nothing. Point it at a provider you already pay, or at a model running on your own computer. The request goes straight there.\n\ngeneration\n\ndefaults, editable behind `,`\n\n- OpenAI\n- Anthropic\n- OpenRouter\n- Ollama\n- LM Studio\n- llama.cpp\n- KoboldCpp\n- Custom endpoint\n\nYour stories stay in plain text files on your computer. Your key goes in a private file that only you can read, never into the story folder.\n\nKeys\n\n## Learn six. The rest find you.\n\nThese eight cover a whole writing session. There are about 40 in total and `?` shows you the rest, but nothing below this line is needed to finish a chapter.\n\n- continueWrite the next part from here\n- directSay what happens next, then continue\n- flip takesMove between siblings of this part\n- movePrevious and next part\n- retakeAnother take on the same prompt\n- writeAdd a take in your own words\n- editOpen the part in the full-screen editor\n- mapCycle path, tree, and mass\n\nand the program shows you the rest\n\nWhat we didn't build\n\n## Left out on purpose.\n\nEach of these was considered and turned down.\n\n### No telemetry\n\nNo analytics, no crash reporter, no install id. There is no such code.\n\n### No cloud\n\nNo sync, no server of ours. Stories never leave the folder they are in.\n\n### No ghost autocomplete\n\nNothing is generated until you press a key that asks for it.\n\n### No chat sidebar\n\nType an instruction, get a paragraph. There is no thread to scroll back.\n\nFAQ\n\n## Questions worth answering.\n\n## Does it write the book for me?\n\nNo. It writes a paragraph when you ask for one, in the direction you gave it, and then it stops and waits. You choose the take, you cut the line, you decide what the chapter is. The judgement stays yours.\n\n## What happens to the takes I don't use?\n\nThey stay. Every take is written to the tree the moment it exists, and moving to another one changes nothing about it. The map shows you all of them, including the lines you abandoned after a single paragraph. Only d removes a take.\n\n## Is anything collected about me?\n\nNo. There is no analytics code, no telemetry, no crash reporter and no install id in the source. Every request the program makes goes to the endpoint you configured, with one exception: an optional update check, which ships off. Turned on, it reads a version number and tells you. It downloads nothing.\n\n## Why 1667?\n\n1,667 words a day for thirty days is fifty thousand, which is the pace that finishes a first draft. The number names that pace. Nothing in the program tracks whether you hit it.\n\n## Where does my writing live?\n\nIn a folder you chose. Run 1667 init in ~/book and that is your project. Export writes the selected story line to Markdown in the same place. Back it up like any other directory. There is no export step to be trapped behind.\n\n## Which models can I use?\n\nAnything behind an OpenAI or Anthropic compatible endpoint. Presets ship for OpenAI, Anthropic, OpenRouter, Ollama, LM Studio, llama.cpp, KoboldCpp, and a custom endpoint. Keys are stored in a private file on your machine and sent only to the provider they belong to. A model running locally needs no key at all.\n\n## Do I need to be good at the terminal?\n\nYou need to be able to open one. After that it is arrow keys to move, space to continue, and ? for the rest. There is no shell scripting and no configuration file to hand-edit. Settings are a panel behind the comma key.\n\n## Can I run it on Windows?\n\nYes. The native Windows x64 release uses the PowerShell Installer. Exit 1667 and run the same command again for a later release.\n\n## What does it cost?\n\nNothing. It is Apache-2.0 source with no paid tier, because there is no server to pay for. You pay whatever your model provider charges, directly to them, or nothing at all if you run a model locally.\n\n## 1,667 words. Tonight.\n\nOpen a folder, run it, and write the next paragraph.\n\n`curl -fsSL https://1667.ai/install.sh | sh`\n\n`powershell -ExecutionPolicy Bypass -c \"irm https://1667.ai/install.ps1 | iex\"`\n\n`npm install --global @1667-ai/cli@latest`\n\n`git clone https://github.com/1667-ai/1667.git`\n\n`cd 1667 && npm ci`\n\n`cd tui && bun install --frozen-lockfile && bun start`\n\nInstalls 1667 0.9.8. Supports macOS arm64/x64 and glibc 2.17+ Linux arm64/x64. Run 1667 upgrade for later managed releases.\n\nInstalls 1667 0.9.8 on Windows x64. Exit 1667 and run this command again to install a later release.\n\nNeeds Node 22. npm manages this installation. Use npm to install later releases.\n\nNeeds Bun 1.3.14 or later, and Node 22. Git manages this installation.\n\n## verify the installer first\n\nThis optional path needs GitHub CLI. It verifies version 0.9.8 before it runs the local file.\n\nd=$(mktemp -d) && (trap 'rm -rf \"$d\"' EXIT && cd \"$d\" && gh release download v0.9.8 --repo github.com/1667-ai/1667 --pattern install-stable.sh && gh attestation verify install-stable.sh --hostname github.com --repo 1667-ai/1667 --signer-workflow 1667-ai/1667/.github/workflows/release-npm.yml --source-ref refs/tags/v0.9.8 --source-digest 5548e0565fd424725d1c86493060566e01667c62 --deny-self-hosted-runners && sh install-stable.sh)\n\n$d=Join-Path ([IO.Path]::GetTempPath()) ([Guid]::NewGuid()); New-Item -ItemType Directory -Path $d | Out-Null; try { gh release download v0.9.8 --repo 1667-ai/1667 --pattern install-stable.ps1 --dir $d; if ($LASTEXITCODE -ne 0) { throw 'GitHub release download failed.' }; gh attestation verify (Join-Path $d 'install-stable.ps1') --hostname github.com --repo 1667-ai/1667 --signer-workflow 1667-ai/1667/.github/workflows/release-npm.yml --source-ref refs/tags/v0.9.8 --source-digest 5548e0565fd424725d1c86493060566e01667c62 --deny-self-hosted-runners; if ($LASTEXITCODE -ne 0) { throw 'GitHub attestation verification failed.' }; powershell -ExecutionPolicy Bypass -File (Join-Path $d 'install-stable.ps1'); if ($LASTEXITCODE -ne 0) { throw '1667 install failed.' } } finally { Remove-Item -LiteralPath $d -Recurse -Force }", "url": "https://wpnews.pro/news/show-hn-1667-a-terminal-ui-for-writing-fiction-with-language-models", "canonical_source": "https://1667.ai/", "published_at": "2026-08-17 13:35:31+00:00", "updated_at": "2026-08-17 14:11:17.703478+00:00", "lang": "en", "topics": ["ai-tools", "generative-ai", "large-language-models"], "entities": ["1667", "GitHub", "Apache-2.0"], "alternates": {"html": "https://wpnews.pro/news/show-hn-1667-a-terminal-ui-for-writing-fiction-with-language-models", "markdown": "https://wpnews.pro/news/show-hn-1667-a-terminal-ui-for-writing-fiction-with-language-models.md", "text": "https://wpnews.pro/news/show-hn-1667-a-terminal-ui-for-writing-fiction-with-language-models.txt", "jsonld": "https://wpnews.pro/news/show-hn-1667-a-terminal-ui-for-writing-fiction-with-language-models.jsonld"}}