Native, deployment and CLI
Desktop and mobile from the same code, a real deploy, and the full toolchain.
Tauri (desktop)
nexa add tauri
cd src-tauri && cargo buildGenerates a real Windows/macOS/Linux binary, compiled with cargo — the same source code as the web version.
Capacitor (Android/iOS)
nexa add capacitor
npx @capacitor/cli add android
cd android && ./gradlew assembleDebugGenerates a real Android/iOS project. The Android build was verified end to end (a real APK compiled with Gradle); iOS needs Xcode.
Deploying with nginx
nexa add nginx
# genera deploy/nginx.confGenerates a real deploy/nginx.conf: gzip, security headers, a year-long immutable cache only for hashed files, and a real proxy_pass for dynamic routes without paths.
The full CLI
nexa build # compila src/pages/**/*.tsx -> dist/
nexa lint # falla si hay avisos, sin escribir dist/
nexa test # dist/ fresco + corre "test" de package.json
nexa dev # recompila en cada request + auto-reloadnexa build/preview/dev/lint/test/add/info — lint fails if there are SEO/package warnings; test compiles (a fresh dist/) and runs the project's test runner.
nexa.toml — full reference
[project]
name = "mi-sitio"
[dependencies]
ui = "0.1.0"
[imports]
stripe = "/vendor/nexa-stripe.js"
[performance]
maxInitialJS = 15000Every section is optional except [project]. None of them require package.json or npm.
@nexa/test
import { mountChunk, getEntry } from "@nexa/test";
const entry = getEntry(manifest, 3);
const activate = (await import(entry.module)).default;
const { el } = mountChunk(activate, `<button>Comprar</button>`);
el.click();For testing an isolated activation chunk, outside a real browser — mountChunk/getEntry/expectEntry against the real manifest.