← Back to RetIQ · Features · Manual · Validation
🛡

Privacy & Security Transparency

A complete, verifiable audit of what RetIQ does — and does not do — with your data, on every platform

0
Data Collected
0
Trackers
0
External Requests During Use
100%
Client-Side Math
CSP
Browser-Enforced

Core Privacy Principles

💻

Your Device Is the Engine

Every financial calculation — tax brackets, Social Security estimates, Roth conversion optimization, Monte Carlo simulation — runs locally on your device. On the web it runs in your browser; on iOS it runs inside the app's sandboxed environment. Nothing is sent to a server for processing. Your numbers never leave your device unless you explicitly ask the optional AI Guide a question — and even then, only a plan summary goes to the provider you chose.

🔒

Your Data Stays on Your Device

All plan data is saved to local storage on your device — localStorage in your browser on the web, or the app's private sandboxed storage on iOS. RetIQ cannot read, retrieve, or access this data remotely. Neither can anyone else.

🚫

No Accounts. No Tracking. No Ads.

RetIQ has no user accounts, no login, no analytics, no tracking pixels, no cookies, no fingerprinting. On the web, the only personal information collected is the email address you provide at Stripe checkout, used solely for license key delivery. On iOS, purchases are handled entirely by Apple — we receive no personal information at all. There is no mechanism to correlate your usage across sessions.

🔌

Works Fully Offline

On the web, RetIQ installs as a Progressive Web App and works without any internet connection after the first load. On iOS, the app is fully self-contained from installation. This is structural proof that your financial data doesn't need to go anywhere — because it doesn't.

🔐

Browser-Enforced Lockdown

A strict Content-Security-Policy embedded in the app itself tells your browser exactly which domains RetIQ is allowed to contact. Even if the code were somehow modified, your browser would block any unauthorized connections. This is a browser-enforced guarantee, not a promise.

📖

Verified & Inspectable

RetIQ is built as a single HTML file with all calculations running in your browser. You can inspect the running code at any time using your browser's View Page Source (Ctrl+U or Cmd+Opt+U) and DevTools. Every calculation is validated against authoritative sources — open the Validation tab to see 3,700+ automated tests with IRS/SSA/CMS citations. Transparency isn't a feature — it's the foundation.

Complete Network Manifest

The table below is an exhaustive list of every external domain RetIQ contacts, when it contacts them, and exactly what data is transmitted. There are no hidden endpoints, no background beacons, no telemetry.

DomainWhenPurposeData SentFinancial Data?
retiq-worker.bortvin.workers.dev
Cloudflare Worker
App load, purchase & license, and — only if you use it — the AI Guide Licensing & trial: /create-checkout-session, /start-trial, /verify-token, /validate-license, /verify-session, /redeem-session, /recover-license
Regulatory data: /regs-current and /state-taxes-current — two small checks at app load that download current federal and state tax constants; nothing about you is sent
AI Guide: /ai-proxy — relays your question, a plan summary, and your API key to your chosen AI provider, in memory only, when you submit a question
(Plus a Stripe-to-worker webhook and admin-secret-gated maintenance endpoints that your browser never calls.)
License key or trial token for licensing; nothing personal for the regulatory checks. The AI Guide is the one flow that carries financial data: a plan summary, sent only when you ask a question, relayed to your provider and never stored or logged.Only if you use the AI Guide
checkout.stripe.comWeb purchase onlyStripe's payment page processes web purchases. You are redirected to Stripe's domain — RetIQ never sees your credit card number.Stripe collects payment information under Stripe's Privacy Policy. RetIQ receives only a license key in return.No
Apple StoreKit
iOS only
App purchase onlyIn-app purchases on iOS are verified on-device through Apple's StoreKit 2 framework. Purchase validation happens locally — no server round-trip to RetIQ.Nothing sent to RetIQ. Apple handles all payment processing. RetIQ receives only a purchase confirmation from StoreKit on-device.No
That's the complete list. During normal use (entering data, running projections, Monte Carlo simulations), RetIQ makes no network requests beyond two small automatic checks at app load — /regs-current (federal tax constants) and /state-taxes-current (state tax overrides), which download current data and send nothing about you. Licensing endpoints fire only when you buy, start a trial, or activate a license. The AI Guide contacts the worker only when you submit a question. There are no analytics services, no advertising networks, no social media trackers, no error-reporting services, no telemetry of any kind. Even fonts are self-hosted — no Google Fonts CDN.

