Decision Model
Choose a stack by constraints, not familiarity. A familiar stack that fights platform policy, distribution, or native APIs is not the simple option.
The Seven Questions
| Question | Why it matters | Example signal |
|---|---|---|
| What is the product shape? | Prevents framework-first thinking | Static report, PWA, native app, CLI, backend, AI tool |
| Which platform APIs are core? | Determines when native wins | SMS, Bluetooth, file watching, notifications, widgets |
| Where does data live? | Avoids premature servers and sync | SQLite, files, IndexedDB, backend DB |
| How will users get it? | Distribution is product work | URL, Play Store, Microsoft Store, installer, package manager |
| What quality gate proves done? | Dev server success is not release readiness | Release build on device, packaged desktop app, offline PWA test |
| What can one person maintain? | Solo-dev scope beats theoretical elegance | One repo, one CI path, one runtime |
| What will AI get wrong? | Agent productivity depends on guardrails | UWP APIs in WinUI 3, stale Android examples, unsafe Electron defaults |
Cost Of Wrongness
Some wrong choices are cheap to reverse. Others create release and data traps.
| Choice | Cheap to reverse | Expensive to reverse |
|---|---|---|
| Static web vs SSR | Usually cheap if routing/data model is clean | Expensive if auth/session assumptions spread everywhere |
| PWA vs native mobile | Cheap for early prototypes | Expensive after users depend on offline/native permissions |
| Expo vs native | Usually manageable with development builds or prebuild | Expensive if custom native code dominates from day one |
| Tauri vs Electron | Moderate if UI is plain web | Expensive if Node APIs or Chromium-specific behavior define UX |
| Local-first vs backend | Cheap while data is local/exportable | Expensive after sync/account models ship |
| AI tools without sandbox | Looks cheap initially | Expensive after untrusted tools touch user workspaces |
Minimum Decision Record
Use this before implementation:
Product shape:
Default stack:
Why this rung:
Avoided stacks:
Native/platform APIs required:
Data boundary:
Distribution path:
Quality gate:
Known traps:
Escape hatch:
Gotcha: “AI can generate it” is not a decision signal. AI can generate broken release paths, stale platform APIs, and unsafe tool execution just as quickly as good code.