{
  "markdown": "# ariadne\n\n**English** · **[Українська](README.uk.md)**\n\nA **native, local-first, multilingual memory server** for\n[Codex](https://github.com/openai/codex),\n[Claude Code](https://claude.com/claude-code), and any MCP client.\n[Go](https://go.dev/) +\n[Qdrant](https://qdrant.tech) + [bge-m3](https://huggingface.co/BAAI/bge-m3) —\nno Docker, no cloud, no API keys.\n\nPurpose-built for private coding-agent memory: a small native appliance rather\nthan a hosted, multi-tenant memory platform. The default path is offline and\ncross-lingual, with observable retrieval cost and no account dependency.\n\n[![Release](https://img.shields.io/github/v/release/mclaut/ariadne)](https://github.com/mclaut/ariadne/releases/latest)\n[![CI](https://github.com/mclaut/ariadne/actions/workflows/ci.yml/badge.svg)](https://github.com/mclaut/ariadne/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-11120f.svg)](LICENSE)\n\n**[Project site](https://mclaut.github.io/ariadne/)** ·\n**[Hugging Face Space](https://huggingface.co/spaces/mclaut/ariadne)** ·\n**[Latest release](https://github.com/mclaut/ariadne/releases/latest)**\n\nBuilt as a replacement for embedded vector-DB memory backends that crash or\nstarve under several concurrent MCP sessions. ariadne is a **server**: one\nQdrant handles concurrent writes natively, so the whole single-writer /\nlock-starvation class simply doesn't exist.\n\n## What's New in v0.8.16\n\n### Fixed\n\n- **Windows release checks include the launcher safely.** The macOS behavior\n  tests are now platform-scoped while release archives retain a Windows-safe\n  launcher stub, so every supported target builds and tests cleanly.\n\n### Added in v0.8.15\n\n- **Ariadne is now a real macOS application.** The installer creates a signed\n  `Ariadne.app` in the system Applications folder when writable, with a\n  user-level `~/Applications` fallback and a native project icon.\n- **One click restores the managed tray.** Finder, Spotlight, or Launchpad now\n  starts the existing tray LaunchAgent, re-registering its canonical plist when\n  needed without creating an unmanaged duplicate process.\n\n## Previously in v0.8.14\n\nv0.8.14 detached the confirmed macOS update helper from tray shutdown and made\nthe handoff observable in `update.log`.\n\n## Previously in v0.8.13\n\nv0.8.13 makes a consolidation deadline safe deferred work rather than a\nmaintenance failure, preserving every source diary with append-only deferred\nmetadata.\n\n## Previously in v0.8.12\n\nv0.8.12 bounded the maintenance supervisor, made schema-bound consolidation\nJSON deterministic for reasoning-capable Ollama models, and added exact,\nappend-only owner-approved credential trust.\n\n## Previously in v0.8.11\n\nv0.8.11 made the desktop tray truly single-instance, reconciled canonical and\nhistorical launchd ownership, preserved superseded plist files in an archive,\nand added real tray-process diagnostics.\n\n## Previously in v0.8.10\n\nv0.8.10 made token attribution auditable with lossless Qdrant pagination,\nrecallable-versus-history coverage, separated measured and estimated provenance,\nexplicit gap classification, and safe opt-in attribution backfill.\n\n## Previously in v0.8.9\n\n### Fixed\n\n- **Qdrant remains available with many concurrent agent sessions.** Each MCP\n  process now uses one persistent gRPC connection instead of the client\n  library's implicit pool of three, while the macOS launchd service receives an\n  explicit 8192-file descriptor limit instead of inheriting 256.\n- **Startup no longer hammers payload-index creation.** Ariadne inspects the\n  existing schema and creates only missing indexes. Real storage errors now\n  fail startup instead of being silently ignored.\n- **Every short-lived client closes cleanly.** Hooks, import, install, and\n  maintenance release their Qdrant connection when they finish.\n\n### Added\n\n- **Descriptor-pressure visibility.** `ariadnectl status`, the tray, and the\n  full-stack doctor report Qdrant's open descriptors and configured limit, with\n  a visible warning before exhaustion.\n\n## Previously in v0.8.8\n\n### Added\n\n- **Fail-closed remote Qdrant authentication.** Remote gRPC requires an API key\n  plus TLS; REST requires the same key and HTTPS. Long-running clients retain\n  only a protected key-file path, never the key value. An explicit insecure\n  override remains available for a user-managed SSH or equivalent tunnel.\n- **Honest retrieval comparison.** `cmd/eval` now calculates deterministic\n  macro Recall, MRR, and nDCG for judged BM25 and learned-sparse runs instead of\n  claiming a SPLADE improvement without corpus evidence.\n\n### Changed\n\n- **Metrics schema v3 scales without discarding history.** Every recall event\n  remains append-only, while an indexed 30-day path and transactional daily\n  rollups make lifetime totals bounded and fast. Existing v2 databases migrate\n  without changing raw rows or totals.\n- **Collection scans are complete.** Memfile reconciliation now pages through\n  every Qdrant point instead of relying on a fixed upper limit.\n- **Maintenance has a reusable core.** Bounded retry/backoff orchestration lives\n  in `internal/maintenance`; `ariadnectl` retains its established CLI and\n  activity semantics.\n\n### Fixed\n\n- **Remote settings survive installation and self-update.** macOS, Linux, and\n  Windows launchers propagate the same non-secret Qdrant transport settings;\n  explicit Windows installer arguments still take precedence.\n- **Repository tooling no longer compiles dependencies from `site/node_modules`.**\n  The site is a separate Go module, and `make clean` archives generated assets\n  with a recovery manifest instead of deleting them.\n\n## Previously in v0.8.7\n\n### Fixed\n\n- **Tray restart now works under launchd's restricted environment.** Ariadne\n  resolves Homebrew from standard macOS locations when `brew` is absent from\n  launchd's minimal `PATH`, so both Qdrant and Ollama actually restart.\n- **Restart always attempts recovery.** `ariadnectl restart` runs the start\n  phase even when stopping one service reports an error, then returns every\n  failure instead of leaving the stack down after a partial stop.\n- **The completion message survives the tray restart.** The verified result is\n  appended before the old tray exits; its launchd replacement displays the\n  final notification and appends a delivered marker.\n\n### Added\n\n- **Verified service operations.** The tray observes Qdrant and Ollama before\n  and after Start, Stop, or Restart, waits for the requested state, verifies PID\n  changes on restart, and refuses to report success while the collection is\n  unhealthy.\n- **Visible PID and operation diagnostics.** Tray rows and `ariadnectl status`\n  expose service PIDs; structured logs include duration, before/after state,\n  command output, and the exact verification failure.\n\n### Changed\n\n- **Conflicting controls are locked during service work.** Start, Stop,\n  Restart, maintenance, update, backup, and export cannot overlap while a\n  service action is in progress.\n- **Platform command errors keep their useful output.** macOS, Linux, and\n  Windows service-control failures now preserve stderr/stdout for diagnosis.\n\n## Previously in v0.8.6\n\n### Fixed\n\n- **Tray restarts are reliable on macOS.** A launchd-managed tray now asks its\n  supervisor for one clean replacement instead of racing a second menu-bar\n  process and occasionally leaving no icon.\n- **Service failures are reported honestly.** `start`, `stop`, and `restart`\n  propagate platform errors to the CLI and tray instead of displaying success.\n- **Claude upgrades no longer leave stale integration files.** The installer\n  validates and refreshes the shipped skill plus exact hook paths, matchers, and\n  timeouts.\n\n### Added\n\n- **Persistent recall across Claude context transitions.** Auto-recall now runs\n  for `startup`, `resume`, `clear`, `compact`, and `fork`, and injects an explicit\n  reminder to save durable decisions, gotchas, and verified outcomes immediately.\n\n### Changed\n\n- **Approval is always a deliberate click.** System warnings contain only\n  **Approve** and **Deny**; neither is default or focused, and Return/Enter or\n  Escape cannot decide or dismiss the request.\n- **Hook installation is update-aware.** Existing Ariadne hooks are updated in\n  place while unrelated Claude hooks are preserved.\n\n## Previously in v0.8.5\n\n**The macOS approval warning comes to the foreground.** The native dialog\nactivates before it is displayed, so an access request cannot sit unnoticed\nbehind the active coding window. Activation changes visibility, never authority.\n\n**Hugging Face publishing is valid.** The Space metadata stays within the Hub's\n60-character `short_description` limit.\n\n## Previously in v0.8.4\n\n**Approval requests now interrupt visibly.** A new cross-wing or protected-\nresource request opens a system warning dialog immediately instead of relying\non the tray badge and desktop notification alone. The dialog shows the bounded\nscope and purpose with **Approve**, **Deny**, and a safe-default **Later** action.\nClosing it, pressing Escape, or choosing Later grants nothing; a pending request\nis shown again after one minute. The tray queue remains available as a fallback\nand audit view.\n\nThe prompt uses the native macOS warning dialog, Windows system popup, or an\navailable KDialog/Zenity provider on Linux. Only an explicit Approve/Deny writes\nthe append-only decision record.\n\n## Previously in v0.8.3\n\n**Cross-project memory with a real human gate.** `all_wings: true` now creates a\npending request instead of searching. The Ariadne tray displays its active\nwing, purpose, and bounded query; only an Approve click issues a 15-minute grant\nscoped to that MCP client session, active wing, and collection. The client then\nretries with `approval_id`. Exact-ID cross-wing recall follows the same path.\n\n**Local context stays dominant.** After approval, external candidates receive a\n0.70 origin weight and normally occupy at most two of five results. Responses\nlabel local versus cross-wing origins and disclose the applied weight. The\nweight is applied after authorization and is never treated as permission.\n\n**Credentials require a second, one-time approval.** `credential_access`\ncreates an independent tray request for one exact source wing, target wing,\ncredential name/path, and purpose. Approval expires after five minutes and is\nconsumed once. Ariadne never reads or returns the value; requests, decisions,\nand consumptions remain as separate append-only audit records.\n\nFor a credential file the owner explicitly designates for repeated use, register\nan exact local binding once with `ariadnectl credential trust --source-wing ...\n--target-wing ... --resource ... --purpose ... --yes`. Future `credential_access` calls for\nthat exact tuple skip the popup while still appending a use record. `credential\nrevoke` disables the binding append-only;\nother resources and wing pairs remain default-deny.\n\n## Previously in v0.8.2\n\n**Project isolation is now default-deny.** Semantic `memory_recall` requires a\nproject `wing`; searching every project needs the explicit `all_wings: true`\nopt-in intended for a user-requested cross-project audit. Session hooks resolve\nthe nearest repository root and may use a stable `.ariadne-wing` marker, so a\nnested working directory cannot silently become a new namespace. The shared\nCodex and Claude Code skill also treats the active workspace as the filesystem\nboundary: a readable sibling project is not permission to borrow its `.env`,\ncredentials, endpoints, or configuration.\n\n**Credential material is blocked and quarantinable.** MCP saves and the store\nreject high-confidence private keys, credential URIs, known token formats, and\nexplicit secret assignments. Import and hook capture redact detected values,\nconsolidation validates output again, and recall excludes quarantined records\nwith defensive redaction on exact-ID output. `ariadnectl quarantine-secrets`\nperforms a metadata-only dry-run by default; `--apply` preserves the original\npayload, vector, and previous status while removing the record from normal\nrecall. `--apply --reconcile` can restore the previous status after detector\nrefinement without erasing the quarantine audit trail.\n\n## Previously in v0.8.1\n\n**One service owner, visible health.** Ariadne detects duplicate macOS Qdrant\njobs before they can hide behind a green HTTP health check. `ariadnectl`\nnormalizes start, stop, and installer ownership to one canonical job while\nretaining old plist files and every byte of memory history. The expanded doctor\nresolves the active immutable runtime, checks both Codex and Claude MCP paths,\nreports maintenance and launchd state, exposes attribution coverage, and warns\nabout runaway logs.\n\n**Maintenance that distinguishes retry from review.** Each captured session is\ncurated atomically before same-day outputs are coalesced and deduplicated. An\nindependent local quality pass rejects memories that fuse unrelated concerns,\nthen gives invalid model output one focused repair pass.\nTransient network and Ollama failures still receive bounded backoff;\ndeterministic schema, language, local-path, and quality failures become\nexplicit deferred work instead of replaying the whole stage. Unchanged sources\nare not retried again with the same model and pipeline revision. Source diaries\nremain active and append-only throughout, and safe deferred review does not\nmisreport otherwise successful maintenance as unhealthy.\n\n**A stronger curator without heavier capture.** Capture and consolidation can\nuse different local models through `ARIADNE_CONSOLIDATION_MODEL` and\n`ARIADNE_CONSOLIDATION_JUDGE_MODEL`. In a fixed 11-batch validation,\n`qwen2.5:7b` deferred five batches while `qwen2.5:14b` cleared all eleven. The\n14B curator is therefore the recommended local choice when memory permits;\ncapture can remain on a smaller model.\n\n**A resilient, explainable tray.** The macOS LaunchAgent restarts the tray after\nan abnormal exit but respects an explicit clean Quit. Lifecycle reasons are\nappended to the tray log, so a missing icon no longer leaves an empty forensic\ntrail. The installer also adds `Ariadne.app` to Applications; launching it from\nFinder, Spotlight, or Launchpad restores the managed tray without spawning an\nunmanaged duplicate.\n\n## Previously in v0.8.0\n\n**Scoped append-only memory lifecycle.** Identical text may exist independently\nin different projects and rooms. A move writes the destination record first and\nretains the original as superseded history. Session capture records actual event\nand capture times separately and assigns stable opaque source lineage. Daily\nconsolidation saves durable memories first, then archives source diaries by\nmetadata; it never deletes them. A first zero-output review remains active as\n`candidate_empty` and needs a later confirming pass after a grace period before\narchival. Normal recall hides archived/superseded records, while exact-ID lookup\nor `include_archived: true` provides an explicit audit path.\n\n**Conservative historical ranking.** Qdrant still supplies the dense+BM25 RRF\ncandidate set. A small bounded second pass adds source quality, explicit\ntemporal intent, and context-size signals. Old decisions and gotchas do not\ndecay merely because they are old; recency applies only when the query asks for\nthe latest/current/history-aware answer, and metadata cannot override a\nmaterial semantic lead.\n\n**Non-destructive, observable maintenance.** Memfile sync skips unchanged source\nrevisions before embedding, imports changed revisions before marking older\nchunks `superseded`, and preserves original observation timestamps; vanished\nsources become `orphaned`, not deleted. Consolidation is batch- and\ncontext-bounded, validates model output, and retains source diaries when any\npromotion fails. The runner retries transient failures with capped backoff,\nrecords append-only activity, and exposes failed, partial, stuck, or stale state\nin status and the tray. Backup rotation archives older snapshots.\n\n**Deterministic regression evaluation.** `go run ./cmd/eval` executes the\nmultilingual coding-memory ranking suite in `evaluation/coding-memory.json`\nwithout touching Qdrant or Ollama.\n\n## Previously in v0.7.0\n\n**Exact retrieval and immediate durable memory.** `memory_recall` now accepts an\nexact scoped-content `id`, so agents can retrieve and verify one memory without an\nembedding call or approximate ranking. Semantic recall can also be scoped by\nboth project (`wing`) and category (`room`).\n\nThe shared Ariadne skill now requires agents to save completed release,\ndeployment, migration, audit, incident-resolution, and verified-status reports\nto `reference` immediately when the outcome becomes known. This is proactive:\nthe agent does not wait for SessionEnd, PreCompact, daily consolidation, or a\nseparate “remember this” command. Decisions and hard-won gotchas follow the same\nimmediate-save discipline.\n\nToken metrics separate source-backed measurement from unknown delivery instead\nof treating every legacy recall as negative savings:\n\n- **measured saved/net** — source-backed context benefit after attributed cost;\n- **attribution coverage** — the share of observed recall cost with provenance;\n- **unattributed** — visible legacy/manual delivery with no invented benefit.\n\nThe tray shows measured savings, coverage, recall count, and unattributed cost.\n`ariadnectl metrics` and JSON retain the complete observed-cost counters.\n\n```json\n{\n  \"id\": \"2704862554782470108\"\n}\n```\n\n## Previously in v0.6.0\n\n**Automatic diary distillation.** SessionEnd capture writes one concise,\nlocal-model diary memory per substantive session. Daily maintenance revisits\ndiary entries older than 24 hours, groups them by project and day, and promotes\ndurable decisions with rationale, verified gotchas, critical constraints, and\nimportant open risks. Source chronology remains archived for audit instead of\nbeing discarded.\n\nThe process is fail-safe and append-only: Ariadne creates a due weekly Qdrant\nsnapshot before archival, saves every distilled memory, then marks the source\ngroup archived. A first empty pass stays active for later confirmation, and a\nfailure leaves the source group active for retry. The summary endpoint remains\nlocal-only unless remote capture is explicitly enabled.\n\nPreview or run it manually:\n\n```bash\nariadnectl consolidate --before 24h --dry-run\nariadnectl maintenance  # memfile sync + consolidation, with bounded retries\nariadnectl consolidate --before 24h  # consolidation only\nariadnectl requeue-empty --dry-run  # inspect records archived by the legacy one-pass empty policy\n```\n\nThe installer schedules the 04:30 daily memory maintenance job on macOS and\nLinux. A failed stage is retried up to three times with bounded exponential\nbackoff; partial import failures return non-zero and block consolidation.\nsystemd uses `Persistent=true`; a loaded launchd calendar agent receives one\ncatch-up start after the Mac wakes when a scheduled time was missed. The tray\nshows the latest outcome, warns when maintenance failed, remains partial, is\nstuck, or is older than 36 hours, and offers **Run maintenance now**. A\n`complete_with_deferred` outcome remains observable without turning the service\nindicator orange. Output is written to `~/.ariadne/logs/maintenance.log`;\nappend-only outcomes live in\n`~/.ariadne/state/activity.jsonl`.\n\n## Previously in v0.5.0\n\n- **Explicit Windows client integration** — the installer detects Claude Code\n  and Codex CLI, then asks which one to configure. It never creates settings for\n  an absent client and non-interactive installs require an explicit choice.\n- **Core-only and configure-later modes** — install the local Ariadne stack with\n  `-CoreOnly`, then connect Claude or Codex later with `-ConfigureClients`.\n  Consent-gated updates preserve existing client configurations unchanged.\n- **Physical and VM preflight** — PowerShell now reports Windows, CPU, RAM, disk,\n  and machine type; enforces the default models' minimum resources; gives\n  Proxmox/KVM CPU guidance; and directly executes `qdrant.exe --version` before\n  registering the service.\n\n## What's New in v0.4.0\n\n- **Local token-efficiency metrics** — Ariadne estimates confirmed savings,\n  recall overhead, and signed net context benefit for automatic and MCP recalls. Totals are\n  available through `ariadnectl metrics`, its JSON form, and the tray menu.\n- **Content-free accounting** — only numeric counters and opaque event hashes\n  are stored locally. Repeated hook delivery counts as overhead without claiming\n  the same represented session context twice.\n\n## What's New in v0.3.1\n\n- **Clean Windows prerequisite repair** — the installer now detects the\n  Microsoft Visual C++ Runtime required by the official Qdrant Windows binary.\n  When it is missing or older than 14.44, Ariadne downloads Microsoft's\n  official redistributable, verifies its Authenticode signer, and requests\n  administrator approval for that prerequisite only.\n- **Actionable Qdrant failures** — startup gets a full 60-second window, loader\n  and process errors are preserved in `~/.ariadne/logs/qdrant.log`, and the\n  installer prints the scheduled-task result plus the last log lines instead of\n  returning only a generic timeout.\n- **Real Windows Qdrant coverage** — CI now downloads the exact pinned Qdrant\n  archive, verifies its SHA-256 digest, starts it with Ariadne's loopback/storage\n  settings, and waits for `/healthz` on a Windows runner.\n\n## What's New in v0.3.0\n\n- **Native Windows installation** — `install.ps1` installs release binaries,\n  native Qdrant, signed Ollama, user-level startup tasks, Codex/Claude Code MCP\n  bindings, the skill, and session hooks. Docker is not required; administrator\n  approval is needed only when Windows lacks Qdrant's Microsoft VC++ Runtime.\n- **Windows self-updates** — the version-aware tray now offers the same explicit\n  confirmation and automatic restart flow on Windows as on macOS and Linux.\n- **Five release targets** — Windows x64, Linux x64/ARM64, and macOS\n  Intel/Apple Silicon archives are built from tags by GitHub Actions.\n- **Verifiable artifacts** — releases include SHA-256 checksums, a CycloneDX\n  SBOM, and a keyless Sigstore bundle for the checksum manifest.\n- **MCP discovery** — a cross-platform MCPB and `server.json` are generated from\n  the release binaries and published to the official MCP Registry with GitHub\n  OIDC.\n- **Public project site and launch kit** — structured metadata, `llms.txt`,\n  platform installation paths, architecture, security notes, and ready-to-use\n  launch copy make Ariadne easier for both people and AI systems to discover.\n\n## Why\n\n- **Stable** — Qdrant server, not an embedded HNSW that SIGSEGVs on compaction.\n- **Multilingual** — bge-m3 covers 100+ languages; cross-lingual recall works\n  (an English query finds Ukrainian notes, cosine ~0.8–0.94 across uk/ru/en/es/\n  de/it/pl/ro/hu/lt/lv/et/fi/fr/ar).\n- **Hybrid search** — dense (bge-m3) + BM25 sparse (pure Go tokenizer; Qdrant\n  computes IDF server-side) fused with RRF, followed by a bounded historical-\n  quality rerank. Exact terms/codes/names rank sharply; explicit temporal queries\n  prefer the correct dated event without blindly decaying durable decisions.\n- **Default-deny scoped recall** — semantic searches require a project (`wing`)\n  and may be narrowed further by category (`room`). Cross-project recall needs\n  an explicit purpose plus a human-approved tray request.\n- **Native** — Qdrant binary + Ollama on Windows, macOS, and Linux; supported\n  NVIDIA/AMD acceleration, Metal on Apple Silicon, and a CPU fallback.\n\n## Components\n\n| Path | What |\n|---|---|\n| `cmd/ariadne` | MCP server (stdio). Tools: `memory_save`, `memory_recall`, `credential_access`, `memory_delete`, `memory_move`. |\n| `cmd/import` | Backfill from a chromadb sqlite, markdown memory files or JSONL (batched embeds). |\n| `cmd/hook` | Claude Code session hooks (`ariadne-hook`): SessionStart auto-recall plus SessionEnd/PreCompact auto-capture. |\n| `cmd/install` | One-shot installer (macOS/Linux): preflight, reuse-or-install Qdrant, services, MCP, skill, hooks. Windows uses `install.ps1`. |\n| `cmd/ariadnectl` | Control + health core: status/metrics, lifecycle, backup/restore/export, maintenance/consolidation, quarantine and approval inspection. |\n| `cmd/eval` | Read-only ranking regressions and judged retrieval-run comparison. |\n| `internal/store` | Storage core: embed (Ollama), BM25 sparse, Qdrant hybrid. |\n| `internal/maintenance` | UI-independent bounded retry engine for maintenance stages. |\n| `internal/qdrantauth` | API-key loading and fail-closed remote Qdrant transport policy. |\n| `internal/retrievaleval` | Recall/MRR/nDCG scoring for comparable ranked runs. |\n| `cmd/ariadne-tray` | Cross-platform tray monitor (macOS/Linux/Windows) — pure-Go, localized, over the `ariadnectl` core. |\n| `skills/ariadne` | Codex and Claude Code skill: scoped recall/save discipline + `doctor.sh`/`recall.sh`. |\n| `deploy/` | LaunchAgent / systemd templates: Qdrant service, daily memfiles-sync, tray autostart. |\n| `poc/` | Standalone experiments that validated the stack. |\n\n## Setup\n\n### Windows\n\nOpen PowerShell as your regular user. Download the script first so it remains\ninspectable before execution:\n\n```powershell\nirm https://raw.githubusercontent.com/mclaut/ariadne/main/install.ps1 -OutFile install.ps1\npowershell -ExecutionPolicy Bypass -File .\\install.ps1\n```\n\nThe Windows installer downloads the matching GitHub Release archive and checks\nit against `SHA256SUMS`. If Ollama is missing, it downloads the official\n`OllamaSetup.exe`, verifies that its Authenticode signer is **Ollama Inc.**, and\ninstalls it without elevation. It installs the pinned native Qdrant x64 asset\nafter verifying its SHA-256 digest, registers Qdrant and `ariadne-tray` as\ncurrent-user scheduled tasks, pulls `bge-m3` and the summary model, then\noffers to register Ariadne with the detected Codex and/or Claude Code CLI.\nClient configuration is always explicit: the installer never creates settings\nfor software that is not installed.\n\nChoose an integration directly for unattended setup, install only the core, or\nconfigure clients later:\n\n```powershell\n.\\install.ps1 -Yes -Integration Claude\n.\\install.ps1 -Yes -Integration Codex\n.\\install.ps1 -Yes -Integration Both\n.\\install.ps1 -Yes -CoreOnly\n.\\install.ps1 -ConfigureClients -Integration Codex\n```\n\n`-Integration None` and `-CoreOnly` leave all client configuration untouched.\nTray-driven updates also preserve existing client settings; they do not enroll\na newly discovered client during an update.\n\nThe official Qdrant Windows binary requires Microsoft Visual C++ Runtime 14.44\nor newer. Ariadne checks it before starting Qdrant. If it is absent or outdated,\nthe installer downloads the official Microsoft x64 redistributable, verifies\nthe Microsoft Authenticode signer, and Windows requests administrator approval\nfor that prerequisite. Rerun the same install command after a cancelled prompt.\nIf Qdrant still cannot start, the installer prints diagnostics and the tail of\n`~/.ariadne/logs/qdrant.log` directly in PowerShell.\n\nQdrant installed by Ariadne is always bound to `127.0.0.1`. An intentionally\nreused remote Qdrant can be configured without putting its key in client files:\n\n```powershell\n.\\install.ps1 -QdrantHost qdrant.example -QdrantRestPort 6333 `\n  -QdrantGrpcPort 6334 -QdrantApiKeyFile C:\\secure\\qdrant.key -QdrantTls\n```\n\nThe installer validates the authenticated health endpoint and propagates only\nthe key-file path and transport settings to Codex, Claude, hooks, and the tray.\n`-AllowInsecureRemoteQdrant` is the explicit exception for an independently\nencrypted private tunnel. Ollama remains managed by its native Windows app and\nserves `http://localhost:11434`. Requirements: Windows 10 22H2\nor newer, x64, Windows PowerShell 5.1+, at least 8 GiB RAM and 15 GiB free disk\nfor the default local models (16 GiB RAM recommended, 4+ CPU cores preferred).\nVirtual machines need the same guest resources; for Proxmox/KVM expose a modern\nCPU type such as `host`. The installer prints the detected hardware before any\ndownload and validates that `qdrant.exe` can execute on the machine.\nUse `-SkipOllama` or `-SkipModels` when those dependencies are provisioned\nseparately.\n\n### One command (Linux + macOS)\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/mclaut/ariadne/main/install.sh | sh\n```\n\n### Upgrading an existing installation\n\nThe tray checks GitHub Releases every six hours and, after confirmation,\ninstalls the exact selected release. On macOS, every v0.8.16-or-newer installer\nalso creates or refreshes `Ariadne.app` in Applications, so future updates keep\nthe app, launcher, tray, and command-line binaries aligned.\n\nIf the currently running tray is **v0.8.13 or older**, its pre-v0.8.14 update\nhandoff may close before the installer starts. Use this pinned command once:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/mclaut/ariadne/v0.8.16/install.sh | sh\n```\n\nYour existing Qdrant collections, backups, settings, and logs are reused. After\nv0.8.16 is active, normal consent-gated updates from the tray work again. If an\nupdate needs diagnosis, inspect `~/.ariadne/logs/update.log`.\n\nNothing by hand: `install.sh` bootstraps Go and the source (GitHub tarball — no\ngit needed), then runs the installer below, which auto-installs Ollama, Qdrant,\nthe models, the services, and — on Linux — the tray plus its desktop deps. Pass\ninstaller flags straight through, e.g. a lighter summary model or a preview:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/mclaut/ariadne/main/install.sh | sh -s -- -summary-model qwen2.5:3b\ncurl -fsSL https://raw.githubusercontent.com/mclaut/ariadne/main/install.sh | sh -s -- -dry-run\ncurl -fsSL https://raw.githubusercontent.com/mclaut/ariadne/main/install.sh | sh -s -- -strict-supply-chain\n```\n\n(sudo — for distro packages and the official Ollama installer on Linux —\nprompts on the terminal, so the pipe is fine.)\n\nSupply-chain defaults are pinned: `install.sh` installs `go1.26.2` unless\n`ARIADNE_GO_VERSION` is set, verifies the Go tarball SHA256 before unpacking,\nand the Go installer installs Qdrant from a pinned `-qdrant-version` release\n(default `v1.18.2`) after checking the GitHub release-asset digest. For locked\ndown environments, pass `-strict-supply-chain`; on Linux this refuses the\nOllama `curl | sh` bootstrap and asks you to install Ollama manually first.\n\n#### Linux and Ollama\n\nAriadne uses Ollama for `bge-m3` embeddings and, when session hooks are enabled,\nfor the local summary model. An existing local Ollama installation is reused.\nIf the `ollama` command is missing, the default installer runs Ollama's official\nLinux install script, waits for `http://localhost:11434` to become ready, then\npulls `bge-m3` and the configured summary model.\n\nIf Ollama is installed but its daemon is stopped, start it before running the\nAriadne installer:\n\n```bash\nsudo systemctl enable ollama\nsudo systemctl start ollama\nsudo systemctl status ollama\ncurl -fsS http://127.0.0.1:11434/api/version\n```\n\nOn Linux, Ollama remains a system service owned by the OS. The\n`ariadnectl start`, `ariadnectl stop`, and `ariadnectl restart` commands manage\nAriadne's Qdrant user unit and deliberately leave Ollama alone. On systems\nwithout systemd, run `ollama serve` under the local service manager instead.\nSee Ollama's official\n[Linux installation guide](https://docs.ollama.com/linux) for manual packages,\nARM64, NVIDIA, and AMD/ROCm setup.\n\nWith `-strict-supply-chain`, Ariadne never runs Ollama's `curl | sh` installer.\nInstall and start Ollama yourself, then rerun Ariadne. `-skip-deps` also leaves\nOllama and the Linux tray dependencies entirely to you. To reuse Ollama on\nanother machine, provision the required models there and pass\n`-ollama http://host:11434` together with `-skip-model-pull`.\n\n### From a clone (macOS/Linux, or to hack on it)\n\n```bash\ngo run ./cmd/install -dry-run   # preflight + plan, changes nothing\ngo run ./cmd/install -yes       # do it\n```\n\nThe installer is deliberately careful with existing infrastructure:\n\n- **An already-running Qdrant is REUSED, never restarted or reconfigured** —\n  Ariadne only adds its own collection. A busy port that is *not* Qdrant aborts\n  the install. Use `-qdrant-host/-qdrant-rest/-qdrant-grpc` to point at a\n  remote instance, `-ollama` for a remote embedder. Remote Qdrant is\n  fail-closed unless API-key authentication and TLS are configured (or the\n  explicit insecure override is set for an already-encrypted private tunnel).\n- **GPU / RAM / disk are checked up front** and insufficiencies are stated\n  plainly (no GPU → an honest \"embeddings on CPU, ~10x slower\" warning;\n  <6GiB RAM or <5GiB disk → hard FAIL).\n- Idempotent: re-running skips everything that is already in place.\n\nIt installs the Qdrant binary + service (macOS LaunchAgent / Linux systemd\nuser unit, loopback-only), builds the Go binaries into `~/.ariadne/bin`,\npulls `bge-m3`, creates the collection, registers the MCP server in\n`~/.claude.json` (backup kept) and installs the Claude Code skill.\nCodex and other MCP clients can use the same installation by registering\n`~/.ariadne/bin/ariadne` as a stdio MCP server.\n\n### Release archives and MCPB\n\nEvery stable release includes native archives for five targets, a portable\ncross-platform `.mcpb`, `server.json`, `SHA256SUMS`, a CycloneDX SBOM, and a\nSigstore bundle. The MCPB contains the MCP server for all supported platforms;\nQdrant and Ollama still need to be installed by the native OS installer first.\nSee [GitHub Releases](https://github.com/mclaut/ariadne/releases/latest) for\nmanual downloads and verification files.\n\n### Manual setup (macOS example)\n\nThe **runtime lives in `~/.ariadne`** (binaries, data, backups, logs) — the repo\nholds only source. On macOS this is not just taste: launchd agents **cannot**\nexec programs or write logs under `~/Desktop`/`~/Documents` (TCC) — they die\nwith `EX_CONFIG` and empty logs. Keep the runtime out of those folders.\n\n```bash\nmkdir -p ~/.ariadne/{bin,backups,logs}\n\n# 1. Qdrant (native binary — no Docker)\ncurl -sL https://github.com/qdrant/qdrant/releases/latest/download/qdrant-aarch64-apple-darwin.tar.gz \\\n  | tar xz -C ~/.ariadne/bin\n\n# 2. Ollama + bge-m3 (native, Metal)\nbrew install ollama && brew services start ollama\nollama pull bge-m3\n\n# 3. Build + install\ngo build -o ~/.ariadne/bin/ariadne    ./cmd/ariadne\ngo build -o ~/.ariadne/bin/ariadnectl ./cmd/ariadnectl\ngo build -o ~/.ariadne/bin/import     ./cmd/import\n\n# 4. Qdrant as a service (see the TCC note above)\nsed \"s|__HOME__|$HOME|g\" deploy/com.ariadne.qdrant.plist > ~/Library/LaunchAgents/com.ariadne.qdrant.plist\nlaunchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.ariadne.qdrant.plist\n\n# 5. Register with Claude Code — add to ~/.claude.json mcpServers:\n#   \"ariadne\": { \"type\": \"stdio\", \"command\": \"<home>/.ariadne/bin/ariadne\" }\n```\n\n**Security:** Qdrant has no auth by default — the template pins it to\n`127.0.0.1` (`QDRANT__SERVICE__HOST`). Never expose it on the LAN: your\nmemories are stored in plaintext payloads. For an intentional remote Qdrant,\nset an admin or collection-scoped API key on the server and configure Ariadne\nwith `ARIADNE_QDRANT_API_KEY_FILE` (recommended, mode `0600`) or the\nprocess-only `ARIADNE_QDRANT_API_KEY`, plus `ARIADNE_QDRANT_TLS=1`. The Go\nclient sends the key through gRPC metadata and every Qdrant REST request uses\nthe `api-key` header. Qdrant itself recommends TLS whenever an API key is used.\nThe installer accepts the file form so generated MCP configuration retains\nonly a path, never the secret value; generated maintenance, hook, and tray\nlaunchers receive the same non-secret client settings. `ARIADNE_QDRANT_ALLOW_INSECURE_REMOTE=1`\nis an explicit escape hatch for a separately encrypted transport such as a\nprivate tunnel; it must not be used on an ordinary LAN.\n\nConfig via env (defaults in brackets): `ARIADNE_QDRANT_HOST` [localhost],\n`ARIADNE_QDRANT_PORT` [6334], `ARIADNE_QDRANT_REST`\n[http://localhost:6333], `ARIADNE_QDRANT_API_KEY_FILE`,\n`ARIADNE_QDRANT_API_KEY`, `ARIADNE_QDRANT_TLS` [0],\n`ARIADNE_QDRANT_ALLOW_INSECURE_REMOTE` [0], `ARIADNE_OLLAMA`\n[http://localhost:11434], `ARIADNE_MODEL` [bge-m3],\n`ARIADNE_COLLECTION` [ariadne].\n\n## Codex and Claude Code skill\n\n`skills/ariadne/` teaches agents when to recall, what (not) to save, and\nhow to operate the stack; `tools/doctor.sh` checks the whole chain\n(binaries → services → model → collection → binding → MCP registration) and\n`tools/recall.sh \"query\"` does CLI recall without MCP. Install (a real copy —\nsymlinked skills are not discovered at session start):\n\n```bash\ncp -R skills/ariadne ~/.claude/skills/ariadne\ncp -R skills/ariadne ~/.codex/skills/ariadne\n```\n\n## Session hooks — auto-recall & auto-capture\n\nThe installer registers two Claude Code lifecycle hooks (`cmd/hook`, binary\n`ariadne-hook`; skip with `-skip-hooks`):\n\n- **SessionStart → auto-recall.** When a session starts in a project that HAS\n  memories (wing = the nearest project root or its `.ariadne-wing` marker), the\n  top hits are injected as context —\n  Claude \"remembers\" the project before your first message. Projects without\n  memories start completely clean; failures are silent and never block the\n  session.\n- **SessionEnd → auto-capture.** A detached worker (session exit is never\n  blocked) parses the transcript, extracts deterministic facts (branch,\n  commits, duration) and asks a **local Ollama chat model** to write a 4–8\n  sentence summary — decisions with reasons, fixes, open items. ONE curated\n  diary memory per session; raw transcripts are never stored. Trivial sessions\n  are skipped (min-turns guard + the summarizer can answer `SKIP`).\n  Log: `~/.ariadne/logs/capture.log`.\n\nConfig via env: `ARIADNE_CAPTURE=0` disables capture,\n`ARIADNE_SUMMARY_OLLAMA` [defaults to `ARIADNE_OLLAMA` or localhost],\n`ARIADNE_SUMMARY_MODEL` [qwen2.5:7b], `ARIADNE_CAPTURE_MIN_TURNS` [3]. The\nsummary endpoint must be local by default; if you deliberately want a remote\nsummary model, set `ARIADNE_SUMMARY_OLLAMA` and `ARIADNE_CAPTURE_REMOTE=1`\nbecause condensed transcript text is sent to that endpoint for summarization.\nThe summary model is loaded only for capture and unloaded right after\n(`keep_alive:0`), so it costs RAM only briefly; for a smaller footprint set\n`ARIADNE_SUMMARY_MODEL=qwen2.5:3b` (~2GB vs ~4.7GB, at some summary quality) —\nor pass `-summary-model` to the installer so it pulls that one.\n\nConsolidation can use a stronger model without increasing capture latency:\n`ARIADNE_CONSOLIDATION_MODEL` falls back to `ARIADNE_SUMMARY_MODEL`, while\n`ARIADNE_CONSOLIDATION_JUDGE_MODEL` falls back to the consolidation model. A\n24GB machine can run `qwen2.5:14b` (~9GB) for both roles; validate it with a\ndry-run before changing scheduled maintenance.\n\n### Daily diary consolidation\n\n`ariadnectl consolidate` turns short-lived session chronology into compact\nlong-term knowledge. It selects `room=diary` entries older than 24 hours by\ndefault, processes each captured session atomically, then coalesces and\ndeduplicates validated same-day outputs within each project (`wing`). The\nconfigured local consolidation model emits only `decisions`, `gotchas`, and\n`reference` memories. Requests are split to a bounded source-token budget.\nAn empty result first marks the source `candidate_empty`; only a later empty\npass after the default seven-day grace period may archive it as\n`empty_confirmed`.\n\nAutomatic consolidation creates a native Qdrant backup only when archival is\nneeded and the latest backup is older than seven days (override with\n`ARIADNE_BACKUP_MIN_INTERVAL`); manual `ariadnectl backup` is unconditional.\nNew memories are saved before source diary entries are marked archived; source\ntext and vectors remain intact. Deterministic failures remain active and receive\na model-and-pipeline revision marker, so unchanged input is reconsidered only\nafter the model or curation pipeline changes. Use `--before 48h` for a longer\nreview window or `--dry-run` to inspect output without changing either the store\nor production activity history. Search history with `include_archived: true`. Remote summary endpoints\nremain blocked unless `ARIADNE_CAPTURE_REMOTE=1` is explicitly set.\n\n### Coding-memory evaluation\n\nThe checked-in suite exercises historical ranking invariants without a live\ndatabase or model:\n\n```bash\ngo run ./cmd/eval -cases evaluation/coding-memory.json\n```\n\nIt currently covers recency for explicitly temporal queries, no blind decay for\ndurable decisions, semantic-dominance bounds, oversized legacy payloads, source\nquality, and multilingual temporal intent. To compare actual BM25 and\nlearned-sparse outputs, export their ordered point IDs for the same judged\nqueries and run:\n\n```bash\ngo run ./cmd/eval \\\n  -retrieval-runs evaluation/retrieval-runs.example.json \\\n  -baseline bm25\n```\n\nThe comparison reports macro-averaged Recall, MRR, nDCG, and nDCG delta at each\ncutoff; `-json` emits machine-readable scores. The checked-in file is an\nillustrative schema, not product evidence. A real conclusion requires frozen\nrelevance judgments and runs from the same corpus, query set, filters, and\ncutoffs. The evaluator never contacts Qdrant, Ollama, or a remote model and\nnever mutates memory.\n\n## Monitor\n\nA tray/menu-bar monitor polls `ariadnectl status -json` every 5s and shows a\ngreen/orange/red/grey icon, per-service detail, and start/stop/restart/backup\nactions; it notifies when a service drops. The menu and tooltip show the current\nAriadne version. A background check queries GitHub Releases every six hours and\noffers a consent-gated update when a newer stable version exists on Windows,\nmacOS, and Linux; update output is written to\n`~/.ariadne/logs/update.log`. The `ariadne-tray` UI is localized —\n**7 languages** (English, Українська, Deutsch, Italiano, Español, Français,\nPolski) with a live **🌐 Language** switcher that shows the active one at a\nglance. The choice persists in `~/.ariadne/lang` and `ariadnectl` follows it, so\nthe whole interface stays in one language. Adding a language is one block in\n`internal/i18n`.\n\n### Estimated token savings\n\nAriadne locally tracks how much observed recall context it delivers and how\nmuch bounded source context each attributed memory represents. The tray shows\nall-time measured savings, attribution coverage, recall count, and\nunattributed delivery; the full counters are available as:\n\n```bash\nariadnectl metrics\nariadnectl metrics -json\n```\n\nFor source-backed recalls, measured net is represented source context minus the\nattributed share of the complete observed cost (query plus response). Recalling\nthe same memory twice in one client session credits its source only once while\ncounting both deliveries. Legacy/manual memories without source-size metadata\nreceive no invented benefit: their cost is reported separately as\n`unattributed`, not as negative overhead. `memory_save` accepts optional\n`source_tokens` for integrations that know a bounded source size and\n`occurred_at` for historical facts; capture and\nconsolidation populate provenance automatically. The deterministic multilingual\nestimate uses UTF-8 bytes because exact tokenizers vary by client and model; `~`\nmarks a conservative context-reuse estimate, not provider billing or an A/B\ncounterfactual. Metrics contain only numeric counters and opaque hashes, never\nmemory or transcript text, and stay in `~/.ariadne/metrics.db` with user-only\npermissions. Raw events remain append-only; schema v3 maintains transactional\ndaily summaries for bounded lifetime reads and indexes the rolling time window.\nSet `ARIADNE_METRICS=0` to disable new records.\n\n- **`ariadne-tray`** (pure-Go, `fyne.io/systray`) is the monitor on every\n  platform: the installer builds it into `~/.ariadne/bin` and registers autostart\n  — a `~/.config/autostart` entry on Linux, a `com.ariadne.tray` LaunchAgent on\n  macOS (migrating off any older Swift monitor so you get one icon). On Linux it\n  needs a StatusNotifierItem host (native on KDE/XFCE; on GNOME install the\n  \"AppIndicator and KStatusNotifierItem\" extension). On Windows it starts from\n  a current-user scheduled task and updates through the signed release archive.\n\n## Backup & portability\n\nTwo distinct concepts:\n\n- **Backup / restore** — a fast, full, native Qdrant snapshot (includes vectors;\n  one-to-one restore, tied to the embedding model). For recovering after damage.\n  ```bash\n  ariadnectl backup            # 10 recent snapshots; older ones move to backups/archive\n  ariadnectl restore <file>    # recover the collection from a snapshot (destructive)\n  ```\n- **Export / import** — portable JSONL with text, scope, provenance, historical\n  status, timestamps, and source accounting (no vectors, so it moves between\n  machines and re-embeds with any model). For migration/inspection.\n  ```bash\n  ariadnectl export [file]                        # all memories → JSONL\n  import -source jsonl -file export.jsonl           # re-embed + upsert an export\n  ```\n\n`import` also backfills from an archived chromadb sqlite\n(`-source chroma -db <file>`) or markdown memory files (`-source memfiles`).\nAll imports are idempotent within a `(wing, room, text)` scope; identical text\nmay intentionally exist in different projects or rooms. For memfiles, `-sync`\nuses a privacy-safe source key and relative source path, skips unchanged files\nbefore embedding, imports a changed revision first, preserves original event\ntime, marks prior chunks `superseded`, and marks chunks from vanished sources\n`orphaned`; it does not delete their history. The\ninstaller registers a daily agent\n(`com.ariadne.sync` / `ariadne-sync.timer`) that runs retry-bounded memfile sync\nplus diary consolidation for you; use `ariadnectl maintenance` or the tray\nbutton after large note edits. The\n`-force` flag is reserved for an explicit migration/repair pass; routine sync\nmust omit it so unchanged revisions stay out of the embedding queue.\n\n## Status\n\nv0.8.16 — current release. The macOS installer adds a signed `Ariadne.app` with\na native icon to Applications, and one click restores or re-registers the\nmanaged tray LaunchAgent. macOS-only launcher tests are platform-scoped so the\nfull Windows CI gate also passes.\n\nv0.8.14 made macOS tray update helpers run independently before\nthe tray exits and append explicit handoff diagnostics, preventing a confirmed\nupdate from silently leaving its installer unused.\n\nv0.8.13 made a bounded consolidation deadline safely deferred\nwith a fresh persistence context, so unchanged source diaries remain intact and\nthe tray reports a healthy `complete_with_deferred` outcome instead of a false\nmaintenance failure. v0.8.12 added exact owner-approved credential trust with\nappend-only trust, use, and revocation records; deterministic JSON-only\nconsolidation for reasoning-capable Ollama models; and a 20-minute maintenance\nsupervisor deadline that prevents a wedged scheduled child from remaining\nactive for hours. Also includes cross-platform single-instance tray enforcement,\ncanonical launchd ownership reconciliation, history-preserving legacy plist archival,\nand actual tray-process diagnostics; lossless Qdrant attribution pagination, recallable-versus-history\ncorpus accounting, measured-versus-estimated provenance, explicit safe attribution backfill,\nand bounded agent-side source accounting; single-connection MCP clients, launchd descriptor capacity,\npayload-index reconciliation, graceful Qdrant client shutdown, and descriptor-pressure diagnostics;\nfail-closed remote Qdrant authentication, append-only metrics v3 rollups,\ncomplete paginated collection scans, deterministic BM25/learned-sparse evaluation,\nreusable maintenance orchestration, and reversible site cleanup; verified Qdrant/Ollama lifecycle operations, launchd-safe Homebrew resolution,\ndurable post-restart notifications, PID observability, conflict-free service controls,\ndeliberate two-button approval warnings, reliable supervised tray restarts,\nhonest service-control errors, persistent Claude recall across context transitions, update-aware hooks and skills,\nforeground macOS approval warnings, human-approved cross-wing recall, origin weighting,\none-time credential grants, append-only approval audit, default-deny project recall, deterministic credential\nblocking/redaction, append-only secret quarantine, stable project markers,\nruntime ownership diagnostics, repair-aware maintenance,\ntray lifecycle logging, truthful full-stack doctor checks, exact ID retrieval,\nroom-scoped hybrid recall, append-only\nsource history, conservative temporal ranking, scoped identities, incremental\ntimestamp-safe memfile sync, two-pass empty consolidation, retry-bounded\nmaintenance with history/storage observability, immediate\ndurable reference/report capture, honest token-efficiency accounting, automatic\ndaily diary distillation, explicit Windows client setup,\nlocal token-efficiency metrics,\nnative desktop installation,\nsession hooks (auto-recall + curated auto-capture), and time-ordered diary are\nall live; several thousand memories are in daily use. Bulk import batches\nembeddings for a large backfill speedup. A\nlearned-sparse upgrade (bge-m3 SPLADE on a CUDA box) is optional if BM25 proves\ntoo weak for morphology-rich languages.\n\n## Contributing and security\n\nReproducible bug reports, native Windows installer feedback, and focused feature\nrequests are welcome through the\n[issue chooser](https://github.com/mclaut/ariadne/issues/new/choose). Setup and\nusage questions belong in [GitHub Discussions](https://github.com/mclaut/ariadne/discussions).\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for local checks and pull request guidance.\n\nGenerated site artifacts can be cleared from the working tree without data\nloss: `make clean` moves build output to `~/.ariadne/archive/site/` with a\nrecovery manifest, while `make clean-all` includes `site/node_modules`.\n\nDo not open a public issue for a vulnerability. Follow [SECURITY.md](SECURITY.md)\nand use GitHub's private vulnerability reporting instead.\n\n## Contributors\n\n- **Project maintainer** — architecture, product direction, validation, and\n  release decisions.\n- **[OpenAI Codex](https://github.com/codex)** — implementation, tests,\n  documentation, cross-platform packaging, and release engineering.\n- **[Claude Code](https://github.com/claude)** — implementation, localization,\n  installer hardening, and cross-platform runtime improvements.\n\nAll AI-assisted changes are reviewed and approved by the maintainer.\n\n## License\n\nMIT\n",
  "bytes": 50563,
  "sha": "fed6867bea162d88df47badc36c2f90b6d3395dcb79b4906b14788b312110d44",
  "repo_slug": "mclaut/ariadne",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_mclaut_ariadne_419c5f5d/readme"
}