Plan it in your notes. Your agent builds it.
Write what you want from wherever you are: your phone, or any browser tab, including a work computer where nothing can be installed. The coding agent you already run on your computer asks its questions in a note, waits for your answers, and builds once you approve the plan. Then it files the docs beside your requirements, and the server never sees a word.
You bring the agent. HushJot does not run one. Your computer runs the agent you already use; any browser is where you write, answer and approve: a phone on the train, or a work laptop where nothing can be installed. The one install is on the machine that runs the agent. It needs a Sync plan, the hushjot command, and a machine that stays on.
Four steps, all of them in your notes.
Write
Put what you want in a Requirements note, in a project folder.
Answer
Your agent asks in Questions 01, with its recommendation for each. Answer and tick the box.
Approve
It writes Docs/Plan. Tick Approve, or write changes and get a revised one.
It builds
Then it files the summary, architecture and decisions, and waits in your Inbox for what’s next.
Your first loop in five minutes.
Five commands on the computer that runs your agent, then two in Claude Code. Write a Requirements note in Projects/Halves in the app first, from any browser, or now.
- Needs Node 22.18 or newer and a Sync plan
- Create your vault in the browser first: the recovery code is shown once, and a terminal is the wrong place for that
- Other agents:
hushjot pending --waitin a shell loop does what/loopdoes. Setup guides for Codex, Copilot, Gemini, Grok and Cursor
How it keeps going. Your agent only works while something runs it. In Claude Code that is /loop; elsewhere a shell loop around hushjot pending --wait. If the machine is off, your notes simply wait. Nothing is lost and nothing happens without you.
$ npm install -g @hushjot/cli $ hushjot login $ hushjot mcp enable $ hushjot scope Projects $ claude mcp add hushjot -- \ hushjot mcp --scope Projects/Halves then, in Claude Code > /mcp__hushjot__plan > /loop 15m continue the HushJot project
The spec is a note. Not a file in one tool.
Spec-driven tools such as Kiro keep requirements, design and tasks as files in the repository, which is the right place at the desk. In HushJot the spec is a note: in whatever browser is in front of you when the idea arrives, encrypted, and readable by whichever agent you run next, so it outlives the tool.
HushJot’s spec is encrypted at rest, readable in any browser tab, and readable by an agent on any machine you own. Bear and Obsidian can be reached by agents too, but their notes sit on disk in the clear, and Obsidian has no browser version.
Spec on the beach. Ship at the desk.
Write the requirements in a HushJot folder, wherever you are. Your agent asks its questions as a note, plans, builds, files the docs, and waits in your Inbox for what’s next.
- Answer from any browser. It can only pick a note up once you have ticked the box.
- Approve the plan, or write changes and get a new one
- Summary, architecture and your manual steps, filed in
Docs/ - Keep going from the Inbox: commit, fix, add, deploy
- The agent sees that one folder and nothing else
you, in any browser Requirements what to build > /mcp__hushjot__plan > /loop 15m continue the HushJot project agent Questions 01 with its recommendations you [x] I have answered all questions agent Docs/Plan you Changes: also split by percentage [x] agent Docs/Plan revised: what changed you [x] Approve [x] Done agent builds · Docs/Summary · Architecture Inbox [ ] Initialise git and commit you [x] Initialise git and commit [x] Done agent > Claude picked this up · 15:40
The key is unwrapped here, and stays here.
The backend is the same one the web app syncs with, and it sees exactly what it sees from a browser: ciphertext, a revision counter and a timestamp. The passphrase is typed into the process and goes nowhere else.
hushjot │ 1. sign in over REST → ID token │ 2. fetch users/{uid}/keys/primary → your key record (still sealed) │ 3. Argon2id(passphrase, salt from record) → unwrap the data key ← stays here │ 4. read notes → AES-256-GCM ciphertext, decrypted locally └ 5. write notes → ciphertext, revision = base + 1
No delete. Every overwrite kept in History.
hushjot ls [--folder F]- List notes, pinned first, then by recency
hushjot cat <note>- Print one note’s Markdown, byte for byte
hushjot search <query>- Full-text search; the same
#tag,in:,"phrase"and-grammar as the app hushjot push [text]- Create a note; also reads stdin or
--file hushjot append <note> [text]- Add text to the end of a note
hushjot replace <note> --revision N- Rewrite a note. Refused if it changed since it was read, and the old text goes to History
hushjot mkdir <path>- Create a folder, and any missing folders above it
hushjot pending,take,reply- What you’ve ticked, pick it up, answer in the Inbox. Append only
hushjot scope [folder | add | rm | clear]- Confine every command to one or more folders
hushjot status,login,logout,mcp- What this machine is set up for; the credentials; the server
rm, mv or delete. HushJot gives an agent no way to delete a note, and anything it rewrites is one tap away in the note’s History for 30 days. --json on any of them gives machine-readable output, and the exit codes are meant to be branched on: 4 you can fix, 5 is transient, 6 is a write conflict.Off until you switch it on.
hushjot_searchhushjot_cathushjot_lshushjot_pushhushjot_appendhushjot_replacehushjot_mkdirhushjot_pendinghushjot_takehushjot_replyhushjot_protocol
/plan/continue/document
Three prompts run a project. plan reads the requirements and asks its questions, continue picks up whatever you’ve ticked, and document brings the docs up to date.
Tested end to end with Claude Code. Setup guides for Codex, GitHub Copilot, Gemini, Grok and Cursor, and any local MCP client. --agent Codex puts its name on the boxes.
The server will not start until you enable it, and --read-only keeps it to reading. hushjot scope confines it to the folders you choose, for reads and writes, and --scope gives each agent project its own folder.
A scope, not a sandbox. It keeps an agent on task. An agent that can also run shell commands as you can reach your keychain, so deny it the hushjot command. The README shows how.
Know where the text goes. Decryption happens on your machine, so plaintext never reaches our servers. But a note an agent reads is sent to whoever runs that agent’s model, under their policies. Scope it to what you are happy to share, or use a local model.
$ npm install -g @hushjot/cli $ hushjot scope Projects # optional, and recommended $ hushjot mcp enable $ cd ~/code/halves $ claude mcp add hushjot -- \ hushjot mcp --scope Projects/Halves
Where things are kept
| Project id, the public web API key, email, scope, whether MCP is on | ~/.hushjot/config.json, none of it secret |
|---|---|
| Account password, refresh token, the data key | Your OS keychain (macOS Keychain, Linux secret service). Without one, as in a container, CI or on Windows, they come from environment variables instead (HUSHJOT_PASSWORD, HUSHJOT_PASSPHRASE), and hushjot status says so. |
| Ciphertext cache and sync cursor | ~/.hushjot/cache/ |
| Your passphrase | Nowhere. It is used and discarded, unless you put it in HUSHJOT_PASSPHRASE yourself. |
| The search index | Memory only, rebuilt per search. A serialised index is the words of every note in the clear. |
One command.
npm install -g @hushjot/cli. Needs Node 22.18 or newer, a HushJot account with Sync, and macOS or Linux (elsewhere, secrets go in environment variables). The vault is created in the browser, because the recovery code is shown to you exactly once. Source and issues: github.com/hushjot/hushjot-cli.