x86-64
Mini PCs, industrial box PCs, repurposed point-of-sale terminals and low-power Celeron/Atom hardware.
amd64WorkingArdaPlayer is the runtime that turns a Linux box into your product. It boots, verifies and decrypts your application package, paints it full screen through WebKit, and hands the page a controlled door into the hardware underneath.
There is no desktop, no window manager to fight and no browser chrome for a customer to poke at. The machine powers on and the application is simply there.
arda.* namespace, scoped to the capabilities the manifest declared.Electron is an excellent way to ship a desktop application to people who own their computers. An appliance in a shop is a different problem, and the trade-offs go the other way.
| Concern | Typical Electron app | ArdaPlayer |
|---|---|---|
| Rendering engine | Private Chromium bundled per application | System WebKit, updated by the distribution |
| Application code | ASAR archive — readable and extractable | Signed, encrypted .arda, decrypted at load |
| Native access | Full Node.js API surface in the main process | Narrow, capability-scoped arda.* bridge |
| Target hardware | Developer and consumer machines | Low-power terminals, panel PCs and ARM boards |
| Window model | Desktop window, menus, multiple windows | One full-screen surface, no chrome, no escape |
| Updates | Per-application updater the user consents to | Fleet-wide, hash-verified, operator-driven |
| Fleet management | Not in scope | Registry, telemetry, console and remote shell built in |
// arda.json — declared at build time
{
"name": "counter-kiosk",
"version": "1.4.0",
"entry": "dist/index.html",
"capabilities": [
"db",
"sync",
"printer",
"usb:read",
"net:status"
],
"kiosk": {
"cursor": false,
"blankAfter": 0
},
"bind": "installation"
}
// Anything not declared simply isn't there
console.log(typeof arda.printer) // 'object'
console.log(typeof arda.gpio) // 'undefined'
// Capability checks are cheap and explicit
if (arda.can('usb:read')) {
const devices = await arda.usb.list()
}
// Errors are typed, not stringly-typed
try {
await arda.printer.receipt(job)
} catch (err) {
if (err.code === 'PRINTER_OFFLINE') {
ui.warn('Check the printer')
}
}
The page has no network stack of its own and no filesystem. Everything it can reach passes through the bridge, and the bridge only exposes what the package's manifest asked for at build time.
That cuts both ways: it limits what a compromised page can do on the device, and it limits what a careless dependency can do to your customer's hardware. A third-party analytics script bundled into your app cannot quietly open a socket, because there is no socket to open.
The same package model targets very different machines. If Linux boots on it and WebKit paints on it, ArdaPlayer is designed to run on it.
Mini PCs, industrial box PCs, repurposed point-of-sale terminals and low-power Celeron/Atom hardware.
amd64WorkingSingle-board computers, panel PCs and embedded modules running a 64-bit Debian-family userland.
arm64In progressThe reference board for GPIO work — Pi 4 and Pi 5 with an official or third-party touchscreen.
rpiIn progressCapacitive and resistive touchscreens, customer-facing second displays, cash drawers and thermal printers.
peripheralsIn progressStorage, synchronisation, networking, printers, cameras, USB devices, GPIO and system control — all from ordinary JavaScript.