Interact with Inkdrop's local HTTP server to manage notes, notebooks, and tags.
Set environment variables:
bash
export INKDROP_URL="http://localhost:19840" # default port
export INKDROP_AUTH="username:password" # from Inkdrop preferences
For OpenClaw, store credentials in a secrets file (e.g., workspace secrets.md) and source them at runtime. Avoid persisting plaintext credentials in shell profiles.
text
Base URL: http://localhost:19840 (or INKDROP_URL env var)
Auth: Basic auth via INKDROP_AUTH env var (user:password)
Verify connection:
bash
curl -s -u "$INKDROP_AUTH" "${INKDROP_URL:-http://localhost:19840}/"
# Returns: {"version":"5.x.x","ok":true}
All endpoints use Basic auth. Replace USER:PASS with your $INKDROP_AUTH value.
bash
curl -s -u $INKDROP_AUTH http://localhost:19840/notes
Query params:
keyword — search text (same qualifiers as Inkdrop search)limit — max results (default: all)skip — offset for paginationsort — updatedAt, createdAt, or titledescending — reverse order (boolean)bash
curl -s -u $INKDROP_AUTH "http://localhost:19840/<docid>"
The docid is the full _id (e.g., note:abc123, book:xyz). Works for notes, books, tags, files.
Optional params:
rev — fetch specific revisionattachments — include attachment data (boolean, use for file documents)bash
curl -s -u $INKDROP_AUTH -X POST http://localhost:19840/notes \
-H "Content-Type: application/json" \
-d '{
"doctype": "markdown",
"title": "Note Title",
"body": "Markdown content here",
"bookId": "book:inbox",
"status": "none",
"tags": []
}'
_id is auto-generated. bookId is required — use book:inbox as default or look up notebooks first.
POST with _id and _rev (required to avoid conflicts):
bash
# 1. Get current _rev
REV=$(curl -s -u $INKDROP_AUTH "http://localhost:19840/note:abc123" | python3 -c "import sys,json; print(json.load(sys.stdin)['_rev'])")
# 2. Update with _rev
curl -s -u $INKDROP_AUTH -X POST http://localhost:19840/notes \
-H "Content-Type: application/json" \
-d '{
"_id": "note:abc123",
"_rev": "'"$REV"'",
"doctype": "markdown",
"title": "Updated Title",
"body": "Updated content",
"bookId": "book:inbox",
"status": "none"
}'
bash
curl -s -u $INKDROP_AUTH -X DELETE "http://localhost:19840/<docid>"
bash
curl -s -u $INKDROP_AUTH http://localhost:19840/books
bash
curl -s -u $INKDROP_AUTH -X POST http://localhost:19840/books \
-H "Content-Type: application/json" \
-d '{"name": "My Notebook"}'
bash
curl -s -u $INKDROP_AUTH http://localhost:19840/tags
bash
curl -s -u $INKDROP_AUTH -X POST http://localhost:19840/tags \
-H "Content-Type: application/json" \
-d '{"_id": "tag:mytag", "name": "mytag", "color": "blue"}'
bash
curl -s -u $INKDROP_AUTH http://localhost:19840/files
Create with POST to /files. Files are primarily image attachments for notes.
bash
curl -s -u $INKDROP_AUTH "http://localhost:19840/_changes?since=0&limit=50&include_docs=true"
Params: since (sequence number), limit, descending, include_docs, conflicts, attachments.
Returns changes in order they were made. Useful for syncing or watching for updates.
The included scripts/inkdrop.sh wraps common operations:
bash
export INKDROP_AUTH="username:password"
# List all notes
./scripts/inkdrop.sh notes
# Search notes
./scripts/inkdrop.sh search "project ideas"
# Get a specific note
./scripts/inkdrop.sh get "note:abc123"
# Create a note (title, bookId, body)
./scripts/inkdrop.sh create "My Note" "book:inbox" "Note content here"
# List notebooks
./scripts/inkdrop.sh books
# List tags
./scripts/inkdrop.sh tags
# Delete a document
./scripts/inkdrop.sh delete "note:abc123"
FieldTypeDescription_idstringnote:<id> (auto-generated)_revstringRevision token (required for updates)titlestringNote titlebodystringMarkdown contentdoctypestringAlways "markdown"``bookIdstringNotebook ID (e.g., book:inbox)tagsstring[]Array of tag IDsstatusstringnone, active, onHold, completed, dropped``pinnedbooleanPin to topsharestringprivate or public``createdAtnumberUnix timestamp (ms)updatedAtnumberUnix timestamp (ms)
none — Defaultactive — In progressonHold — Pausedcompleted — Donedropped — Abandonedbook:inboxGET /books)_rev before updating to avoid conflictstag:<name> format