Content Security Policy — Browser-Enforced Restrictions

RetIQ includes a strict Content Security Policy (CSP) in its HTML. This is not just a claim — it's a set of rules your browser actively enforces. Even if RetIQ's code were somehow modified, your browser would block any connection that violates these rules:

CSP DirectivePolicyWhat It Means
default-src'self'By default, only load resources from retirementiq.app itself
script-src'self' 'unsafe-inline'Only run scripts embedded in the page — no external JS files can be loaded from any domain
style-src'self' 'unsafe-inline'Styles from the page itself only — no external CSS from any domain
font-src'self'Font files from retirementiq.app only — self-hosted, no CDN
connect-src'self'
retiq-worker.bortvin.workers.dev
API calls restricted to RetIQ's own worker — no other server can be contacted via fetch/XHR
img-src'self' data: blob:Images from the site itself and inline data (icons)
object-src'none'No plugins (Flash, Java, etc.) can run — ever
frame-src'none'No iframes — no third-party content can be embedded in the page
form-action'none'No form submissions — data cannot be POST-ed to any server via HTML forms
How to verify: View the page source (Ctrl+U or Cmd+Opt+U) and look for the <meta http-equiv="Content-Security-Policy"> tag near the top. Your browser reads this tag and blocks any request that violates it — you can see violations in the DevTools Console.

The AI Guide — The One Optional Data Flow

RetIQ includes an optional AI Guide. If you never use it, no plan data is ever transmitted anywhere. When you enable it and submit a question, three things travel to RetIQ's worker in a single request: your question, a summary of your plan (relevant inputs and projection results), and the API key you configured. The worker relays the request to the AI provider you selected — Anthropic, OpenAI, Google, Perplexity, Meta, Groq, DeepSeek, or Mistral — and returns the answer. Everything passes through in memory only: the worker does not log or store your question, your plan summary, your key, or the provider's response.

Your API key lives in your browser's localStorage (one entry per provider you configure) and is used solely to authenticate your own account with your chosen provider. Your provider's privacy policy applies to what you send it. Because the Content Security Policy allows connections only to RetIQ's worker, the app cannot contact any AI provider directly — every AI request is visible in the Network tab as a single call to /ai-proxy.

What's Stored on Your Device

RetIQ saves your settings and plan data locally on your device. On the web, this uses your browser's localStorage, sandboxed so that only retirementiq.app can read it. On iOS, the app uses its own private sandboxed storage, inaccessible to other apps. Nothing here is ever transmitted automatically — the only exception is the AI Guide flow described above, which you trigger explicitly. Below is every key RetIQ writes (web key names shown — the iOS app stores equivalent data):

KeyContainsWhen Written
retiq_v1Your retirement plan inputs: ages, income, expenses, account balances, Social Security settings, Roth strategy, etc. This is the core of your financial plan.Every time you change an input (Pro users only)
retiq_themeYour color theme preference: "dawn" (default), "sepia", "dusk", "dark", or "light"When you toggle the theme
retiq_pro"true" or absent — whether Pro is activated on this deviceWhen you activate a license
retiq_licenseYour license key stringWhen you activate a license
retiq_trial_tokenA trial session token (no personal info)When you start a trial
retiq_trial_startTimestamp of when your trial beganWhen you start a trial
retiq_pre_survivor_backupAn automatic backup of your plan, taken so you can restore the original after adopting a survivor planWhen you use Adopt Plan in the Survivor Planning Center
retiq_textScaleYour text size preference: default, large, or largerWhen you cycle the Text Size button
retiq_showRealDollarsWhether the Today's-dollars display toggle is onWhen you flip the dollars toggle
retiq_mode_seenA one-time flag so the Simple/Full mode introduction isn't repeatedThe first time the mode chooser appears
retiq_seen_guideA one-time flag so the Guide introduction isn't repeatedThe first time you open the Guide tab
retiq_ai_enabled"true" or absent — whether you've enabled the optional AI GuideWhen you enable the AI Guide
retiq_ai_providerWhich AI provider you selectedWhen you choose a provider
retiq_ai_key_<provider>Your API key for that provider — one entry per provider you configure, used solely to authenticate your questions with that provider (see the AI Guide section above)When you save an API key
Important: Because your data lives only in your browser's localStorage, clearing your browser data or switching devices will erase your plan. Use the HTML Export feature to save a portable copy of your plan, or export as JSON — optionally locked with a password (see the next section). The exported file is stored on your computer and is never uploaded anywhere.

