Roland
By Roland
January 22, 20268 min read

Over-engineering our own Christmas dinner

TeamWorkshop

At 10KB we close the year with a dinner. We have done that for 13 years. What began as a simple lunch grew into an evening where partners are invited, with a MasterChef at the stove and a tight programme. Last year we played Glittersby, an English-language murder mystery set in the 1920s, while the courses were served. Thirty people around the table, theme dress code, and everyone fully in character. A huge success we talked about for weeks afterwards.

Office styling for the Christmas dinner

It went so well that exactly one year later we wanted to do the same trick again. And as always, when we repeat something, we ask ourselves what can be tighter. The English-language roles from then were entertaining enough, but not everyone found it easy to follow fluent 1920s slang. The plot worked fine, but for our taste it had a bit too little personality of its own. It stayed a touch flat. Ewout and I looked at each other: "I think we can build this ourselves."

So we jumped in at the deep end. As every year, Ewout and I took it on as a surprise for everyone else.

What became possible over the past year

In day-to-day work, AI is standard tooling for us by now. Over the past year you saw things get better month after month: Opus, Nano Banana Pro for images, Cursor with agents. Every month something became feasible that four weeks earlier really could not.

For a murder mystery with 30 participants you easily count 120 unique texts: background stories, motives, what everyone says in each round. Writing that on the side of your normal client work simply does not work, but with today's tools it suddenly felt like a realistic experiment. And the moment it started to move, creativity really took off.

A murder mystery for 30 people needs 120 unique texts. Writing that by hand alongside your normal work will not work.

Early November we started with a concept document. Opus threw several plot directions on the table, from which we chose the line that truly landed, without overly forced twists, and with a storyline that could build smoothly. The theme became the MS Ruby Riviera, a cruise ship floating on the La Dolce Vita style of the 1950s. Sunny, Mediterranean, and a gold-edged dress code.

Then Opus generated all 120 texts, though of course that did not happen without our guidance. We filled the plot with details only people at 10KB understand: the house that one colleague was renovating, a secret marriage of two others, the baby discussion that had been buzzing around the office for a while. No stock character cards, but exaggerations of ourselves.

After that we wanted to test the difficulty. So we had LLMs play the game against themselves. The model got all info from rounds 1 and 2, after which we asked the simple question: "Who is the murderer?" If the answer came up too fast, the hints had been too explicit and we sanded them down.

Screenshots of our MS Ruby Riviera app

"We are not going to print this, are we?"

Everything in markdown, neatly in a git repo, so printing on A4 sheets was no longer an option. Two weeks before the event we started on a Glossary · In briefprogressive web appA progressive web app (PWA) uses modern web technologies to offer an app-like experience. Users can install it from a compatible browser and use additional features supported by their device.Read more (PWA).

Everyone got a personal login, texts unlocked in real time, and Glossary · In briefpush notificationA push notification is a short message an app or website sends to a user's device, even when that app or website is not open.Read more kept everyone on track. For ourselves as game masters we ran a dashboard. We played along as Staff Captain and Hotel Director and covered it with an alibi: we were supposedly in Palermo during the murder.

A few weeks beforehand participants already got their very first notification, an invitation to install the app and immediately view their character, including hints about the dress code.

The app grew fast. It started with reading your character description. To make that screen a bit more fun, we pumped out portrait photos via Nano Banana Pro. Based on real photos of colleagues and their character, everyone got a personal 1950s version of themselves.

Personal texts per round soon followed, more push notifications, a visual timeline, and a floor plan of our office. Eventually we had full puzzles with QR codes and audio clips in them. Feature creep, yes, but entirely deliberate. Because your deadline is a party and your code may go straight in the bin afterwards. Nobody then says "we'll do that in v2." You just build it.

When your deadline is a party and your code may be thrown away afterwards, you do not say "we'll do that in v2". You just build it.

Just to be clear: what we deliver for clients plays at a different level. Glossary · In briefunit testA unit test is an automated test of a small, defined software component, usually isolated from external systems.Read more, Glossary · In briefcode reviewA code review is an assessment of a code change by another developer. They check its behaviour, readability, and maintainability, among other things, before the change is merged.Read more, maintainability, Glossary · In briefsecurity auditA security audit is a structured examination of a digital system's security. The auditor assesses technical measures and processes against agreed requirements and records findings.Read more. This was code with one purpose, and that was 19 December. After that it could go. No edge cases, no Glossary · In briefrefactoringRefactoring changes the internal structure of existing code without changing observable software behaviour. The aim is to make code easier to understand and modify.Read more. Feature creep without a scrap of consequence.

