Skip to content

Releases: keepnotes-ai/keep

v0.38.4 - Pluggable storage backends

13 Feb 16:40

Choose a tag to compare

Pluggable storage backends with entry point registration.

  • PendingQueueProtocol added to keep/protocol.py
  • keep/backend.pyStoreBundle, NullPendingQueue, create_stores() factory
  • Entry point registration — external packages register via keep.backends group
  • Configbackend and backend_params fields in StoreConfig / keep.toml
  • Type annotationsKeeper.__init__ injection params typed with protocols
  • Local-only guards — embedding cache, model locks, processor spawning skipped for non-local backends

v0.38.3

13 Feb 15:53

Choose a tag to compare

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 recovery
    • test_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 $and queries, get_entries_full, batch operations, versioning
  • OpenClaw plugin version synced to 0.38.3

v0.38.2

13 Feb 13:36

Choose a tag to compare

Prevent SQLite corruption from concurrent hooks

  • Migrations now gated by schema version — hot path does zero writes after first run
  • BEGIN EXCLUSIVE serializes 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

13 Feb 13:16

Choose a tag to compare

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

13 Feb 12:38

Choose a tag to compare

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 queries
  • resolve_inline_meta() API method with shared resolution engine
  • POST /v1/notes/{id}/resolve REST endpoint
  • Metadoc query syntax: tag AND/OR, context expansion, prerequisites

v0.37.1

13 Feb 03:10

Choose a tag to compare

API layering: include_hidden support

  • find(), find_similar(), query_fulltext(), query_tag(), list_recent() now accept include_hidden parameter across all backend implementations
  • Fixes TypeError when using --all flag with a non-local backend

v0.37.0 - Local dates, hidden system notes, security hardening

13 Feb 02:42

Choose a tag to compare

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 from list, find, and similar/meta sections by default. Use --all/-a to 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: RemoteKeeper validates server responses — checks types, coerces values, rejects malformed data.
  • Transaction atomicity: Multi-statement SQLite writes use BEGIN IMMEDIATE for 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.config property instead of private _config.

v0.36.0

12 Feb 22:18

Choose a tag to compare

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

12 Feb 19:58

Choose a tag to compare

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=rock

Then 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)

v0.34.3

12 Feb 03:31

Choose a tag to compare

Rename keep save to keep move — better describes the action of moving versions between items.