Florent Martineau

~ ❯ cat ~/PRIVACY.md

Privacy

The site uses privacy-minimal, EU-hosted analytics for anonymous page views and Web Vitals only. It does not create profiles, record sessions, autocapture interactions, or store analytics cookies or analytics data in local storage. URLs are sent without query strings or fragments, and IP capture is disabled in the project settings.

You can disable anonymous analytics. This stores only your opt-out preference in this browser; no analytics data is sent after opting out.

Your theme preference is also saved in this browser. Terminal commands and searches are processed locally; search terms are not saved in URLs or persistent storage.

Exploring a role sends the submitted URL, including its query parameters, to Jina Reader. Downloaded text, the PDF, or pasted text is sent to Requesty and then OpenAI to extract requirements. One comparison request per requirement, with up to six running in parallel, sends the requirement, Florent’s public accounts and his published blog articles to the same providers to compare experience. Switching language may request another comparison. Postings and results are not sent to analytics. Completed extraction, the source URL and comparisons are kept in this tab’s session storage for reloads; the original PDF is not stored there. You can clear them from the comparison. Provider retention depends on their policies and account configuration; zero retention is not guaranteed. Cloudflare limits requests using a secret-keyed IP pseudonym that changes daily; the site does not log the address. People sharing a connection may share the limit.

Completed job descriptions and comparisons are stored on Cloudflare until deletion is requested. Descriptions saved before a comparison finishes expire after 24 hours if no result completes. Anyone with their content-hash link can read them; these links are not private. Saved results refresh after 28 days without a visit, or on an explicit refresh. Saved comparison pages are excluded from analytics. Uploaded PDF files and conversations are not retained with comparisons. Contact Florent with the comparison URL to request deletion.

The résumé conversation uses Florent’s AI assistant. On the job page, extracted job details and available comparison results also go through Requesty to the answer model and TypeSafe topic check with each question. Job-page conversations stay in page memory and clear on reload. Each question, selected passages, conversation history, public accounts and published blog articles are sent through Requesty to OpenAI to generate an answer. The site does not store conversations on its server or send them to analytics. The browser keeps the conversation in the tab’s session storage, separately for each language, until the tab closes or you start a new conversation after reaching its limit. Knowledge updates reset this history. If storage is unavailable, reloading clears the conversation. Retention at Requesty and OpenAI depends on their policies and account configuration; zero retention is not guaranteed. Rate limits use the same daily IP pseudonym mechanism as job exploration. Questions, selected passages and previous exchanges also go through Requesty to TypeSafe (Jev) to check the topic, without the public accounts. Checking and answering start in parallel. TypeSafe retention also depends on its policies. Cloudflare temporarily stores a refusal count, deadlines and a request lease under a secret-keyed IP pseudonym, without the raw address or message content. Penalties expire after 30 minutes without a refusal; an active request can extend storage until its lease expires. Shared connections share the cooldown. The browser separately keeps the cooldown expiry in local storage, shared across tabs, even after starting a new conversation.

When live captions are enabled, a separate ElevenLabs Scribe stream also processes microphone audio and incurs additional usage. We request disabled logging, but Scribe retention depends on the account’s provider terms and is separate from the agent’s retention settings. Optional voice conversations send microphone audio, selected passages and the published résumé knowledge and blog articles to ElevenLabs, which handles speech and replies. On the job page, extracted job details and available comparison results are also sent to ElevenLabs when a call starts and when that context changes during the call. The initial job context, selected passage and resumed history are held in the temporary call-agent configuration until cleanup. Saved audio is disabled and conversation retention is configured to zero days; this does not guarantee zero provider processing or retention. Once voice is used, the entire conversation stays in page memory and is cleared on reload. Switching modes sends prior messages and selected passages to ElevenLabs for voice, or through Requesty to the text model and topic guardrail for typed replies. A browser cookie shares a 20-minute daily allowance across tabs; clearing cookies or changing browsers resets it. Short-lived server counters store pseudonymous usage and provider call identifiers, not transcripts. Calls last at most five minutes. Text-only conversations retain their existing tab-session history.

~/RESUME.md

Experience & résumé

Florent Martineau’s résumé: software engineering experience, project accounts, and a curated role comparison with prepared answers.

Who stole the red panda?

Who stole the red panda?

A painting has vanished. Three detectives with very different methods take the case. All are right, and all are wrong.

Imagine

Imagine

I thought I'd write a long blog post about why this song spoke to me, then realised I had nothing to add or take away.

“It wasn’t me hacking, it was my agent!” Does that keep you out of jail?
The universal hammer
When ideas expire

When ideas expire

It’s the cache invalidation of mental models that I care the most about. That’s where I really see the lag.