by alex09x
Git-backed shared memory for AI agent fleets: searchable knowledge base, incident and task tracking, every write versioned and attributed. CLI, HTTP API and MCP server.
# Add to your Claude Code skills
git clone https://github.com/alex09x/kybLast scanned: 10/20/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-10-20T09:10:11.266Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}See how kyb compares with popular alternatives.
kyb is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by alex09x. Git-backed shared memory for AI agent fleets: searchable knowledge base, incident and task tracking, every write versioned and attributed. CLI, HTTP API and MCP server. It has 138 GitHub stars.
Yes. kyb passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/alex09x/kyb" and add it to your Claude Code skills directory (see the Installation section above).
kyb is primarily written in Rust. It is open-source under alex09x on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh kyb against similar tools.
No comments yet. Be the first to share your thoughts!
30 days in the Featured rail · terms & refunds
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
Automated security scan — not a certification.
The shared memory your AI agent fleet keeps forgetting it needs.
A git-backed, searchable knowledge base and incident tracker for fleets of AI agents. Which servers exist, how services are wired, what broke and how it ended — the operational truth that survives between sessions and across machines.
Website · By Alexander Panasenko
Quick start · How it works · Incidents · Agent skill · MCP · Web UI · HTTP API · Citation
Agents forget everything between sessions. Multiple agents — Claude Code, Codex, Antigravity — on multiple machines rediscover the same infrastructure over and over, and every hard-won incident lesson evaporates the moment the context window closes.
KYB is the shared memory that survives: which servers exist and what runs on them, how services are wired, how they deploy, which decisions were made and why — plus incident reports: what broke, the impact, how to live with it, and how it ended.
knowledge/, incidents/ or tasks/ by kind — one commit per change,
a commit sha is a version id. History, diff and rollback come for free; the canon can
be read and edited with any text editor. (Flat pre-v2 canons migrate themselves on start.)GET (marked archived). Deleting plain
knowledge is a retraction and drops it from the default search. Git keeps everything
either way.--history: "what moved where").Agents use the kyb CLI over HTTP. The Rust/axum server stores Markdown and history in Git,
then builds search state from that history. Tantivy provides BM25 search; an optional
multilingual-e5-small ONNX model supplies in-memory vectors. Reciprocal rank fusion combines
lexical and semantic candidates. All search modules run inside the server. Without a model,
lexical search still works.
Incidents are first-class entries (kind: incident, keys prefixed inc-) with a lifecycle
open → mitigated → resolved and a rule: closing requires a resolution — an incident
that ends with "it just went away" teaches nobody anything. A report is a control panel, not
a story:
| Field | What it gives an agent |
|---|---|
detection |
an executable "is it still happening?" check, with the expected healthy result |
affected |
machine-readable poisoned windows [{scope, from, to}] — a backtest excludes them programmatically |
knowledge |
links to the knowledge entries the incident concerns |
resolution |
how it ended — searchable, so "how did we fix this last time" has an answer |
| timeline | started/detected/mitigated/resolved_at; the server stamps status transitions |
| follow-ups | - [ ] checkboxes in the body; the server counts them and warns when closing over them |
The server teaches structure instead of gating on it: a bare report is accepted but the
reply carries hints naming the missing actionable parts. kyb incident --template prints
the canonical skeleton.
Resolving archives the report: the canon stays clean (open things only), the record stays searchable forever.
The third kind (kind: task, keys prefixed task-): short actionable notes and ideas with
the same close-with-an-outcome discipline and none of the incident ceremony.
open → in_progress → blocked → done | dropped. Only done and dropped
are terminal: they require a resolution ("dropped: obsolete after the rewrite" is knowledge
too) and archive the task. in_progress and blocked are work in flight — the task stays
live in the canon, in kyb tasks and in open_tasks.priority — optional, low | medium | high | critical; empty means unranked and stays
unranked, nothing infers one. Exact filter on GET /tasks and /search.blocked_reason — optional, what the task waits on. It belongs to status: blocked
only: setting it on any other status is rejected, and moving off blocked clears it, so a
task never reports a block it is no longer in.assignee — optional, who holds the task right now: a short public label (≤80 chars,
single line, secret-scanned like every other field). Empty means unclaimed and stays
unclaimed. Exact filter on GET /tasks and /search.parent_task — optional, the task- key this one hangs under; empty means top-level.
Must be a valid task- key and cannot create a parent cycle. A parent that does not exist
yet is allowed — a child can be filed before its parent — and is reported back as
unknown_parent.POST /tasks/{key}/transition (kyb task-status) moves a task
between the live statuses and optionally changes its owner or parent without resending
title, body, tags, priority or links. Leaving blocked clears the reason; the terminal
statuses are refused with a pointer to kyb done, because closing demands an outcome.Closing archives the task; kyb tasks and the search keep the full record. Every write is a
commit, so kyb history <key> + kyb get <key> --at <sha> reconstruct who held a task, in
which status, at any point in time.
# install the server binary from crates.io
cargo install knowyourbusiness --locked
# run natively — reindexes from git on start, listens on 127.0.0.1:9310
kyb-server
Note:
cargo install knowyourbusiness --lockedinstalls thekyb-serverbinary. The separatekybclient CLI (skills/kyb/bin/kybviabash skills/install.sh) and model setup for hybrid search remain separate steps (see CLI, The agent skill, and Search quality).
# build and run from source
cargo run --release
# docker — data (git canon + index) lives in ./data
docker compose up -d
# remote private-network clients: bind one exact interface, never every NIC
KYB_PUBLISH_ADDR=10.0.0.10 docker compose up -d
| Variable | Default | Notes |
|---|---|---|
KYB_DATA |
./kyb-data |
git canon directory |
KYB_INDEX |
./index |
Tantivy cache (safe to delete) |
KYB_ADDR |
127.0.0.1:9310 |
where to listen; with KYB_AUTH=off anyone who can reach it can write |
KYB_AUTH |
off |
off trusts the network, compat honours a token but does not ask for one (for rollout, on a trusted bind — it protects nothing), required refuses callers without one |
KYB_AUTH_FILE |
./auth.json (Docker: /data/auth.json) |
the token book; keep it on persistent storage beside the data, never inside kyb-data |
KYB_ANON |
(unset) | read: with KYB_AUTH=required, callers without a token may read (a public demo) |
KYB_PUBLISH_ADDR |
127.0.0.1 |
Docker Compose host interface; set one exact private IP for remote clients |
KYB_MODEL |
(unset) | dir with model.onnx + tokenizer.json; absent = lexical-only |
KYB_AUDIT |
audit.jsonl |
JSONL request log |
skills/kyb/bin/kyb (installed to ~/.local/bin/kyb; point it anywhere with KYB_ADDR=host:port):
kyb query "nats streams" [--tag infra] [--history] [--recent] [--kind incident] [--status open] [--service X]
kyb query "nats streams" --as-of 2026-08-01 # the base as it stood then: one version per key,
# the value that was current, not today's. The
# snapsho