Database Working
arda.db(name)
Hardware-encrypted key/value stores on the device. Survives power loss, unreadable if the disk walks out of the building.
- put · get · del · keys
- prefix scans and ranges
- bulk writes
- per-store metadata
ArdaPlayer injects a single arda namespace into your page. Everything the device can do lives underneath it as ordinary promise-based JavaScript — no bindings to compile, no native modules to rebuild per board, no shelling out to Python.
Each group is gated by a capability in your package manifest. If you didn't ask for it at build time, it isn't on the object at runtime.
arda.db(name)
Hardware-encrypted key/value stores on the device. Survives power loss, unreadable if the disk walks out of the building.
arda.sync
The only path between the sandboxed page and your server. Durable outbound queue, request/response pulls, delta profiles.
arda.net
Connectivity state, interface details and Wi-Fi management for devices that get moved before anyone tells you.
arda.printer
Receipts, labels and reports on thermal and standard Linux printers, with the cash drawer on the same interface.
arda.camera
Capture stills, scan codes and drive check-in flows without the image ever leaving the device.
arda.face
Local detection and matching for attendance and identity confirmation. On-device by design — no cloud call, no image upload.
arda.gpio
Digital I/O on boards that have it. Buttons, relays, indicators, interlocks and sensors, driven from the same code that draws the screen.
arda.usb
Enumerate attached hardware, classify it and react when something is plugged in or yanked out mid-transaction.
arda.system
Who am I, what am I running on, and how healthy is it — plus the controls an appliance legitimately needs.
arda.storage
Scoped file storage for media, cached assets and generated documents, with quotas so a runaway cache can't fill the disk.
arda.audio
Prompts, chimes and volume control — for queue displays, drive-through screens and accessibility.
arda.app
The application's own lifecycle: configuration pushed from the control plane, update checks and controlled restarts.
Four short excerpts from the kinds of applications ArdaForm exists for. None of them need a build plugin or a native module.
const printer = await arda.printer.default()
await arda.sync.push({ type: 'sale', ...sale })
await printer.receipt({
width: 42,
lines: renderReceipt(sale),
cut: true,
})
await printer.drawer()
await arda.gpio.mode(17, 'out')
await arda.gpio.mode(27, 'in', { pull: 'up' })
arda.gpio.watch(27, { debounce: 40 }, async () => {
await arda.gpio.pulse(17, 400)
await arda.sync.push({ type: 'entry' })
})
const playlist = await arda.sync.get('playlist')
for (const item of playlist.items) {
const file = await arda.storage.read(item.path)
await player.show(file, item.duration)
}
await arda.system.display({ blankAt: '23:00' })
const cam = await arda.camera.open()
const qr = await cam.scanQR({ timeout: 15000 })
const staff = await arda.sync.get('staff', {
badge: qr.text,
})
await arda.sync.push({ type: 'clock-in', id: staff.id })
The same four rules hold across every group, so learning one API teaches you the rest.
No callbacks, no synchronous blocking calls that freeze the paint. await works everywhere.
Rejections are ArdaError objects with a stable code, so you can branch on the failure instead of matching strings.
Every on() and watch() returns a handle you can dispose. Nothing leaks when a screen unmounts.
An undeclared capability is undefined rather than a method that throws — check with arda.can() and degrade cleanly.
Signatures, parameters, return shapes, error codes and worked examples for each group.