Skip to content
Apoorv Mittal

Privacy

What this site collects, how long it keeps it, and how to ask for it back.

Last updated: 2026-11-06

Who runs this site

Apoorv Mittal, Munich, Germany. Reach me at apoorv173@yahoo.co.in for anything in this policy, privacy questions, data requests, deletion requests.

What is collected

Pageviews and core web vitals via Vercel Analytics and Vercel Speed Insights. Both are cookieless and use no browser fingerprinting. Vercel reports an aggregate count of which routes were viewed plus performance percentiles. No identifying information about individual visitors is collected.

Approximate location is attached to a single per-visit pageview_geo event. Vercel’s edge network derives a country, region, and city from your IP at request time; only those three labels (e.g. “DE”, “BY”, “Munich”) are forwarded to Vercel Analytics as event properties. The IP address itself is not retained, logged alongside, or transmitted to any other party by this site. Used to understand which regions visitors come from.

Interaction events via Vercel Analytics record categorical clicks on a small set of UI elements: cv_download (PDF download triggered), chat_tab_open (the “ask my CV” hero tab opened), chat_message_sent (a chat message was sent — properties record the active persona and the 1-based turn index, never the message content), chat_persona_switch (the audience identified as recruiter / engineer / CTO / general), chat_feedback (an answer got a thumbs up or down — persona, verdict, and turn index only, never the question or answer), chat_followup_click (a suggested follow-up chip was clicked), chat_voice_mode (the hands-free voice toggle changed, on or off), cmdk_open (the command palette opened), external_link (LinkedIn / GitHub / Calendly clicks), nav_click (top-nav clicks), lang_switch (language toggle clicked), theme_toggle (dark / light toggle clicked), anagram_reveal (the home-page animation was played), translate_query (a translation was requested on /lab/for-german — properties record only the input kind and language direction, never the text or image), translate_rejected (an off-scope translation query was refused, with the categorical reason), pronunciation_attempt (a pronunciation-practice attempt finished on /lab/for-german — the property is a four-value score bucket, never the sentence or what was heard), and share_link (a share button was used — properties record only which page and whether it was the LinkedIn dialog or a copied link). Each event carries only short categorical labels (e.g. source: "palette"); no free-form input, no IP, no user identifier.

Chatbot messages in the “~/ask-my-cv” tab on the home page, and translation queries (text, questions, and uploaded images) on /lab/for-german, are sent to Anthropic’s API to generate replies. Anthropic processes the request subject to their privacy policy. I do not retain chatbot messages, translation queries, or uploaded images on my own servers. If you enable the optional HD voice on /lab/for-german, the sentence text (never your audio) is sent to Google’s Text-to-Speech API via this site, subject to Google Cloud’s privacy notice; generated audio clips may be cached in server memory to avoid repeat synthesis. The endpoints’ rate limiters hold your IP address in memory for at most 24 hours to enforce per-IP request caps; that state resets every time the function instance cold-starts and is never written to disk.

Voice input (the microphone buttons in the chat and on /lab/for-german) uses your browser’s built-in speech recognition. Depending on the browser, that audio may be processed on the browser vendor’s servers; Chrome, for one, routes it through Google. This site’s code receives only the resulting text, never the audio, and stores neither. Dictated text is treated like typed text: it is sent to Anthropic only when you send the message (in the chat’s hands-free mode, as soon as you stop speaking). Pronunciation practice is scored entirely in your browser. On /lab/local-whisper, the speech model is downloaded from Hugging Face’s CDN and its runtime from jsDelivr when you choose to load it; after that, audio is processed inside your browser tab and is not sent anywhere.

Server logs for the chatbot endpoint capture errors only (e.g. an Anthropic stream interruption). Logs do not include message content. They are kept for as long as Vercel’s default log retention (about a week).

What is not collected

No cookies (other than the locale-preference cookie set when you switch language), no advertising trackers, no third-party analytics besides Vercel’s own. The Anthropic chatbot does not run unless you actively send it a message.

Third parties

  • Vercel, hosting + analytics + speed insights.
  • Anthropic, only invoked when you use the chatbot or the translation tutor.
  • Google Cloud Text-to-Speech, only if you switch on the optional HD voice on /lab/for-german.
  • Your browser’s vendor (for example Google, if you use Chrome), only if you use voice input and your browser processes speech on its vendor’s servers. The audio goes from your browser to the vendor, not through this site.
  • Hugging Face and jsDelivr, only if you load the speech model on /lab/local-whisper.

Your rights under the GDPR

You have the right to access, correct, or request deletion of any personal data I hold about you. Given how little data this site collects, in practice that means: chatbot messages, if you sent any, are not retained on my side, and there is nothing to delete. Email me anyway if you have a specific concern.

Data Protection Officer

As a sole operator of a personal portfolio, I’m not required to designate a Data Protection Officer under Art. 37 GDPR. For privacy questions, I am the contact: apoorv173@yahoo.co.in.

Changes to this policy

If I change anything material, I’ll update the “last updated” date at the top and add a note here.

2026-11-06: added the paragraph on voice input and listed Google Cloud Text-to-Speech, the browser vendor, Hugging Face and jsDelivr under third parties. No change to what is collected; the features were already described next to their controls.