Build once, native everywhere. Native Shell is a native UI framework for iOS, Android, macOS, Windows, Linux and the web, built in Rust. It unifies the app — components, state, logic and API — and leaves the pixels to each platform: native views on iOS, Android, macOS, Windows and Linux, HTML on the web, GPUI in GPUI apps and Ratatui in terminals, with the platform's own text, input and interaction (a menu is a popup on the desktop and a sheet on a phone). Write the whole app in Rust, its screens in TSX, or combine both with shared Rust components.
Package it as a standalone app on every platform, or embed it in an existing one. On the same engine, apps load TSX modules at run time — plugins, features, UI generated by AI — delivered as signed packages and run in a sandbox the host configures.
Documentation, guides and live demos: nsh.dev.
nsh/base: navigation, safe areas, dialogs, the keyboard, the status bar), and your app draws its components from them in TSX or Rust.nsh CLI for building and packaging.| Platform | Drawn with | Embed with | Requires |
|---|---|---|---|
| iOS | UIKit, CoreText | NshAppView (Swift, NativeShell.xcframework) | iOS 15+ |
| Android | Android views, StaticLayout | NshView (Java / Kotlin, nsh.aar) | Android 9 (API 28)+ |
| macOS | AppKit, Core Animation, CoreText | AppView (Rust, nsh-platform-macos) | macOS 14+ |
| Windows | Win32, Direct2D, DirectWrite | AppView (Rust, nsh-platform-windows) | Windows 10 1809+ |
| Linux | GTK 4, Pango | AppView (Rust, nsh-platform-linux) | GTK 4.14+ |
| GPUI (macOS, Windows, Linux) | GPUI (GPUI Fast) | AppView (Rust, a GPUI view, nsh-platform-gpui) | macOS, Windows; Linux with Vulkan |
| Terminal (macOS, Windows, Linux) | Ratatui, Crossterm | AppView (Rust, a Ratatui region, nsh-platform-tui) | Interactive terminal |
| Web | HTML, CSS | createPlayer (JavaScript) or an iframe | Modern browsers |
Each desktop runs and packages apps with its own backend (AppKit, Win32, GTK 4). The GPUI backend draws with GPUI on all three desktops and embeds NSH in GPUI and GPUI Kit apps; nsh run --target gpui shows an app as they do. The web platform (nsh run --target web, nsh package --target web) publishes apps as static sites and runs the website's live demos. The terminal backend (nsh run --target tui, nsh package --target tui) shares the same runtime and layout, with keyboard focus, Unicode editing and mouse input. Images and canvas drawing use terminal graphics protocols and Unicode block rendering for portable composition.
Install the nsh command (other ways):
curl -fsSL https://nsh.dev/install.sh | sh
Build and install the latest main from source (Git, Rust and the platform build dependencies required):
curl -fsSL https://nsh.dev/install.sh | sh -s -- --source nsh -V # nsh 0.1.1 (abcdef0)
Re-run to update. The checkout stays in ~/.nsh/source for runtime builds.
brew install longbridge/tap/nsh
irm https://nsh.dev/install.ps1 | iex
Choose how to write your app:
| Rust | TSX | |
|---|---|---|
| Create | nsh init my-app --template rust | nsh init my-app --template ts |
| Write | Rust components, typed styles and signals | TSX components, Tailwind classes and signals |
| Iterate | Rebuild and restart on Rust changes | Hot updates that preserve state |
| Toolchain | nsh and Rust | nsh |
You can also combine them (nsh init my-app --template mixed): TSX screens import your Rust components and modules. See Building with Rust for Rust apps and mixed projects.
Run either app on your chosen platform:
nsh run my-app --target ios # iOS simulator; requires Xcode nsh run my-app --target catalyst # Mac Catalyst window on macOS
nsh run my-app --target android # emulator or device; requires the Android SDK
nsh run my-app --target macos # AppKit window
nsh run my-app --target windows # Win32 window
nsh run my-app --target linux # GTK 4 window
nsh run my-app --target gpui # as GPUI apps that embed it show it
nsh run my-app --target tui
nsh run my-app --target web # open in the browser
The Rust template includes a Cargo project with its root component in src/lib.rs. The TSX template includes App.tsx, nsh.json and tsconfig.json, with generated TypeScript declarations in .nsh/types for your editor. Logs and errors show in the terminal. What each platform needs: Installation.
| Example | What it shows |
|---|---|
examples/gallery-rs | The gallery written in Rust: an app with no TSX and no QuickJS |
examples/rust-exports | A TSX app using a component, a module and a class of its own Rust crate |
examples/gallery | A tour of what NSH supports: lists, navigation, forms, controls, gestures, animation, images, styles, text, web view and video, fetch |
examples/counter | The smallest app |
examples/hopper | A dark, tabbed dashboard built only from primitives: interactive canvas charts, sliders, menus, animation |
examples/desktop | A desktop app with a title bar and menus of its own (nsh/desktop) |
examples/terminal-workbench | A three-pane operations console with search, service details, charts, activity and deployment dialogs |
examples/embed-ios, examples/embed-android | NSH inside existing native apps, with a native component the app registers |
examples/bench | Rust components against the same components in TSX |
cargo run
NSH builds on the ideas of these projects:
Points, Point, Size, Bounds, Edges), SharedString, typed styles in Rust and much of the vocabulary of NSH’s API.gpui-base's unstyled base components, which nsh-base follows in names and scope, and the Coding and Design Guides.neutral) and the cssVars theme files apps write or export from shadcn’s themes and tweakcn.Licensed under the Apache License, Version 2.0.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be licensed under Apache-2.0, without any additional terms or conditions.