Start from what you already have, then from what the app must feel like:
| If your situation is... | Start with | Because |
|---|---|---|
| A working web app or PWA, web team | Capacitor 243,123 | Same code in the browser and the stores (this chapter) |
| An existing Cordova 129 app | Capacitor | Plugins mostly carry over (Migrating from Cordova) |
| A React 7,897 team, app must feel native | React Native 36,878 with Expo 6,418 | Platform views, largest ecosystem (React Native) |
| Custom, animated, brand-identical UI | Flutter 16,720 | One renderer draws everything the same way |
| A Tauri 126,184 desktop app going mobile | Tauri | Shares the Rust core and front end |
| Heavy platform features, one OS | Kotlin or Swift | No layer between you and the platform (Android with Kotlin) |
A few checks settle close calls. List the device features the app needs and confirm each one has a maintained plugin for the current major version (Vetting Community Plugins). Prototype the hardest screen, not the easiest: a long list with images, a map, or a gesture-heavy editor shows a framework's limits within a day. Measure a release build on a low-end Android phone, since debug builds of every framework mislead. And price the services around the app, such as live updates, push and CI, because Appflow 53,110 's wind-down (Appflow's Wind-Down) showed that the framework can outlive the company selling its extras.
For BookNest the answer is Capacitor: a catalog, detail pages, notes and a cart are content screens, the Framework7 572,986 version already existed, and every native feature it uses, from the camera to encrypted storage, came from a maintained plugin. Android with Kotlin builds the same app in Kotlin, so you can judge the difference yourself.