Ladder Map
Start at the top and stop at the first rung that is truly required. If two rungs look plausible, pick the lower-operational-cost rung and write the escape hatch.
flowchart TD
idea([App idea]) --> content{"Mostly content, docs, reports, or prototype?"}
content -->|Yes| staticWeb["Static Astro or static web"]
content -->|No| browserOk{"Can browser APIs cover the product?"}
browserOk -->|Yes| pwa["Web app or PWA"]
browserOk -->|No| mobileDeep{"One mobile OS needs deep platform APIs?"}
mobileDeep -->|Yes| nativeMobile["Native mobile"]
mobileDeep -->|No| bothMobile{"Android and iOS at launch?"}
bothMobile -->|Yes| crossMobile["Expo or Flutter"]
bothMobile -->|No| desktopNeed{"Desktop app required?"}
desktopNeed -->|Yes| desktop["Tauri, Electron, Windows App SDK, or Wails"]
desktopNeed -->|No| cliNeed{"Automation or developer workflow?"}
cliNeed -->|Yes| cli["CLI"]
cliNeed -->|No| serverNeed{"Shared state, auth, payments, jobs, or integrations?"}
serverNeed -->|Yes| backend["Backend/API plus thin UI"]
serverNeed -->|No| aiNeed{"AI tools, MCP, local models, or sandboxing core?"}
aiNeed -->|Yes| aiNative["AI-native app stack"]
aiNeed -->|No| smaller["Re-scope to a smaller web, local, or CLI app"]
How To Use It
- Write one sentence for the product shape.
- Walk the ladder and stop at the first required rung.
- List the constraints that forced that rung.
- List the constraints that did not matter yet.
- Define the quality gate that proves the choice works.
What The Ladder Optimizes
| Priority | Meaning |
|---|---|
| Smallest maintainable surface | Fewer runtimes, fewer release paths, fewer policy gates |
| Platform fit | Use native when the app depends on native permissions, UX, or APIs |
| Distribution reality | Store review, signing, installer reputation, and updates count as product work |
| Local-first by default | Keep data local until shared state is a requirement |
| AI-agent safety | Prefer stacks with official docs, commands, examples, and known traps |
Tip: The ladder is not a ranking of technologies. It is a way to avoid paying for a bigger stack before the product earns it.