You cannot write a Watch app in React Native. Here is what to do instead.
The honest answer disappoints people, so most articles avoid giving it. Here it is, along with the architecture that does work.
· 6 min read · Nadir Ben Salah
React Native does not run on watchOS. There is no configuration flag, no community fork worth depending on, and no realistic prospect of one. The watch app is SwiftUI, and if somebody tells you otherwise they are either selling something or have not shipped one.
That is the disappointing half. The useful half is that this matters far less than teams assume, because of what a watch app actually is.
A watch app is not a small phone app
The temptation is to port your interface. Do not. A watch interaction lasts a few seconds, at arm's length, often while walking. The right scope is usually one screen showing one number, and maybe one button.
In Qindil the watch app shows the next prayer time and how long until it. That is the entire surface. In Amiens it shows the next bus at your usual stop. Both took a fraction of the time the phone screens took, because there was almost nothing on them.
Which reframes the problem: you are not rewriting your app in SwiftUI. You are writing one or two small screens, and the cost is proportional.
What can be shared, and what cannot
Shareable: nothing of your JavaScript, but plenty of your thinking. The data model, the business rules, the formatting conventions. If your prayer time calculation lives in TypeScript, you will be writing it again in Swift — so keep it small and well specified, and write tests on both sides that assert the same fixtures.
Not shareable: the interface, the navigation, the state management. All of it is SwiftUI.
There is a third option people forget: for many cases, the watch app does not need your logic at all. It needs a result the phone already computed. Which leads to the connection.
How the two halves talk
WatchConnectivity is the framework, and it has several transfer modes that behave very differently. The one that matters for most apps is application context: a small dictionary the phone updates and the watch reads, where only the latest value survives.
That is exactly right for "here is the next prayer time" or "here is your usual stop". It is exactly wrong for a queue of events, because intermediate values are discarded.
The constraint nobody mentions: the watch is frequently unreachable. Out of range, in a different room, battery saving. Your watch app must render something sensible with stale data or no data at all. Design that state first, because your users will see it more often than you expect.
The complication, which is the real reason to do this
The app on the watch is the smaller half of the value. The complication — the number on the watch face itself — is what people actually use, because it needs no interaction at all.
Complications have their own update budget, tighter than Live Activities. The same lesson applies: give the system data it can render over time rather than pushing updates. A next prayer time or a departure time is a date, and the watch can count towards it on its own.
So, should you?
Worth it when your app has a single recurring number somebody would glance at: a time, a countdown, a next departure, a streak. The complication is the product; the app is the settings screen for it.
Not worth it when your app is about browsing, reading, entering data or anything involving a list longer than five items. You will spend weeks on something with very few users, and I would rather say that before you commit than after.