Proof
Docs

Wire Proof into your app

Written for your agent as much as for you. Keys are per workspace and early access is invite-gated; everything below works the moment you hold one.

The tag

<script src="/_p/p.js" data-api="/_p/e"
  data-key="YOUR_WRITE_KEY" defer></script>

One tag. Pageviews, sessions, clicks, Core Web Vitals, JS errors, outbound clicks, and marked 404s flow immediately, single-page-app route changes included, each under a governed contract. Dev hosts (localhost, private ranges) are ignored unless the tag carries data-dev.

Serve it from your own domain

The tag above loads and posts through two paths on your own site. Point them at Proof:

// next.config.ts
async rewrites() {
  return [
    { source: "/_p/p.js", destination: "https://proof.dorsr.com/p.js" },
    { source: "/_p/e", destination: "https://proof.dorsr.com/api/collect" },
  ];
}
// vercel.json (Vite, Astro, any static site)
"rewrites": [
  { "source": "/_p/p.js", "destination": "https://proof.dorsr.com/p.js" },
  { "source": "/_p/e", "destination": "https://proof.dorsr.com/api/collect" }
]

Brave's default Shields and uBlock Origin both drop a beacon sent straight to proof.dorsr.com/api/collect. Both run EasyPrivacy, which blocks that path on any domain and blocks every cross-site beacon. We measured it in both browsers before shipping the door. On your own domain, under a path no list names, those visitors count. Country still resolves from the visitor, not from the proxy.

Hand it to your agent

One line, to Claude Code, Cursor, or any agent with shell access:

Fetch https://proof.dorsr.com/wire.md and follow it.
My write key is pk_... and my agent key is ak_...

wire.md is the full procedure, written to be executed: add the tag, mark the 404, instrument the moments that actually matter in your app, propose a contract for each one, and then check its own work by reading the numbers back. That last step is the one every other installer skips, and it is the difference between “instrumentation added” and a number you can trust.

Or paste the short form directly:

Wire Proof analytics into this app.

1. Proxy two paths on this app's own domain (Next.js rewrites or vercel.json):
     /_p/p.js -> https://proof.dorsr.com/p.js
     /_p/e    -> https://proof.dorsr.com/api/collect
   then add this tag to the root layout, once, in <head> or at the end of <body>:
     <script src="/_p/p.js" data-api="/_p/e" data-key="YOUR_WRITE_KEY" defer></script>
2. Mark the 404 page so missing paths are measured:
     <meta name="proof-not-found" content="1">
3. Deploy, load one page in a browser, then read the number back:
     curl -s -X POST https://proof.dorsr.com/api/ask \
       -H "x-proof-key: YOUR_AGENT_KEY" -H "content-type: application/json" \
       -d '{"question":"pageviews today"}'
4. For product events, call:
     window.proof.track("myapp.thing_happened", { plan: "pro" })
   then propose a contract for each event name through the propose door.
   It is approved on arrival; nobody has to sign off on it.

The agent door

Four verbs over plain HTTP, and the same four over MCP (below). Ask in plain English:

curl -s -X POST https://proof.dorsr.com/api/ask \
  -H "x-proof-key: YOUR_AGENT_KEY" -H "content-type: application/json" \
  -d '{"question":"did yesterday's deploy hurt checkout?"}'

Emit actions (deploys are the canonical case; retries dedupe on the id):

curl -s -X POST https://proof.dorsr.com/api/collect \
  -H "content-type: application/json" \
  -d '{"write_key":"YOUR_WRITE_KEY","events":[{
        "name":"agent.action.deploy","source":"agent",
        "external_id":"deploy-9b1f04d","event_time":"2026-07-22T13:00:00Z",
        "properties":{"target":"myapp.com","commit":"9b1f04d","outcome":"success","actor":"agent:ci"}
      }]}'

Propose a contract for each new event. It is approved the moment it arrives:

curl -s -X POST https://proof.dorsr.com/api/propose \
  -H "x-proof-key: YOUR_AGENT_KEY" -H "content-type: application/json" \
  -d '{"kind":"event","proposed_by":"agent:ci",
       "definition":{"name":"myapp.thing_happened","version":1,
         "human_meaning":"A user did the thing that matters.",
         "properties":{"plan":{"type":"string","required":false,"pii":false}}}}'

Nobody approves anything by hand. Your agent key carries a standing approval, so a contract proposed with it is live straight away, and the record names the agent that added it.

MCP, hosted

The same four verbs speak MCP over HTTP, so Claude Code, Cursor, or anything else that speaks it can read your numbers with nothing installed. Drop this in .mcp.json:

{
  "mcpServers": {
    "proof": {
      "type": "http",
      "url": "https://proof.dorsr.com/api/mcp",
      "headers": { "Authorization": "Bearer YOUR_AGENT_KEY" }
    }
  }
}

list_metrics to see what is answerable, ask for a plain-English answer, emit_eventto log your agent's own deploys onto the same timeline, and propose_event to add a contract for a new event. There is no free-form SQL.

What the tag costs

One script, no dependencies, and a hard budget: under 12 KB gzipped over the wire. That is not a claim from a build log. A probe re-fetches the tag from every instrumented site four times a day with accept-encoding: gzip, counts the bytes that actually crossed the wire, and fails the check when a build crosses the budget. Ask Proof "how heavy is the tag"for today's measured figure.

Privacy defaults

First-party only, no third-party requests, no fingerprinting (a random id in your own cookie), id-looking path segments scrubbed before storage, click text masked under data-proof-mask, coarse country only. One switch silences the tag entirely:

window.proofConsent = false        // or set cookie: proof-consent=denied
What we never do with your datav1.0, effective 2026-07-28
  • Your events are never used to train a model. Not ours, not anyone else's.
  • There is no opt-in by default, and no exception by region, plan, or account age.
  • Your workspace is never pooled with another workspace to build anything.
  • Changing any line above requires a new version and a new date, in public git history.

Your data

The data is yours. Raw events are kept until you remove them (there is no silent auto-purge; your approved events and metrics are your schema and stay). From your account you can export the whole workspace as JSON at any time, or erase every event in one action. Deletion removes the rows; it is not a soft flag.

Access

Proof is in invite-gated early access while it hardens on the founder's production apps. Follow the build to catch the open.