Skip to main content

arkiv

Universal personal data format. JSONL in, SQL out, MCP to LLMs.

The Format

Every record is a JSON object. All fields optional.

{"mimetype": "text/plain", "content": "I think the key insight is...", "uri": "https://chatgpt.com/c/abc", "timestamp": "2023-05-14T10:30:00Z", "metadata": {"role": "user", "conversation_id": "abc"}}
{"mimetype": "audio/wav", "uri": "file://media/podcast.wav", "timestamp": "2024-01-15", "metadata": {"transcript": "Welcome to...", "duration": 45.2}}
{"mimetype": "image/jpeg", "uri": "file://media/photo.jpg", "metadata": {"caption": "My talk at MIT"}}

The Stack

JSONL directory (human-readable, portable, durable)
       ⇅ arkiv convert
SQLite database (queryable, efficient, standard SQL)
       ↓ arkiv mcp
MCP server (tools → any LLM)

The two forms (directory and database) are isomorphic peers. arkiv convert goes either direction, auto-detected from input type.

Quick Start

pip install arkiv

# Point at a directory and query. arkiv.db is auto-created on demand.
arkiv query ./my-archive/ "SELECT content FROM records WHERE metadata->>'role' = 'user' LIMIT 5"

# Serve to any LLM via MCP
arkiv mcp ./my-archive/

# Explicit conversion (either direction)
arkiv convert conversations.jsonl archive.db              # JSONL → database
arkiv convert archive.db ./exported/                      # database → directory
arkiv convert archive.db 2024/ --since 2024-01-01         # temporal slice
arkiv convert archive.db archive.zip                      # pack for transport

Library: reading and writing bundles

Tools that produce or consume arkiv archives (the *-memex exporters and importers, for example) can use the bundle layer directly instead of reimplementing zip/tar handling:

from arkiv import write_bundle, records_to_jsonl, iter_jsonl, peek_jsonl

# Directory, .zip, or .tar.gz, chosen by extension. Byte-reproducible:
# identical records always produce identical bundle bytes.
write_bundle("export.zip", {
    "records.jsonl": records_to_jsonl(records),
    "schema.yaml": schema_bytes,
    "README.md": readme_bytes,
})

# Stream records from a directory, .zip, .tar.gz, or bare .jsonl / .jsonl.gz
# (members are read in place, never extracted). Non-object lines are skipped.
for record in iter_jsonl("export.zip", member="records.jsonl"):
    ...

first = peek_jsonl(path)  # None if absent or unreadable: for format detection

pack_bundle / unpack_bundle convert a whole directory tree (including media/) to and from a bundle; unpacking rejects path escapes and decompression bombs.

MCP Tools

Read-only by default. Start with arkiv mcp --writable db to enable the write tool.

Tool Description Mode
get_manifest() What collections exist, their descriptions and schemas read-only
get_schema(collection?) What metadata keys can be queried read-only
sql_query(query) Run read-only SQL read-only
write_record(...) Append a single record to a collection writable

Why

  • Your data lives in silos (ChatGPT, email, bookmarks, photos, voice memos)
  • Source toolkits (memex, mtk, btk, ptk, ebk) export it as JSONL
  • arkiv gives you one format, one database, one query interface
  • Any LLM can query it via MCP
  • JSONL is human-readable and durable. SQLite is the most deployed database in history.

Spec and philosophy

Metadata

Release files for arkiv 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for arkiv 0.4.0
File Size Uploaded Provenance
arkiv-0.4.0.tar.gz 131.3 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for arkiv 0.4.0
File Interpreter ABI Platform
arkiv-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 170.6 kB

Release files / arkiv-0.4.0.tar.gz

Download URL arkiv-0.4.0.tar.gz
Size 131.3 kB
Tags Source
SHA-256 checksum
How to use checksums
a38a3817a4afd4bf86d1553a39529978d7ff277aa0ee50d3d9c67e8393c0f242
BLAKE2b-256 checksum
How to use checksums
019f29d57608139a084aee64df49ed661e9e5b29a6456a326dac8118736649c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.15

Release files / arkiv-0.4.0-py3-none-any.whl

Download URL arkiv-0.4.0-py3-none-any.whl
Size 39.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
05971ed4e79755600239fcfb860d1909c66635acd924d5d77e51ae1caadc91cb
BLAKE2b-256 checksum
How to use checksums
91a43a56bb782b9a419778dea210fd2f822ae19a29aa8cee6147f76d565bfcba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.15

Security for arkiv 0.4.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page