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
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
- SPEC.md: full technical specification
- docs/PHILOSOPHY.md: why arkiv exists and how it composes with longecho
Release files for arkiv 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| arkiv-0.3.0.tar.gz | 127.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| arkiv-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 162.8 kB
Release files / arkiv-0.3.0.tar.gz
| Download URL | arkiv-0.3.0.tar.gz |
|---|---|
| Size | 127.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fbc123cfd01b6f9b58e4a1b9306f42266e344be299d4603284d68e97336cbb37
|
|
BLAKE2b-256 checksum How to use checksums |
54407dd27856c641ca008e7d2e5c2939ba2e89e9ba3833563514b8c358ec6639
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.3
|
Release files / arkiv-0.3.0-py3-none-any.whl
| Download URL | arkiv-0.3.0-py3-none-any.whl |
|---|---|
| Size | 35.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a7a80aa4fb3075901cc1a0c365fad734ee912efaa244d7a0b87ccd92f46577c8
|
|
BLAKE2b-256 checksum How to use checksums |
a53a82c9b6a54f7642f51679cc63067a1595027bac7490b65b44540e7b867b9e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.3
|