Release History

What's Changed

Every release. Every fix. Every improvement.

v1.0.13 2026-05-06

  • Memory-type color palette — the TYPE_COLORS map in the web UI now has 14 distinct presets so every memory type that exists in the database renders with its own color in the graph view and in badges. New entries: bug (red), diary (rose), investigation (gold), reference (sky blue), mockup (orange), skill (mint), feedback (teal), handoff (lavender), and a coral for error so it no longer collides with bug.
  • Search pagination — the Search tab now shows showing N of total under the result list and a Load more button when more results are available. Replaces the silent 50-row truncation. Server cap raised from 200 to 1000.
  • Hooks: server log_runhooks/codex-hook.sh and hooks/gemini-hook.sh now POST a log_run to the Zikra server when ZIKRA_URL and ZIKRA_TOKEN are set. Token counts land in prompt_runs on the server, not just the local statusline cache.
  • MCP project_scope enforcement — tokens minted with a project_scope are now enforced for all project-scoped MCP tools. Mismatched calls return a structured token_scope_mismatch error; matched calls have project injected automatically.
  • Architecture docs rewrittendocs/architecture.md repositioned around the team-memory-OS framing with Mermaid diagrams for system, request flow, role/scope model, and storage layout.
  • PROMOTION.md launch kit — public promotion kit at the repo root with canonical links, positioning, and submission copy for directories, awesome lists, and launch platforms.
  • prompts/zikra-audit.md — new Claude Code audit prompt for project drift, type misclassification, ghost projects, and emerging-project signals.
  • Stars badge fix on this sitescript.js was passing cache: 'force-cache' to fetch(), which froze the GitHub star count to whatever the first response returned. Switched to 'no-cache' so the count refreshes every page load.
  • Memory type cleanup — DB-side merges consolidated stray one-off types: run_diarydiary, memoryreference, knowledgereference. Distinct types reduced from 15 to 12.
  • setup.py version sync — was 9 releases stale at 1.0.1; now matches zikra/version.py.

v1.0.12 2026-04-27

  • og:image social card — new 1200×630 share image (/assets/og-image.png) shown when Zikra links are shared on Twitter/X, Slack, Discord, LinkedIn, and any Open Graph-aware platform. All pages updated to summary_large_image.
  • JSON-LD structured dataSoftwareApplication schema added to the homepage so search engines can surface richer results (name, description, license, code repository, pricing).
  • Live GitHub stars badge — the "Star on GitHub" button in the hero now fetches the current star count from the GitHub API and displays it inline.
  • Canonical + og:url tags — added to install, changelog, and license pages that were missing them.

v1.0.11 2026-04-27

  • Screenshots page — new /screenshots.html with six cropped, web-optimised screenshots covering the memory list, hybrid search, memory graph, graph node detail panel, renderings tab, and prompt library. Each screenshot includes a title and description. Browser chrome removed with pixel-level precision (156 px measured from a live 4 K capture).
  • Lightbox — click any screenshot to expand it full-screen. Dismiss with Esc, click outside the image, or the close button.
  • Testimonials section — quote cards below the gallery, styled to match the site glass theme.
  • Global nav update — Screenshots link added to the navbar across all pages (index, install, changelog, license).

v1.0.10 2026-04-22

  • "Who are you?" login screen — replaces the silent settings-panel token input with a full-viewport user-picker overlay. On first visit the UI fetches /api/ui/users and renders a button per token label. Clicking a name reveals an inline token-paste field; the token is verified against /api/ui/bootstrap before being stored. An "Advanced" disclosure allows manual entry for new users. Global 401 now wipes localStorage and returns to the picker instead of opening the gear panel.
  • Project-scoped tokens — new project_scope column on access_tokens (NULL = unrestricted). Pass "project_scope": "veltisai" to create_token to restrict a token to one project. Any request targeting a different project returns a structured 403 with a hint field. The UI shows a friendly banner with a one-click "Switch to '…'" button. Scoped tokens auto-lock to their project at login and on every page reload.
  • Token usage tracking — new append-only token_hits(label, command, ts) table. A FastAPI middleware records every authenticated 200 response as a non-blocking background task. Webhook calls log the exact command; UI calls log ui:bootstrap, ui:memories, etc. Query via GET /api/ui/token-usage for hits_total, hits_7d, hits_24h, and last_seen per label.
  • GET /api/ui/users — new unauthenticated endpoint returning [{"label": "…"}, …] from active non-owner tokens. Labels only — no tokens, no roles, no IDs.
  • Project selector unlocked — removed the role === 'owner' gate from renderProjSelector; all authenticated roles now see the radio-button project list.
  • Schemaproject_scope TEXT added to access_tokens; token_hits table added with two indexes. SQLite: migration 008. Postgres: _PG_TABLES updated for fresh installs; migration guards handle existing deployments idempotently.

