Skip to content
Optiqo

Changelog

What we shipped, what changed in the data, what we fixed. Public-facing items only — the internal dev log lives in the repo. Newest first.

2026

  1. Fix

    Newsletter: "you're already on the list" instead of confusing success

    The newsletter form used to show "thanks, check your email" even for emails that were already confirmed — so users sat waiting for a confirmation that never arrived (by design: no re-confirmation needed). The form now reads the `alreadySubscribed` field from the API response and shows a different message: "You're already on the list — no new email needed."

  2. Data

    All 26 cantonal tax scales now verified

    BL and VS were the last two scales still flagged as approximations. BL's §34 StG logarithmic formula (verified at section boundaries against the ESTV reference) and VS's Calcul_IC indexed brackets (transcribed from the canonical Art. 32 LF table) are now in the verified set. New regression tests in the engine guard the boundary numbers + the monotonicity invariants. The "two scales we still mark as approximations" disclaimer is gone from the homepage.

  3. Data

    Atlas data: filter out partial-status (fraction) communes

    The cantonal-move target and the cheaper-commune-within-canton lookup used to surface VD partial-tax-status entries (e.g. 'Les Bioux (fraction) **' at Steuerfuss 3) — not real places you can move to. They're now filtered everywhere: /score, /explore top-10 cheapest, canton-page commune lists, OG image ranks. Real cheapest commune in CH is now Schwende-Rüte (AI, Steuerfuss 18) — and that's a legitimate target.

  4. Feature

    Optimisation Score v2 — engine-backed, feasibility-weighted

    The free Score no longer uses heuristic ranges. Every CHF figure on /score now comes from a real engine pass: baseline tax + four engine levers (3a max, LPP buy-in, swap to cheapest commune in your canton, swap to cheapest CH commune). Each lever has a feasibility weight (1.0 'Easy' → 0.25 'Very hard') so cantonal-move doesn't dominate the score — raw savings still shown on the cards, but the score reflects realistic headroom.

  5. Feature

    Public changelog at /changelog

    Curated release notes — features, data refreshes, fixes — tagged and grouped by year. Available as RSS at /changelog/feed.xml.

  6. Feature

    Atlas: keyboard navigation + mobile list view

    The 26-canton heat-map is now fully keyboard-navigable: tab between cantons, hear the name and average Steuerfuss read by screen readers, see the active stroke move with focus. A sorted list below the map serves as the primary view on phones and as a tabular fallback for assistive tech. Reduced-motion preference is respected.

  7. Feature

    Open Graph cards on canton + commune share links

    Pasting any /commune/[bfs] or /explore/canton/[code] URL into iMessage, WhatsApp, LinkedIn, or Slack now shows a magazine-cover preview with the commune/canton name, Steuerfuss, and ranking. Home, /score, /pricing, /learn share a default editorial card.

  8. Feature

    Security headers + HSTS preload eligibility

    Full security-headers set added: HSTS (2 years, preload-eligible), Content-Security-Policy, Referrer-Policy, Permissions-Policy, X-Content-Type-Options. /embed/* routes get a loosened CSP so partner sites can iframe them. Framework leak (X-Powered-By) removed.

  9. Feature

    Dashboard: full DE / FR / IT translation

    Every page under /dashboard — overview, all-levers, profile, document upload, action plan, combo, multi-year planner, cantonal-move — now switches language with the EN / DE / FR / IT toggle in the header. Translations use Swiss-domain terminology (Steuerfuss / coefficient communal / moltiplicatore, BVG / LPP, Rachat / Einkauf / Riscatto). Pre-launch native review still recommended.

  10. Feature

    Sentry live: error reporting with EU residency

    Errors are now reported to a Sentry project in the EU (de.sentry.io) with strict PII scrubbing — email, salary, income, pension data, auth tokens, and request bodies on /api/profile and /api/levers/* are dropped before transport. Tunnel route bypasses ad-blockers.

  11. Feature

    Pension certificate (Vorsorgeausweis) extractor

    Upload your annual 2nd-pillar statement, get insured salary, current capital, and — the headline — your buy-in capacity extracted into your profile. Encrypted at rest with AES-256-GCM, 30-day auto-purge, 'delete immediately after extraction' opt-in.

  12. Feature

    Optimisation Score (free) — 0-100 with named top lever

    A 60-second test that estimates your tax bill, identifies which of six levers apply to your situation, and names the biggest one ("your largest gap is the Pillar 2 buy-in window — about CHF 3,500/yr"). Free, no signup. Horizontal optimisation scale shows where you sit.

  13. Launch

    First real charge — Stripe live with TWINT

    CHF 49 via TWINT, status succeeded. Cross-border activation took ~10 days of Stripe risk review. Card + TWINT both work; checkout is in CHF, no subscription, no card-on-file.

  14. Feature

    Onboarding wizard with commune-level precision

    New paid users land in a 9-step wizard: canton → commune → birth year → civil status → children → salary → flash baseline → situation flags → pillar data. The commune picker quantifies precision: choosing the right commune is up to 28% more accurate than canton-default.

  15. Data

    All 2,061 communes ingested

    Full 2026 Steuerfuss tables for every Swiss commune (all 26 cantons). 24 of 26 cantonal scales transcribed from cantonal Steuergesetz / Loi sur les impôts texts; VS and BL marked as approximations pending source confirmation.

  16. Feature

    PRO tier launched — CHF 49 one-time, no subscription

    Free atlas + free calculator + free score stay free forever. The personalised plan (multi-year LPP buy-in optimiser, 4 specialist calculators, cantonal-move ROI, document upload + extraction, printable action plan) is CHF 49 one-time for tax year 2026.

  17. Feature

    Tax engine: 6 optimisation levers

    Pillar 3a (single year), LPP buy-in (single year + multi-year DP optimiser), staggered lump-sum withdrawal, the buy-in × withdrawal combo, and 3a multi-account split. Pure TypeScript engine with decimal.js arithmetic — no LLM in the calculation path.

Subscribe

One short email a week with the latest changelog entries and any 2026 Swiss tax rule shifts that affect your bill — no marketing fluff. Sign up for the dispatch →