● Kanton Zürich · 100 % on-device · iOS
A real-time tax reserve, Swiss QR-bill invoicing and receipt scanning for sole proprietors — designed, built and shipped solo.
Scroll01 — The problem
Every self-employed person in Canton Zürich pays into five separate systems — each with its own rates, brackets and municipal multipliers. Most freelancers guess how much to set aside, and guess wrong.
Invoicing means paying CHF 30+/month for Bexio. Expense tracking is a separate tool. Tax estimation is a Treuhänder or a spreadsheet. Nothing combines all three affordably — and privately.
02 — The solution
The Solaris orb is the heart of it: a live tax reserve that recalculates with every invoice and receipt, across 25+ Zürich municipalities. It glows teal when you're fully covered — tax awareness becomes passive.
Real-time reserve calculator covering AHV/IV/EO (incl. sliding scale), cantonal, municipal, federal and church tax for 25+ municipalities.
Scan your provisional Steuerrechnung, compare it against actual year-to-date income, and auto-generate a formal Einsprache in German if you've been overcharged.
Swiss QR-bills to the SIX SPS v2.3 standard in one tap. Mark an invoice paid and the revenue flows straight into the tax calculation.
Photograph a receipt; on-device OCR extracts merchant, amount and date. Deductions update the reserve instantly.
03 — Design identity
Near-black canvas, one hero accent, and a strict typographic rule: when you see monospaced text, it's money.
The orb doubles as data display and emotional indicator. Colour went through three iterations — the shift from navy to near-black came from seeing it on a real device, not from a prompt. The app ships in both light and dark mode.
04 — Architecture
No servers, no cloud database, no accounts, no analytics SDKs. Everything runs on-device with SQLite — so the App Store privacy label reads “Data Not Collected.” Almost no finance app can claim that.
The tax engine is pure TypeScript with zero dependencies, validated by 29 unit tests. Privacy wasn't a compromise; it's the positioning.
05 — The hardest bug
The QR-bill passed every internal test — then Raiffeisen's validator rejected it against three spec violations. Fixing it meant restructuring the address model across settings, onboarding and invoice creation, plus a pre-flight gate that blocks a broken bill before it ever reaches a client.
This is the detail that proves the app was built against a real standard, not a mock.
Creditor address incomplete — combined address lines rejected; structured street / building / postal / town required.
Debtor address incomplete — same structural requirement on the payer side.
Invalid reference type — SCOR with a non-RF string on a normal IBAN.
Structured address model across settings, onboarding and invoicing · QRR for QR-IBANs, NON for standard IBANs · pre-flight validation gate before export.
06 — Process
Claude for strategy, tax-law research and architecture. Pencil.dev for twelve wireframed screens. Claude Code for implementation. Expo and Xcode for on-device testing.
Scope was deliberately cut from four cantons to one — Zürich with verified, accurate data beats four done with guesswork. AI moved implementation at high speed, but every product decision, design judgement and quality bar came from a human reviewing it on a real screen.
Outcome
Functional iOS app submitted to the App Store · marketing site live at taxmeter.ch · full custom screenshot set in both languages.
Reflection
“AI writes the code. Humans make the decisions.”
This project tested whether a designer could ship a production-quality native app, a marketing site and a compliant Swiss financial tool solo, using AI tools — all the way to the App Store. The answer was yes, with a caveat: the value wasn't the code generation. It was the product thinking, the design judgement, and the willingness to test against reality — a real bank, a real device, a real tax table.