Reach beyond
the browser.

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.

01 / Surface

Twelve groups.
One namespace.

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.

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

Sync Working

arda.sync

The only path between the sandboxed page and your server. Durable outbound queue, request/response pulls, delta profiles.

  • push — at-least-once, acknowledged
  • get — request/response with params
  • profiles with delta gating
  • queue depth and last-sync state

Network In progress

arda.net

Connectivity state, interface details and Wi-Fi management for devices that get moved before anyone tells you.

  • status · online/offline events
  • interfaces, MAC and IP details
  • scan and join Wi-Fi networks
  • stored credentials, securely

Printers In progress

arda.printer

Receipts, labels and reports on thermal and standard Linux printers, with the cash drawer on the same interface.

  • discover attached printers
  • receipt and label jobs
  • raw ESC/POS passthrough
  • drawer kick · status

Camera In progress

arda.camera

Capture stills, scan codes and drive check-in flows without the image ever leaving the device.

  • open · capture · stream
  • QR and barcode scanning
  • resolution and quality control
  • multiple attached cameras

Face Planned

arda.face

Local detection and matching for attendance and identity confirmation. On-device by design — no cloud call, no image upload.

  • detect · enrol · match
  • local template store
  • confidence scoring
  • liveness checks

GPIO In progress

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.

  • mode · read · write · toggle
  • watch with debounce
  • pulse and PWM output
  • board pin maps

USB Working

arda.usb

Enumerate attached hardware, classify it and react when something is plugged in or yanked out mid-transaction.

  • list with vendor/product IDs
  • classified device types
  • attach and detach events
  • serial numbers where exposed

System Working

arda.system

Who am I, what am I running on, and how healthy is it — plus the controls an appliance legitimately needs.

  • device ID, version, architecture
  • CPU, memory, disk, uptime
  • restart app · reboot device
  • display brightness · blanking

Storage Working

arda.storage

Scoped file storage for media, cached assets and generated documents, with quotas so a runaway cache can't fill the disk.

  • read · write · list · remove
  • binary and text
  • quota and usage
  • encrypted-at-rest option

Audio Planned

arda.audio

Prompts, chimes and volume control — for queue displays, drive-through screens and accessibility.

  • play · stop · volume
  • output device selection
  • text-to-speech hooks

App Working

arda.app

The application's own lifecycle: configuration pushed from the control plane, update checks and controlled restarts.

  • config from the device group
  • checkUpdate · applyUpdate
  • restart · reload
  • version and channel
02 / In practice

What it looks
like in a real app.

Four short excerpts from the kinds of applications ArdaForm exists for. None of them need a build plugin or a native module.

till.js point of sale
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()
gate.js access control
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' })
})
signage.js digital signage
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' })
checkin.js attendance
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 })
03 / Design rules

Predictable
on purpose.

The same four rules hold across every group, so learning one API teaches you the rest.

Everything is a promise

No callbacks, no synchronous blocking calls that freeze the paint. await works everywhere.

Errors carry a code

Rejections are ArdaError objects with a stable code, so you can branch on the failure instead of matching strings.

Events are unsubscribable

Every on() and watch() returns a handle you can dispose. Nothing leaks when a screen unmounts.

Absent, not broken

An undeclared capability is undefined rather than a method that throws — check with arda.can() and degrade cleanly.

!
API preview The namespace layout is settled, but individual method names and option shapes may still change before the 1.0 release. Anything marked Working is running on deployed hardware today; anything marked In progress or Planned is documented so you can design against it, not so you can ship against it.
Reference

Every method,
documented.

Signatures, parameters, return shapes, error codes and worked examples for each group.