v1.0.9 2026-04-21

  • Gemini CLI integration — new hooks/gemini-hook.sh registers for AfterModel and SessionEnd events. Parses the Gemini JSONL transcript for token counts (probes usageMetadata.promptTokenCount and OpenAI-style usage.input_tokens for cross-version compatibility). Writes last_tool=gemini and last_model to the shared zikra-stats.json cache so the statusline always reflects the active tool. Run the Gemini setup prompt to install automatically.
  • Codex CLI integration — new hooks/codex-hook.sh registers for Stop and PostToolUse events. Probes transcript_path from the hook payload and falls back to ~/.codex/sessions/<id>/history.jsonl. Parses OpenAI-style usage.prompt_tokens / usage.completion_tokens. Installer writes to ~/.codex/config.toml ([hooks] section) when present, else ~/.codex/hooks.json.
  • Shell statusline — new hooks/zikra-shell-status.sh sources into ~/.bashrc / ~/.zshrc and renders the Zikra bar before each terminal prompt during Gemini and Codex sessions. Reuses zikra-statusline.js (synthetic payload from cache); project, run count, memory count, and model label all work. Token bar not shown at shell level — context window data is only available inside a Claude Code session.
  • Installer: "Other AI tools" step — new question after hook depth. Detects gemini and codex on PATH and marks them "(detected)". Installs hooks, writes tool-specific configs, and appends the shell statusline source line to RC files. Summary lists all integrated tools.
  • Shared cache architecture — all three tools (Claude Code, Gemini CLI, Codex CLI) write to and read from a single ~/.claude/cache/zikra-stats.json. Claude Code uses its native statusline hook; Gemini and Codex hooks update the cache; the shell PROMPT_COMMAND reads it for non-Claude sessions.

v1.0.8 2026-04-21

  • Statusline project detection from cwdhooks/zikra-statusline.js now walks up from the current working directory looking for a CLAUDE.md with a project: line (or ZIKRA_PROJECT= env-style). First non-global match wins. Falls back to the cached project. Fixes sessions inside known project repos showing global in the statusline instead of the project name.
  • Context window no longer hardcoded — the statusline uses whatever size Claude Code reports for the session in context_window.context_window_size. No cap at 200K. A 1M-variant session renders X/1M; a 200K session renders X/200K; any future window size is picked up automatically. 200K is kept only as a last-ditch fallback when the payload omits the field entirely.
  • CHANGELOG.md added to the main repoCHANGELOG.md now lives at the root of getzikra/Zikra with entries from v1.0.4 forward, in Keep-a-Changelog format.

v1.0.7 2026-04-13

  • Wikilinks in memories — write [[Another Memory Title]] anywhere in content_md and save_memory now parses the anchors and stores directed edges in a new memory_links table. Resolution prefers same-project targets, then falls back to global. Works on both Postgres (asyncpg) and SQLite backends; migration 007 ships the table.
  • Backlinks on get_memory — responses now include links_out (outgoing anchors) and links_in (incoming backlinks from other memories). New REST endpoint GET /api/ui/backlinks/{memory_id} exposes the same data for UI consumers.
  • Graph: bold purple wikilink edges — the canvas graph now renders explicit [[link]] edges in bold purple before scored semantic candidates, so wikilinks always reach their target regardless of score threshold or per-node degree cap. Semantic pass skips pairs already claimed by a wikilink to avoid double-drawing.
  • Orphan / stale detection — new hygiene_report command finds memories idle beyond stale_days (default 30) and with zero incoming wikilinks. Returns days_idle, access_count, backlink_count, and a verdict of archive (> 90 days) or review. Scoped per-project.
  • New MCP tool: zikra_hygiene_report — registered in the MCP server so Claude Code, Cursor, and other MCP clients can pull a project's orphan list directly. Viewer-role accessible.
  • Statusline stale warning — the Stop hook now caches orphan_count in zikra-stats.json alongside the memory count. When a project has orphaned memories, the statusline renders ⚠ N stale in yellow after the token bar, so hygiene pressure is visible without opening the UI.
  • delete_memory command — new admin-gated command removes a memory and its memory_links edges via ON DELETE CASCADE. Requires an admin-role token; viewer and default tokens receive 403.

