Privacy Policy
Written plainly. This page tells you exactly what personal data we collect when you use pseolint, why we collect it, how long we keep it, who else sees it, and the rights you have to change, export, or delete it.
Privacy notice scope: this disclosure governs the pseolint hosted dashboard, audit submission endpoints, magic-link authentication flow, billing receipts dispatched via Polar.sh, and the pseolint-bot crawler when it fetches pages from sites you submit. It does not extend to third-party destinations our outbound links reach, nor to self-hosted CLI runs that never contact our servers — those execute entirely on your machine and never transmit audit bodies, IP fragments, or telemetry of any kind back to Ouranos Labs. This document was first published on April 20, 2026, aligns 100% with the GDPR Article 13 disclosure requirements, and was updated on April 30, 2026 to reflect the v0.4.0 engine cut.
Effective 2026-04-20 · contact philippe.kam27@gmail.com
Who is the data controller
- Controller
- pseolint, operating the service at pseolint.dev.
- Contact
- philippe.kam27@gmail.com
- Scope
- This policy covers pseolint.dev, its API, the CLI when it communicates with our servers, and transactional email we send you. It does not cover websites we audit on your instruction — those are separately controlled by their operators.
What we collect, and why
- Email address
- Collected when you create an account (magic link or Google OAuth). Used for authentication, sending the magic link, audit-completion notifications, and billing receipts. Legal basis: contract performance + legitimate interest (account security).
- Account metadata
- Name (from Google OAuth, if used), timezone, UI preferences. Legal basis: contract performance.
- Audited URLs and rendered reports
- The URLs you submit, the HTML we fetch from them, the structured audit summaries we generate, and derived stats (score, counts). Legal basis: contract performance — we can't deliver the service without this.
- Hashed IP (rate-limit signal)
- We store a SHA-256 hash of your IP combined with a rotating server-side salt. The raw IP is never written to storage; only the hash is. Legal basis: legitimate interest (abuse prevention). Salt rotates periodically, which unlinks historical hashes from current IPs.
- Anonymous session cookie
- One opaque random ID (signed). Lets us tie a pre-sign-in audit to your browser so you can reclaim it on sign-up. Legal basis: strictly necessary (functional — exempt from EU cookie consent).
- Authentication cookie
- Issued after you sign in. HttpOnly, Secure, SameSite=Lax. Expires after 30 days of inactivity. Legal basis: strictly necessary.
- Billing metadata
- Subscription plan, Polar customer ID, renewal date. We do NOT receive your card details — those stay with Polar.sh, our merchant of record. Legal basis: contract + legal obligation (invoicing, VAT).
- Analytics
- Aggregate request logs (route, status, response time) retained 30 days for debugging and capacity planning. No cross-site tracking. No third-party analytics SDK. Legal basis: legitimate interest.
What we do NOT collect
- No raw IP addresses
- They never touch disk. Only salted hashes do.
- No card / bank data
- Polar.sh handles payment collection end-to-end.
- No behavioral tracking
- No Google Analytics, Segment, Mixpanel, FB pixel, LinkedIn pixel, or similar. No cross-site identifiers.
- No advertising
- We do not sell or rent data. We do not run ads. We do not participate in ad networks.
- No training on your data
- Your audit content is not used to train AI models — ours or anyone else's. AI triage calls (Pro) send the minimum necessary snippet to Anthropic under their zero-retention terms.
How long we keep data (retention)
- Anonymous audit reports
- 24 hours, then auto-deleted from storage. DB row keeps aggregate stats (score, page count) for internal analytics.
- Free-account audit reports
- 30 days, then the cached report body is deleted. Aggregate stats remain.
- Pro-account audit reports
- Kept until you delete the audit or close the account.
- Account email + profile
- Kept while your account is open. Deleted within 30 days of account deletion, except where we must retain something to meet a legal obligation (e.g. invoicing records).
- Invoices and payment metadata
- Retained 10 years per applicable tax/accounting law in the EU.
- Salted IP hashes
- Deleted after 14 days. Salt rotates every 30 days, severing linkability beyond that window.
- Aggregate request logs
- 30 days.
- Email delivery logs (Resend)
- Retained by Resend per their policy; we purge references after 90 days.
Who we share data with (subprocessors)
- Neon (Postgres hosting)
- Stores all account and audit metadata. Data region: EU. Contract: GDPR-compliant DPA.
- Cloudflare R2 (object storage)
- Stores cached report HTML and structured summaries. Data region: auto-placed EU-first.
- Cloudflare Turnstile
- Bot challenge on sign-in and audit submission. Receives a challenge token, not personal data beyond IP (which Cloudflare processes per its own terms).
- Polar.sh (payments, merchant of record)
- Receives your email and the purchase intent when you subscribe. Handles checkout, tax, and invoicing. See polar.sh/privacy.
- Resend (transactional email)
- Receives your email address + the message content (magic link, audit-complete, alerts) at send time.
- Google (OAuth, if chosen)
- Google is informed only that you used pseolint to sign in (inherent to OAuth). We receive your email and basic profile from Google.
- Anthropic (AI triage, Pro only)
- For Pro accounts that run AI triage, an aggregated, anonymized finding summary is sent to Anthropic for root-cause analysis. Sent under Anthropic's zero-retention policy for API. Your audited URLs are not sent; only rule IDs and counts.
- Inngest (background job orchestration)
- Receives audit IDs and worker metadata to run the audit pipeline. Does not receive audit report contents.
- International transfers
- Some subprocessors process data in the United States (e.g. Resend, Anthropic). Transfers rely on the EU-US Data Privacy Framework and/or Standard Contractual Clauses.
Your rights under GDPR / UK GDPR / CCPA
- Right of access
- Request a copy of the personal data we hold about you. We respond within 30 days.
- Right to rectification
- Correct inaccurate data via your account or by emailing us.
- Right to erasure
- Delete everything with
DELETE /api/accountwhile signed in, or email us. Removes user record, audits, reports, and derived stats within 30 days. - Right to portability
- Export your audit history as JSON via
GET /api/account/export. - Right to restrict / object
- Email us to restrict processing or object to legitimate-interest processing (rate-limit hashes, analytics).
- Right to withdraw consent
- Where processing is based on consent (e.g. marketing email, if you ever opted in), you can withdraw at any time without affecting lawful processing that already happened.
- Right to lodge a complaint
- You may complain to your local EU data-protection authority. In France: CNIL (cnil.fr).
- No automated decision-making
- We do not take legal or similarly significant decisions about you via automated means.
Security
- Transport
- All connections use TLS 1.2 or higher. HSTS is enforced.
- At-rest encryption
- Database and object storage are encrypted at rest by the hosting provider.
- Authentication
- Magic links are single-use, short-lived (15 minutes), and bound to the requesting device. Google OAuth follows Google's security model.
- Session cookies
- HttpOnly, Secure, SameSite=Lax. Signed with a server-held secret.
- Access control
- Private audits are keyed to the user ID or anonymous session ID. Public audits are accessible by anyone who has the share URL (by design).
- Breach notification
- If we confirm a personal-data breach likely to result in risk to your rights, we will notify the relevant authority within 72 hours and you as soon as reasonably possible, per Art. 33–34 GDPR.
Cookies and local storage
- Strictly necessary cookies
- Session cookie (auth), anonymous session cookie, CSRF token. Exempt from consent under EU ePrivacy — these are required for the service to function.
- No analytics cookies
- We set no analytics or tracking cookies.
- No advertising cookies
- We set none.
- Third-party cookies from embeds
- We do not embed third-party trackers. Turnstile may set a short-lived functional cookie during the bot challenge.
- Local storage
- We use localStorage only to remember UI preferences (e.g. theme). No personal identifiers.
Children
- Age
- The service is not directed at children under 16. We do not knowingly collect data from children under 16. If you believe we have, email us and we will delete it.
Changes to this policy
- Notifications
- Material changes are announced at least 30 days before they take effect — via an in-app banner and, for signed-in users, email. Non-material edits (typos, clarifications) are made in place with an updated effective date.
- History
- Previous versions of this policy are available on request.