Docs

How to install it, what the commands are, what the API looks like, and where your notes actually live.

Quickstart

Three steps: sign up, install the plugin, run /keepnow once. The install page puts your API key straight into the command, so it's copy and paste.

1. Get an API key

After signing up, open /dashboard/install and pick your environment. The page generates a key and embeds it in the install command. The plaintext is shown exactly once — the server only ever stores its SHA-256.

2. Install the plugin

# Claude Code
claude plugin install keepnow@keepnow

# Codex
curl -fsSL https://keepnow.app/plugin/codex/install.sh | bash

# pi
mkdir -p ~/.pi/agent/extensions
curl -fsSL https://keepnow.app/plugin/pi/keepnow.ts \
  -o ~/.pi/agent/extensions/keepnow.ts
curl -fsSL https://keepnow.app/plugin/pi/prompt.md \
  -o ~/.pi/agent/extensions/prompt.md

3. Set the key and check it

export KEEPNOW_API_KEY=kn_live_...

# 然后在任意会话里 / then in any session:
/keepnow status

Commands

All three environments expose the same commands, worded the same way, with the same output. Switching environments teaches you nothing new.

CommandWhat it does
/keepnowWrite up this session and save it. The agent works out the topic itself.
/keepnow <主题>Pull only the parts about that topic. The topic doubles as the note's identity.
/keepnow find <词>Search and list candidates, numbered.
/keepnow open <n|id>Fetch the full note and read it into the current context.
/keepnow recentThe last 10 notes.
/keepnow statusAccount, plan and usage. The post-install check.

Saving twice in one session

The topic is the note's identity. Within one session, run /keepnow d1 migrations, talk about something else, run /keepnow r2 presigned urls — you get two notes. Come back and run /keepnow d1 migrations again and the agent recognises the topic it already wrote about, pulls that note back, folds the new material in and rewrites it whole.

Matching only ever considers notes created in this session; it will never touch an older one. Several notes on the same topic across different days is normal and intended, not a defect.

REST API

This is what the plugins call, and you can call it directly to build your own integration. Authenticate with Authorization: Bearer <key>, or X-API-Key if that's easier.

EndpointWhat it does
GET /api/v1/meValidate the key; returns plan and usage.
POST /api/v1/notesCreate a note. Returns id, slug and webUrl.
GET /api/v1/notesList and search. Never returns bodies.
GET /api/v1/notes/:idOne note, with the full Markdown.
PATCH /api/v1/notes/:idPartial update. Passing content creates a new version.
DELETE /api/v1/notes/:idDelete the note and all of its versions.
GET /api/v1/tagsAll tags with their note counts.
curl -X POST https://keepnow.app/api/v1/notes \
  -H "Authorization: Bearer $KEEPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Remote D1 migration says table already exists",
    "summary": "drizzle-kit migrations fail on remote D1 ...",
    "keywords": "d1, drizzle-kit, migration, table already exists",
    "content": "# ...markdown...",
    "tags": ["cloudflare-d1", "drizzle"],
    "source": "claude-code"
  }'

Error codes

Failures return { error, code }. The code is stable and safe to branch on.

StatuscodeMeaning
401invalid_keyKey invalid or revoked.
402quota_notesNote limit reached.
402quota_storageStorage limit reached — usually version history.
404not_foundNo such note.
413too_largeNote exceeds 256 KB.
429rate_limitedToo many requests.

Storage and versions

Note bodies live in object storage; the database holds only metadata and the searchable fields. Every edit writes a new version and old ones are kept indefinitely, so a bad agent rewrite can be recovered.

The two quota dimensions count different things. Notes are counted logically — a note edited ten times is still one note. Storage counts real bytes in object storage, so all ten versions add up.

Deleting a note removes every one of its versions too. It cannot be undone and there is no recycle bin — version history protects against a bad edit, not against a deletion.

Privacy and credentials

Notes are private by default. Any single note can get a public link; the body is rendered by the server and the storage address is never exposed.

A developer's working session naturally carries credentials. Three layers: the write-up prompt tells the agent to redact line by line; the server scans for known credential patterns on write and flags the note; and switching a flagged note to public triggers a confirmation showing the exact lines.

A scan hit never blocks the write: losing your note is worse than storing a secret you can then remove. The one place we do block is publishing, because that cannot be taken back.

Use a separate key per device so one can be revoked on its own. Revocation takes effect immediately.