Releases: keepnotes-ai/keep
Releases · keepnotes-ai/keep
v0.38.4 - Pluggable storage backends
Pluggable storage backends with entry point registration.
PendingQueueProtocoladded tokeep/protocol.pykeep/backend.py—StoreBundle,NullPendingQueue,create_stores()factory- Entry point registration — external packages register via
keep.backendsgroup - Config —
backendandbackend_paramsfields inStoreConfig/keep.toml - Type annotations —
Keeper.__init__injection params typed with protocols - Local-only guards — embedding cache, model locks, processor spawning skipped for non-local backends
v0.38.3
CI, Test Coverage, Encrypt-at-Rest Docs
New
- GitHub Actions CI — pytest runs on push/PR to main
- 45 new tests across 4 test files:
test_concurrency.py— multi-process SQLite (parallel upserts, concurrent read+write, parallel migration)test_migrations.py— schema migration paths (v0→v3, v1→v3, v2→v3, zero-write-on-reopen)test_recovery.py— malformed DB detection, iterdump recovery, non-fatal touch, runtime recoverytest_meta_resolution.py— persistent.meta/*resolution, inline queries, prereq gating, context expansion
- Encrypt-at-rest guidance in QUICKSTART.md (recommends OS-level disk encryption)
Improved
- Mock infrastructure: ChromaDB
$andqueries,get_entries_full, batch operations, versioning - OpenClaw plugin version synced to 0.38.3
v0.38.2
Prevent SQLite corruption from concurrent hooks
- Migrations now gated by schema version — hot path does zero writes after first run
BEGIN EXCLUSIVEserializes migrations when multiple hook processes start simultaneously- Fixes the root cause of "database is malformed" errors seen in concurrent SubagentStart/UserPromptSubmit scenarios
v0.38.1
Self-heal malformed SQLite at runtime
touch()(accessed_at updates) is now non-fatal — read operations won't crash on SQLite corruption- Runtime recovery via
iterdump()→ rebuild when malformation is detected mid-session Keeper.get()catches malformation, triggers recovery, retries, falls back to ChromaDB data
v0.38.0
Strings terminology
- "Thread" → "string" across all docs for versioned note chains
- New concept section in VERSIONING.md explaining the metaphor
Inline meta-resolve
keep get ID --resolve "type=learning project="for ad-hoc meta queriesresolve_inline_meta()API method with shared resolution enginePOST /v1/notes/{id}/resolveREST endpoint- Metadoc query syntax: tag AND/OR, context expansion, prerequisites
v0.37.1
v0.37.0 - Local dates, hidden system notes, security hardening
What's New
- Local timezone dates: Short-form display dates now render in local timezone (all stored data remains UTC)
- Hidden system notes: System notes (dot-prefix IDs like
.conversations,.tag/act) are hidden fromlist,find, and similar/meta sections by default. Use--all/-ato reveal them. Direct access by ID always works. - Terminology: User-facing text now says "notes" instead of "items"
Security Hardening
- Input validation: Tag keys validated against
[a-zA-Z_][a-zA-Z0-9_-]*regex to prevent JSON path traversal in SQLite queries. ID and tag value length limits enforced at all API entry points. - HTTPS enforcement: Remote API connections now require HTTPS (localhost exempted). Previously only warned.
- Response validation:
RemoteKeepervalidates server responses — checks types, coerces values, rejects malformed data. - Transaction atomicity: Multi-statement SQLite writes use
BEGIN IMMEDIATEfor cross-process safety. Prevents TOCTOU races in version archival. - Background reconcile: Prevents concurrent reconcile runs, verifies documents still exist after embedding before ChromaDB upsert.
- API layering: CLI accesses config through public
Keeper.configproperty instead of private_config.
v0.36.0
What's New
- Media description — Optional vision-model descriptions for images and speech-to-text transcription for audio files, enriching media beyond metadata-only indexing
- MLX support (Apple Silicon): Qwen2-VL for images, Whisper for audio
- Ollama support: vision models (llava, moondream, bakllava)
[media]config section, auto-detected, fully optional- Install:
pip install keep-skill[media]
- Internal layering — Store protocol extraction for cleaner separation between API and storage backends
v0.35.0 — Metadoc prerequisites and media group-by
What's New
Metadoc prerequisite wildcards (key=*): Gate a meta-doc on tag existence. If the current item doesn't have the required tag, the meta-doc is skipped entirely. This lets you create meta-docs that only apply to certain kinds of items.
Context-only group-by: Meta-docs with only prerequisites and context keys (no query lines) become pure group-by matchers — find items sharing the same tag value.
Media metadocs: Three new bundled meta-docs for media libraries:
.meta/genre— groups items by genre.meta/artist— groups items by artist/creator.meta/album— groups tracks from the same release
Example
Tag audio files with media metadata:
keep put ~/Music/OK_Computer/Airbag.flac -t artist=Radiohead -t album="OK Computer" -t genre=rockThen keep get shows meta/artist:, meta/album:, and meta/genre: sections with related items — ranked by similarity and recency. Items without media tags don't see these sections at all.
Query syntax summary
| Syntax | Meaning |
|---|---|
key=value |
Exact match filter |
key= |
Context match (value from current item) |
key=* |
New: Prerequisite (item must have this tag) |