What stays in your browser
By default, the entire ranking works offline from data stored in your browser. Three local stores are used:
- Traffic events. A capped list of source slugs, an event type (view or open), and a timestamp. It is kept for up to 62 days and limited to 2,000 events. A page view is counted at most once per source every six hours; an outbound open is deduplicated for three seconds.
- Recent searches. Up to 40 queries with a timestamp and a count, so the search page and command palette can show your recent searches. Search queries are never sent to a server.
- Presence identifier. One random value, generated by your browser, used only to count how many people are on the site right now. It is not derived from your device, and it is sent to this site’s own server every 15 seconds while the tab is visible.
These use localStorage. A short-lived sessionStorage flag prevents a refresh from counting the same page view twice. None of this is a cookie, none of it is readable by another site, and none of it is transmitted by default.
What a traffic API records
If the site is deployed with the optional traffic API, a source page view or an outbound open sends a single JSON request containing the source slug and the event type. The server adds a timestamp. That is the entire payload.
- No IP address is stored in the database.
- No user agent, device identifier, or fingerprint is stored.
- No account, cookie, or session identifier is attached to an event.
- A per-IP rate limiter exists in memory to stop scripts from inflating the desk; it is not written to storage and is discarded with the worker.
Presence identifiers are separate from these events: they are held in memory only and never joined to a traffic record. If the deployment binds a D1 database, rows contain a slug, a kind, and a timestamp only, and are pruned after 62 days. If it does not, the aggregate lives in memory for the life of the worker and disappears on restart. The browser snapshot always remains available as a fallback.
The online-now counter
The live counter in the top bar is real, not decorative. While the tab is visible, the browser sends its random presence identifier to this site once every 15 seconds. The server keeps a list of identifiers with the time they were last seen, in memory only, and reports how many were seen in the last 45 seconds.
- Nothing is written to disk or to a database.
- No IP address, user agent, or location is attached to a presence entry.
- Identifiers expire 45 seconds after the last heartbeat and are never reused.
- Polling stops when the tab is hidden and resumes when you return to it.
- Clearing your signals on the trending desk also deletes the identifier, and a new one is generated on your next visit.
Presence is counted per server process. On a single-process deployment the number is exact; on a platform that runs several isolated instances it is an estimate, and the counter says so rather than guessing.
What is never collected
- No names, email addresses, or accounts. There is no sign-up.
- No advertising identifiers, tracking pixels, or third-party analytics.
- No cross-site profiles, fingerprinting, or behavioural retargeting.
- No content of any search you type is stored on a server.
Third-party requests
The site loads its two typefaces from Google Fonts, which means your browser contacts Google to fetch the font files. Those requests are subject to Google’s privacy terms. No other third-party script is loaded.
Clicking an official service opens that operator’s site in a new tab; from that point the operator’s own privacy policy applies. Clicking a GitHub link opens GitHub. Neither happens until you click.
Your choices
You can clear every signal stored on this device from the trending desk — the clear button removes the local event log. Clearing site data in your browser removes the recent searches as well. If a traffic API is deployed, the anonymous aggregate cannot be tied back to you, so there is nothing identifiable to delete.
Questions
For a privacy question or a correction, open an issue on the project repository. There is no tracking to explain beyond what is written here.