TINYJS : des applications de bureau en JavaScript qui tiennent dans 6 Mo
⏱️ Temps de lecture estimé : 4 minutes
📌 TINYJS est un runtime de bureau qui transforme une page web en application native, avec un vrai backend JavaScript, sur macOS, Windows et Linux.
Si vous avez déjà livré une app Electron, vous connaissez le poids. Le même hello world pèse 150 Mo, Chromium embarqué, et vous sortez une release à chaque CVE navigateur. tinyjs part du constat inverse : garder le webview que l’OS fournit déjà — WebKit sur macOS, WebView2 sur Windows, WebKitGTK sur Linux — et lui ajouter un vrai backend JavaScript, pas juste une page.
Ce qui est inhabituel, c’est que ce backend est du JavaScript. Il tourne sur txiki.js, 5,6 Mo : QuickJS plus libuv. Pas de Rust à compiler, pas de seconde langue dans le projet, pas de Node à installer. Le backend reçoit fetch, WebSocket, sqlite, FFI, sockets, processus et système de fichiers, et vous l’écrivez en exportant des fonctions.
Le point que je trouve le plus propre reste l’absence de port réseau. La page et le backend communiquent par RPC sur un socket Unix dans un dossier temporaire privé en 0700. Rien n’écoute, rien ne se collisionne, rien à scanner. tinyjs le dit sans détour dans son tableau comparatif : Neutralino pèse moins encore (3 Mo), mais n’a aucun runtime backend et proxifie l’API native via un websocket localhost — un vrai port, gardé par un token. Electron n’écoute rien non plus, mais emballe son Chromium. Le compromis est explicite : 6 Mo, un seul langage, zéro port.
Et la surface système est l’API, pas une liste de plugins à installer un par un. Menu bar native avec About et Quit, dialogues rendues par AppKit, presse-papiers avec watcher et marqueur pour les gestionnaires de mots de passe, raccourcis globaux, tray, lancement au login, secrets dans le Keychain / Credential Manager / Secret Service, Touch ID et Windows Hello. SQLite est inclus. Il y a même une chaîne DSP : un égaliseur natif sur la sortie de l’app, sous PipeWire sur Linux et via un process tap Core Audio sur macOS, désactivé sur Windows avec un repli pageChain côté Web Audio. Le player amp, dans les exemples, synthétise le MIDI et les modules tracker lui-même, précisément parce qu’un webview ne sait pas les jouer.

En développement, tinyjs dev ouvre la fenêtre avec hot reload : le frontend se remplace dans la fenêtre vivante, le backend redémarre. Le template par défaut n’a aucune dépendance et aucune étape de build, le frontend est servi en file://. Vous pouvez partir sur react-ts, vue-ts, svelte-ts ou solid-ts avec Vite, et le backend TypeScript est bundlé par esbuild. Un détail pour les agents : chaque projet généré embarque un skill file, un SKILL.md de 186 lignes plus six références. C’est rare, et ça change la façon dont un agent écrit dedans.

Je garde une réserve sur la maturité. Le projet a moins de trois mois, 510 étoiles, MIT, code en C. macOS est la plateforme principale et stable ; Windows et Linux sont en beta avec quelques appels non portés — Quick Look, OCR, AppleScript, IA on-device, regroupés sous tiny.macos.* qui rejette ailleurs qu’en direct. Vous ne pouvez pas builder une app Windows depuis votre Mac, il faut une matrice CI. Et le rendu diffère forcément entre les trois plateformes, avec des bords plus nets sous Linux : les codecs média dépendent des plugins GStreamer installés, et le Web Audio grésille sous WebKitGTK.
Reste que le changelog m’a inspiré confiance : la 0.42.3 corrige une injection de commande via un id de fenêtre contenant un retour à la ligne, qui permettait d’exécuter de l’AppleScript en tant que l’utilisateur. Signalée par un tiers, reproduit, corrigé. C’est exactement le genre d’attention que je préfère voir chez un runtime jeune plutôt que son contraire.
- 🪶 ~6 Mo sur les trois plateformes, contre ≥ 150 MB pour Electron
- 🔌 Zéro port réseau : RPC sur socket Unix dans un dossier 0700
- ⚡ Backend JavaScript sur txiki.js, sans Node ni étape de compilation
- 🎛️ Menu bar, dialogues, tray, Keychain et EQ déjà dans l’API
- 🧬 MIT, et chaque projet embarque un skill file pour les agents
Sources