Password-Protected Export — Your Plan, Locked

When you save your plan as JSON (Save → Save as JSON), RetIQ can encrypt the file with a password — tick “Protect this file with a password” in the export dialog and choose a passphrase. The encryption happens on your device, before anything leaves it: the file is encrypted with AES-256-GCM, and the key is derived from your password with PBKDF2-SHA256 at 600,000 iterations — the same standard password managers use to protect your vault. The bytes that leave your device are ciphertext; without your password they are meaningless.

Because the key is derived from your password on your device, no recovery is possible by design. If you forget the password, the file cannot be opened — not by you, not by us, not by anyone. There is no backdoor and no “forgot password” flow; that is the point of encrypting it. A protected file exported on iOS opens on the web app, and vice versa. Unprotected HTML and JSON exports work exactly as before — the password lock is strictly optional, for when you want it.

Choose a strong passphrase and keep it safe. A few random words beat a short, complex password and are easier to remember. Write it down somewhere secure or use a password manager — there is no way for RetIQ, or anyone else, to recover it for you.

What RetIQ Never Does

RetIQ does not:

• Send your financial data (income, balances, expenses, Social Security, tax info) to any server — ever
• Create user accounts or require login
• Collect your name, phone number, or personal identifiers (your email is collected by Stripe at checkout for license delivery and recovery only)
• Use cookies for tracking (RetIQ sets no cookies at all)
• Use browser fingerprinting or device identification
• Include analytics, telemetry, or error-reporting services
• Display advertisements or share data with ad networks
• Sell, rent, or monetize any data — there is no data to sell
• Use your data to train AI models or for any secondary purpose
• Phone home, ping servers, or send background requests while you use the app
• Access your clipboard, camera, microphone, contacts, or files (beyond the import feature you explicitly trigger)
• Hold a “master key” or backdoor to your data — password-protected exports are encrypted with no recovery, so not even RetIQ can open them without your password

Verify It Yourself

You don't have to trust these claims — you can confirm them in under two minutes using tools built into your browser. These same techniques are used by security professionals to audit web applications.

Open DevTools → Network tab. In Chrome or Edge, press F12 (or Cmd+Opt+I on Mac), then click the Network tab. In Firefox, press F12 and select Network. In Safari, enable the Develop menu in Preferences, then press Cmd+Opt+I.
Reload RetIQ and watch. You'll see requests to retirementiq.app — the app itself, its fonts, and its icons — plus at most two small calls to RetIQ's worker: the /regs-current federal tax-constants check and the /state-taxes-current state-tax check, both of which send nothing about you. Nothing else.
Use the app — change inputs, run projections, run Monte Carlo. Watch the Network tab. You will see zero new network requests — the one exception is asking the AI Guide a question, which appears as a single call to /ai-proxy. All calculations happen locally in your browser.
Check localStorage. In DevTools, go to Application (Chrome/Edge) or Storage (Firefox) → Local Storageretirementiq.app. You'll see exactly the keys listed above and nothing else.
Go offline. Turn off Wi-Fi or enable airplane mode. RetIQ continues to work perfectly — projections, charts, Monte Carlo — because nothing depends on a server connection.
Check the Content Security Policy. View page source (Ctrl+U) and find the Content-Security-Policy meta tag in the <head>. This tells your browser exactly which domains are allowed. In DevTools → Console, any CSP violation would appear as a red error — the browser will block any attempt to send data to an unauthorized domain.
For advanced users: RetIQ is a single HTML file with embedded JavaScript. Right-click and select View Page Source in your browser to read the running application. Every calculation, every network call, every localStorage write is visible. There is no minified or obfuscated code hiding additional behavior.

