A JavaScript backend with full system access, a native WebKit window, and nothing else. No Electron. No bundled Chromium. No HTTP server. No ports.
curl -fsSL https://tinyjs.app/install | sh
Page ⇄ backend RPC over a Unix socket in a private temp dir. Nothing listens, nothing collides, nothing to scan.
Backend runs on txiki.js — files, sockets, processes, FFI, sqlite, fetch, WebSocket.
Frontend edits swap into the live window; backend edits restart the process. No build step in dev.
Real menu bar (About + Quit included), file panels, alert / confirm / prompt — answered by AppKit, not divs.
tinyjs build emits a codesigned, notarization-ready bundle with your icon.
Every project ships a skill file, so coding agents already know the whole API.
tinyjs new myapp cd myapp tinyjs dev # window opens, hot reload tinyjs build # dist/myapp.app, signed
export const api = { hello: async ({ name }) => `hi ${name}`, };
await tiny.api.call('hello', { name }); tiny.menu.set([…]); await tiny.win.openFile();
backend (txiki.js) ◂──▸ launcher (WebKit)
unix socket · line protocol
◂──▸ your page
tiny.api.call / tiny.api.on