Privacy
I built this site to collect less. Here is what leaves your browser, what I keep, and for how long.
The site's own analytics
The site has a small, first-party analytics endpoint of its own. It records the page path, the referring site's hostname, and page language; CLS, INP, and LCP performance measurements; and a short allowlist of interactions such as downloads, outbound links, language or theme changes, and use of the chat or contact form.
Browser analytics requests explicitly omit credentials. The endpoint accepts only a defined schema; it rejects unknown fields and request bodies larger than 4 KiB. Event labels cannot contain a chat question, contact message, name, or email address. The record I store contains no cookie, request IP address, browser fingerprint, visitor ID, or cross-site identifier. Every analytics record now has an expiration set for 180 days after creation. DynamoDB deletes expired records asynchronously, so removal can lag that timestamp.
The “Opt out of analytics” button at the bottom of every page stops these requests too. Global Privacy Control and Do Not Track turn off Google Analytics, described next, but not this endpoint, which sets no cookie and keeps no identifier.
Google Analytics
The site also uses Google Analytics 4, a service of Google LLC, to count visits. Google processes this data on my behalf. It receives each page's address and title, the referring site, and your browser's language, screen size, browser, and operating system. Google also uses your IP address to estimate your approximate location, such as your city. The address sent to Google keeps only the page path and campaign tags such as utm_source; other query parameters and anything after # are removed. With its standard settings, Google Analytics also records scrolling to the end of a page, clicks on links to other sites, and file downloads. I never send Google your name, email address, chat, or contact message.
Google Analytics sets two cookies on this site: _ga, and one whose name begins with _ga_. They hold a random identifier so a return visit can be counted, and they last up to two years. In the European Economic Area, the United Kingdom, and Switzerland, the site tells Google not to store these cookies. There, Google Analytics receives only cookieless measurements, without a stored identifier.
Advertising features are off. Google signals and ad personalization are turned off, and advertising storage is denied everywhere. Google Analytics keeps event-level data for 14 months.
Google Analytics does not load if your browser sends Global Privacy Control or Do Not Track. The “Opt out of analytics” button at the bottom of every page stops it too, from the next page view on. That choice is saved in this browser's localStorage, deletes the Google Analytics cookies already set, and also stops the site's own analytics. “Opt back in” undoes it. Clearing this site's data clears the choice too.
Chat
When you use the assistant, your question and the conversation shown in the dialog go to this site's AWS Lambda and Amazon Bedrock. This site does not write the chat text to its database.
The browser keeps the visible conversation in sessionStorage for the current tab so the dialog can reopen without losing it. “New chat” clears that copy. To slow automated abuse, the chat uses the request IP address as the key to applying a daily limit. That key is stored separately from analytics and expires after about two days. DynamoDB deletes expired records asynchronously, so removal can lag that time.
Contact form
The contact form sends your name, email address, and message through AWS Lambda and Amazon Simple Email Service to my inbox. The site does not add that message to analytics or save it in its database. Once delivered, it remains in my mailbox like an email you send directly.
What stays in your browser
If you choose light or dark mode, the site saves that choice in localStorage. Choosing “system” removes it. If you opt out of analytics, that choice is saved in localStorage too. Chat history uses sessionStorage in the current tab. Language is part of the URL rather than a stored preference. The site's own code sets no cookies; the only cookies are the Google Analytics cookies described above.
Hosting and outside services
The static site and its API run on AWS, which processes network requests to deliver the pages and features. This site serves its own fonts and media. Writing pages retrieve verified public webmentions through the site's API.
Google Analytics is the only third-party script, and there are no third-party iframes. YouTube, GitHub, LinkedIn, and other sites do not receive a request until you follow a link to them. Then your browser connects to that service, and its privacy terms apply.
Questions or corrections
If this description does not match what the site does, or you want to ask about a record, email me at chelsea@chelseakr.com.