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.
| Count | System | What it covers |
|---|---|---|
| 216 tests, plus a 59-step run | The festival entries portal | Unit 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 tests | The rentals and studio back office | Most 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 checks | Clear to Air | Against 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.