It became an escape room

Halfway through December it flipped. We had texts, we had an app, but that office also has physical places: a storage room, a bar, a reception. What if we wove those into the game?

A storage space turned into a locked captain's cabin, a place you could only enter if as a group you found six QR codes we had hidden around the office. Each code opened a question in the app. The answers stayed hidden in tangible props: AI-generated birth certificates, old sea charts, and yellowed newspaper clippings. With six correct answers we opened the door. Only then.

Inside lay the captain. Murdered. His room, the Captain's Quarters, was packed with hints toward the mysteries still to come. Clues merged into photos together produced a code that unlocked an audio clip, an AI-generated, distorted coast guard emergency call. "The ship... en route to... Malta."

Photo of the Captain's Quarters and escape room puzzles

The office lighting started joining in

Our office is equipped with DMX-controlled lighting. It is usually set for atmosphere. This time we built a puzzle around it with a Node.js controller that constantly polled the Glossary · In briefbackendThe backend is the part of an application that processes data, applies business rules and communicates with other systems on the server. Users usually access it through a frontend or API.Read more. As soon as certain game states occurred, it fired signals to the lamps.

For the Morse puzzle four players each had to scan a different QR code within five seconds, together. It required everyone to be present, so solo play was out. When four unique codes reached the backend within that window, an event fired immediately. The lamps started blinking Morse: the code of the captain's physical diary.

19 December, the day itself

At 14:30 a participant reported that he was ill. Not exactly an extra. His texts were full of clues the other players badly needed to progress in the puzzle.

With a standard off-the-shelf game we would really have had a problem here. Our texts lived in code. An LLM straightened the storyline quickly and the fix was live by 15:02, without any panic involved.

The racing driver was now "ill in his cabin with an infection" and the hints he used to give were redistributed to Rick and Raymond. The plot still held. We pushed it to production and none of the twenty-nine guests noticed anything of the change that half an hour earlier did not even exist.

At 16:21, 39 minutes before doors opened, Ewout and I were looking at the app. Why did we not have a Glossary · In briefuser interfaceA user interface (UI) is the part of a digital system through which a user receives information and operates it. Examples include screens, buttons, forms and voice controls.Read more for notification history? It was not needed. But there was still time and we had a Glossary · In briefdeploymentA deployment is the process of installing and starting a chosen software version in a target environment so it can be tested or used there.Read more pipeline that goes live in minutes. We used a just-tight-enough AI implementation plan, added the notification history, and half an hour later it ran on every phone.

In the kitchen the team from Voertaal Studio was at work, all in ship uniform and busy with the Captain's Dinner menu, meanwhile setting up the amuse table. Shells and a life ring around it, fully on theme.

On a large screen a porthole with a view of the sea was running, complete with a solid clock that showed everyone, including the kitchen, exactly how many minutes remained until the next round. Opus had processed the runbook into a meticulously designed PDF: a minute-by-minute script that steered game masters and kitchen so every course was served in sync with the game.

Photo of our runbook and menu for the Christmas event

Was it worth it?

A PWA with IoT integration, DMX-controlled lighting, and AI-generated audio, all for one dinner. Over-engineered? Absolutely.

This was a pure playground. Vibe coding, you might almost say. Software that only has to work correctly for exactly one day and may then be safely forgotten. No client asking why it is running late. No Glossary · In briefscopeScope defines the boundaries of a project or assignment: which goals, activities and results are included and which are excluded.Read more that constantly has to be defended and no Glossary · In brieftechnical debtTechnical debt is the extra work required because earlier software decisions make later changes harder, slower or riskier.Read more, because nothing later gnaws at your conscience.

We could try things that never would have been possible in client work. Every familiar bottleneck simply fell away: "we need a copywriter", "we have to wait for design".

The code has since been forgotten. The evening has not. How we will top this next year? No idea.

Ewout

Contact person: Ewout

Work together?

Have a software question or a project in mind? Get in touch with Ewout to discuss what you need and how we can help.

CONTACT

Get in touch with us

Have a question or want to discuss your software? Leave your details and we will get back to you soon.