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.0.0 — Python SDK and ik CLI Format 3.0 — first public version 1 November 2026 — contributions open Desktop app — development is underway

The format specification and the indiek package are free and open source under the Apache License 2.0. Read the vision, then get started.