NativeScript: TypeScript Against Native APIs, Framework Optional
⚡ Write Native with TypeScript ✨ Best of all worlds (TypeScript, Swift, Objective C, Kotlin, Java, Dart). Use what you love ❤️ Angular, React, Solid, Svelte, Vue with: iOS (UIKit, SwiftUI), Android (View, Jetpack Compose), Flutter and you name it compatible.
At a glance
- What is it?
- NativeScript lets JavaScript and TypeScript call iOS, Android and visionOS APIs directly, with Angular, React, Solid, Svelte or Vue as an optional layer on top. Here is how the runtime, the packages and the CLI fit together, and where the approach costs you.
- Who is it for?
- Adopt NativeScript when you want one TypeScript codebase that reaches the native API surface of iOS, Android and visionOS, and when you are willing to own the native build toolchain on each platform. Do not adopt it if you want a managed cloud build or a pure webview model, because the project documents neither.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 2 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 28, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What NativeScript Is For, and Who It Fits
NativeScript is a set of runtimes and packages that let JavaScript and TypeScript code call native APIs on iOS, Android and visionOS. The README states the goal plainly: it "empowers you to access native APIs from JavaScript directly." That sentence is the whole product. It is not a webview wrapper and it is not a UI kit that happens to compile to native. The JavaScript you write runs inside a runtime that exposes the platform's own classes and methods to your code.
The intended audience is a team that already knows TypeScript and wants to ship to more than one mobile platform without maintaining three separate codebases. The README lists Angular, React, Solid, Svelte and Vue as supported frontends, and each has a starter URL. That matters because the framework is a choice, not a requirement. You can build against the core primitives alone, or bring the framework your team already uses.
The secondary audience is narrower and more interesting: developers who need a specific native capability that a cross-platform UI framework does not expose. Because the runtime hands you the platform API surface, the escape hatch is the same language you are already writing. That is the strongest argument for this project, and it is the one the README leads with.
How the Runtime, the Packages and the Types Fit Together
The repository is an Nx monorepo. The root package.json is marked private and its version field reads 9.0.0, which describes the workspace, not a published artifact. The published pieces live under packages/ and are scoped to @nativescript.
The README describes the split. @nativescript/core holds "singular primitives offering an easy-to-use API surface for diverse iOS/visionOS/Android APIs implemented with NativeScript." That is the layer your app code touches. @nativescript/types bundles the iOS and Android type declarations and is described as the most commonly used of the type packages; @nativescript/types-ios and @nativescript/types-android split them apart, and @nativescript/types-minimal covers only the latest Android and iOS SDKs, aimed at web-based IDEs that auto-load every declaration in node_modules. @nativescript/ui-mobile-base holds the native UI classes that core depends on. @nativescript/webpack provides the build utilities and configs.
What the README does not contain is the runtime itself. The iOS and visionOS runtime lives in the NativeScript/ios repository, written in a mix of C++, Objective-C and Swift, and the Android runtime lives in NativeScript/android, written in C++, Java and Kotlin. The CLI is a third repository, NativeScript/nativescript-cli. So the data flow is: your TypeScript is bundled by the webpack or Vite tooling, the CLI packages it into a platform project, and the platform runtime executes it with the native classes bound into the JavaScript context. The type packages exist so that the editor knows what those bound classes look like.
Installing NativeScript and Running a First App
The README's Quick Start is four steps. The CLI is installed globally from npm under the name nativescript.
npm install -g nativescriptWith the CLI on the path, the ns command creates a project. The README does not show a framework prompt in this example, so expect the create flow to ask which template you want; the starter links cover JavaScript, TypeScript, Angular, React, Solid, Svelte, Vue and Vue 3.
ns create my-app
cd my-appThe run commands build and deploy to a connected device or a running emulator. The README gives both platforms as separate commands.
ns run androidns run iosThe README does not state what the terminal prints during a successful run, and it does not document rollback or how to undo a deploy. What it does show is that the CLI is the entry point for the entire lifecycle: create, build, run. Before any of this works you need a working native toolchain for the platform you are targeting, and the README points to https://docs.nativescript.org/setup/ for that environment setup rather than describing it inline. That is the honest boundary of this README: it gets you to the commands, and the setup documentation carries the platform prerequisites.
Where the Direct-Native-API Model Costs You
The same design decision that makes NativeScript useful is the one that makes it expensive. Because your code binds to the platform's own API surface, the API surface is the platform's. The README lists iOS, Android and visionOS as the runtimes provided. There is no desktop target and no web target in that list. If you need a browser build from the same codebase, this is the wrong tool, and no amount of framework choice changes it.
The type packages make the cost visible. @nativescript/types bundles both platforms, and @nativescript/types-minimal exists specifically because loading every declaration is heavy enough that web-based IDEs need a reduced set. That is a real constraint on editor performance, and the README treats it as a known problem rather than a footnote.
The runtime split is the second cost. The core primitives, the iOS runtime, the Android runtime, the CLI and the plugin collection are separate repositories. A bug that crosses that boundary, say between the CLI's packaging step and the runtime's class binding, is not fixable in one place. Nothing in the README documents a rollback path for a bad app build, and nothing describes how a runtime version is pinned against a core version. The release stream shows @nativescript/core and @nativescript/vite versioned independently, which is consistent with a multi-repository project but leaves version alignment as something you verify yourself.
NativeScript Compared with Capacitor and Flutter
The two comparisons worth making are with Capacitor and Flutter, because they represent the two other answers to the same question.
Capacitor's model is a web application inside a native shell. Your UI is HTML and CSS in a webview, and native capability arrives through a plugin bridge. The difference from NativeScript is where the code runs: in a webview versus in a runtime with native classes bound into the JavaScript context. If your existing product is a web app and you want it on a phone, the webview model is a shorter path. If you need to call a platform API that no plugin wraps, you are writing a plugin, whereas in NativeScript the README's premise is that the native API is already reachable from your JavaScript.
Flutter takes the third position: it draws its own widgets and does not use the platform's UI toolkit. NativeScript does the opposite. The README names UIKit and SwiftUI on iOS and View and Jetpack Compose on Android as things it is compatible with, which means the native UI layer is available to you rather than replaced. That is a genuine difference in kind, not a preference. It also means you inherit the platform's UI behaviour and its inconsistencies, and you do not get Flutter's pixel-identical rendering across platforms.
Neither comparison is settled by the README, which makes no performance claims and publishes no benchmarks. Anyone choosing on performance grounds should measure their own workload.
Maintenance, Releases and the MIT Licence
The repository is not archived, and the last push was on 2026-09-19. That is recent enough to treat the project as one that receives changes, and the release stream supports that reading: @nativescript/core 9.1.2 on 2026-09-14 and @nativescript/vite 8.0.10 on 2026-09-16. Note the version numbers. The core package is on 9.x while the Vite package is on 8.x, so the two do not move in lockstep and you should not assume they do.
Upgrade cost has two components. The first is the npm packages, which follow the usual semver expectations. The second is the native runtimes in the separate ios and android repositories. A core upgrade that depends on a runtime capability is not a single npm install, and the README does not describe a compatibility matrix between the two. Budget for reading release notes rather than trusting a caret range.
The licence is MIT, stated in the README badge, in the repository metadata and in the root package.json. MIT is permissive: it allows commercial and closed-source use, modification and redistribution, with the licence and copyright notice retained. The copyright notice names the OpenJS Foundation and NativeScript contributors, and the README notes that the OpenJS Foundation has registered trademarks and points to its trademark policy. Trademark rights are separate from the code licence, so redistributing the code is not the same as using the project's name or logo. That is a description of the terms, not legal advice; check with counsel for your situation.
Editorial conclusion
Adopt NativeScript when you want one TypeScript codebase that reaches the native API surface of iOS, Android and visionOS, and when you are willing to own the native build toolchain on each platform. Do not adopt it if you want a managed cloud build or a pure webview model, because the project documents neither. Verify first that your target platforms are covered by the runtimes, that your chosen frontend has a starter, and that you can install the CLI and produce a debug build on your own machine with ns run android or ns run ios before committing a team to it.
Frequently asked questions
What is NativeScript used for?
It is used to build mobile applications for iOS, Android and visionOS from JavaScript or TypeScript. The README states that it lets you access native APIs from JavaScript directly, and lists Angular, React, Solid, Svelte and Vue as frontends you can use on top.
How do I install NativeScript?
Install the CLI globally with npm install -g nativescript, then create a project with ns create my-app and run it with ns run android or ns run ios. The README points to the setup documentation for the platform environment you need beforehand.
Is NativeScript better than React Native?
The README makes no comparative claim and publishes no benchmarks, so there is no basis in it for a ranking. The concrete difference it does state is that NativeScript exposes the native API surface directly and lets you pair it with several frontends, including React.
Is NativeScript still used?
The repository is not archived and the last push was on 2026-09-19, with @nativescript/core 9.1.2 released on 2026-09-14. The README does not publish usage numbers, so activity in the repository is the only signal available here.
Is NativeScript dead?
The repository is not archived and the last push was on 2026-09-19, with @nativescript/core 9.1.2 released on 2026-09-14 and @nativescript/vite 8.0.10 on 2026-09-16. The README does not discuss the project's popularity, so commits and releases are the only evidence available here.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/nativescript-nativescript)