Capless

Web analytics and session replay in one 2 KB tag.

Pageviews, clicks, errors, Web Vitals and replays, stored as plain JSON you can query with SQL, over HTTP, or through your coding agent.

Paste this tag before </head>

The key was made in this browser and is yours. One tag works on every site and page.

<script async src="https://c.capless.sh/c.js" data-key="…"></script>

Using Claude Code, Cursor or Codex? Give it this instead:

Add Capless analytics to this site. Run `curl -s https://capless.sh/new` and follow what it prints.

Watch it record

This page runs the same tag. Everything it stores about your visit shows up on the rightabove, live: pages, clicks, the device you're on, and a replay you can watch.

Your visit, as stored

connecting
  1. nowpageview/
  2. nextreplay_startstarts within seconds of your first page
  3. nextclickclick anything on this page
  4. nextpageleavewhen you reload or leave

Only your own visit is shown; click a record for every field. capless.sh writes its records every 3 s; quiet sites batch every 30 s to keep storage cheap, busy ones within a second.

Claim it to see everything

Dashboard, replays, SQL, API keys and your team. Free for 14 days without a card, then from $5 a month. Unclaimed data is deleted after 14 days, or look at it without an account.

Your visit, replayed

Every event is one JSON record

No schema to set up and nothing sampled away. Each event lands in one stream as plain JSON, with session, device and location added on the way in. Never the IP address.

  • pageviewEvery page, client-side navigation included, with title, referrer, UTM tags and timing
  • clickThe element's tag, text and selector; repeated clicks are flagged as rage clicks
  • submitForm submissions, with the form's name and action, never field values
  • errorUncaught errors and rejected promises, with stack traces
  • pageleaveTime on page, scroll depth, load time and Web Vitals
  • customYour own: capless("track", "signup", { plan: "team" })
  • identifyTies later events to a user: capless("identify", "u_123")
Example recordyours replaces it once stored
{
  "type": "pageview",
  "timestamp": "2026-10-31T09:14:02.118Z",
  "url": "https://example.com/pricing?utm_source=newsletter",
  "path": "/pricing",
  "title": "Pricing · Example",
  "referrerHost": "news.ycombinator.com",
  "navigation": "load",
  "ttfbMs": 84,
  "anonymousId": "k3x9w2mq7bmvx1",
  "sessionId": "q8n4t1v6zcmvx1",
  "device": {
    "browser": "safari",
    "os": "ios",
    "deviceType": "mobile",
    "screen": "390x844",
    "language": "en-GB"
  },
  "geo": {
    "country": "PT",
    "city": "Lisbon"
  }
}

Query it like your agent does

Every read takes a CEL filter and map that run next to the data, over HTTP or through the MCP server that Claude Code, Cursor and Codex connect to. Try it on your own visit: edit either expression and run it.

For aggregates, the same events stream into ClickHouse tables you query with SQL.

CEL reference · Connect an agent · SQL

POST /v1/streams/$web.events/readyour visit only
Run a query to see what Capless returns.

Replays that don't record what people type

Every input is masked before it leaves the browser, and password fields are never captured at all. Add capless-mask to hide text, or capless-block to leave a region out entirely. Raw IP addresses are never stored.

Stored as***************

Security and privacy

Your replay shows up here once its first chunk is stored, about 15 seconds after you arrive.

Your own visit, rebuilt from the frames Capless stored. This frame is left out of the recording with capless-block.

The details

2.0 KB
The tag, brotli, loaded async. Replay is a separate 1.7 KB file that loads only for recorded sessions.
0
Cookies. An anonymous ID in localStorage; a session ends after 30 idle minutes.
10 GB
Stored per project and month, kept until you delete it; beyond that $0.10 per GB-month.
3
Ways to query: HTTP with CEL filters, ClickHouse SQL, and MCP for coding agents.

Erase by predicate, for example entry.userId == "u_123", and it propagates to every table. For agents: llms.txt, AGENTS.md, OpenAPI and a signup API.

Pricing

$5a month on your own

$29per member a month for teams

Free for 14 days, no card. Start without an account: the tag at the top of this page is already yours.

Every project, every month, on both plans
UsageIncludedThen
Events250,000$2 per million
Replays2,500$0.50 per 1,000
Storage10 GB$0.10 per GB-month
SitesUnlimited