How RetIQ Compares

Most retirement planning tools store your financial data on their servers, require accounts, and use tracking. Here's how RetIQ's architecture differs:

Privacy FeatureRetIQTypical Cloud-Based
Planning Tools
Where calculations runYour browserTheir servers
Where data is storedYour device onlyTheir cloud database
Account / login requiredNoYes
Email requiredAt purchase only (license recovery)Yes (account required)
Analytics & trackingNoneGoogle Analytics, Mixpanel, etc.
Works offlineYes (PWA)No — requires server
Source code visibleYes — View Page Source in browserNo — server-side code
Content Security PolicyYes — browser-enforcedRare
Data survives if company shuts downYes — your files, your deviceNo — data locked in their servers
Vendor can be breachedNo financial data to breachYes — single point of failure
Password-protected exportYes — AES-256-GCM, encrypted on your deviceRare

Frequently Asked Questions

If all data is local, what happens if I clear my browser data?
Your plan data will be erased. This is the tradeoff of true local-only storage: your data's safety depends on your device, not our servers. Use the HTML Export or JSON Export features to create backups on your computer — and if you want that backup unreadable by anyone without your password, tick “Protect this file with a password” when exporting as JSON. These files are self-contained and can be re-imported anytime.
What if I forget the password on a protected export?
The file cannot be opened — not by you, not by us, not by anyone. There is deliberately no recovery: the key is derived from your password on your device, so RetIQ has no way to decrypt the file. Choose a strong passphrase and keep it somewhere safe (a few random words in a password manager is good practice) before you export.
Can RetIQ's developer access my financial data?
No. There is no technical mechanism for this. Your plan data is stored locally on your device — in your browser's localStorage on the web, or in the app's private sandboxed storage on iOS. The RetIQ worker's endpoints handle licensing, the regulatory-data check, and the optional AI Guide relay — none of them store financial data. The only flow that ever carries a plan summary is the AI Guide, at your explicit request, relayed in memory and never retained. You can verify web behavior by watching the Network tab in DevTools while you use the app.
What if retirementiq.app gets hacked?
A compromised website is a serious concern for any web app. Here's what limits the risk with RetIQ: your financial data exists only in your browser's localStorage. An attacker who compromises the web server could serve malicious JavaScript that attempts to read localStorage and exfiltrate data. However, RetIQ works as a Progressive Web App — once installed, it runs from a local cache and doesn't re-download from the server on each visit. For maximum security, you can: (1) use RetIQ in offline/airplane mode after initial install, (2) save your plan as an HTML or JSON file and clear RetIQ's localStorage when you're done, or (3) review the source code in your browser before entering sensitive data.
What does Stripe or Apple know about me?
Web purchases (Stripe): If you purchase RetIQ on the web, Stripe processes your payment and collects standard payment information (name, card number, email for receipt) under Stripe's Privacy Policy. RetIQ receives your email address (for license recovery) and a license key — not your payment details or card number. Your email is stored solely for license recovery and is never used for marketing.

iOS purchases (Apple): If you purchase through the App Store, Apple processes your payment under Apple's Privacy Policy. RetIQ receives no personal information from Apple — your purchase is verified entirely on-device through StoreKit.
Why does RetIQ self-host its fonts?
Many web apps load typefaces from Google Fonts, which sends your IP address and browser information to Google on every page load. RetIQ instead bundles its fonts (DM Sans and JetBrains Mono) directly on the same server as the app. This means loading RetIQ never contacts Google or any other third party. The fonts are also cached by the service worker, so they load instantly on repeat visits and work fully offline.
Can I inspect the code myself?
Yes. RetIQ is a single HTML file with embedded JavaScript — there is no minified or obfuscated code. Right-click in the app and select View Page Source to inspect every calculation, network call, and storage operation directly in your browser. You can also open DevTools (F12) to monitor all network activity in real time. Additionally, the Validation tab inside the app displays 3,700+ automated tests verified against IRS, SSA, CMS, SECURE 2.0, and OBBB Act 2025 sources.
How can I completely delete my data?
Web: Open your browser's Developer Tools → Application (or Storage) → Local Storage → retirementiq.app, and delete all entries. Alternatively, clear your browser's site data for retirementiq.app.

