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

Build against
it today.

The quickstart takes a project from empty folder to running package. The CLI reference covers every command, flag and exit code.