Multi-language i18n (10 locales pre-wired)
VN, EN, ES, FR, JA, KO, ZH, AR (with RTL), ID, TH ship as working locales. Type-safe translation keys, browser-locale + timezone auto-detect, hreflang alternates, multi-locale sitemap, language switcher. `bun run i18n:check` validates parity in CI; `bun run i18n:sync` writes `[EN]`-prefixed placeholders for missing keys.
46+ themed UI primitives + live Theme Studio
Every shadcn / Base UI primitive a SaaS needs — DataTable (TanStack v8), recharts, cmdk command palette, vaul drawer, resizable panels, combobox, sortable, hover-card, context-menu, tabs, dialog, TipTap editor. `/settings/theme` ships a live Theme Studio (12 WCAG-AA presets, light/dark/system, soft/default/bold contrast, font slider, RTL/LTR) — settings persist via CSS variables with no rebuild.
Stripe billing — multi-currency + freemium gate
Free / Pro / Family tiers with webhook-verified upgrades, customer portal, dunning + grace-period handling, idempotent `stripe_events` table, and a `profiles_update_self_safe_columns` RLS policy that blocks user-side billing tampering. Multi-currency (USD/EUR/GBP/VND/IDR/THB) with USD fallback. Server-side freemium middleware blocks Pro routes for Free users.
Claude API insight engine (4 prompt types)
Weekly digest (sonnet), Anomaly alert (haiku — 20× cheaper), Goal review (sonnet), Forecast write-up (sonnet). Edge Function-based generation (`supabase/functions/generate-insight/`) so the Anthropic key stays server-side and out of the Next.js bundle. Per-user 7-day cache, token + model tracking surfaced in admin. 6 mandatory prompt rules: JSON-only, specific amounts, no hallucination, ≤120 words, right model per task.
OCR receipts + 5-bank CSV import
Three transaction input methods: manual entry (RHF + Zod), client-side OCR receipt scan via Tesseract.js (no server upload), and CSV import with 5 pre-wired bank parsers (Vietcombank / Techcombank / TPBank / VIB / generic) + a diff-and-confirm screen so duplicates never land in the ledger.
Full finance suite + tax calculators
Dashboard, transactions, goals (SMART templates + AI nudges), budgets (caps + rollover + alerts), recurring (subs + income detection), debts (snowball + avalanche planner), invoices + clients (freelancer mode), accountant share-link (`/accountant/[token]` with scope + expiry), forecast (30/60/90-day), net-worth + portfolio, calendar, family/team accounts (owner / co-pilot / view-only). Tax calculators for Vietnamese TNCN (7-bracket), Indonesian PPh 21 (PTKP 54M), Thai PIT (8-bracket).
Full admin panel + audit log + investor PDF
9 admin routes — dashboard (DAU/MRR/paying/churn KPIs + 30d signups + plan-mix + 15s cache), users (list + detail + 5 lifecycle actions: reset password, magic link, ban, unban, cancel sub), messages (inbox + reply via Resend), audit log (paginated + filterable), feature flags (runtime kill-switches + rollout %), analytics (cohort LTV heatmap + onboarding funnel + investor PDF export via jsPDF). Every admin write is recorded.
Public API v1 + v2 + per-user API keys + SDK
`/api/v1/me`, `/api/v2/transactions/batch` (100/call), `/api/v2/usage` — bearer-token endpoints. `ApiKey` table stores prefix + sha256(plaintext); plaintext shown once at creation. `/finance/settings#api-keys` UI for create + revoke. Typed `FinanceAIClient` SDK in `public/sdk/` with 429 auto-retry. Webhook delivery with auto-disable after 10 consecutive failures.
Gamification — XP, levels, badges, streaks
Streaks (with streak freeze), XP / 10 level thresholds, 10 badge types, weekly challenges, achievements wall. Fire-and-forget award pipeline. Wakes dormant users by ~40% in our cohort vs no-gamification control.
PWA + offline + Web Push
Service-worker via `vite-plugin-pwa` — install prompt, offline shell, transaction-queue replay on reconnect, `/offline` fallback route. Web Push (`web-push` library) wired for daily nudge, anomaly alert, weekly recap.
Demo mode + seeded admin user
`NEXT_PUBLIC_DEMO_MODE=true` flips the deployment to read-only (every write API returns `403 DEMO_MODE_READONLY`) with a sticky banner. `bun run seed:demo` provisions an admin user + 90 days of sample transactions + goals + insights so reviewers can browse every screen without polluting the data set.
RLS-first Postgres + verifier script
60+ SQL migrations under `supabase/migrations/` with paired `CREATE POLICY` blocks for every table. `on_auth_user_created` trigger materialises a Profile row on signup; `enforce_role_immutability` blocks role escalation via the user-facing PATCH. `bun run verify:rls` asserts every table has RLS on + the expected policy block — drift fails CI.