HushJot
Tested with Claude Code · works with local MCP agents · decrypts on your machine

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.

🔒 hushjot.app
A project folder in HushJot, Projects › Halves with a Docs folder inside. The agent’s Questions 01 note is open, each question with its recommendation and the answer, and the box ticked so it can continue.
How a project runs

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.

Setup

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 --wait in a shell loop does what /loop does. 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.

first loop
$ 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
Why this is different

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.

From the agent’s side

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
Projects/Halves
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
How it works

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.

what one command does
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
Commands

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
There is no 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.
MCP

Off until you switch it on.

  • hushjot_search
  • hushjot_cat
  • hushjot_ls
  • hushjot_push
  • hushjot_append
  • hushjot_replace
  • hushjot_mkdir
  • hushjot_pending
  • hushjot_take
  • hushjot_reply
  • hushjot_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.

setup
$ 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
On your machine

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 keyYour 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 passphraseNowhere. It is used and discarded, unless you put it in HUSHJOT_PASSPHRASE yourself.
The search indexMemory only, rebuilt per search. A serialised index is the words of every note in the clear.
Getting it

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.

The CLI comes with sync.

The key stays on your machine either way.