Electron is the dominant framework for shipping cross-platform desktop applications from web code. VS Code is Electron. Slack is Electron. Discord is Electron. Each of them ships a full Chromium browser and a full Node.js runtime with every install. VS Code is 350MB. Slack is 200MB. The application itself is often 10MB. The other 190MB is the runtime tax.
Trojan Horse is the answer to that tax. A native shell — ~500 lines per platform — that embeds the operating system's own WebView engine. WKWebView on macOS and iOS. WebKitGTK on Linux. WebView2 on Windows. Android WebView on Android. Every modern operating system already ships a capable web rendering engine. Trojan Horse uses it. The result is a native application that weighs what the application actually weighs.
"Your machine, your rules. A Fluid Fortune project."
Trojan Horse is a native application wrapper. Write your application in HTML, CSS, and JavaScript — the same code runs on every platform. The wrapper changes. The application does not. The window.spadra.* bridge is injected before the page loads, giving the web application direct access to native OS capabilities that a browser tab cannot touch.
Five platforms are built and working. macOS and iOS in Swift with WKWebView. Linux and Windows in C++17 with WebKitGTK and WebView2 respectively. Android in Kotlin with Android WebView in companion mode. The native code per platform is approximately 500 lines. That is the entire runtime cost.
The bridge is injected into every page before it loads. Web applications detect it with window.spadra?.isNative and fall back gracefully when running in a regular browser. All bridge methods return Promises.
readFile(path), writeFile(path, content), listDir(path), deleteFile(path), mkdir(path). Direct read/write access to the local filesystem from a web application. No Electron. No Node.js. No file system API workarounds.
listPorts(), openSerial(port, baud), writeSerial(data), onSerial(callback). Direct serial port communication with connected hardware — including the LilyGO T-Deck Plus running Pisces Moon OS. A desktop application can talk to the device directly without a backend server or driver installation.
notify(title, body), launchApp(name), setTitle(title), appInfo(), exit(). OS notifications, cross-app launching within the Trojan Horse launcher, window title control.
The default app loaded on startup. Reads apps/*/app.json and renders a tile grid. Click a tile to launch any installed app. The app store that doesn't require Apple's approval.
A native desktop wrapper for claude.ai — because Anthropic doesn't ship a Linux desktop client. Loads claude.ai in WKWebView with persistent login. The wrapper is ~20 lines of app.json configuration. The application is Anthropic's. The wrapper is MIT.
SD card formatter and partition manager for Pisces Moon OS. Creates the dual FAT32 layout with a hidden Ghost Partition accessible to the T-Deck Plus but invisible to consumer operating systems via MBR byte-flip stealth. Uses the serial bridge to communicate directly with the T-Deck Plus over USB. Requires the Python backend for format operations.
Splits large WiGLE-format wardrive CSV files into Smelter-ready chunks. Runs entirely in-browser — no backend required. Supports split by row count, date, session, geographic grid, or filter-only mode. Full deduplication and RSSI filtering pipeline. Companion tool to Spadra Smelter.
Trojan Horse is the deployment layer for the entire Fluid Fortune ecosystem. Every tool in the stack — Punky, Static, Little Soul, Spadra Smelter, the Threat Model Visualizer — is a single HTML file. Every single HTML file becomes a native desktop application through Trojan Horse without changing a line of code. The bridge API provides the filesystem and hardware access that turns a browser tool into a native tool.
The serial port bridge connects directly to the T-Deck Plus running Pisces Moon OS. A Trojan Horse desktop application can read wardrive data from the Ghost Engine in real time, manage the Ghost Partition, push ELF modules to the SD card, and communicate over the LoRa mesh radio — all from a native desktop window, without a server, without a cloud dependency, without a driver installation beyond the USB serial driver the OS already provides.
This is the Clark Beddows Protocol expressed as infrastructure. The compute belongs to the person running it. The hardware belongs to the person who bought it. The software belongs to the person who wrote it. Trojan Horse is what connects all three.
An app is a folder containing an app.json manifest and an index.html file. The manifest specifies the app name, description, icon, version, and accent color. The HTML file is the entire application. Drop the folder into the apps/ directory next to the binary. It appears as a tile in the Home launcher on next launch. No recompilation. No registration. No approval.
URL-type apps — web wrappers like the Claude desktop app — require only a "url" field in the manifest. The wrapper loads the URL in the native WebView with persistent cookies and login state. Any website becomes a native desktop application in one JSON file.
No Electron. No Node.js. No Chromium. No npm. No build pipeline beyond the platform's native compiler. Swift on Apple platforms. g++ or clang++ on Linux and Windows. Gradle on Android. The entire runtime is the operating system's own WebView engine — which ships with the OS and costs nothing in binary size.