Default Picks

Defaults are starting points. Override them with product constraints.

Product shapeDefault pickAvoid trigger
Docs, reports, content-heavy sites, prototypesAstro static outputNeeds sessions, Actions, bindings, SSR, or APIs
Private/internal lab previewCaddy tailnet routeNeeds shareable protected access without tailnet
Shareable static surfaceR2/Worker/Access-style protected static hostingNeeds heavy local service behavior
Installable/offline workflow appPWA/web-firstNeeds restricted native permissions or deep background execution
Android-first appKotlin + Jetpack Compose + Room/WorkManager as neededEqual iOS launch matters more than Android depth
Android+iOS standard appExpo/React NativeCustom rendered brand UI dominates or native modules dominate
Custom cross-platform UIFlutterPlatform-native feel and platform-specific UX matter more
New Windows-only native appWindows App SDK + WinUI 3Existing WPF/WinForms app only needs incremental modernization
Small local-first desktop appTauri 2Chromium consistency, Node modules, or mature Electron packaging matters more
Keyboard-heavy desktop productivity appElectron + sidecarFootprint/security constraints dominate and WebView differences are acceptable
Go-backed local service/admin UIGo backend with embedded Vite/React UIStatic/PWA is enough or a managed backend is clearly cheaper
Developer automationGo or Rust CLINon-technical users need GUI onboarding
AI-native local assistantDesktop/web shell + SQLite + MCP + sandboxed toolsAI is a minor feature, not the product boundary

Lab Biases

  • Prefer static/content and local-first options before adding servers.
  • Prefer native Android for permission-heavy Android-first apps.
  • Prefer explicit quality gates over framework enthusiasm.
  • Prefer one maintainer-friendly repo/runtime unless the product truly needs more.
  • Prefer official docs and source examples before AI-generated starter code.