# A knowledge base for your coding agents

> Coding agents need memory that survives the chat. hraness/info keeps it in Markdown and Git, with local search and deterministic structure.

- Author: PRMTE
- Category: [Engineering](<https://hraness.pub/categories/engineering>)
- Published: 2026-07-22
- Updated: 2026-07-24
- Reading time: 11 minutes
- Repository: <https://github.com/hraness/info>
- Canonical source: <https://hraness.pub/articles/a-durable-knowledge-base-is-a-write-path>

---

A coding agent can inspect a repository and finish a task, then begin the next session without the decisions, evidence, or rejected approaches that shaped the first one. A longer context window delays that loss. It does not create maintained memory that another agent can inspect and improve.

[hraness/info is an open-source knowledge base for coding agents](<https://github.com/hraness/info>) handles exact metadata and links; local semantic search helps when the right note uses different words. The package stays deliberately close to files so a team can change agents, editors, or search tools without migrating its memory.

![Four icon cards show sources flowing into durable memory, linked ideas, and search for reuse by future coding-agent sessions.](<https://hraness.pub/article-diagrams/a-durable-knowledge-base-is-a-write-path.light.webp>)

*hraness/info turns source material into memory that agents can link and find again.*

The default layout separates authored records from derived views. These directories are useful conventions, not a framework that application code must import:

**Default hraness/info vault and its derived views**

```text
info/
├── articles/<slug>/  # captured source, manifest, and local assets
├── notes/            # maintained synthesis
├── plans/            # decisions, progress, and verification
├── riffs/            # voice-preserving source thought
└── index.md          # regenerated catalog

Markdown + frontmatter + wikilinks
              │
              ├── info list / info links   # deterministic views
              └── info search              # local derived QMD index
```

Markdown is the authority in this map. The catalog, backlink view, and semantic database can all be deleted and rebuilt. Obsidian can browse the same files, but it is a compatible editor rather than a runtime dependency. Git supplies history, review, and recovery for the records that agents edit.

## Several systems converged on durable agent memory

This design direction did not begin with one recent proposal. Cognition's [2024 Devin release history](<https://docs.devin.ai/release-notes/2024>) described Knowledge that Devin could recall across future sessions by September 2024 and automatic Repo Knowledge from repository scans by November. On April 3, 2025, [Devin 2.0 introduced Devin Wiki and Devin Search](<https://cognition.com/blog/devin-2>). Cognition then launched the public [DeepWiki service on May 5](<https://cognition.com/blog/deepwiki>), followed on May 22 by a [DeepWiki Model Context Protocol server](<https://cognition.com/blog/deepwiki-mcp-server>) for programmatic retrieval. Those products are codebase-oriented and managed by Cognition, but the chronology matters: they predate the later public LLM-wiki discussion.

In April 2026, Andrej Karpathy published an [LLM Wiki proposal](<https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f>) with three layers: raw sources, an agent-maintained Markdown wiki, and an instruction schema. Its operations are ingest, query, and lint, with QMD suggested when the collection outgrows an index file. hraness/info is not an implementation of Cognition's products, and the similar pieces do not establish direct lineage. They show convergence on the same pressure: useful reasoning must become a durable artifact before a session ends.

## Keep the substrate boring and portable

A knowledge base earns trust differently from a chat transcript. Its records need stable paths, reviewable changes, and a format that remains legible when the current agent is gone. Plain Markdown and YAML frontmatter meet that bar with little codebase coupling. The application being developed does not depend on the knowledge-base package, and the vault does not need to know which agent will read it next.

The directory names encode only a few distinctions that affect editing authority. Captured articles preserve what a source said. Notes hold current synthesis and may change as evidence changes. Plans record intended work and its outcome. Riffs preserve a speaker's claims and uncertainty. A different domain can add its own directories and frontmatter without changing the graph or search model.

This low level of opinion has a practical payoff. An agent can start with `index.md`, use standard file tools, or ignore the CLI entirely. Another agent can use the package's commands and skills. Neither path requires a hosted database, a proprietary document format, or knowledge-base hooks inside production code. Optional indexes accelerate retrieval; they do not become another source of truth.

## Make ingestion an auditable write path

Durable memory starts with a reliable way to acquire evidence. `info clip` can read a public URL, saved HTML, a rendered page, or the page already open in a signed-in browser. The [capture documentation](<https://github.com/hraness/info/blob/main/docs/capture.md>) defines layered extraction routes for ordinary pages and specialized surfaces. Each route reports what it actually obtained rather than treating any nonempty response as a complete capture.

When the useful page is already visible, `info clip current --browser-live` reads the active tab through the attached browser session. `info clip current --cdp 9222` uses a browser's Chrome DevTools Protocol port instead. Both use the authentication already present on the machine and read the current document without navigating it. For ingestion, this is the programmatic equivalent of Save Page. A new source surface needs an extractor, representative fixtures, or the generic rendered-page path; it does not need an action API.

A capture produces readable Markdown beside `capture.json` and any localized assets. The manifest records the source URL, attempted routes, chosen extractor, completeness state, counts, warnings, and artifact hashes. “Complete” refers to the selected bounded representation, not every hidden branch of a service or a future version of the page. Bundle installation is atomic, so an interrupted write does not leave a source record that only looks finished.

Media follows the same evidence rule. Images from ordinary pages, X, LinkedIn, and other rendered surfaces are localized into the bundle, while exposed video posters remain inspectable without downloading the full video. A normal YouTube capture adds available title, description, duration, channel, thumbnail, and transcript context; full audio or video remains an explicit opt-in.

PDFs use the same durable bundle whether the input is a local path or a public HTTP(S) URL. `info pdf` sends remote input through the same DNS-pinned, private-network-denying acquisition boundary as web capture, then removes sensitive URL parameters before saving provenance. Local and remote captures keep the original PDF byte-for-byte, infer headings from native layout, extract every embedded image, and use local OCR for scans and screenshots.

**Capture a local or public remote PDF**

```shell
info pdf "/absolute/path/to/document.pdf" --output articles
info pdf "https://example.com/document.pdf" --output articles
```

Text-bearing images become inspectable Markdown with page and geometry metadata while the source image remains available; primarily visual images stay embedded. This matters for hybrid documents such as exported reports whose later pages are really Slack messages, diagrams, or photographs.

The bundle is evidence, not the final interpretation. A maintained note can cite several captures, record disagreement, and change when later evidence warrants it. The captures stay available for audit. This source-versus-synthesis boundary prevents an agent from silently replacing what a page said with what the agent now believes it meant.

## Use structure before semantic guesswork

Some retrieval questions have exact answers. Frontmatter values such as `type`, `status`, `area`, dates, aliases, and tags are parsed into bounded scalar, list, and nested-object values. `info list` can filter repeated fields with AND semantics, match tags case-insensitively, follow dotted metadata paths, and sort with a stable path tie-breaker. The parser makes these queries deterministic; it does not impose one domain schema on every vault.

Links answer a different exact question: which relationships did an author state? Vault-root wikilinks are contextual edges. The scanner resolves them by path, title, or alias and reports broken or ambiguous targets rather than guessing. Backlinks reverse resolved links at read time. Generated catalog links in `index.md` do not count as context, and a title mentioned in prose is only a review candidate until an author links it.

**Exact metadata filtering and bounded link traversal**

```shell
info list --root . --where type=plan --where status=in-progress --tag browser --sort area --order asc --json
info links plans/browser-ingestion --root . --direction both --depth 2 --limit 25 --json
```

The first command finds active browser plans in a reproducible order. The second walks both incoming and outgoing contextual links for at most two hops and 25 notes. Depth is explicit, cycles are handled, the default result cap is 50 notes, and the traversal never expands through semantic similarity. This bounded traversal lets an agent gather nearby decisions without pulling the whole vault into context.

## Let semantic search find language, not truth

Exact structure cannot find a note whose author used an unexpected phrase. For that lane, hraness/info embeds [QMD, a local search engine for Markdown](<https://github.com/tobi/qmd>). `info search` defaults to QMD's vector-only search path. It uses the recommended English-optimized `embeddinggemma-300M-Q8_0` model, roughly a 300 MB download, without loading QMD's query-expansion or reranking models. The model and index stay local.

**Prewarm the local index and search by meaning**

```shell
info index --root .
info search "why current-tab capture does not navigate" --root . --json
```

`info index` builds or incrementally refreshes the derived database. `info search` also checks for changed Markdown before searching, then joins each hit back to its authored metadata, tags, backlinks, and contextual edge counts. The database lives in a local cache outside the vault and can be rebuilt from the files. Keyword BM25 search remains available with `--mode keyword` when exact terms are a better fit.

A vector score means that two passages occupy a nearby region in an embedding model's representation. It does not mean the passage is current, correct, or supported by its sources. An agent should use semantic results to discover candidate notes, metadata to narrow them, links to inspect stated relationships, and the Markdown plus cited captures to verify the answer.

## Write plans and operating rules back into the vault

A plan shown only in chat has the same session boundary as the reasoning that produced it. The package's `plan-info` skill writes the plan as a normal file with an outcome, status, area, assumptions, dependencies, decisions, and a verification method. During execution, the same file accumulates deviations, review findings, command evidence, and the final result. Completed plans remain as history; current operating truth moves into code, documentation, or maintained notes.

hraness/info ships five Agent Skills with the installed package. `save-url-info` selects an acquisition route and records completeness. `save-pdf-info` turns local files and public PDF URLs into Markdown while preserving native text, image text, visual assets, original bytes, and source provenance. `query-info` chooses among exact metadata, graph traversal, and semantic search. `refresh-info` regenerates the catalog and reviews link diagnostics without manufacturing edges. `plan-info` keeps execution knowledge durable. Their shared `-info` suffix makes the skill family easy to scan and invoke consistently. The [agent workflow documentation](<https://github.com/hraness/info/blob/main/docs/agent-workflow.md>) defines how those skills meet the same CLI contracts across agent runners.

## Adopt the parts that prevent repeated rediscovery

A small vault may need only Markdown, Git, an index, and ordinary file search. Add deterministic metadata queries when filenames stop answering exact questions. Add link traversal when relationships matter. Add QMD when vocabulary drift makes exact search miss useful notes. Add browser clipping when important evidence lives on signed-in or rendered surfaces. Add PDF ingestion when documents mix native text, scans, screenshots, and visual evidence. Each layer is optional because the lower layer remains readable on its own.

The limits are equally modular. Capture records what a selected surface exposed; it does not decide whether the source deserves trust. A wikilink records a relationship, not agreement. Metadata encodes an author's classification, not an objective fact. Semantic similarity supplies candidates, not conclusions. The durable part is the inspectable record and the discipline of revising it. With those in place, the next coding agent can begin from maintained evidence and decisions instead of reconstructing them from a previous chat.
