Skip to content
Privacy

What we read, and what we never touch

Short version: the extension learns that you are waiting, never what you are waiting for.

What the extension never does

It never reads your source code, your prompts, or a model’s answers. It never opens a chat transcript. It never modifies another extension, and it never relaxes a content security policy to reach into one — that approach is how other tools in this category work, and it is the reason they can see things we cannot.

It has no analytics, no telemetry SDK, and no third-party scripts. Nothing about your keystrokes, files, or repository names leaves your machine.

How it knows a model is working

It watches one directory for file writes — filenames and modification times, nothing more. The watcher never opens a file, so the only fact it learns is that a chat transcript grew, which is the observable edge of an answer being streamed.

The distinction matters and we got it wrong once. An earlier build keyed on a background index file that is rewritten while you edit, so it believed a model was working when nothing was. That fired ads against waits that never happened, and it was fixed by watching transcripts specifically and refusing every other file by name.

Whether you are actually there

An ad nobody looked at should not be billable, so the client checks two things before counting one: that the window has focus, and that you have interacted with the editor in the last 3 minutes. Both are signals that you did something — a keystroke, a scroll, a click — never what you did.

Time only accrues while both hold. An impression counts after 5 seconds of that, verified independently against the server’s own clock.

What actually reaches the server

  • A random session id, regenerated every time the editor restarts.
  • Which surface asked (editor or terminal) and the rotation position.
  • A one-time nonce per ad, and how long it was on screen.
  • Your account, because that is who gets paid.
  • A coarse country, read from the CDN edge header, so advertisers can target by region. Not an IP address we store against you.

That is the whole list. There is no field for the file you had open, the language you were writing, or the project you were in.

Your device token

Pairing stores a token in your editor’s own secret storage — the OS keychain on macOS and Windows. It is never written to a settings file, never shown on screen, and never typed or pasted by you. Signing out deletes it, and revoking a device from the dashboard makes it refuse work immediately.

Turning it off

OpenSpinner: Account and privacy in the command palette has a switch that stops sponsored lines entirely while leaving your balance intact, and a sign-out that deletes the token. Uninstalling removes the extension and everything it stored; nothing of ours is left behind in your editor, because nothing of ours was ever put anywhere but our own directory.

Verify it rather than believe it

The client is published source. Every claim above is a few minutes of reading in clients/vscode/extension.js, and the released build can be checked against it — see the terms for what we commit to, and the repository for how releases are attested.

Status of this document

This describes the software accurately as of today and has not yet been reviewed by a lawyer. It is not yet a substitute for a formal privacy policy in jurisdictions that require specific disclosures, and it will be replaced by a reviewed version before this service handles money at scale.