v1.0.6 2026-04-09

  • Server-side prompt_id handshake — new pending_runs table keyed by (runner, project). get_prompt records a pending row; log_run consumes it and auto-links the prompt_id. Fixes empty run history when prompts fire through the MCP transport. Atomic FOR UPDATE consume on Postgres; last-write-wins UPSERT on SQLite.
  • Runner auto-injection via X-Zikra-Runner header — the MCP server pulls the runner hostname from the header and injects it into get_prompt / log_run tool arguments automatically. Callers no longer need to know their own hostname. Implemented via ContextVar for Streamable HTTP and session dict for SSE.
  • mcp.json auto-configurationinstaller.py now writes the X-Zikra-Runner header into the generated mcp.json so new installs get the handshake out of the box.
  • File-based rendezvous removedautolog.sh and watcher.py no longer read or write /tmp/zikra_prompt_id. The handshake is now fully server-side, eliminating a race condition where long-running sessions lost their prompt linkage.
  • Integration test for pending consumption — verifies the get_promptlog_run handshake, idempotency of pending consume, and correct behavior when multiple prompts are in flight for the same runner+project.

v1.0.5 2026-04-09

  • POST /mcp no longer 307-redirects — Starlette's Mount was redirecting POST /mcp to /mcp/ with a 307, which Claude.ai, Cursor, and other web MCP clients silently fail to follow. The Streamable HTTP handler is now registered directly on FastAPI via @app.post('/mcp') before the mount, so the redirect never fires. Legacy SSE endpoints at /mcp/sse and /mcp/messages continue to route through the mount.
  • CORS middleware added — browser-based MCP connections and web clients were blocked before the request reached the handler. Now explicit CORS headers are sent on all routes.
  • Web UI: direct GET /api/ui/* endpoints — the browser UI now reads from dedicated REST endpoints instead of posting through /webhook/zikra command dispatch. New endpoints: /api/ui/memories (hybrid FTS+vector for q=<text>, full list for q=*), /api/ui/memories/{id} (full content_md, no access-count bump), /api/ui/prompts, /api/ui/requirements, /api/ui/run-history, /api/ui/bootstrap. UI browsing no longer inflates access_count — only API clients do.
  • Token telemetry in the topbar — new topbar pill shows aggregate in / cache / out tokens across all runs. Per-run history panel now exposes cache_read and cache_creation counts. Backed by a new GET /api/ui/runs aggregation endpoint (sum, avg, count).
  • prompt_runs schema extended — adds prompt_id, tokens_cache_read, tokens_cache_creation. Migration 005 ALTERs existing tables in place; no rebuild required.
  • Content cutoff fixrenderSearchDetail was reading m.content (undefined in search results) and falling back to a truncated snippet. Now fetches the full record via get_memory on click and renders content_md through the markdown renderer so bold / code / lists / headers display correctly instead of raw syntax.
  • Timezone-safe date parsing — new parseUTCDate() normalizes SQLite's YYYY-MM-DD HH:MM:SS format (no T, no Z). Without normalization, browsers parsed these as local time, producing wrong ageDays and skewed recency scores on the decay gauge and signal bars.
  • Score fallback corrected — recency-signal rendering now falls back to the server-computed score instead of a stale client-side estimate when the backend payload omits per-signal values.
  • UI polish — sidebar cards show a 90-char snippet preview so memories are distinguishable before opening. Score progress bar and signal bars get background tracks for empty-state clarity. Improved card hover / active states, spacing, and a loading skeleton while full content fetches. Inline-SVG orange "Z" favicon.
  • update.sh fixes — WIP snapshot commit now works without a global git identity (inline -c user.name/email). Rebuild path prefers docker-compose.local.yml if present. Execute bit restored so the script is runnable straight after clone.

v1.0.4 2026-04-09

  • MCP transport migrated to Streamable HTTP — the /mcp endpoint now speaks the MCP 2025-03-26 Streamable HTTP spec (stateless POST, JSON-RPC 2.0). Container restarts and proxy reconnects no longer drop sessions. The deprecated SSE endpoint at /mcp/sse is kept for backward compatibility with a logged warning.
  • Safe update script (update.sh) — one command to pull, detect Docker vs. bare-Python, and restart. Checks for uncommitted changes before pulling, snapshots a WIP branch if any exist, then restores after the update. Docker: detects bind-mount or compose and restarts accordingly.
  • Server update prompt (prompts/zikra-server-update.md) — Claude Code prompt that walks through the same update steps for users who prefer not to run scripts directly.
  • Onboarding prompt renamedprompts/g_zikra.mdprompts/zikra-claude-code-setup.md. Agent-specific naming: Claude Code gets its own file; Gemini CLI and Codex prompts are coming in separate files. A note at the top clarifies the scope: hooks, statusline, MCP token — not server updates.
  • SQLite concurrency warning — installer now warns when SQLite is selected with a non-localhost bind address. Single-writer limitation documented in README profiles table.
  • SQLite runtime files untracked*.db-shm and *.db-wal added to .gitignore. WAL-mode journal files were being accidentally staged on some systems.

v1.0.3 2026-04-09

  • Version badge direction fixed — the topbar update indicator now only shows v→ vX.X.X when GitHub has a strictly newer release. Previously showed a downward arrow when running ahead of the latest tag.
  • Favicon — browser tab now shows the Zikra Z icon via an inline SVG link. No external file required.
  • Memory titles no longer cut off — sidebar card titles use the full available width before truncating with . A CSS property mismatch (flex:1 on a non-flex child) was causing mid-word clipping.
  • Access counter now incrementsget_memory calls bump_access_count on every read. Search results also expose access_count so the accessed N× label in the sidebar is accurate.
  • Memory decay gauge fixed — the circular health gauge and recency/frequency/confidence bars now compute correctly. Root cause: search results were not returning access_count or confidence_score, and the UI was reading the wrong field. Gauge now reads the server-computed score (0–1); bars are derived independently from created_at, access_count, and confidence_score.
  • Added compute_score() to scoring module — standalone memory health score (decay × frequency × confidence × pin boost), independent of search query. Applied to all search results so the UI always has an accurate health signal.
  • Version file syncedversion.py bumped to 1.0.3 and git tag v1.0.3 pushed so the GitHub Tags API reflects the current release.

v1.0.2 2026-04-09

  • Single version source of truthversion.py now drives everything: FastAPI, /health, debug_protocol, and the version command. No more three different hardcoded strings.
  • Server-side GitHub version check/health and the version command return latest_version when a newer GitHub tag exists. One daily API call, cached in memory, shared by all endpoints.
  • Web UI version indicator — the topbar now shows the running server version on connect. Turns orange with v1.0.1 → v1.1.0 if GitHub has a newer release.
  • Stop hook race condition fixed — lock moved to main shell (before the background fork). Was inside the subshell, causing 30-80× duplicate diaries per session.
  • Stop hook: macOS portability — portable lock: flock on Linux/WSL, atomic mkdir fallback on macOS. Hook now works correctly on all platforms.
  • Stop hook: diary title includes time — title is now diary:YYYY-MM-DD-HHMM:host instead of diary:YYYY-MM-DD:host. Multiple sessions per day are preserved instead of being silently overwritten.
  • Stop hook: transcript byte cap — adaptive tail (80–200 lines) + 200KB head -c cap prevents megabytes of JSONL tool results being fed to claude -p.
  • Stop hook: claude -p timeouttimeout 120 (or gtimeout on macOS) prevents a hung call from holding the lock indefinitely.
  • Removed zikra-lite — all references to the discontinued zikra-lite product removed from installer, hooks, docs, and website. One product, one repo.
  • Installer fixg_zikra.md no longer has a localhost → zikra-lite branch that silently pulled stale hooks from the old repo.

v1.0.1 2026-04-08

  • Statusline: server version display — the Claude Code statusline now shows the running server version fetched from the Zikra API, not a hardcoded local string. Compares against GitHub tags and highlights in orange if an update is available.
  • New version command — returns {"version": "1.0.1", "server": "zikra"}. Accessible to any viewer role token. Aliases: ver, server_version.
  • Stats hook: server version cachezikra-stats-update.sh fetches the server version each run and caches it in ~/.claude/cache/zikra-stats.json.
  • Statusline fallback — shows (update if ●) with an orange dot when server version is not yet cached, prompting the user to run zikra update.

v1.0.0 2026-04-01

  • Initial release — FastAPI + SQLite + sqlite-vec. Zero external dependencies.
  • MCP server — SSE transport at /mcp, compatible with Claude Desktop and Claude Code.
  • Hybrid search — semantic (vector cosine) + keyword (FTS5), weighted scoring with confidence decay.
  • Claude Code hooks — Stop hook auto-logs session diaries; PreCompact hook saves summaries before context compression; statusline shows live stats.
  • Multi-user RBAC — owner, admin, developer, requirements_engineer, viewer roles. Token-based auth on all endpoints.
  • Memory types — decision, error, requirement, reference, user, feedback, project, conversation, architecture.
  • One-command installerg_zikra.md prompt sets up hooks, CLAUDE.md, and statusline in a single Claude Code session.
  • PostgreSQL backend — optional DB_BACKEND=postgres for teams needing pgvector scale.

Always improving.

Watch the repo for new releases. Every update ships through the same one-command installer.