index

Orange Horse: Beau's Move

Interactive festival booth that prints every move.

The booth at the festival: a rack of orange 3D-printed horse keychains beside a chessboard with an orange knight, and a receipt printer feeding out an orange receipt.

At a glance

Role
Interaction design, development, fabrication
When
IN BETWEEN festival, Singapore, Aug 2026, 3 days
Stack
React, Vite, IndexedDB, Web Bluetooth, Cloudflare
Outcomes
  • 285 moves over 3 days
  • 18 of 32 NFC keychains sold
  • Selected as 1 of 50 creatives

The brief

The booth had to sell horse keychains and postcards, and get more people to know Orange Horse. It also had to give passers-by a reason to stop: a new kind of interaction, half physical and half digital.

I applied for a booth at IN BETWEEN, a creative festival in Singapore. Beau’s Move is a single shared game of chess: each visitor makes one knight move and inherits the previous visitor’s position.

The idea came from the Orange Horse story: you don’t choose your luck, but you decide what the next stranger walks into. Every move printed a receipt with a fortune to take home. The hardest constraint was time. I had about two weeks from first commit to opening day, and the booth had to run without the venue’s wifi.

Teaching a knight move to a stranger in seconds

A visitor had a few seconds to get both the game and the idea behind it. The booth screen told the Orange Horse story first, then led straight into choosing a move. It highlighted every legal move, because a visitor can’t move the knight back to the square it just came from, so the app did a job the board alone couldn’t. I designed the receipt after luck fortunes, so every move ended with something to keep.

The gameplay changed too. In early versions, the goal was the middle of the board, where moves unlocked more postcard designs. It felt too restrictive, and the booth’s job was to sell merch, so I rebalanced it.

What I didn’t expect was confusion about Orange Horse itself. I had a floor-length banner with a QR code and a custom /booth page to explain it, but people didn’t scan it. They wanted me to tell them. After watching people play on day one, I also made the text bigger and smoothed out the animations.

The cost: the booth worked best with me there to tell the story.

Keeping every move safe, even without wifi

I didn’t rely on the venue’s wifi. The booth app saves each move on the tablet first, in the browser’s own database, as one step, so a crash can’t leave the board and the log out of step. Nothing syncs during the day. Each night I exported the log by hand and merged it on my laptop. The merge keeps every record it has seen, and it stops if two tablets claim the same one, so a bad export can’t wipe a day. Before each night’s update, automatic checks confirmed the moves formed one unbroken game and matched each tablet’s count, and any failure stopped the update. The cost: the public site updated only once a night.

A visitor's hand holding an orange Beau's Move receipt, printed with a dithered image and the details of their move.
A visitor's receipt, with a dithered image and the details of their move.

A browser app instead of a native one

The booth runs as an installable web app (a PWA), built in React and Vite and hosted free on Cloudflare. One online session installs it. After that, it makes no network calls. I chose it over a native app because one build runs on both the Android tablet and the iPad, and a stored setting gives each screen its job. I couldn’t serve it from a laptop on the venue network, because offline caching needs HTTPS. The cost was browser limits. An iPad can clear site data when storage runs low, so the horse-sales iPad, where buyers picked their square and wrote a message, kept a second copy and a recovery screen. A separate public site lets anyone play back the game, move by move.

The live microsite open on its welcome screen: a dithered photo of a stable under the heading "Welcome to the Stable", framed by orange gradients.
The live microsite's welcome screen.

One URL per keychain instead of visitor accounts

I 3D-modelled 32 NFC horse keychains, one for each square a horse could claim. Each tag holds its own link with a long random code, and tapping it opens that buyer’s certificate page. Accounts would have meant sign-ups at a busy booth, just to reach a keepsake. A private link is enough security for that. The cost: each code was tied to a square, so I had to hand over the exact horse the buyer picked and check it against the last four characters on screen. A new page went live only after that night’s update. I also made four postcard designs. Each has its own tag, and tapping one reveals that design on the site.

A grid of 3D renders of the horse piece, one for each square a horse could claim, some in orange and some in grey.
3D renders of the 32 horse keychains, one for each square a horse could claim.
The four postcard designs fanned out, as they appear on the microsite.
The four postcard designs.

The printer on day one

Receipts go to a cheap 58mm thermal printer over Web Bluetooth. Only the Android tablet could print, because iPads don’t support Web Bluetooth.

About thirty receipts into day one, the printer started printing garbage. The picture came out as text, and the fortune never printed. Before the event, I had raised the size of each Bluetooth write from 180 to 512 bytes. That night I set it back, with a note in the code on why it must not change mid-event. I also changed how the app talks to the printer. It now waits for the printer to confirm each piece before sending the next, never retries a slip that failed halfway, and closes the booth until the printer is restarted, so one bad print can’t spill into the next visitor’s receipt. A switch keeps the game running with no printer, and turns itself off overnight. On day two, receipts were too long, about 30cm, so I cut the spacing to bring them to about 20cm.

Everything else on the booth was checked automatically before each night’s update. The printer was the one part only real hardware could test, and it was the last setting I changed. Now hardware settings are fixed before opening, and changes wait until the booth closes.

Outcome

Orange Horse now has a digital space, and the brand lives there. Every move from the festival is still playable on the public site, and each keychain still opens its owner’s certificate page, so every horse sold is a way back in. After the event, the booth page became the site’s homepage, with the final counts and booth photos. The QR codes printed for the booth floor still lead there.

The booth did its other jobs too. Visitors made 285 moves over three days, so people stopped and played. 18 of the 32 NFC keychains sold, and each sale put a buyer’s own page on the site.