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.1

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.1
File Size Uploaded Provenance
arkiv-0.4.1.tar.gz 185.6 kB Without provenance Details

Built distribution (wheel)

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

Total release size: 234.3 kB

Release files / arkiv-0.4.1.tar.gz

Download URL arkiv-0.4.1.tar.gz
Size 185.6 kB
Tags Source
SHA-256 checksum
How to use checksums
a9e35c0895014585f6efa0fb7f79a204acfc4c3c09a260a14c3e45a99f07239c
BLAKE2b-256 checksum
How to use checksums
7119ef06cebfe368f97cdaead0263ce4e176864d284095aac6dc3dbc3098ed90
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

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

Download URL arkiv-0.4.1-py3-none-any.whl
Size 48.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9c537fc14d84d749fca1822c6c1aac40f3599ec9c189594331711d1ca8fd0463
BLAKE2b-256 checksum
How to use checksums
2b894359d9c66438743610753283f70287919aa8660799021127c8d1efe9dc96
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Security for arkiv 0.4.1

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