feat: add Privacy Notice page in all 7 locales #150

Merged
ellamizuki merged 1 commit from feat/privacy-notice-page into main 2026-09-05 21:49:39 +00:00
ellamizuki commented 2026-09-05 21:43:43 +00:00 (Migrated from github.com)

What this adds

A /privacy page (all 7 locales: en, pt, es, fr, de, ja, zh-CN) documenting what the site does and does not do with visitor data — requested after auditing the actual getClientIp/rate-limiting code in PR #149 and confirming plain-text IP storage in production.

Content basis (verified against the actual codebase, not boilerplate)

  • AI chat ("Yue AI") conversations are stored only in the browser's localStorage — verified in apps/web/src/utils/yue-chat-storage.ts. The server never persists message content.
  • Server-side AI observability only records content-free metrics — verified in apps/web/src/lib/ai/ai-observability.ts (response time, estimated token count, provider/model, status code, endpoint). No message text.
  • No code path sends chat content anywhere for model training or fine-tuning.
  • Chat feedback (like/dislike) stores only the rating + an optional comment tied to a messageId — verified in packages/db/src/schema/ai-chat-feedback.ts. Not the surrounding conversation.
  • IP address, user agent, and analytics events ARE collected server-side for rate-limiting, error/security logs, and basic analytics — and are stored as plain text, not hashed or encrypted (confirmed directly against production data while investigating PR #149). This is disclosed rather than glossed over, since it's the accurate state of the code today.

Structure

  • apps/web/src/app/[locale]/(main)/privacy/page.tsx — new route, follows the same pattern as the existing /uses page (WebPage JSON-LD, build_alternates, getLocalizedPath)
  • apps/web/src/content/pages/<locale>/privacy.mdx — one file per locale (7 total)
  • privacy.title / privacy.description (page metadata) and layout.privacy (footer link label) added to all 7 packages/i18n/src/messages/*.json files
  • Footer link added to FOOTER_LINKS in apps/web/src/config/links.tsx

Validation

  • pnpm turbo type-check --filter=@isyuricunha/web --filter=@isyuricunha/i18n — clean
  • pnpm turbo lint (same filters) — clean, --max-warnings 0
  • pnpm test:unit (full suite, includes the i18n key-parity test across all 7 locales) — 185/185 passed
  • content-collections build compiled all 7 new MDX documents successfully (538 total documents, up from 531)

Follow-up

I'm separately looking into hashing/anonymizing the plain-text IP addresses in the logging tables (analytics_events, error_logs, etc.) mentioned above — that's a schema-level change and will come as its own PR.

## What this adds A `/privacy` page (all 7 locales: en, pt, es, fr, de, ja, zh-CN) documenting what the site does and does not do with visitor data — requested after auditing the actual `getClientIp`/rate-limiting code in PR #149 and confirming plain-text IP storage in production. ## Content basis (verified against the actual codebase, not boilerplate) - **AI chat ("Yue AI") conversations are stored only in the browser's `localStorage`** — verified in `apps/web/src/utils/yue-chat-storage.ts`. The server never persists message content. - **Server-side AI observability only records content-free metrics** — verified in `apps/web/src/lib/ai/ai-observability.ts` (response time, estimated token count, provider/model, status code, endpoint). No message text. - **No code path sends chat content anywhere for model training or fine-tuning.** - **Chat feedback (like/dislike) stores only the rating + an optional comment tied to a `messageId`** — verified in `packages/db/src/schema/ai-chat-feedback.ts`. Not the surrounding conversation. - **IP address, user agent, and analytics events ARE collected server-side** for rate-limiting, error/security logs, and basic analytics — and are stored as **plain text**, not hashed or encrypted (confirmed directly against production data while investigating PR #149). This is disclosed rather than glossed over, since it's the accurate state of the code today. ## Structure - `apps/web/src/app/[locale]/(main)/privacy/page.tsx` — new route, follows the same pattern as the existing `/uses` page (`WebPage` JSON-LD, `build_alternates`, `getLocalizedPath`) - `apps/web/src/content/pages/<locale>/privacy.mdx` — one file per locale (7 total) - `privacy.title` / `privacy.description` (page metadata) and `layout.privacy` (footer link label) added to all 7 `packages/i18n/src/messages/*.json` files - Footer link added to `FOOTER_LINKS` in `apps/web/src/config/links.tsx` ## Validation - `pnpm turbo type-check --filter=@isyuricunha/web --filter=@isyuricunha/i18n` — clean - `pnpm turbo lint` (same filters) — clean, `--max-warnings 0` - `pnpm test:unit` (full suite, includes the i18n key-parity test across all 7 locales) — 185/185 passed - `content-collections build` compiled all 7 new MDX documents successfully (538 total documents, up from 531) ## Follow-up I'm separately looking into hashing/anonymizing the plain-text IP addresses in the logging tables (`analytics_events`, `error_logs`, etc.) mentioned above — that's a schema-level change and will come as its own PR.
isyuricunha (Migrated from github.com) reviewed 2026-09-05 21:43:43 +00:00
vercel[bot] commented 2026-09-05 21:43:48 +00:00 (Migrated from github.com)

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
website-docs Ready Ready Preview Sep 5, 2026 9:48pm UTC
website-web Ready Ready Preview Sep 5, 2026 9:48pm UTC
[vc]: #WgiT/MXE+aF1l19bU8VbsaOgWiW6xJuT3J1saWX6YLk=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJ3ZWJzaXRlLXdlYiIsInByb2plY3RJZCI6InByal9iNnJGaEFBUEhJWFI3M2Nlb2RFMHl2bEJ3MzgyIiwicm9vdERpcmVjdG9yeSI6ImFwcHMvd2ViIiwiaW5zcGVjdG9yVXJsIjoiaHR0cHM6Ly92ZXJjZWwuY29tL3l1cmktY3VuaGFzLXByb2plY3RzL3dlYnNpdGUtd2ViLzNUOHZ5eVFOdEV6RTNVS2syWVVyeDRCWG9xOEEiLCJwcmV2aWV3VXJsIjoid2Vic2l0ZS13ZWItZ2l0LWZlYXQtcHJpdmFjeS1ub3RpY2UtcGFnZS15dXJpLWN1bmhhcy1wcm9qZWN0cy52ZXJjZWwuYXBwIiwibmV4dENvbW1pdFN0YXR1cyI6IkRFUExPWUVEIiwibGl2ZUZlZWRiYWNrIjp7InJlc29sdmVkIjowLCJ1bnJlc29sdmVkIjowLCJ0b3RhbCI6MCwibGluayI6IndlYnNpdGUtd2ViLWdpdC1mZWF0LXByaXZhY3ktbm90aWNlLXBhZ2UteXVyaS1jdW5oYXMtcHJvamVjdHMudmVyY2VsLmFwcCJ9fSx7Im5hbWUiOiJ3ZWJzaXRlLWRvY3MiLCJwcm9qZWN0SWQiOiJwcmpfMmVVMnNUTTBpZFk3MHJUYnNjQ0N0RXQ2TUZPdyIsInJvb3REaXJlY3RvcnkiOiJhcHBzL2RvY3MiLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20veXVyaS1jdW5oYXMtcHJvamVjdHMvd2Vic2l0ZS1kb2NzLzM2WmduTnU5M0dGODFCM3ZOWnoyaTN1cE5TOFQiLCJwcmV2aWV3VXJsIjoid2Vic2l0ZS1kb2NzLWdpdC1mZWF0LXByaXZhY3ktbm90aWNlLXBhZ2UteXVyaS1jdW5oYXMtcHJvamVjdHMudmVyY2VsLmFwcCIsIm5leHRDb21taXRTdGF0dXMiOiJERVBMT1lFRCIsImxpdmVGZWVkYmFjayI6eyJyZXNvbHZlZCI6MCwidW5yZXNvbHZlZCI6MCwidG90YWwiOjAsImxpbmsiOiJ3ZWJzaXRlLWRvY3MtZ2l0LWZlYXQtcHJpdmFjeS1ub3RpY2UtcGFnZS15dXJpLWN1bmhhcy1wcm9qZWN0cy52ZXJjZWwuYXBwIn19XX0= The latest updates on your projects. Learn more about [Vercel for GitHub](https://vercel.link/github-learn-more). | Project | Deployment | Actions | Updated | | :--- | :----- | :------ | :------ | | <a href="https://vercel.com/yuri-cunhas-projects/website-docs"><sup><img src="https://vercel.com/api/www/avatar?projectId=prj_2eU2sTM0idY70rTbscCCtEt6MFOw&teamId=team_g087rqPZJa9s4DWPeZtQhxa9&s=32" width="16" height="16" align="middle" alt="" /></sup></a> [website-docs](https://vercel.com/yuri-cunhas-projects/website-docs) | ![Ready](https://vercel.com/static/status/ready.svg) [Ready](https://vercel.com/yuri-cunhas-projects/website-docs/36ZgnNu93GF81B3vNZz2i3upNS8T) | [Preview](https://website-docs-git-feat-privacy-notice-page-yuri-cunhas-projects.vercel.app) | <relative-time datetime="2026-09-05T21:48:41.846Z">Sep 5, 2026 9:48pm UTC</relative-time> | | <a href="https://vercel.com/yuri-cunhas-projects/website-web"><sup><img src="https://vercel.com/api/www/avatar?projectId=prj_b6rFhAAPHIXR73ceodE0yvlBw382&teamId=team_g087rqPZJa9s4DWPeZtQhxa9&s=32" width="16" height="16" align="middle" alt="" /></sup></a> [website-web](https://vercel.com/yuri-cunhas-projects/website-web) | ![Ready](https://vercel.com/static/status/ready.svg) [Ready](https://vercel.com/yuri-cunhas-projects/website-web/3T8vyyQNtEzE3UKk2YUrx4BXoq8A) | [Preview](https://website-web-git-feat-privacy-notice-page-yuri-cunhas-projects.vercel.app) | <relative-time datetime="2026-09-05T21:48:41.846Z">Sep 5, 2026 9:48pm UTC</relative-time> |
Sign in to join this conversation.
No description provided.