Skip to content

Changelog

This page documents all notable changes to IndepAI. Subscribe to our changelog feed for updates.

  • data-enrichment: fix tax-verify coverage gap + prod replicate path (#852) (#875) (29e4b39)
  • build: fold cn() shim into ui-utils chunk to shorten hero LCP waterfall (#876) (db791cb)

  • eliminate eager locale-en.js load from hero-island critical path (round 5) (#872) (5944314)

  • data-enrichment: monthly FX/CPI reindexation step (#868) (f1e790e)
  • enrichment: Exa-grounded tax verification + cost-anchor row-block gate (#867) (6ecf8b2)
  • enrichment: honest job status + parent job finalization (#865) (6aef749)
  • fix LCP regressions — AW gtag double-load, font-display/swap, latin-ext over-fetch (#870) (f4770f7)

  • a11y: agentic-browsing accessibility-tree failures on public nav/hero (#863) (e3cc792)

  • trust: surface Pro trial and tool data-source disclosure (#854) (39b2645)
  • pricing: correct meta description price ($4.99 → $9.99) (#857) (62425c2)
  • enrichment: correct inverted Sofia/Bucharest cost anchors (#853) (448e8d7)
  • public: LCP round 3 — defer GTM/Ads, direct CookieYes, hero client:idle (#860) (d258c99)

  • seo: link Facebook page — footer + Organization sameAs (b8945c1)
  • coming-soon: mobile LCP/JS round-2 — root rewrite, per-arm hero islands, self-hosted fonts, lazy Sentry (#856) (13e67a7)

  • seo: on-page SEO for /coming-soon — title/meta trims, methodology + FAQ, real 404s (#844) (2ef2ba0)
  • marketing: Marketing Autopilot v2 data layer + admin panel (#834) (f084f89)
  • i18n: emailCapture namespace excluded from EN client bundle (raw key leak) (#846) (6f6b7b0)
  • google-ads: generate_refresh_token persists token to local env file (ff53f51)
  • marketing: daily loop now ACTS — execute-approved + non-money whitelist; cron git-lfs PATH fix (dbd7f7d)
  • portfolio: chart colors via canvas pixel readback — fillStyle getter keeps oklch (#831) (af19411)
  • seo: cut public font payload — Material Symbols icon_names subset, async Inter, dedupe (#847) (f48a91a)
  • marketing: finish ads-strategy docs relocation root -> marketing/ (c03e5da)
  • marketing: runbook — own awesome-digital-nomads list live under cloudfloo org (8da7eb0)
  • marketing: runbook sync after live submission run — 2 submitted, 4 blockers documented (0c3afbf)
  • marketing: two ready-to-upload sponsored articles for WhitePress/Linkhouse order (5060977)
  • marketing: submission runbook — founder batches, ready-article pointers, HARO kit (3184efa)
  • marketing: autopilot daily brief 2026-07-03 (3240dab)
  • marketing: seo submission collateral — sponsored order brief + directory kit (a5d6b74)
  • marketing: ops hardening — PLN currency gotcha, worktree cron, budget-cap script, docs changelog v1.21.0 (8891de5)

  • portfolio: IA 6→4 tabs, Brand System v3, holdings-row integrity fixes (#824) (c5f815d)
  • portfolio: interactive stock charts, sparklines, unrealized P/L, price freshness (#817) (2790204)
  • portfolio: price-history OHLCV pipeline + /portfolios/price-history endpoint (#814) (0b6aec3)
  • brand: BrandPhotoCard bento — travel photos on dashboard + city page, design guide v3 asset docs (#808) (46527cd)
  • fi-score: total redesign — tabbed IA, FI education layer, Brand v3 (#807) (c56e36f)
  • rewards: Brand v3 redesign of Rewards page (badges + invite) (#806) (0ab77ec)
  • skills: rebuild nav skills, add 11 new skills (#804) (b81a139)
  • cities: filters/sort UX redesign + PL/EN copy de-slop (#801) (d1b7529)
  • portfolio: honest indicator cards — per-axis risk copy, no fabricated zeros (#828) (5db31b9)
  • portfolio: definitive no-dividend state on the overview dividend card (#827) (455d697)
  • portfolio: render chart with oklch tokens + 5 adversarial-review fixes (#826) (b50ef16)
  • portfolio: freedom-card ring overflow + junk comparison city (eligibility floor) (#825) (c3f4c9a)
  • portfolio: real instrument names via sync enrichment; definitive dividend status (#822) (d475ce0)
  • portfolio: nightly snapshot cron writes daily rows, not ISO-week-start (#820) (a47473c)
  • portfolio: rental income save 400 — client/schema field-name drift (#819) (b21494f)
  • portfolio: single-source snapshot writer, retire dead price cron, fix island hydration (#816) (0dc3200)
  • portfolio: six P1 UX bugs on the portfolio tab (#815) (869daa6)
  • cities: eligibility floor + diverse tiebreaks for FI ranking (#796) (9f7e391)
  • ci: sync supabase types hash + make PROD type-regen maintain it (#795) (339f8ca)
  • dashboard: gate shell until client hydration (df4610a)
  • dashboard: prevent hydration mismatches (9f5ce26)
  • csp: allow Google Ads conversion endpoints (dcadc08)
  • auth: stabilize mobile dashboard hydration (425dbb6)
  • launch: clean production console errors (d81c1f3)
  • sentry: harden launch error paths (f229296)
  • ci: use IPv4-compatible Supabase link in migrations (9019d00)
  • k8s: add production www ingress host (#788) (cfe5750)
  • marketing: backlink program 2026 playbook + backlink_pipeline seed (#830) (646b586)
  • dev: index the portfolio overhaul program (2026-07-02) (#829) (3fc634d)
  • dev: index cities explorer overhaul (2026-07-02) (#802) (7df7a93)
  • marketing: daily ops brief 2026-07-02 (autopilot v2 first run) (56b1b67)
  • marketing: Marketing Autopilot v2 — approved spec, daily-ops skill, cron wrapper (5505dbc)
  • skills: add codex-marketing-images skill for marketing asset generation (d1b3622)
  • skills: fix 15 audited skills + prune legacy rules and dead symlinks (#803) (546764f)
  • agents: orchestration workflow + deep-reasoner/fast-executor agent definitions (#805) (8034564)
  • deploy: bump production indep-ai to prod-b2224152 (ads conversion tag + scripts) (145732f)
  • deploy: bump production indep-ai to prod-f3d838a5 (hero A/B override fix + redesign) (997bb21)
  • k8s: bump indep-ai image to b325647d (CSP: Umami/GA4/DoubleClick) (74e03d1)
  • deploy: bump PROD to 7b76c4e9 (0ef3ff1)
  • deploy(prod): bump to prod-de6cd3ad (CSP + NetworkPolicy fix) (6ebc5d3)

  • feature-flags,e2e: quiet flag defaults-mode + @smoke-tagged public smoke (#786) (42ee987)
  • harden email delivery and document nomad community (#761) (5f6b3a4)
  • ads: wire Google Ads conversion (AW-1045148393) + campaign mgmt scripts (b222415)
  • hero variants polish, AI FI snapshot, i18n, E2E fixes (#734) (b08a30d)
  • compliance,security,auth,ai,billing: war-room batch — 100+ file sweep (49f0410)
  • compliance,perf: GDPR Art.52 AI labels, security headers, LCP fixes (30a9ec0)
  • auth: Apple OAuth button + i18n review checklist (#571, #536) (221254d)
  • planner: tax-residency day accumulator + 31-country threshold dataset (#685) (ea77f16)
  • ci: bundle-size gate + Lighthouse perf CI job (#547) (17d9a5c)
  • geo-arbitrage: Net-FIRE sort option + years-gained city detail (#683/#684) (3d42882)
  • gdpr,data-enrichment: Art.17 account deletion + GeoNames coord fallback + trim orphan LLM fields (#652, #687 AC1, #680) (9b160ca)
  • cities: cost-history API + retention migration + i18n (#678) (e5cda64)
  • security,infra: DPIA for AI financial profiling + ServiceMonitor bearer token auth (#561, #525) (a5d3d34)
  • export,compliance: CSV export endpoint + ROPA document (#556, #531) (de9812b)
  • tools: currency risk calculator for nomad FIRE planning (#695) (b80a75b)
  • tools: after-tax withdrawal simulator with country-specific tax models (#694) (8070c12)
  • admin,ai: PostHog AI observability + Pro comp grant UI (#491, #585) (c57415b)
  • admin: user-ops support actions + GDPR erasure/export (#586, #589) (a03a363)
  • admin,waitlist: cache stats perf card + waitlist count social proof (#583, #575) (112c6fa)
  • seo: localize OG metadata for all 11 tool pages EN+PL (#710) (53fd6c6)
  • monitoring,ui: Sentry metrics + coming-soon hero a11y fixes (14cfff2)
  • waitlist,security: share block on /coming-soon + GDPR cron health check (#711, #528) (5440e4c)
  • cities,observability: smart filter badge + Sentry fail-loud (#533, #526) (1b43eb7)
  • cities: local feedback moderation + city sentiment display (#714, #715) (4b667ad)
  • cities: POST /api/v1/cities/[id]/local-feedback submission endpoint (#713, #716) (d58252e)
  • pwa,marketing: SW registration on app load + UTM share-link kit (#570, #709) (63821a6)
  • launch: repair waitlist funnel telemetry (38d3d2b)
  • ci: unbreak develop — migration collision + email snapshots + data-export test (+ email-capture sources) (#785) (c3c518c)
  • csp: allow Supabase-hosted media so coming-soon demo video plays (#782) (1624a93)
  • analytics: gate Ads conversion on internal traffic + restore Umami under enforce-mode CSP (#759) (2ad8e00)
  • e2e: TS2551 PostgrestFilterBuilder.catch in portfolio-consistency afterAll (f2587c8)
  • e2e: portfolio-consistency — stale selector + category teardown (0ffef0b)
  • portfolio: per-portfolio totalValue NaN→null (wrong asset columns) + multi-portfolio E2E (Batch 6i) (#756) (c11234c)
  • referral: /r/[code] attribution cookie never set — 100% referral loss (+ E2E, Batch 6f) (#750) (0aa6881)
  • api: api-keys revoke → 404 for unknown id (+ settings P1 E2E, Batch 6d) (#747) (9eb4316)
  • api: malformed JSON body → 400 not 500 (+ public FI endpoints E2E, Batch 6c) (#746) (a7af1bb)
  • coming-soon: clear stale PostHog flag override so hero A/B buckets (f3d838a)
  • gdpr,e2e: repair GDPR data export + green Batch-5 P0 specs vs staging (#742) (25431b2)
  • csp: allow Umami, GA4 region1, DoubleClick endpoints (b325647)
  • k8s: remove podSelector from frontend NetworkPolicy ingress rule (de6cd3a)
  • k8s,security: correct NetworkPolicy ingress namespace + CSP cookieyes domain (e2be9e6)
  • security: add cdn-cookieyes.com to CSP script-src and connect-src (f2bef77)
  • build: sentry DSN throw→warn to unblock Docker prerendering (7b76c4e)
  • build: sync docs/package-lock.json for Docker npm ci (a43f3ec)
  • build: sync package-lock.json + remove –prefer-offline from Dockerfile (6e8119d)
  • infra: reconcile STG/PRD Supabase drift — crons, indexes, ticker fn (#512, #572) (ef52ebb)
  • health: decouple Redis from readiness gate — fail-open on Redis loss (#636) (6319aae)
  • infra,enrichment: HPA maxReplicas cap + CPU target + LLM prompt caching + spend guard (#635, #634, #682) (7e2c36c)
  • analytics,e2e: strip internal UTMs from /vs+/alternatives + E2E route fixes (#623) (f7aa88f)
  • billing,analytics: Pro legacyPriceIds pre-reprice guard + GA4 event rename (#542, #720) (069d632)
  • security,gdpr,admin: GDPR consent signal + MRR cron (#705, #706) (1f12b1c)
  • security: harden public calculator-results + GDPR consent signal + MRR cron (#707, #705, #706) (1817026)
  • admin: geo_arbitrage source filter 400, silent flag errors, debounce, column header, conversion rate (#594, #596) (7c1a35e)
  • security,i18n,analytics: onboarding allow-list, hero i18n, confirmation events (#702, #703, #704) (0c4572d)
  • e2e: programmatic sign-in — kill the UI-login flake, ~5-8x faster authed setup (#755) (40e18f2)
  • admin: shared AdminPageHeader primitive applied to 9 tabs (#597) (d0b862d)
  • e2e: P2 coverage — legal pages + SEO endpoints (Batch 7) (#760) (334e63d)
  • e2e: P1 coverage — admin users/alpha/broadcast + email-unsubscribe HMAC endpoint (#758) (fd20e16)
  • e2e: unblock + cover Nomad leg-shorten undo (signed-token round-trip) (Batch 6i) (#757) (af5a94d)
  • e2e: admin metrics API authz + shape; harden UI sign-in retries (Batch 6h) (#754) (3ebaa81)
  • e2e: AI agent action execute → undo reversibility (Batch 6h) (#753) (757cd5f)
  • e2e: AI Coach conversation history round-trip + owner isolation (Batch 6h) (#752) (d55f916)
  • e2e: onboarding resumes at saved step after reload (Batch 6g) (#751) (846489f)
  • e2e: i18n raw-key leak guard across EN+PL (Batch 6e) (#748) (a74ad68)
  • e2e: AI Coach P1 — server-enforced consent + free-tier usage cap (Batch 6b) (#745) (70afc2c)
  • e2e: cities P1 coverage — save round-trip + compare flow (Batch 6a) (#743) (9063814)
  • e2e: Batch 2 — fix stale routes and heading (import-myfund, badges) (ef6c943)
  • e2e: Batch 1+2 — remove 5 dead specs, fix Free+Pro/USD pricing assertions (270e533)
  • e2e: pricing → checkout → webhook → plan-unlock smoke spec (#549) (757dc36)
  • e2e: import → dashboard → FI-Score smoke spec (#550) (91ebca9)
  • e2e: signup → confirm → welcome journey spec (#567) (c6d3aa6)
  • e2e: product tour + AI FI Snapshot coverage; fix broker-sync flag (#552, #537, #546) (b599d19)
  • design: Nomad Community UX/UI design package (#783) (9baed83)
  • add waitlist interview recruitment template (#744) (0ff109c)
  • analytics: correct coming-soon bypass list — homepage / is now gated (#741) (87abf8e)
  • launch: war room 2026-06-30 + fix(seo) stale city count (#737) (c30777f)
  • legal: subprocessor DPA register (#532) (#735) (9c21a6a)
  • deps-dev: bump brace-expansion from 1.1.12 to 1.1.15 in the npm_and_yarn group across 1 directory (#787) (ac67ac6)
  • deploy: bump staging indep-ai to staging-b2224152 (ads conversion tag + scripts) (c397068)
  • deploy: bump staging indep-ai to staging-f3d838a5 (hero A/B override fix) (584e0de)
  • k8s: bump indep-ai image to b325647d (CSP: Umami/GA4/DoubleClick) (739d566)
  • deploy: bump STG+PROD to 7b76c4e9 (bf7ab76)
  • stage csp test updates + backlog grooming doc + video frame doc (6a6af6f)
  • audit: add 8 missing routes to mobile overflow harness (#527) (dffc1cb)
  • billing: wire live Stripe products and prices for prod deploy (b897276)
  • docker: preserve Sentry build-args from main (PUBLIC_SENTRY_DSN, SENTRY_AUTH_TOKEN) (456f58d)
  • deploy: pin prod overlay to live prod-028a926 before release merge (915c0a4)
  • deploy: bump images to de6cd3ad (CSP fix + NetworkPolicy fix) (c5cec34)

  • marketing: coming-soon hero A/B experiment, UTM routing, video skills, and ads research (bb885b0)
  • data-enrichment: tax multi-model ensemble with abstention + source provenance (#689) (#698) (bb6ef40)
  • data-enrichment: field provenance + source-priority reconciliation (#691) (#699) (e792246)
  • data-enrichment: expand DN visa coverage + source URLs + staleness SLA (#679) (#700) (7be87cf)
  • admin: Enrichment Health tab + confidence/freshness surfacing (#690, #686) (#701) (45a168d)
  • data-enrichment: Net-FIRE true-cost index folding tax+visa (#683) (#697) (b5ecc96)
  • data-enrichment: ground cost-of-living in World Bank PPP + stable cost index (#684) (#693) (407780d)
  • data-enrichment: self-heal remaining importer HTTP calls (#686) (27e8e4e)
  • data-enrichment: LLM spend guard with budget ceiling (#682) (eadc460)
  • data-enrichment: absolute cost-plausibility bounds in validation (#684) (beec0bf)
  • db: auto-stamp updated_at on visa & tax tables for staleness SLA (#679, #689) (6fba8d3)
  • data-enrichment: persist numeric per-field confidence to DB (#690) (c095d31)
  • db: auto-stamp numbeo_data.updated_at as a freshness signal (#686, #690) (6c737d3)
  • data-enrichment: env-configurable spot-check tolerances (#688) (2294992)
  • expose questionnaire fields to get_nomad_settings AI tool (8aa96a3)
  • data-enrichment: per-region spot-check gate, not just global avg (#688) (a073f88)
  • wire food/nature/nightlife/wellness/family interests and travel_style into city scoring (5e41793)
  • fetch food_scene/nature_access/nightlife/fitness_culture in CityCard query (5e4c55a)
  • data-enrichment: make spot-check a blocking quality gate (#688) (c505aba)
  • add LifestyleScores interface and lifestyle field to CityCard (ec4c83a)
  • data-enrichment: webhook failure alerting on pipeline run (#686) (4b235d0)
  • data-enrichment: self-healing fetchWithRetry for importer HTTP (#686) (44dc5b3)
  • data-enrichment: fail loud on severe silent partial failures (#686) (eafdf2c)
  • admin: broadcast improvements + admin user mgmt tweaks (82209d0)
  • analytics: failure-side funnel events for blog newsletter capture (#712) (7c403a3)
  • analytics: exclude internal users from GA4 generate_lead Key Event (#692) (fd3ea57)
  • analytics: complete founder internal-email allowlist (#676) (2174dfa)
  • data-enrichment: prototype-safe pricing lookup in budget guard (#682) (c6eea4e)
  • data-enrichment: harden LLM budget guard (security review on eadc460b) (ea33c7f)
  • planner: prevent Dialog/Drawer close when clicking Select options (870b4e8)
  • correct remoteWork.workStatus field name and export extractQuestionnaire for testing (768d738)
  • data-enrichment: stabilize C1 value-for-money normalization (#683) (4442898)
  • correct budget threshold (1200/2500 band) and add missing negative tests (2c5f07b)
  • data-enrichment: snapshot costs after enrich, not before (#678) (e2499a5)
  • data-enrichment: raise daily enrichment deadline 1h->2h (e9388d2)
  • data-enrichment: don’t fail import:coordinates on geocoding misses (aa78530)
  • data-enrichment: make /app/data writable by non-root runtime user (f1c8712)
  • data-enrichment: write data/ under service root, not monorepo root (1307d96)
  • test: use makeRow helper in lifestyle mapping tests (b839672)
  • launch: War Room plan 2026-06-29 (#708) (b4a7bed)
  • enrichment: record gaps resolved since research (epic #677) (372e661)
  • enrichment: append improvement roadmap table (epic #677, 14 issues) (181af9f)
  • enrichment: add data-enrichment service design doc + diagrams (12ed9bb)
  • deploy: update staging indep-ai image to staging-eafdf2c (9a61688)
  • deploy: update staging data-enrichment to staging-aa78530 (e28a728)
  • deploy: update staging data-enrichment image to staging-f1c8712 (4035bc8)
  • deploy: update staging data-enrichment image to staging-1307d96 (d944cfe)

  • admin: save + reload named user-segment filters (#592 part 1) (#673) (77337ad)
  • coming-soon: 4-variant hero A/B/C/D experiment (Brand System v3 + PostHog) (#672) (f3c517d)
  • admin: grouped left sidebar nav (flat tab scroller → 5 sections) (#670) (f29541b)
  • waitlist: city-FI-bound waitlist CTA + view event on city pages (#667) (f7cc6ef)
  • admin: unified Moderation Inbox tab (city feedback + AI-flagged stub) (#665) (ecaa180)
  • admin: read-only “View as user” support snapshot (#661) (009fb56)
  • admin: global Cmd/Ctrl-K command palette (search + navigate) (#660) (2f9fc37)
  • admin: FI-Score recalculation UI (withAdmin wrapper) (#659) (009eb0c)
  • admin: destructive-action confirm dialogs + per-tab error isolation & tab a11y (#598 pt 1-2) (#658) (ab54275)
  • admin: System Health rollup tab (cron/cache/AI-budget/errors) (#657) (9eff9a8)
  • portfolio: one-time manual→import “Other bucket” explainer (#653) (7aebb1f)
  • observability: capture cron explicit-500 operational failures to Sentry (#651) (4ab72d2)
  • onboarding: replay/restart entry point for the product tour (#649) (eddb63f)
  • fi-score: FI-date sensitivity + currency-exposure helpers (#645) (3b6eff0)
  • planner: EU EES-awareness warning on Schengen visa validation (#644) (072451e)
  • public: privacy-safe shareable FI-by-city result cards (#643) (82e6df6)
  • planner: preference deal-breakers, soft weights + AI summary (#642) (97b3f44)
  • ai: AI Coach next-base city recommendations grounded in planner (#639) (5781f5b)
  • planner: remote-work & time-zone-overlap constraints (#638) (1af74fa)
  • planner: stay-duration presets + long-stay recommendation mode (#637) (8bc97d4)
  • planner: compliance-light risk indicators (#632) (136f217)
  • planner: Next Base Planner ranked shortlist (#629) (8e9a467)
  • feedback: beta feedback loop after preview + planner (#627) (89c82c7)
  • public: FI-by-city preview flow for beta acquisition (#626) (e4a3e82)
  • admin: dedicated Revenue analytics tab (MRR movement, ARPU, churn, cohorts) (#624) (987f8d2)
  • brand: Brand System v3 for logged-in surfaces (#625) (7584f23)
  • admin: triage endpoint for risky FI-Snapshot feedback (#620) (7179e8d)
  • monitoring: instrument AI Coach + FI-Score preview latency for <2s budgets (#618) (e0e7e39)
  • nomad: surface visa-rule freshness + report-inaccurate flow (#617) (ea5cf9d)
  • legal: add standalone /disclaimer page + footer & AI Coach links (#616) (4e4ed19)
  • billing: env-resolve Stripe price IDs for test-mode staging checkout (#612) (a2ab7ad)
  • security: add Content-Security-Policy header (#609) (1fc4f58)
  • admin: add UTM channel acquisition breakdown to analytics (#607) (75326f5)
  • waitlist: server-side UTM fallback from landing URL / Referer on capture (#606) (e5d4b20)
  • i18n: enforce all 7 locales in CI gate via baseline ratchet (#605) (e23dee0)
  • planner: add visa-accuracy legal disclaimer to planner visa surfaces (#602) (44c7196)
  • waitlist: add InlineEmailCapture CTA to /tools/geo-arbitrage (#580) (f34c903)
  • coming-soon: surface tools + /vs comparisons in pre-launch footer (637643e)
  • ops: AI-cron fleet — 7 launch-ops agents (Claude cron + Codex automations) (#509) (84660d8)
  • ai: launch FI snapshot wave one (#508) (86e1fa6)
  • seo: strengthen city Dataset JSON-LD (#671) (48d9eee)
  • waitlist: hide city CTA shell for logged-in + gate heading on reachability (#669) (34db232)
  • admin: mobile-reachable table columns + sticky header + dropdown actions (#598 pt3) (#666) (95ee306)
  • admin: server-side subscription-status filter with correct counts (#655) (cf5fbda)
  • planner: surface the onboarding climate/interests step (#652) (f94ec5a)
  • portfolio: stack asset-form field grids on mobile (#650) (4e757c3)
  • a11y: accessible names + selected state for portfolio color swatches (#648) (3d855f2)
  • notifications: remove nested-button hydration warning in InsightPanel (#647) (0a33436)
  • ai: USD-normalize AI Coach recommendation financials + register tool in catalog (#640) (fa71279)
  • infra: right-size staging memory request + validated load-test findings (#633) (d3d5237)
  • security: OWASP hardening — share tokens, headers, search validation, referral RLS (#631) (0d539d0)
  • waitlist: capture comparison traffic in context (#601) (22973a9)
  • analytics: flag internal/staff signups in 4 remaining email captures (#610) (19f3b6e)
  • admin: unwrap {success,data} envelope in batch-enrich API helpers (#619) (db58972)
  • billing: block legacy Starter/Premium tiers at the checkout API (#615) (29b39db)
  • flags: set portfolio-tracker seed hiddenBehavior to ‘hidden’ (go-live SSOT) (#613) (edc265b)
  • i18n: translate the AHA first-value hero for de/es/fr/nl/pt (#608) (3472797)
  • i18n: translate landing trustProof + 3 keys for de/es/fr/nl/pt (#604) (71a507e)
  • i18n: fall back to English for missing keys instead of leaking raw keys (#603) (69c2fa0)
  • analytics: flag internal/staff waitlist signups as is_internal (funnel pollution) (#578) (327d118)
  • seo: reconcile marketing city counts (#511) (fbdc075)
  • marketing: restore GDPR/RODO privacy marker in proof strip (P0-6) (a0d8d54)
  • ci: type city page inline scripts (1240ea9)
  • load: prod traffic-spike readiness + load-test suite (#630) (f4c9796)
  • test: move component tests from jsdom to happy-dom (465856b)
  • dev: scope pre-commit hook to staged changes + drop full build (233861e)
  • api: product-tour GET/PATCH + checklist-state preservation (#646) (2bc43c3)
  • fi-score: pin preview==post-save FI-Score + net-worth contract (#611) (36329f9)
  • launch: war-room plan 2026-06-28 (#664) (af7e2ba)
  • design: add IndepAI design-system project + settings/dev notes (#668) (b9cf35b)
  • legal: refresh privacy & cookie policy (GDPR) + data map (#641) (02f863b)
  • mvp-scope: reconcile deferred-feature table with live flag SSOT (#654) (fa40991)
  • analytics: document inline UTM first-touch primer (stops recurring #524 false positives) (#628) (5ab0cd9)
  • marketing: reconcile North Star to waitlist-stats; dedupe drip twin (#614) (a18fe80)
  • launch: require csv-import flag in GA go-live runbook (#582) (f0547fe)
  • launch: war-room plan 2026-06-27 + 3 conversion-CTA issues (#576) (ccf229b)
  • i18n: translate Help Center (help.json) for de/es/fr/nl/pt (#622) (b446e77)
  • i18n: backfill aiFiSnapshot dashboard keys for de/es/fr/nl/pt (#621) (0d39b6a)
  • ops: Codex jobs open ready-for-review PRs, not drafts (#577) (a31be9b)
  • ops: schedule Codex cx1/cx2/cx3 via cron (#513) (c15b3b2)
  • execute founder launch and improve launch vitals (#496) (0667c4d)
  • publish launch audit and security updates (#495) (fd0c915)
  • Docs/founder launch p1 execution (#510) (fd9838f)

  • marketing: add coming-soon premium bg experiment (#490) (0b07635)
  • fi-score: brand-atmosphere redesign of the ScoreHero (#483) (4f70acc)
  • dashboard: premium brand redesign of the first-run ActivationHero (#482) (2d227d6)
  • dashboard: premium AhaHero redesign + sentinel-timeline fix (#481) (8af4f26)
  • ai-coach: add get_portfolio_income tool (passive income / FIRE coverage) (#477) (36c674c)
  • ai-coach: enforce Ustawienia narzędzi tool toggles server-side (#476) (b9d7519)
  • ai-coach: add get_portfolio_holdings tool (wire portfolio into agent) (#475) (e41e4c7)
  • dashboard: AHA Moment Indicator + first-run UX 80/20 fixes (#474) (e8cfd84)
  • ai-coach: implement 3 missing read tools (expense breakdown, income sources, FX rates) (#473) (539cd6e)
  • ai-coach: monthly $ cost ceiling per tier to cap AI COGS (#472) (d969c5d)
  • ai-coach: TrenerAI 80/20 — wire search_cities, prompt caching, Sonnet 4.6, interactivity (#470) (c6e3be5)
  • nomad-planner: per-city % share of trip spend in Monthly Breakdown (#467) (250a489)
  • nomad-planner: English-proficiency indicator on leg cards (#466) (c21102e)
  • nomad-planner: digital-nomad-visa indicator on leg cards (#465) (69c992a)
  • cities: highlight soonest-FI city in the compare dock (#463) (eb823d2)
  • cities: digital-nomad-visa indicator in the compare dock (#462) (ef69f0f)
  • cities: English-proficiency “why” signal + show up to 3 reasons (#461) (52d24a2)
  • cities: surface digital-nomad-visa availability on explorer cards (#460) (3e3a6d3)
  • nomad-planner: travel-pace stat (avg stay per stop) (#458) (3618da9)
  • nomad-planner: annual run-rate under Avg Monthly Cost (#457) (64673f1)
  • cities: livability quick-stats in the LIVE compare dock (#456) (54e37d6)
  • cities: annual-savings FI framing in the LIVE compare dock (#455) (303bc18)
  • cities: per-metric winners in the LIVE compare dock (#454) (7213111)
  • cities: per-metric winners in city comparison (#452) (3f06bae)
  • nomad-planner: at-a-glance trip visa verdict pill (#451) (0876e95)
  • nomad-planner: Schengen days-remaining in Visa Health (#450) (96deb3b)
  • cities: per-city quick stats in comparison (internet/safety/climate) (#449) (88cc49e)
  • cities: annualize comparison savings (FI framing) (#448) (759563a)
  • cities: “Best value” highlight in city comparison (#446) (1d8b6e4)
  • calculators: resolve all open audit items (tax brackets, scoring, Fat 33x, geo basis, i18n) (#443) (4b2c19b)
  • planner: Calendar (Gantt) view of the trip + Timeline↔Calendar toggle (#440) (36a060b)
  • cities: personalizable low-cost signal (drop hardcoded $1800) (#441) (938161e)
  • nomad-planner: premium leg cards — real city photos + richer stats (#436) (5784397)
  • landing: premium GSAP/Lenis hero polish + nomad-planner review deliverable (#424) (9cdb44a)
  • calculators: resolve all open public-calculator audit items (#423) (350cfc9)
  • admin: email tooling — chart fix, real conversions, broadcast/compose (#422) (4968b01)
  • nomad-planner: premium UX/UI + animation + brand polish + 4 follow-ups (#419) (b865495)
  • alpha: alpha-testing system — coming-soon gate bypass + Pro comp (#418) (2b01d33)
  • seo: consolidate JSON-LD entity graph + GEO fixes (handles, llms.txt, FAQ, hreflang) (#415) (31d920f)
  • legal: Right of Withdrawal + Complaints in Terms (UŚUDE/consumer law) (#398) (dcd051a)
  • seo: glossary term pages → tools/hub internal links (#395) (b359f60)
  • calculators: shareable scenario URLs on the FI calculator (#394) (1316c8a)
  • seo: WebApplication schema on geo-arbitrage tool page (#391) (d7c2677)
  • legal: cookie consent disclosure + correct DPO claim (JDG) (#390) (76ca97f)
  • seo: AI-generated social-share image for geo-arbitrage tool (#392) (f02ddc1)
  • billing: pricing rework S2 (surface+i18n consistency) + S3a (reprice safety) (#393) (5237ced)
  • seo: link city→country breadcrumb for all indexable cities (#388) (b22e676)
  • legal: Imprint / Legal Notice page (7 langs, footer-linked) (#385) (96a77ee)
  • legal: data-breach notification + US state privacy (CCPA) sections (#383) (22849cf)
  • brand: wire new iA icon logo across all logo touchpoints (#384) (c0a672c)
  • seo: A-Z all-countries directory on /countries hub (#373) (143ac03)
  • portfolio: geo-arb payoff on import-success step (#377) (a6c6a20)
  • fi-score: geo-arbitrage payoff card (activation UI) (#375) (25d2b8a)
  • geo: /api/v1/geo/fire-payoff route (geo-arbitrage activation) (#374) (2e24b17)
  • portfolio: geo-arbitrage FIRE payoff core + design doc 22 (#372) (9df6f73)
  • portfolio: NetWorthEquation on Portfolio + Plan (gate G1) (#371) (d4f9969)
  • seo: strengthen city-page internal linking mesh (#366) (c8e6524)
  • admin: add break-glass access and stabilize public paths (#489) (54b1e8f)
  • ai: finish city recommendation responses (c34a15b)
  • portfolio: humanize unknown city slugs (no more raw ‘abohar-india’) (#485) (5a7ba52)
  • badges: render the badge-hero border (dynamic Tailwind class never compiled) (#484) (41db97a)
  • blog: render markdown tables (header must precede the |-|-| delimiter) (#479) (62af583)
  • ci: sync docs/package-lock.json — add missing openapi-types@12.1.3 (unblocks Deploy) (#478) (f15567d)
  • cities: a11y — non-color “best” cue for compare-dock metric winners (#468) (394a24d)
  • cities: surface “Best value” in the LIVE compare dock (#453) (c80adf5)
  • planner: calendar views full-width + denser month grid (#447) (45dc13a)
  • oidc: bump migration timestamp 160000->170000 (collision with develop’s fix_nomad_visa_hub_slug_match) (#445) (a817d3c)
  • ci: prettier-format planner files to unblock develop CI (#442) (8bf9eda)
  • deploy: bake PUBLIC_SITE_URL per env — fixes broken staging confirmation links (#437) (d9f9e3c)
  • nomad-planner: UX clarity — dates, visa labels, plurals, relative scores, leg-cap (#434) (d6dad04)
  • email-capture: 3 tool pages’ email capture was broken (fire_quiz/savings_rate/investment_growth) + 500→400 on validation (#431) (dcde438)
  • admin: broadcast — explain empty audience + single-source-of-truth source list (#432) (d1a7f6e)
  • nomad-planner: leg/optimize/wizard reliability bug sweep (#433) (f57df64)
  • nomad-planner: visa-run “Add to plan” silently failed (false success toast) (#430) (c6d88b0)
  • security: CSV formula injection + javascript: URI XSS in new admin features (#427) (e259527)
  • ci: green up develop — middleware test indices + supabase types hash (#429) (f9052fa)
  • deploy: raise builder heap to fix Docker build OOM (exit 134) (#428) (31043bc)
  • security: disarm CSV formula injection in admin export (f40f943)
  • referral: repair end-to-end referral flow, harden grant, add admin stats (#421) (1818347)
  • waitlist: resilient email capture + trim EN client locale bundle (#408) (4009554)
  • calculators: correctness, capture + anti-slop sweep across public tools (#417) (30d1a53)
  • nomad-planner: QA fixes, visa-data correctness, first E2E suite (#414) (c396cc9)
  • security: pin search_path on last 2 advisor-flagged functions (#412) (46a566c)
  • security: lock 14 cron/ops SECURITY DEFINER functions to service_role (#411) (a733122)
  • build: pre-compress client assets instead of the SSR bundle (#410) (759917e)
  • security: sanitize rendered blog markdown (defense-in-depth XSS) (#409) (116148c)
  • observability: capture FI-Score recalc + import-pipeline failures to Sentry (lane D slice 3) (#402) (f3601af)
  • security: block users self-escalation (CRITICAL) + lock increment_referral_usage (#407) (2508c5d)
  • security: harden SECURITY DEFINER function grants (systemic sweep) (#405) (fca85b7)
  • portfolio: ETF classification + freshness banner + years-clamp (QA P2/P3) (#404) (b89d5cb)
  • security: lock set_cached_api_data to service_role (cache poisoning) (#403) (ef5c7ca)
  • observability: capture Stripe webhook handler throws to Sentry (#399) (7a6dade)
  • security: harden public_calculations RLS (anon UPDATE + PII enumeration) (#401) (cbb4de2)
  • security: lock extend_user_trial to service_role (privesc/revenue bypass) (#400) (da99876)
  • billing: finish USD-only in PricingSection + drop unused priceNoteApprox (#397) (2d7b863)
  • fi-score: preview returns fiNumber in base currency, not USD (F-2) (#396) (643f514)
  • portfolio: FI number on portfolio overview no longer double-converts (F-2) (#389) (1fc9410)
  • legal: correct privacy claims to match actual data flows (#386) (3bc7b0c)
  • legal: real operating entity (Michał Wiatr JDG) + complete imprint (#387) (488d7c6)
  • portfolio: value imported holdings at cost basis (F-1, P0 net worth 0) (#382) (2b12cb6)
  • portfolio: readable quantities + unblock develop tests + QA findings (#380) (86dd9ff)
  • portfolio: import commit now persists holdings (P0) (#379) (723db72)
  • seo: include MDX blog posts in the dynamic sitemap (#378) (4809810)
  • nomad-scoring: correct stale/contradictory normalization comments (#459) (9c64e2c)
  • add DESIGN.md design-system reference (#416) (a067cb7)
  • supabase: record 2026-06-24 security hardening in inventory SSOT (#413) (44c4700)
  • portfolio: MVP value + pricing strategy + go-live status (#369) (3fafe5d)
  • alpha: wire ALPHA_GATE_SECRET + ALPHA_MASTER_CODE into deploy (#420) (b034eff)
  • pricing: enforce Free+Pro two-tier model everywhere + reconcile docs/feature-list (#471) (70cfd2b)
  • marketing: autopilot log 2026-06-25 — tax/passport Cyprus non-dom (#464) (75843fc)
  • cities: remove dead V1 explorer + comparison components (#469) (3c50a4e)
  • deps: bump the npm_and_yarn group across 3 directories with 3 updates (#322) (00ee3c3)
  • Codex/city image cache long ttl (#493) (f3e27a8)
  • [codex] configure PostHog experiments and proxy (#492) (b3e759a)
  • [codex] Harden city media caching, geo ranking, and portfolio refresh (#488) (f490e13)
  • [codex] complete ux pareto followups (#487) (8526824)
  • [codex] unify city FI scenarios (#486) (180774b)
  • Merge remote-tracking branch ‘origin/develop’ into feature/referral-system-fix (#444) (6aa8d5b)
  • Admin: feature-flag correctness + audit log, dashboard metric fixes + AI settings (#426) (fd39447)
  • Feat/public calculators audit (#425) (4844968)
  • [codex] Polish premium landing brand experience (#406) (a69a5ef)
  • i18n(public): complete de/es/fr/nl/pt parity for public pages (#381) (3b769e7)
  • content(blog): digital-nomad taxes & 183-day rule pillar, all 7 languages (draft) (#376) (2feb273)
  • content(blog): “4% rule outside the US” pillar, all 7 languages (draft) (#370) (6a2e42d)

  • seo: deterministic per-city narrative (unique on-page content) (#364) (4139a08)
  • seo: stage-2 on-site — FAQPage schema (EN+PL) + Dataset license (#361) (6b92917)
  • portfolio: simple management panels, insights, real-estate fields (#362) (279faa5)
  • fi-score: rescale monthly rental-income slider range (#363) (116fcd8)
  • help-page deep-linking + i18n + cleanup; myFund follow-up decisions; docops drift (#360) (e676de1)
  • ci: never deadlock prod deploy waiting for a migrations run (#358) (25b8dab)
  • [codex] polish PL locale copy (#359) (a29745d)
  • Feat/brand v2 and seo launch (#357) (135e478)

  • brand+seo: brand v2 across 7 langs + SEO launch phase 1 (#353) (98a9edc)
  • fi-score: split My Numbers & Goals into explained tabs (#337) (3c041bc)
  • fi-score: opt-in dividend->passive-income derivation (P3-2) (afeaff1)
  • fi-score: partial-snapshot dashboard nudge (P3 follow-up) (#334) (e03c1b2)
  • fi-score: portfolio_snapshots.currency column (P3 core) (f013b98)
  • fi-score: manual<->auto portfolio integration P0-P2 + design docs (609b58d)
  • portfolio: asset-form review follow-ups (modal dropdown close, RE quantity corruption) (#348) (d23d218)
  • cities: FI-lens base-city recognition, false income alert, Explorer default sort (D1-D3) (#346) (80fe08d)
  • cities: set Content-Type on save-city + logout for Astro 6 checkOrigin (#345) (73e4af9)
  • fi-score: rescale monthly rental-income slider range (#341) (5144b20)
  • notifications: make email + push delivery work end-to-end (#343) (67cdff2)
  • ai-coach: show conversation history sidebar for all plans (#340) (2904262)
  • cities: resolve Internal Server Error on /dashboard/cities/compare (#339) (2399e73)
  • mobile: restore draggable/hideable AI FAB + fix notification read panel (e5b969e)
  • db: grant SELECT on country_tax_rates (RLS-without-GRANT 403) (8e4e763)
  • p3: resolve 67 of 73 pre-MVP P3 (Low/Info) audit findings (c5ed58a)
  • p2: resolve 60 of 66 pre-MVP P2 (Medium) audit findings (886b367)
  • p1: resolve all 23 pre-MVP P1 (HIGH) audit findings (f242fac)
  • supabase: standard STG↔PROD pattern + skill; pin functions CI (#332) (966e777)
  • seo: add IndexNow key file for instant Bing/Yandex indexing (#355) (b934ee3)
  • seo: add IndexNow key file for instant Bing/Yandex indexing (#354) (d88f6ea)
  • release: release-readiness audit fixes, full i18n fill, contact page (#344) (ceadc53)
  • i18n: replace em-dashes with plain punctuation in UI copy (#342) (0c3e43c)
  • [codex] simplify cities explorer for new users (#352) (9b49588)
  • [codex] add cities relocation decision signals (#351) (8275aa6)
  • Chore/release readiness prep (#349) (fac71e9)
  • [codex] add community city ratings (#347) (ac76fc1)

  • rebrand: Wave 2, cities loop + portfolio tabs + FI Score + My Numbers
  • rebrand: Wave 1, app shell IA + dashboard home + Cities Compare + foundation components
  • portfolio: xlsx ingestion layer, per-sheet CSV lowering (B0)
  • portfolio: synthesized estimated “Paid” dividend events, feature-flagged (A3)
  • portfolio: myfund XML import, parser, wallet routing, mapping wizard (B3)
  • portfolio: myfund.pl XML import, multi-wallet mapping
  • portfolio: operations history per holding + routed holding rows (B6)
  • portfolio: yields from market history + nightly dividend sync + provenance UI (A2)
  • portfolio: transaction-backed holdings, initial lot scaffold + backfill (B1)
  • portfolio: auto-fetch dividend data from market history (A1)
  • portfolio: rebalance plan, buy/sell & smart-contribution suggestions
  • portfolio: tiered price freshness + market-hours-aware refresh
  • portfolio: income & dividends suite, myfund.pl use cases (UC1–UC7)
  • portfolio: price_history table + daily EOD snapshot writers
  • portfolio: per-provider cost observability + fix api_usage_log column drift
  • portfolio: net-worth value-over-time chart
  • portfolio: group holdings by category on the holdings page
  • portfolio: add-holding by ISIN/ticker via EODHD resolution
  • portfolio: multi-provider live prices: CoinGecko crypto + EODHD fallback
  • rebrand: portfolio sub-page content/routing hygiene
  • rebrand: a11y for referral share, dashboard gauge/activity, icon ligatures
  • deploy: Dockerfile Node 22 for Astro 6 + sync mcp-server lockfile
  • cities: remove fake 5.0/5 ratings from public city cards
  • dashboard: help shell, breadcrumb a11y, settings + safe 301s
  • portfolio: canonical FI model + scenario labels + reference chip (P0-1)
  • auth: GDPR consent line at signup + clearer referral banner copy
  • marketing: replace fake Revolut/Wise/N26 logos with factual proof strip
  • pricing: USD-primary display, never-$0 paid plans, ship all features
  • portfolio: production gates, all audit BLOCKERs + HIGH items
  • auth: password sign-in cookie sync fix (P0, broken on v1.14.0)
  • portfolio: cross-surface data-sync fixes, currency, categorization, FI display

The first public release of the IndepAI API includes:

  • FI Calculator (POST /api/v1/calculator)

    • Calculate financial independence timeline
    • Year-by-year projections
    • Multiple scenario support
  • Portfolio Health (POST /api/v1/portfolio-health)

    • 0-1000 health score
    • Four scoring components
    • Actionable recommendations
  • API Status (GET /api/v1/status)

    • Health check endpoint
    • Service status monitoring
  • Assets API (/api/v1/assets/*)

    • Full CRUD operations
    • Portfolio summary
    • Asset categorization
  • User API (/api/v1/user/*)

    • Profile management
    • Settings customization
    • Notification preferences
  • Geo API (/api/v1/geo/*)

    • City database (100+ cities)
    • Cost of living data
    • City comparisons
    • Personalized recommendations
  • Tax API (/api/v1/tax/*)

    • Multi-country tax calculator
    • Special programs database
    • Tax optimization suggestions
  • Feature Flags (/api/v1/features/*)

    • Feature flag checking
    • A/B testing support
  • OpenAPI 3.1 specification
  • Zod-based request validation
  • JWT authentication via Supabase
  • Rate limiting by tier
  • Consistent error responses

The IndepAI API uses URL-based versioning:

https://indepai.app/api/v1/...
https://indepai.app/api/v2/... (future)

Within a major version (v1):

  • Existing fields will not be removed
  • Field types will not change
  • Optional fields will not become required
  • New optional fields may be added

Breaking changes will only occur in new major versions:

  • Field removals or type changes
  • New required fields
  • Authentication changes
  • Rate limit structure changes

Major version transitions include:

  • 6-month deprecation notice
  • Migration guide
  • Parallel operation of old version

Get notified of API changes: