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- nowpageview/
- nextreplay_startstarts within seconds of your first page
- nextclickclick anything on this page
- 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.
API key and MCP setup (shown once)
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 timingclickThe element's tag, text and selector; repeated clicks are flagged as rage clickssubmitForm submissions, with the form's name and action, never field valueserrorUncaught errors and rejected promises, with stack tracespageleaveTime on page, scroll depth, load time and Web VitalscustomYour own:capless("track", "signup", { plan: "team" })identifyTies later events to a user:capless("identify", "u_123")
{
"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.
POST /v1/streams/$web.events/readyour visit onlyRun 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***************
Your replay shows up here once its first chunk is stored, about 15 seconds after you arrive.
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.
| Usage | Included | Then |
|---|---|---|
| Events | 250,000 | $2 per million |
| Replays | 2,500 | $0.50 per 1,000 |
| Storage | 10 GB | $0.10 per GB-month |
| Sites | Unlimited |