Member check-in
A framed tablet on the desk. A USB QR scanner reads the membership app's code, the member list answers in a millisecond from the device's own disk, and the visit is saved whether or not the line is up.
Every one of these is the same problem wearing different hardware: a screen in a place you don't control, doing one job, that has to keep working when the internet doesn't — and that somebody has to be able to fix from two hundred miles away. A bakery chain's branch tablets are the first of them in production.
If it has a screen, a plug and a job to do, it's an ArdaForm device. Each of these is a Raspberry Pi or a small x86 box running ArdaPlayer, drawing a web page straight on the panel, adopted and supported from the portal.
A framed tablet on the desk. A USB QR scanner reads the membership app's code, the member list answers in a millisecond from the device's own disk, and the visit is saved whether or not the line is up.
A rugged tablet on an arm at the end of an aisle. Pick lists arrive already cut to this bay, each scan confirms a line, and a label printer on the network prints the tote label. The bay's CCTV camera plays live in a corner of the same screen.
A small screen by the door, edge-lit by its own state. Bookings sync in from your calendar through the HTTP API; a tap books thirty minutes and pushes it back out. Screen brightness follows the office hours.
A box PC in a steel pillar. The keypad is a USB HID, the card reader and the ticket printer are serial, the tariff is a dataset, and every transaction is queued locally and drained when the 4G is there. Someone can see its screen from the office at 2 am.
A panel PC in a cabinet door, talking to the line's controller over a USB-serial adapter and drawing the gauges in HTML. Readings go up as records; alarms are a dataset the maintenance team edits. An operator can check the screen from anywhere.
A Pi behind a wall screen, headless as far as anybody at the desk is concerned. The counter staff's system writes the queue through the API; the board has it within half a minute; a chime plays through the screen's own speakers.
A Pi in a box on a post, probes on a serial bus, a vent and a pump behind a relay board. Readings push every minute; a page on the box shows them and takes a tap; the same page is the one the grower opens from the portal's device view.
A till is the least forgiving device there is. It has to take money during a broadband outage, print a receipt in under a second, open a drawer, and never show a customer anything but the till. This is the shape ArdaForm was built around.
| Needs | Provided by |
|---|---|
| Works with the line down | Arda.db.dataset · Arda.db.push |
| Thermal receipts, cash drawer | Arda.printers.print — raw ESC/POS |
| Scanners, customer display | Arda.on('barcode') · Arda.serial |
| Money entry without a keyboard | Arda.keyboard — the numeric pad, pos entry |
| Locked to one application | Full screen on the bare display, no desktop underneath |
| Price and menu changes | Datasets, cut per branch, on every till within half a minute |
| Remote support at a busy site | Log capture · screen view · console · SSH |
async function completeSale(sale) {
// Durable — this never waits on the network
const { seq } = await Arda.db.push('sales', sale)
const [printer] = await Arda.printers.list()
if (!printer?.usable) {
return ui.toast('Sale saved — check the printer')
}
// The printer's own language, built by the app
await Arda.printers.print(printer.id, escpos({
width: printer.dots,
lines: renderReceipt(sale, Arda.config.currency ?? 'GBP'),
cut: true,
drawer: true,
}))
}
// Prices changed in the portal? Re-render when the sync lands.
Arda.on('sync', (name) => name === 'catalogue' && render())
// Return to attract mode when nobody is there
let idle
function resetIdle() {
clearTimeout(idle)
idle = setTimeout(() => ui.attractMode(), 90000)
}
document.addEventListener('pointerdown', resetIdle)
// The order goes up; the ticket comes out
const { seq } = await Arda.db.push('orders', basket)
await Arda.printers.print(printer.id, ticket(seq))
// Let an update in only between customers
Arda.on('updateStart', () => {
if (basket.length) Arda.update.pause()
})
// Dim overnight, remembered across reboots
await Arda.screens.set(null, { brightness: 20 }, true)
A kiosk is used by people who have never seen it before and won't read anything. It needs to be fast, obvious, impossible to escape from, and back at its start screen the moment the last person walks away.
Four kinds of team keep arriving at the same problem from different directions.
If you can build a web page, you can build the app — basic HTML and JavaScript is enough. What you don't want to build is the Linux setup, the update mechanism and the support tool, and you don't have to.
You sell hardware with software on it, and every new customer site currently costs you a day of setup and a lifetime of phone calls.
You install and support other people's systems across dozens of locations, and you need one way to see all of them.
You need your application to run on customer-controlled hardware without leaving your source sitting readable on the disk.
Create an account and try it — the free plan needs no card. If something you need is missing, tell us: what people describe genuinely shapes what gets finished first.