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.
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
1 November 2026 — contributions open
The format specification and the indiek package 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.