Why
The premise in the question is right: writing once and running everywhere is the mainstream answer in 2026, not a minority one. React Native and Flutter carry a large share of new consumer apps, Kotlin Multiplatform occupies the conservative middle by sharing logic while leaving UI native, and Expo removed most of the build-tooling tax that used to be the strongest argument against the approach. Choosing native-only for a small team is now a decision that needs a reason, which is a reversal from a few years ago.
The second half of the question is the interesting one, and the honest answer is that the study load does not fall proportionally. A cross-platform framework shares the layer that was already the cheapest to learn: laying out views, holding state, calling an API, navigating between screens. What it does not share is everything the operating system and the app stores own. Permission models differ and change with each OS release. Background execution is not a difference in API but a difference in philosophy, and the two platforms disagree at a design level about what an app may do when it is not on screen. Push has different delivery guarantees on each side. Secure storage is Keychain with the Secure Enclave on one platform and Keystore with StrongBox on the other, and they are not the same guarantee. Store review and payment rules are not code at all.
Which produces the rule this card exists for: you can share the code you write, and you cannot share the code you must obey. The shared half is authored by you and is therefore the half you could always have refactored. The unshared half is policy — OS policy and store policy — and no framework abstracts a rule that a reviewer enforces by reading your app.
For this project specifically the asymmetry is at its worst. A wallet or a settlement client touches key storage, biometric binding, background delivery of settlement events, deep links returning from a browser flow, and the store rules around crypto and payments. Every item on that list is in the unshared column. A content app might share ninety percent of its work; an app whose whole job is the secure element shares the chrome around it. That is not an argument against cross-platform — it is an argument for choosing based on the ratio rather than on the language.
And it answers the complaint about volume directly, because the volume is not what it looks like. The reading list is a function of the surface you touch, not of the number of platforms you ship to. Adding a second platform to an app that only draws screens and calls an API adds very little. Adding a second platform to an app that holds keys adds a second secure-storage model, a second biometric prompt semantics, and a second review process — regardless of how much code is shared. Bound the study by listing the surface first, which is the same instruction as one-page-not-the-curriculum: pull the page you are stuck on, not the next one in order.
How it works
What gets shared, and what never does
| Layer | Shared by a cross-platform framework | Why |
|---|---|---|
| UI layout and rendering | Yes | It is a drawing problem, and drawing is portable |
| Business logic, networking, state | Yes | Pure code with no OS opinion |
| Navigation | Mostly | Conventions differ, but they are conventions |
| Permissions | No | OS policy, and it moves with each OS release |
| Background execution | No | The two platforms disagree at a design level, not an API level |
| Push delivery | No | Different transports with different guarantees |
| Secure storage and biometrics | No | Secure Enclave and StrongBox are different guarantees, not different names |
| Deep links | No | Each side verifies ownership with its own hosted file |
| Store review and payment rules | No | Not code. A person reads your app |
The top of the table is the part a framework compresses, and it is the part that was already the cheapest to learn. The bottom of the table is the part that generates the study load, and it is unaffected by the choice.
The self-test, before choosing anything
List the features you will actually ship and mark which half of the table each one lands in. The ratio decides:
| If most features are... | Then |
|---|---|
| Screens, lists, forms, API calls | Cross-platform saves most of the work. Take it |
| Keys, background delivery, biometrics, payments | The saving is real but small, and it is not where the risk is |
This is the same move as choosing-a-chain-is-a-lease in a different domain — the question that looks technical is really about which parts you do not control.
An ordering for the study, since the volume is the actual complaint
- One platform's permission and lifecycle model, properly. The other platform maps onto it, so the second one costs a fraction of the first. Learning half of each costs more than learning one and then translating.
- Secure storage and biometrics on both. This is the part that does not map, so it has to be learned twice, and for this project it is the part that matters.
- The framework last. It is a tool, it is the fastest of the three to learn, and it changes fastest — learning it first means learning it again.
The trade the industry actually settled on
Two stable answers exist rather than one, and they correspond to the two halves of the table. Share everything, including UI is the fast option and is right when the bottom of the table is thin. Share the logic and keep the UI native is the conservative option and is right when platform behaviour is load-bearing. Both are mainstream, which is why the question "is one codebase the trend" has a yes answer that does not settle anything — the trend is real and the decision is still per-app.
Where it lands in Jayverse
- Wallet: budget key storage and biometrics twice, not once. If jayverse-wallet ever ships a mobile companion, treat Keychain/Secure Enclave and Keystore/StrongBox as two separate implementations to write and test, not one cross-platform abstraction.
- Rabbit: table the feature list before picking a mobile framework. Session-key mandate execution and settlement push notifications sit in the unshared column, so list Rabbit's actual mobile features and mark each shared-by-framework or per-platform before choosing React Native, Flutter or KMP.
- Devnet: no action until a mobile client exists. Treat the self-test table as the gate — nothing in Jayverse's current stack changes until a service commits to shipping mobile.
Key expressions
| Expression | 뜻 · 쓰이는 자리 |
|---|---|
| build-tooling tax | 빌드 도구 관련 부담·비용 · 크로스플랫폼 프레임워크가 줄여준 것을 말할 때 · "removed most of the build-tooling tax" |
| load-bearing | (구조상) 핵심적인·없으면 무너지는 · 플랫폼 고유 동작이 중요할 때 쓰는 비유 · "platform behaviour is load-bearing" |
| maps onto | ~에 대응되다·들어맞다 · 한 플랫폼 지식이 다른 플랫폼에 적용될 때 · "The other platform maps onto it" |
| at its worst | 최악의 경우에·가장 심하게 · 격차가 가장 심한 상황을 가리킬 때 · "the asymmetry is at its worst" |
| chrome | 앱의 겉 UI 껍데기(핵심 로직 제외한 화면 틀) · 공유 가능한 부분을 가리킬 때 · "shares the chrome around it" |
| deep links | 브라우저에서 앱으로 되돌아오는 딥링크 · 모바일 앱의 특정 화면 직행 연결을 말할 때 · "deep links back from a browser flow" |
| secure element | 하드웨어 보안 저장 영역 · 키 저장·생체인증 관련 문맥에서 · "whose whole job is the secure element" |
| settled on | ~로 결론짓다·정착하다 · 업계가 특정 방식을 택했다고 할 때 · "the trade the industry actually settled on" |
| reversal from | ~로부터의 방향 전환 · 예전과 반대되는 결정을 설명할 때 · "a reversal from a few years ago" |
| bound the study | (범위를) 한정하다·좁히다 · 공부 범위를 제한하는 전략을 말할 때 · "Bound the study by listing the surface first" |
| StrongBox | 안드로이드 전용 하드웨어 보안 키 저장소 · Keystore와 짝을 이뤄 키·생체인증을 지키는 하드웨어 모듈, iOS Secure Enclave와 대비 · "Keystore with StrongBox on the other" |
| Secure Enclave | iOS 하드웨어 보안 모듈 · Keychain과 함께 키 저장·생체인증을 담당하는 전용 칩, StrongBox의 iOS 대응물 · "Keychain with the Secure Enclave on one platform" |
| Keychain | iOS 시스템 보안 저장소 · 비밀키·인증정보를 저장하는 iOS API, Secure Enclave와 결합해 동작 · "Secure storage is Keychain with the Secure Enclave on one platform" |
| Keystore | 안드로이드 시스템 보안 저장소 · 비밀키·인증정보를 저장하는 안드로이드 API, StrongBox와 결합해 동작 · "and Keystore with StrongBox on the other" |