Every release. Every fix. Every improvement.
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.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.log_run — hooks/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.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.docs/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.script.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.run_diary → diary, memory → reference, knowledge → reference. Distinct types reduced from 15 to 12.setup.py version sync — was 9 releases stale at 1.0.1; now matches zikra/version.py./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.SoftwareApplication schema added to the homepage so search engines can surface richer results (name, description, license, code repository, pricing)./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).index, install, changelog, license)./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_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_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.role === 'owner' gate from renderProjSelector; all authenticated roles now see the radio-button project list.project_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.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.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.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.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.~/.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.hooks/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.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 repo — CHANGELOG.md now lives at the root of getzikra/Zikra with entries from v1.0.4 forward, in Keep-a-Changelog format.[[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.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.[[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.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.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.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.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.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-configuration — installer.py now writes the X-Zikra-Runner header into the generated mcp.json so new installs get the handshake out of the box.autolog.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.get_prompt → log_run handshake, idempotency of pending consume, and correct behavior when multiple prompts are in flight for the same runner+project.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.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.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.renderSearchDetail 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.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 instead of a stale client-side estimate when the backend payload omits per-signal values.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./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.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.prompts/zikra-server-update.md) — Claude Code prompt that walks through the same update steps for users who prefer not to run scripts directly.prompts/g_zikra.md → prompts/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.*.db-shm and *.db-wal added to .gitignore. WAL-mode journal files were being accidentally staged on some systems.v→ vX.X.X when GitHub has a strictly newer release. Previously showed a downward arrow when running ahead of the latest tag.Z icon via an inline SVG link. No external file required.…. A CSS property mismatch (flex:1 on a non-flex child) was causing mid-word clipping.get_memory calls bump_access_count on every read. Search results also expose access_count so the accessed N× label in the sidebar is accurate.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.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.py bumped to 1.0.3 and git tag v1.0.3 pushed so the GitHub Tags API reflects the current release.version.py now drives everything: FastAPI, /health, debug_protocol, and the version command. No more three different hardcoded strings./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.v1.0.1 → v1.1.0 if GitHub has a newer release.flock on Linux/WSL, atomic mkdir fallback on macOS. Hook now works correctly on all platforms.diary:YYYY-MM-DD-HHMM:host instead of diary:YYYY-MM-DD:host. Multiple sessions per day are preserved instead of being silently overwritten.head -c cap prevents megabytes of JSONL tool results being fed to claude -p.timeout 120 (or gtimeout on macOS) prevents a hung call from holding the lock indefinitely.zikra-lite product removed from installer, hooks, docs, and website. One product, one repo.g_zikra.md no longer has a localhost → zikra-lite branch that silently pulled stale hooks from the old repo.version command — returns {"version": "1.0.1", "server": "zikra"}. Accessible to any viewer role token. Aliases: ver, server_version.zikra-stats-update.sh fetches the server version each run and caches it in ~/.claude/cache/zikra-stats.json.(update if ●) with an orange dot when server version is not yet cached, prompting the user to run zikra update./mcp, compatible with Claude Desktop and Claude Code.g_zikra.md prompt sets up hooks, CLAUDE.md, and statusline in a single Claude Code session.DB_BACKEND=postgres for teams needing pgvector scale.Watch the repo for new releases. Every update ships through the same one-command installer.