{
  "markdown": "# orphograph\n\nAnchor any file to the Bitcoin blockchain in about ten seconds.\nFor photographers, journalists, indie creators, and developers who need to\nprove a file existed before a given moment — especially before an AI model\nsaw it. Files never leave the browser; only the 32-byte SHA-256 fingerprint\nis submitted. Free tier (3 anchors/24h), $19 Writer Pack (10 anchors), $9/mo\nStanding Order (unlimited), $19/mo Creator (capture-time app + API + verifier badge).\n\n---\n\n## Quick demo\n\nFour steps a developer can run from a terminal, no signup, no install\nbeyond `curl` and `shasum`.\n\n1. Compute the SHA-256 of any file on disk:\n\n   ```bash\n   shasum -a 256 ~/Pictures/my-photo.jpg\n   # → 3f8c1b...  my-photo.jpg\n   ```\n\n2. Submit the hash to the public anchor endpoint:\n\n   ```bash\n   curl -sS -X POST https://orphograph.com/api/anchor \\\n        -H \"Content-Type: application/json\" \\\n        -d '{\"hash_hex\":\"<paste the 64-char hex digest>\"}'\n   ```\n\n   The response is a JSON receipt with a `receipt_id` and a list of the\n   OpenTimestamps calendars that accepted the submission.\n\n3. Pull the receipt back later by ID (or visit `/r/<id>`):\n\n   ```bash\n   curl -sS https://orphograph.com/api/verify/<receipt_id>\n   ```\n\n4. Verify offline against the original file with the standalone verifier\n   (no orphograph code, MIT, ~100 lines of stdlib Python):\n\n   ```bash\n   # Single file with an inclusion proof:\n   python3 dist/orphograph-verify/verify.py file \\\n       --file ~/Pictures/my-photo.jpg \\\n       --proof receipts/<receipt_id>/proof.json\n   # Whole folder against its manifest:\n   python3 dist/orphograph-verify/verify.py folder \\\n       --dir ~/Pictures/evidence \\\n       --manifest receipts/<receipt_id>/manifest.json\n   ```\n\n   The verifier re-hashes the file (or walks the folder) locally and\n   confirms the result reproduces the manifest's root. Add `--ots\n   <path>.ots` to also invoke the OpenTimestamps client and check the\n   chain witness references the same root.\n\n---\n\n## MCP server (Model Context Protocol)\n\nOrphograph ships an **MCP server**: a single stdlib-only Python file (682\nlines, MIT) that implements the Model Context Protocol — JSON-RPC 2.0 over\nstdio, protocol version `2024-11-05`, with the `initialize`, `tools/list`,\nand `tools/call` methods implemented directly, no SDK — so AI agents and\nMCP hosts (Claude Code, Claude Desktop, or any MCP client) can anchor and\nverify files as tool calls.\n\nListed in the official MCP registry as `io.github.Orphograph/orphograph`.\n\n**MCP tools exposed** (full JSON Schemas in [`mcp/manifest.json`](mcp/manifest.json)):\n\n| Tool | What it does |\n| --- | --- |\n| `orphograph_anchor_file` | Hash a local file (SHA-256/SHA-512 computed in-process) and anchor the fingerprints to Bitcoin via OpenTimestamps. The file body never leaves the machine. |\n| `orphograph_anchor_folder` | Build an RFC-6962 Merkle manifest over a folder and anchor one root that covers every file. |\n| `orphograph_anchor_output` | Anchor an AI agent's generated output at creation time — provenance receipts for agent actions. |\n| `orphograph_verify_receipt` | Look up what this office recorded for a receipt: anchored hashes, calendar attestation counts, and when the Bitcoin pin was observed. A lookup, not an independent chain check — run `ots verify` for that. No API key required. |\n| `orphograph_verify_lineage` | Walk an edit-lineage chain back through its committed parents and report the ordering the anchors establish. |\n| `orphograph_list_vault` | List the authenticated subscriber's anchored receipts. |\n\nQuickstart (stdio transport):\n\nAlso on PyPI: `pip install orphograph-mcp` (stdlib-only; same server).\n\n```bash\ncurl -sSL https://orphograph.com/mcp/orphograph_mcp.py -o orphograph_mcp.py\nclaude mcp add orphograph -- python3 orphograph_mcp.py\n```\n\nThe free tier needs no API key; set `ORPHO_API_KEY` to use vault features.\nAn MCPB bundle is attached to release `mcp-v0.1.1`, and\n[`mcp/Dockerfile`](mcp/Dockerfile) builds a minimal container for MCP\ndirectory crawlers — the server starts and answers MCP introspection with\nno configuration. Full tool schemas and options: [`mcp/README.md`](mcp/README.md).\n\n---\n\n## Architecture\n\nPython 3.11+ stdlib only on the server (`http.server`, `urllib`, `hashlib`,\n`json`, `secrets`, `fcntl`) — zero pip dependencies in the anchor engine.\nVanilla HTML + CSS + JS on the client, hashing via WebCrypto\n`SubtleCrypto.digest` so file bytes never leave the browser. Each anchor\nfans out a single 32-byte POST to five independent OpenTimestamps\ncalendars (a.pool, b.pool, alice, finney, btc.catallaxy); the calendars\nbatch many users' hashes into a single Merkle root and write the root to\nBitcoin roughly hourly, which is why our marginal on-chain cost is\neffectively zero. The `.ots` proofs are stored per-receipt and verify\nagainst the public Bitcoin chain forever, with or without us. Bitcoin\ncustody is receive-only: a single watch-only address printed in\n`btc_address.txt` accepts payments; no signing keys live on production\nhosts.\n\n---\n\n## Why this exists\n\nBy spring 2026 a large share of new images circulating online are\nAI-generated or AI-modified. Watermarks can be stripped, C2PA labels can\nbe re-signed, EXIF is one shell command away from being anything you\nwant. What survives that is cryptographic proof — a Bitcoin block that\nalready existed at a known time, with the hash of your file committed\ninside it. Orphograph is the cheapest, most boring way to put a\nfingerprint of your work into that block before anyone disputes it.\nLong-form on the thesis: [/blog/written-by-an-ai](content/blog/written-by-an-ai.md).\n\n---\n\n## Privacy properties\n\nWhat touches what, in one table.\n\n| Datum | Stays on your machine | Sent to server | Submitted to OTS calendars | Notes |\n|---|---|---|---|---|\n| File bytes | yes | never | never | WebCrypto hashes locally |\n| SHA-256 (32 bytes) | yes | yes | yes | The only thing on-chain |\n| SHA-512 sibling (64 bytes) | yes | yes | no | Quantum hedge; OPTIONAL (client-supplied), stored in receipt only, never anchored |\n| Filename / label | yes | opt-in | no | Off by default; pass `--label` to include |\n| Email address | yes | only when needed | no | Required only for Pack delivery + Personal subscriptions |\n| IP address | n/a | truncated to /24 (IPv4) or /48 (IPv6) | no | Full IPs are never persisted |\n\n---\n\n## Repo structure\n\n```\norphograph/\n├── server/                       Python stdlib HTTP server + anchor engine\n│   ├── engine.py                anchor + verify core (the file in this README)\n│   ├── app.py                   ThreadingHTTPServer with /api/anchor /api/verify\n│   ├── verify_cli.py            standalone receipt verifier (no engine imports)\n│   ├── auth.py                  magic-link tokens + HttpOnly session cookies\n│   ├── credits.py               append-only Pack claim-code ledger\n│   ├── stripe_webhook.py        HMAC signature verify + idempotent handler\n│   ├── subscriptions.py         Personal-tier state derived from Stripe\n│   ├── mailer.py                Resend HTTP send (inert when key unset)\n│   ├── rate_limit.py            persistent token bucket\n│   ├── file_lock.py             fcntl.flock helper for ledger atomicity\n│   ├── upgrade_worker.py        OTS upgrade fetcher (cron)\n│   ├── expire_worker.py         free-tier receipt pruner (cron)\n│   └── gdpr.py                  /api/me/export + /api/me/delete\n│\n├── web/                          vanilla HTML/CSS/JS — no bundler, no framework\n│   ├── index.html, app.js       landing + drop zone + verify section\n│   ├── account.html, account.js Personal-tier dashboard\n│   ├── signin.html, signin.js   magic-link request form\n│   ├── receipt.html, receipt.js print-friendly receipt at /r/<id>\n│   ├── style.css                dark glassmorphism, neon-green accent\n│   └── terms.html, privacy.html legal pages\n│\n├── content/blog/                 markdown blog posts (SEO + manifesto)\n│   ├── written-by-an-ai.md\n│   └── prove-photo-existed-before-ai.md\n│\n├── tests/                        pytest suite (~98 cases, all stdlib)\n│   └── test_*.py                engine / verifier / credits / rate_limit /\n│                                 auth / stripe / subscriptions / gdpr / ui\n│\n├── marketplace/orphograph-plugin/  Claude Code plugin\n│   ├── README.md\n│   └── skills/anchor, skills/verify\n│\n├── lightroom-plugin/             Adobe Lightroom Classic plugin (Lua)\n│\n├── capture/                      desktop capture daemon (Creator tier)\n│\n├── dist/orphograph-verify/       MIT standalone verifier (vendorable)\n│\n├── scripts/                      operational helpers\n│   ├── smoke_test.sh            end-to-end live OTS calendar test\n│   ├── dev_setup.sh             fresh-clone sanity check\n│   ├── init_volume.sh           container entrypoint (Fly)\n│   ├── upgrade_cron.sh          OTS upgrade scheduler\n│   ├── expire_cron.sh           free-tier expiry scheduler\n│   └── refund_pack.py           zero a claim code after a Stripe refund\n│\n└── deploy/                       deploy + ops docs\n    ├── FLY_PREFLIGHT.md\n    ├── EMAIL_AND_LEGAL_COMPLIANCE.md\n    ├── PAYOUT.md\n    ├── RUNBOOK.md\n    └── launch_drafts/\n```\n\n---\n\n## Local dev\n\n```bash\ngit clone https://github.com/orphograph/orphograph ~/orphograph\ncd ~/orphograph\nbash scripts/dev_setup.sh           # offline checks + verifier roundtrip\npython3 server/app.py               # serves http://127.0.0.1:8989\n```\n\nRun the test suite at any time:\n\n```bash\npython3 -m pytest tests/ -q\n```\n\nThe smoke test hits live OTS calendars and requires network:\n\n```bash\nbash scripts/smoke_test.sh\n```\n\n---\n\n## Production deploy\n\nSingle-container Fly.io with a mounted volume for `receipts/` and the\nJSONL ledgers; Stripe webhook verification, Resend for transactional\nemail, CSP `default-src 'self'`. Step-by-step in\n[`deploy/FLY_PREFLIGHT.md`](deploy/FLY_PREFLIGHT.md).\n\n---\n\n## Pricing\n\n| Tier | Price | What's included |\n|---|---|---|\n| Free | $0 | 3 anchors per 24 hours per IP-prefix |\n| Writer Pack | $19 one-time | 10 anchors, claim code by email, never expires, skips rate limit |\n| Standing Order | $9/mo or $60/yr | Unlimited anchors, email delivery, account dashboard, anchor history |\n| Creator | $19/mo | Personal + Orphograph Capture (capture-time desktop app) + API access + verifier badge |\n\nThe `$19 / $9` price points are set deliberately low.\nThe wedge is browser-based UX plus the open-source verifier — not the\ncryptography, which is the public OpenTimestamps protocol.\n\n---\n\n## License\n\n- `dist/orphograph-verify/` — **MIT**. Vendor it, ship it, audit it. This\n  is the trust artifact: a receipt produced today must verify against\n  Bitcoin five years from now even if orphograph.com no longer exists.\n- `marketplace/orphograph-plugin/` — **MIT**.\n- Everything else — private until launch decisions settle. The founder\n  retains the option to open-source after six months of customer signal.\n\n---\n\n## On the guarantee\n\nThe privacy contract of Orphograph is **structural**, not promissory.\nFiles are hashed in the user's browser; only the SHA-256 (and SHA-512)\nfingerprint is transmitted. The server cannot reconstruct, identify,\nor retransmit the file, because it never receives the file. This\nproperty holds independently of who maintains the code.\n",
  "bytes": 11258,
  "sha": "d239621480de14ea1b4ce79f0d8ea9b58048da38453c2c86b533e56264a7b538",
  "repo_slug": "orphograph/orphograph",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_orphograph_orphograph_45e1a543/readme"
}