How we build.

Nothing here runs on a platform that can change its mind about us. The stack is chosen so a client can be handed their own system, and so the monthly bill doesn't grow teeth.

The stack

One platform, edge to database

Cloudflare Workers for the code, D1 for the data, Turnstile against the bots, R2 when there are files. One bill, one dashboard, one place to look when something breaks.

Static where it can be, dynamic where it must be

Marketing pages are prerendered and free to serve. A Worker is added only when a feature genuinely needs one: a login, a booking, an office. That line is where most of the cost of a website usually hides.

Tested before it meets a customer

The entries portal went live behind 216 automated tests and a 59-step run through the whole entrant journey. The back office behind 108. The broadcast control room behind 60 end-to-end checks against a live agent.

Less data, on purpose

Judges can't see an entrant's contact details, because they don't need them. Streaming credentials never leave the machine they belong to. Test data is wiped before real people arrive, not after.

Yours, not ours

The database, the domain and the deploy sit in the client's name where they should. No lock-in, no hostage data, no platform we have to sign for on your behalf.

What "tested" means here.

Test counts are easy to inflate, so here's what ours actually cover.

CountSystemWhat it covers
216 tests, plus a 59-step runThe festival entries portalUnit tests across the submission rules, the judging maths and the access levels, plus one scripted run that walks the whole journey (sign up, submit, get a reference, be scored, be flagged) against a real database before any deploy.
108 testsThe rentals and studio back officeMost of them on the one thing that must never fail: two businesses reaching for the same camera. The clash has to be refused from both sides, and it has to say who's holding the gear.
60 end-to-end checksClear to AirAgainst a live agent rather than a mock, because a scoreboard that's right in a test and wrong on air is worth nothing.

Less data, on purpose.

South African privacy law asks you to collect only what you need and keep it only as long as you need it. That's easier to honour if it's built in from the first migration rather than bolted on before an audit.

Judges see the work

A judge scoring an entry can't see the entrant's phone number, date of birth, guardian details or their other entries. Not hidden by a setting. Not sent to that screen at all.

Credentials stay put

In the broadcast control room, the streaming keys and tokens never leave the machine the rig runs on, even when a producer joins from another city.

Test data goes first

Every system gets a go-live wipe with a backup taken first, so the first real entrant isn't sharing a table with a fake one called Test Test.

In the client's name

The database, the domain and the deploy belong to the business, not to us. If you want to take it elsewhere, there's nothing to unpick.

Tell us what has to work.

The useful first message isn't a brief. It's the thing that keeps going wrong: the double booking, the entries arriving by email, the spreadsheet three people are editing at once. Start there.