paperjam GitHub

Your agent gets a library card.

paperjam files your passports, contracts and policies on your own server, reads every field, and opens the drawer to any MCP client. Ask when the residence permit runs out; get a date and the card it came from.

Open source, AGPL-3.0. Runs in Docker. No telemetry.

Your agent asksWhen does John’s passport expire?
TRV 0042Passport
Holder
John Doe
Number
TS1234567 check digit
Issued by
Ministry of Testing
Expires
01 Sep 2032

1. Doe, John. 2. Travel documents. 3. Republic of Testing.

Synthetic cards. The Republic of Testing does not exist; its paperwork does.

Every value on screen comes from a running paperjam holding the same synthetic scans.

For the agent

Any MCP client can search the drawer, read a card, look at the scan, file a new document and fix a field. The one thing it can’t do is throw something away for good.

What an agent can do
search_documentsFind by any word, person, type or field.
get_documentRead a card: its fields, its facts, its page text.
get_page_imageLook at the scan itself when OCR may have misread a digit.
upload_documentFile a new scan straight from the conversation.
update_documentCorrect a field, a person, a tag.
reprocess_documentRead it again after you change the settings.
trash_documentMove to trash, and back with restore. Purging stays with a person.

Claude.ai connects with OAuth: you sign in and approve it on your own paperjam. Claude Code and other clients take a URL and a token. Connecting an agent

What happens to a scan

Synthetic passport of John Doe, Republic of Testing, with a machine-readable zone at the bottom
In: one synthetic passport scan.
  1. Kept as it came. The original is stored byte for byte and never modified.
  2. Read on your machine. PDF text, Tesseract OCR in twelve languages, and the machine-readable zone of passports and ID cards.
  3. Typed. With an LLM key, it is sorted into one of 21 document types and that type’s fields are filled: holder, number, dates, amounts.
  4. Checked. MRZ check digits, IBANs and national ID numbers from ten countries are verified. A failed check flags the card instead of quietly storing a wrong number.
  5. Shelved. Searchable by every word and every field, from the web app or by your agent.

All of it is one small binary: Rust, SQLite and an embedded search index. No Redis, no Postgres, no extra containers. Without an LLM key, everything but step 3 still runs.

What leaves the building

  • Without an LLM key, nothing. No telemetry, no update check, no cloud calls.
  • With a key, only what you signed out. Document text and page images go to the provider you chose. Mark a document Never send to the cloud and it stays home.
  • Originals stay originals. One-command backup, and a zip export in an open layout.
  • Agents can’t purge. Trash and restore, yes. Deleting for good takes a signed-in person.

Made for a household or a few people sharing one archive: everyone sees everything, there are no per-user permissions and no workflow rules. It is a drawer, not an office.

Get the card.

Run it on a home server, a NAS, a VPS or your own computer. You need Docker with the Compose plugin.

The installer asks four things: where to put it, how you’ll reach it, the languages of your documents, and an optional LLM key. Then it prints the address and a one-time setup code.

Borrower’s cardpaperjam · one copy per household
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ilodezis/paperjam/main/install.sh)"
Rather do it by hand
mkdir paperjam && cd paperjam curl -fsSL https://raw.githubusercontent.com/ilodezis/paperjam/main/compose.example.yml -o compose.yml docker compose up -d docker compose logs paperjam

The last log line holds the setup code. There are no default passwords. Full install guide