Knowledge graphs, archived to last.
IndieK is an open archival format for knowledge graphs: plain files, signed by their authors, append-only, and verifiable by anyone — with nothing but a published specification and standard cryptography.
from indiek import Archive, Author
ik = Archive.open("my-archive", author=Author.generate())
theorem = ik.create_node("Gödel's first incompleteness theorem")
proof = ik.create_node("Diagonalisation over provability.")
ik.create_edge(proof, theorem, "proves")
tag = ik.create_tag("theorem", "A proven statement", kind="node")
ik.set_tag(tag, theorem)
print(ik.seal().hash) # one hash commits to everything
Why IndieK
Plain files
An archive is a folder of UTF-8 text logs and content-addressed files. No database, no server, no proprietary container.
Signed and chained
Every event is signed with its author's Ed25519 key and linked to the previous one by a hash. Any change to the history is detected.
Nothing is overwritten
Revisions are new events; earlier versions stay in the log. How your understanding evolved is part of the knowledge.
Edges carry content
A connection between two ideas has its own text, author, tags and history. "Why are these linked?" gets a first-class answer.
Your vocabulary
No fixed ontology. Tags are designed freely, for nodes and for edges, and anyone can annotate a graph with their own key.
Built to be checked
Seals commit to a whole archive in one short hash. Publish it, and anyone can verify their copy — offline, without trusting anyone.
IndieK Desktop
One app for macOS, Windows and Linux. Open an archive folder, explore its knowledge graph, filter and colour it by tags, and write nodes, edges and tags, all signed with your key and saved straight into the archive.
- No Python, no terminal, no account: everything runs on your computer and works offline.
- Your archives stay plain folders, ready for
git,ikand any other tool. - The
ikcommand line comes with it.
Four pieces, one format
| Piece | For |
|---|---|
| IndieK Desktop | everyone |
| Web UI | browsing and writing graphs |
| Local API | building your own interface |
indiek SDK and ik CLI |
Python and the shell |
All free and open source, all reading and writing the same archives.
An archive in thirty seconds
my-archive/
├── events/…/events.ndjson the knowledge graph
├── meta/events/…/events.ndjson tags on it
├── blobs/sha256/71/a0/71a0b5… content, named by its hash
├── seals/seals.ndjson signed checkpoints
├── SPEC.md the specification itself
└── MANIFEST.json layout and JSON Schemas
Durable by design
The signed event logs and the blobs are the archive; every index or view is rebuilt from them. Archives carry their own specification and test vectors, so a reader in fifty years needs neither this website nor our code. Hashes and signatures name their algorithms, and transcription events let future generations re-attest old history with newer cryptography.
From the shell
uv tool install 'indiek[cli]'
ik keygen --write
ik config --set-archive-path ~/archives/notes
ik create_node --content "Understanding is not retrieval"
ik create_node --content ./notes/limits.md
ik create_edge --source-node e2 --target-node e1 --content "illustrates"
ik seal
ik verify
From Python
from indiek import Archive
reader = Archive.open("my-archive") # read-only
for item in reader.index.items.values():
print(item.alias, item.kind, item.author[:8])
print(reader.verify()) # full check, latest seal
print(reader.fsck().blob_files)
Status
ik CLI
Format 3.1 — reads every version since 3.0
IndieK Desktop — first release coming soon
1 November 2026 — contributions open
The format specification, the indiek package, the local API, the web UI
and the desktop app are free and open source under the Apache License 2.0. Read the vision, then
get started. If IndieK is useful to you,
support it.