IndieK

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.

How the format works →

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

CLI reference →

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)

SDK reference → · Examples →

Status

indiek 1.3.0 — Python SDK and 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.