hotpromptWhat we collect

What we collect

The footer says we keep an anonymous, scrubbed copy. This is that claim with the detail attached. The short version: we keep the shape of what you asked for, and nothing that says who you are.

AI mode is off

Nothing you type is sent anywhere. Sharpening runs in your browser, on this page — no model is involved, and with AI mode off the page does not call our server with your words either. The only thing that leaves is the scrubbed row described below, and private mode stops even that.

Also true right now
Capture log
writing to a durable store
Switched by
AI_TIER is not set
The scrubber, run on this page

Both lines below were produced just now by the same function your browser runs before anything is sent. The example is made up; the scrubbing is not.

You typecold email to sam.draper@acme.com about the Q3 invoice, cc @finance_team — call me on (555) 123-4567 or see https://acme.com/inv/88421

We storecold email to [EMAIL] about the Q3 invoice, cc [HANDLE] — call me on [PHONE] or see [URL]

Tally: {"EMAIL":1,"URL":1,"PHONE":1,"HANDLE":1} — counts only. The scrubber is built so it can never emit a value it removed. It recognises SSN, EMAIL, URL, CARD, PHONE and HANDLE.

What is kept
rough
Your ask, scrubbed to typed placeholders.
refine
The optional second line, scrubbed the same way.
domain
Which of the 21 domains it was routed to.
moves
Each move: its key, its label, its value, and whether you supplied it, we added it, or we left it blank.
fills
Which blanks you filled and the words you used — scrubbed. The most valuable field here, and the only one that is volunteered rather than inferred.
engine
Which tier answered: template or AI.
redaction
How many redactions ran, by type — never the values. It counts passes, not people: your ask is echoed into the Task move, so one email in one sentence is scrubbed twice and tallied twice.
ts
When, to the millisecond. Set on the server; your clock is not trusted.
v / frameworkVer
Which capture and framework version produced the row, so old rows stay readable.
See the exact row this example produces
{
  "v": 1,
  "ts": 1789914600000,
  "rough": "cold email to [EMAIL] about the Q3 invoice, cc [HANDLE] — call me on [PHONE] or see [URL]",
  "refine": "",
  "domain": "Email & outreach",
  "engine": "template",
  "moves": [
    {
      "key": "task",
      "label": "Task",
      "value": "Cold email to [EMAIL] about the Q3 invoice, cc [HANDLE] — call me on [PHONE] or see [URL]",
      "source": "kept"
    },
    {
      "key": "audience",
      "label": "Recipient & relationship",
      "value": "Assume a cold recipient with no prior relationship; open by placing yourself (who you are + why them specifically) in one line.",
      "source": "added"
    },
    {
      "key": "context_hook",
      "label": "Why-you-why-them hook",
      "value": "Lead with one specific, true reason tied to the recipient, not a generic compliment.",
      "source": "added"
    },
    {
      "key": "tone",
      "label": "Tone & register",
      "value": "Warm, professional, direct; conversational not chummy; no corporate filler or hype.",
      "source": "added"
    },
    {
      "key": "format",
      "label": "Length & shape",
      "value": "Under 120 words, 3 short paragraphs, one clear ask, plus a subject line.",
      "source": "added"
    },
    {
      "key": "subject_line",
      "label": "Subject line",
      "value": "Offer 2-3 options: specific, under 6 words, no clickbait or all-caps.",
      "source": "added"
    },
    {
      "key": "cta",
      "label": "Call to action / next step",
      "value": "Close with a specific, low-effort next step actionable in a single reply.",
      "source": "added"
    }
  ],
  "fills": [],
  "frameworkVer": "v1",
  "redaction": {
    "EMAIL": 2,
    "URL": 2,
    "PHONE": 2,
    "HANDLE": 2
  }
}
What is never kept
Your raw text
Scrubbed in the browser before it is sent, and again on the server before it is written.
Your IP address
The collect endpoint does not read it. Not hashed, not bucketed, not stored — never touched.
Your user-agent
Not read.
Cookies or any session
The endpoint sets none and requires none. There is no account to attach a row to.
Anything that links two rows
There is no id field, no session and no account — a row carries no handle on the person who produced it. Nothing in the data points from one of your sharpens to another.
Visits, which are counted separately

Everything above is about what a sharpen leaves behind. Simply visiting also registers a page view, through Vercel’s analytics. It is a different thing with a different answer, so it gets its own list rather than being folded into the one above.

What is counted
That a page was viewed, which page, and roughly where in the world from. Plus the usual shape of the device — mobile or desktop, which browser.
No cookies
None are set, for this or anything else. Nothing is written to your browser to recognise you later.
No profile
Views are counted, not followed. There is no identifier joining two page views into a person, here or anywhere.
Private mode stops it too
The same toggle. With it on, the page view is dropped in your browser before any request is made — not received and discarded.

Why have it at all: the capture log only ever sees people who typed something. It is blind to anyone who opened the page, didn’t know what to write, and left — and that person is the one worth knowing about.

Scrubbed twice, on purpose

Once in your browser, before anything crosses the network. Then again on the server, before anything is written. The second pass is redundant when everything works — which is exactly why it is there. It has to survive a bug in the first pass, a stale cached bundle, or someone posting to the endpoint by hand.

Private mode is literal

Tick it and the page makes no network call — not for the sharpen, not for the scrubbed row, and not for the page view. Not “we receive it and throw it away” — there is nothing to throw away, because nothing is sent. The setting lives in your browser, and if storage is blocked it defaults to private rather than to sharing.

The caveat, stated plainly

Everything above is a promise about our database, not a claim that your words never leave your device. When the AI tier is running, a sharpen sends your text to the Anthropic API to be processed — that is how it answers. What we then store is still the scrubbed row described above. AI mode is off for this deployment right now, so no model is involved at all — but it is a setting, and this page reports it live rather than promising it forever.

The scrubbing is best-effort, not a guarantee. Regular expressions catch emails, phone numbers, cards, URLs, handles and SSNs. They do not catch a name typed as a name, or an address written out in prose. If what you are about to paste must not be recorded at all, use private mode — that is what it is for.

Back to it