Features · Analytics
Traffic, without a tracker.
Views, top pages and top sources for each app, counted on Tofu’s own endpoint. No cookie, no third-party script, no stored IP address — and no analytics account to open.
Count visits to franks-kitchen.
tofu · siteAnalytics
site key tfsk_…a41c issued · snippet ready
Update(app/layout.tsx)
1 line added · collect.js, no cookie
tofu · ingest ~/franks-kitchen
code updated · settings kept
tofu · deploy
ready · HTTP 200 · publicly reachable
One line, or none at all.
Each app has one site key and one line. The key names your app and the addresses allowed to report for it — your trytofu.app address and the domains you connected — and nothing else.
In a framework app, your agent adds the line to your layout and deploys. For a prebuilt static site, one switch has Tofu add it at deploy time — to the copy being published, never to your stored files — and the Analytics section says whenever it did not.
<head>
<script defer
src="https://trytofu.ai/collect.js"
data-site="tfsk_…"></script>
</head>Counted without a tracker
Your visitors’ privacy, by construction.
Both ends are Tofu’s: a small script from its own domain, and its own endpoint. Nothing about a visitor leaves Tofu’s infrastructure.
Cookies
0
Nothing stored in the browser
So there is nothing to clear, and no banner to show for one.
Third-party scripts
0
One script, from Tofu’s own domain
Posting to Tofu’s own endpoint. No vendor on your page.
IP addresses stored
0
Used in memory, never kept
Unique visitors, where counted, come from a digest that changes every day, so no one is followed from one day to the next.
Days kept
90
Then deleted, by a daily job
Never kept past 365 days, and deleting the app deletes its traffic with it.
Do Not Track and GPC, honoured twice
Checked in the browser and again on the server: with either signal on, the view is not recorded at all.
Paths, not full addresses
Query strings and fragments are dropped first, and id-shaped segments become :id, so a search term or a reset token in a URL is never stored.
Not tied to anyone’s account
A view is never linked to a signed-in user, and the site key names your app without being able to read or change anything.
What you see
Your numbers, in your dashboard and your agent.
| Reported | What it is |
|---|---|
| Views | Every counted page load, per UTC day, with quiet days kept rather than dropped. |
| Top 10 paths | Paths only, with id-shaped segments folded into :id. |
| Top 10 sources | The referring site’s hostname, never its path. |
| Visitors | A count only where Tofu’s visitor salt is configured; otherwise shown as —, never a guess. |
Read it in the Analytics section, or ask your agent: siteAnalytics takes any window from 1 to 90 days. A number that cannot be read comes back as unavailable, never as a zero.
How many people saw the booking page this week?
tofu · siteAnalytics days: 7
1,284 views · 7 days
top paths · /book 412 · / 388
top sources · google.com 214 · instagram.com 96
The booking page had 412 views this week — counted as views, not people. Most visits came from Google.
Limits
What is not here yet
What Tofu’s traffic counter does not do.
One view per page load. In-app navigation in a single-page app is not a new view, so such an app under-counts.
Crawlers count like people. Bots are not classified: a crawler that sends no Do Not Track signal is a view.
No export and no webhook. Read the numbers in your dashboard or through your agent; there is no CSV and no webhook.
A collector with brakes. A per-site brake and one shared platform budget keep a flood out of the store — by dropping views, never by slowing your page.
Automatic adding is for prebuilt static sites. A framework app, Next.js included, carries the line in its own layout; the switch adds nothing to it, and the Analytics section says so.
No engagement or Web Vitals. Bounce, time on page and loading metrics are not measured.
Paste one line. Go live.
Your app, its database, your domain and your sign-in — from the agent you already use, in about 10 minutes.
The ship-it layer for vibe-coded apps. Your agent wrote it — Tofu ships it.
Works in all coding agents
© 2026 Tofu
trytofu.ai