Repository navigation
chore(analytics): keep anonymous usage aggregates, drop the visitor trail - #240
Merged
Merged
Conversation
2 tasks done
Contributor
🤖 MERGED
GitHub merged this pull request.
|
1 task done
1 task done
harlan-zw
force-pushed
the
chore/remove-telemetry
branch
from
September 22, 2026 02:23
439bc7b to
d5c5665
Compare
harlan-zw
added a commit
that referenced
this pull request
Sep 22, 2026
Loop 2 is judged on digest click-throughs, and #240 removed the only measure along with the per-reader click history. Links now carry the campaign, issue, placement, and path, and a daily counter stores nothing that names a reader.
1 task done
Privacy is a core skilld.dev tenet. Sentry, the Cloudflare Web Analytics beacon, CLI and install copy events, and weekly email click tracking all sent or stored visitor behaviour that the site does not need. Wide events in Workers Logs remain the operational record.
Install copy events stopped being written, so the table and the daily summary counts that read it only reported zeros.
The owner wants Sentry kept and hardened for privacy instead of removed. This restores it as on main; the next commit hardens it.
Sentry stays, but it must not learn who a visitor is. Browser envelopes now go through a same-origin Worker route, so sentry.io never sees a visitor IP. Browser tracing and session tracking are off. Every event, transaction, and breadcrumb loses query strings, cookies, bodies, and the user IP before it leaves the client or the Worker.
The owner wants RUM kept. The beacon proxy already forwards only a content type, so no visitor IP or cookie leaves the Worker. Page and referrer URLs in the beacon body now lose their query strings before forwarding.
skilld.dev is early, so it needs to know which Skills people run and where they find them. Removing copy and CLI events took that away with the personal data. Both come back as anonymous aggregates. Copies and CLI runs now write to Cloudflare Analytics Engine, which holds surface, grammar, kind, Skill, and country for 90 days and nothing that names a person. The `install_events` D1 table stays dropped: it kept one timestamped row per visitor action. The CLI may still send a `userId`, and the endpoint drops it, so the sampling index is the Skill and never the account. The copy body is strict, so a field the endpoint never asked for is a 400. The daily check-in reads copies over the Analytics Engine SQL API, split as run and install. Traces go back on at 1% for request timing; invocation logs stay off, because they record a full URL and client metadata per request.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
❓ Type of change
📚 Description
Privacy is a skilld.dev tenet, and several paths sent visitor behaviour to third parties or stored it per reader. This PR keeps the data the site needs to grow and drops the part that names a person.
Kept, as anonymous aggregates.
runorinstall), kind, Skill, and two-letter country. It holds no IP address, no cookie, and no account id. The CLI may still send auserId; the endpoint drops it, so the sampling index is the Skill and an account cannot be followed across runs. Blob order is fixed inshared/analytics.ts, because reordering would rewrite every saved query./api/monitoring) that forwards only to the configured DSN, so sentry.io never sees a visitor IP. The browser SDK sends errors only: no tracing, no session tracking, no replay. Client and server strip query strings, cookies, headers, bodies, anduser.ip_address, and drop console and UI click breadcrumbs.Dropped.
install_eventsin D1. It kept one timestamped row per visitor action. The count it fed now comes from Analytics Engine.weekly_click_events. Every row named a reader. feat(identity): count email clicks as daily aggregates #243 brings the digest click number back as a daily counter with no reader id.📝 Migration
0119_drop_click_and_install_events.sqldropsweekly_click_eventsandinstall_events. It cannot be recovered.skilld_web_v1Analytics Engine dataset is created on first write. No dashboard step.skilldproject, enable "Prevent Storing of IP Addresses" and server-side data scrubbing.Notes:
sendDefaultPiiis deprecated in @sentry/nuxt 10.73 and ignored whendataCollectionis set.dataCollection.userInfo: falsealready makes the browser client sendinfer_ip: never, so the deprecated flag is not set.newly_broken_repos_impactedno longer counts an install event as impact, because the table is gone. A star, subscription, collection, or Skill still counts.