Build desktop apps with JavaScript.
Ship them under 5MB.
Go from zero to a running desktop app in under 30 seconds.
npm install -g lightshell
lightshell init my-app
cd my-app
lightshell dev
A native window opens with your app. Edit files — it reloads instantly.
lightshell build
Outputs a native .app (macOS) or AppImage (Linux). That's it.
// Read a file
const data = await lightshell.fs.readFile('./notes.txt')
// Open a native file dialog
const path = await lightshell.dialog.open({
filters: [{ name: 'Text', extensions: ['txt', 'md'] }]
})
// Send a notification
lightshell.notify.send('Saved!', 'Your file has been saved.')
// Get system info
const platform = await lightshell.system.platform() // "darwin"
const arch = await lightshell.system.arch() // "arm64"
Each app was built with lightshell build. Sizes are the final .app bundle.
~2.8MB
Minimal app showing system info cards. Calls lightshell.system APIs to display platform, arch, hostname.
const platform = await lightshell.system.platform()
const arch = await lightshell.system.arch()
const hostname = await lightshell.system.hostname()
~3.2MB
Split-pane editor with live preview. Open/save files via native dialogs. Keyboard shortcuts: Cmd+O, Cmd+S.
const path = await lightshell.dialog.open({
filters: [{ name: 'Markdown', extensions: ['md'] }]
})
const content = await lightshell.fs.readFile(path)
await lightshell.fs.writeFile(path, editor.value)
~3.0MB
Dark-themed dashboard showing system info, directory listings, clipboard copy, and notifications. Live uptime counter.
const entries = await lightshell.fs.readDir(homeDir)
await lightshell.clipboard.write(systemInfo)
lightshell.notify.send('Copied', 'Info copied!')
~2.9MB
RGB sliders with live preview and hex output. Copy to clipboard with one click using native APIs.
const hex = '#6C5CE7'
await lightshell.clipboard.write(hex)
lightshell.notify.send('Copied!', hex)
Try these in the playground — no install needed.
Same app (hello world + file dialog), measured on macOS, Apple M2.
| Framework | You Write | Binary Size | Startup | Memory | Setup Time |
|---|---|---|---|---|---|
| Electron | JS + Node | ~180MB | 1.2s | 120MB | 2 min |
| Tauri | JS + Rust | ~8MB | 0.5s | 45MB | 10 min |
| LightShell | JS only | ~2.8MB | 0.3s | 30MB | 30 sec |
LightShell uses system webviews (WKWebView on macOS, WebKitGTK on Linux) — no bundled browser engine. Electron bundles Chromium. Tauri uses system webviews like LightShell but requires Rust for the backend.
Desktop app development shouldn't require learning Rust, fighting Electron's bloat, or shipping 200MB binaries for a todo app.
LightShell is built on three beliefs:
You write JS, HTML, and CSS. LightShell compiles your code into a native binary that uses the system's built-in webview (WKWebView on macOS, WebKitGTK on Linux). Your app assets are embedded directly in the binary — one file, no dependencies.
Native APIs (file system, dialogs, clipboard, notifications, system tray) are exposed through a clean JavaScript API: window.lightshell.*.
LightShell is MIT licensed. Built by developers who got tired of shipping bloated desktop apps.