iOS: Delete the app from your device. All data stored by the app is removed when the app is deleted.

Because RetIQ never stores your financial data on any server — the optional AI Guide relays a plan summary in memory only and retains nothing — deleting your local data is a complete and permanent deletion. There are no server-side copies, backups, or residual records to worry about.

Technical Details for Security Professionals

Architecture: RetIQ is a single-file client-side application (roughly 22,000 lines of unminified HTML/CSS/JavaScript). All financial computations execute in the browser's main thread. Charts are rendered as inline SVG — no external charting library is loaded. The application registers a Service Worker for offline caching using a stale-while-revalidate strategy.
Content Security Policy (CSP): RetIQ ships with a strict Content-Security-Policy meta tag that tells your browser exactly which domains the app is allowed to contact. This is a browser-enforced guarantee — not just a promise from the developer. The policy restricts scripts to inline-only (no external JS), styles and fonts to 'self' only (self-hosted), API calls to the licensing worker only, and blocks all iframes, plugins, and form submissions. You can inspect it by viewing the page source — it's in the <head>.
Network surface: During normal use (data entry, projections, Monte Carlo), the app makes no network requests beyond the two automatic constants checks at load — /regs-current (federal) and /state-taxes-current (state). The only external origin ever contacted via fetch is RetIQ's own Cloudflare Worker — licensing calls, the regulatory checks, and the user-triggered /ai-proxy relay (the sole flow carrying a plan summary) — plus checkout.stripe.com via redirect during purchase. Fonts are self-hosted. No WebSocket connections, no Server-Sent Events, no background sync, no push notifications.
CSP details: The enforced policy restricts each resource type independently:

• connect-src restricts API calls to 'self' and RetIQ's own Cloudflare Worker only
• font-src 'self' restricts fonts to the app's own origin (self-hosted WOFF2 files)
• style-src 'self' 'unsafe-inline' — no external CSS can be loaded
• object-src 'none' blocks all plugins (Flash, Java, etc.)
• frame-src 'none' blocks all iframes
• form-action 'none' blocks all form submissions

If any code — including a compromised script — attempts to send data to an unauthorized domain, the browser itself will block the request. You can verify this in DevTools → Console, where any CSP violations are logged.
Storage: The localStorage keys shown in the table above are used. No cookies are set. No IndexedDB databases are created. No sessionStorage is used. The Service Worker cache stores only static application assets (HTML, icon images, manifest, and self-hosted font files).
Data export: The HTML Export feature generates a self-contained file using window.open() and document.write(). JSON export is assembled in memory and downloaded via a Blob URL. When you choose a password, the plan is encrypted on-device — AES-256-GCM with a key derived via PBKDF2-SHA256 at 600,000 iterations — before the download begins; the unencrypted plan never leaves the page. Nothing is uploaded during any export, and encrypted files cannot be opened without your password.
Third-party code: Zero third-party JavaScript libraries are loaded at runtime. No external CSS or font CDNs are used. The chart rendering, financial calculations, UI framework, and all application logic are implemented in inline JavaScript within the single HTML file. Fonts (DM Sans and JetBrains Mono) are self-hosted as WOFF2 files served from the same origin.
Content Security Policy: RetIQ enforces a strict Content-Security-Policy via a <meta> tag in the HTML head. This is a browser-enforced restriction — not just a promise — that prevents the app from contacting unauthorized domains, loading external scripts, or exfiltrating data. The policy restricts font-src and style-src to 'self', blocks all form submissions and object embeds, and limits connect-src to the app's own origin and RetIQ's own worker. You can verify this by inspecting the page source or checking the Application → Security panel in DevTools.