Skip to content

v0.134.0

Choose a tag to compare

@hughpyle hughpyle released this 10 Apr 01:09
· 188 commits to main since this release

Remote store, keep daemon, and markdown sync transport

Remote authoritative store

Keep can now target a remote store as the authoritative backend. Configure with:

[remote_store]
api_url = "https://keep.example.com"
api_key = "..."

The local daemon owns the filesystem (markdown mirrors, watches, local state); the remote service owns the notes. One-shot markdown export, continuous --sync, and the change feed all work against the remote store transparently.

New daemon endpoints

  • GET /v1/export — full store export with NDJSON streaming (?stream=ndjson)
  • GET /v1/export/bundles/{id} — single note bundle with inverse edges and edge-tag metadata
  • GET /v1/export/changes?cursor=N — cursor-based non-destructive change feed with server-side dependency expansion (affected_note_ids)
  • Capability descriptors on GET /v1/ready and GET /v1/health

keep daemon is the public command

keep daemon replaces keep pending as the primary daemon management command:

keep daemon                    # Start the daemon (foreground)
keep daemon --list             # Show queue status + active mirrors
keep daemon --reindex          # Enqueue all notes for re-embedding
keep daemon --stop             # Stop the daemon
keepd --store ~/.keep          # Direct foreground daemon runner

keep pending remains as a hidden compatibility alias. keepd is a new minimal script entrypoint.

Remote daemon mode

The daemon can now bind to non-loopback addresses for remote access:

keepd --store ~/.keep --trusted-proxy

Behind a reverse proxy, --trusted-proxy is the only additional flag needed — the daemon binds to loopback by default and the proxy forwards to it. Use --bind and --advertised-url only when the daemon must accept connections directly on a non-loopback interface.

Markdown sync transport

  • Local mirrors now use a local YAML registry (~/.keep/markdown-mirrors.yaml) instead of a store note — correct ownership for distributed sync.
  • Three-branch polling: local sync outbox (trigger-driven), remote change feed (cursor-based), and interval-based fallback.
  • Remote incremental sync: change-feed events carry affected_note_ids so the local mirror can incrementally rewrite only the affected note bundles without local graph access.
  • RemoteKeeper gains full export client: export_iter() (NDJSON streaming), export_bundle(), export_changes(), capabilities().

Other

  • Tool integrations no longer auto-install on every command — explicit setup only.
  • KEEP-PENDING.md → KEEP-DAEMON.md (renamed).
  • Stale keep pending --force hints fixed to keep daemon --reindex.

Upgrade notes

  • The [remote] TOML section is now [remote_store] (old name still works as a fallback).
  • Mirror registrations auto-migrate from the legacy .markdown-mirrors store note to the local YAML file on first save.
  • Schema version unchanged from v0.133.0.