Agentic-first notes & knowledge base. The agent IS the interface.
Notable is a notes and knowledge base service designed for AI agents to drive over plain HTTP. No UI, no SDK. The API is the product.
make build
./notableThe server starts on :8080 with zero config. Data is persisted to a JSON file automatically.
- Get a token:
POST /auth/request→POST /auth/verify→ bearer token - Create a note:
POST /api/noteswithtitle=My Note&body=Content&tags=work,idea - List notes:
GET /api/notes(filter by tag with?tag=work) - Get a note:
GET /api/notes/note_a1b2c(full note with body) - Update a note:
PATCH /api/notes/note_a1b2cwith any oftitle,body,tags - Delete a note:
DELETE /api/notes/note_a1b2c - Search notes:
GET /api/notes/search?q=keyword
- Plain text by default — one labeled, grepable line per record. JSON on demand via
Accept: application/jsonor?format=json. - Instructive errors — every 4xx includes a hint telling the agent what to do next.
- Self-documenting —
GET /helpreturns a one-page operating manual. - Simple auth — OTP via email → long-lived bearer token.
- Single static binary — Go, zero external dependencies, deploys as one file.
- Zero config defaults — runs out of the box. Config: defaults < env < flags.
- Multi-tenant — workspaces isolate notes per tenant.
- Short stable handles — every note gets a workspace-scoped handle like
note_k7m2q.
| Flag | Env | Default | Description |
|---|---|---|---|
-addr |
NOTABLE_ADDR |
:8080 |
Listen address |
-db |
NOTABLE_DB |
notable.json |
Data file path |
-secret |
NOTABLE_SECRET |
random | Token signing secret |
make build # CGO_ENABLED=0, single static binary
make test # go test ./...
make vet # go vet ./...POST /auth/request email=<email>&workspace=<handle> → OTP code
POST /auth/verify email=<email>&code=<code> → Bearer token
POST /api/notes title=<title>&body=<content>&tags=<comma-separated> → handle=note_xxx
GET /api/notes → list all notes (optional ?tag=<tag> to filter)
GET /api/notes/<handle> → full note with body
PATCH /api/notes/<handle> title=<new>&body=<new>&tags=<new> → updated note
DELETE /api/notes/<handle> → delete note
GET /api/notes/search?q=<q> → search notes by title or body content
GET /api/workspace → workspace info
- Plain text (default):
handle=note_a1b2c title=My Note tags=work,idea updated=2024-01-01T00:00:00Z - JSON: add
Accept: application/jsonor?format=json
MIT