In less than 24 hours we had 25+ developers build 10 technical diverse fullstack applications on a Kubernetes cluster running on European cloud STACKIT, integrating via OpenAPI, using a shared AI-prompt for graphic style coherence.

The Conflux fullstackathon recipe

Every year the colleagues of various Conflux brands get together over a weekend to tackle an assignment that involves backend and frontend development in some way or another. Though it’s all in good fun, it has a competitive angle and every year the winning team puts together the assignment for the next year. Last year the fullstackathon involved throwing together IoT-devices and applications to liven up the office and my team won by combining digital displays, LED-strips, motionsensors and an SVG-based office overview to help colleagues determine which meeting room was free without having to walk there first. The fact that my teammate Wilco van Beijnum managed to rewrite the firmware in the motionsensors helped tip the balance in our favor and we were asked to create an assignment for this year.

The theme for 2026

Much too close to the deadline of this year’s fullstackathon, we held a brainstorm session to see what we could come up with. We found several sources of inspiration:

  • We wanted to create a cyberspace, inspired by the way DDS laid out their online services in the 90s

  • Within Conflux we publish a Divotion Tech Radar and a JDriven Tech Radar every half year, in which we identify and discuss technological trends. It would be great if we could have a cyberspace where every individual contribution could use its own tech stack.

  • As can be read in the upcoming JDriven Tech Radar, we do not recommend vibecoding, but decided this event would be an outstanding opportunity to go wild with AI-assisted coding and actually anticipate the dangerous consequences of things breaking.

  • Sovereignty is a major concern in both the political and the digital realm right now. We wanted to give this attention in a lighthearted way.

  • In the spirit of collaboration we decided to forego the competitive element and instead focus on setting a goal that would only be met if everyone would work together. We decided that if this event was fun enough, we wouldn’t need a "winner" to organise next year’s event; enough folks would be inspired to step up to the task.

The resulting recipe for the weekend was as follows:

  • A king would task Conflux with building a digital city. Because I’m into LARP I decided I’d roleplay the king for the occasion. The rest of the team would be the King’s Council and together we’d be present at the fullstackathon event to explain the task at hand and pivot if needed.

  • This digital city would have to be built in a sovereign cloud. We looked around for European cloud providers that support a form of managed Kubernetes. We settled on German cloud provider STACKIT, or commonly referred to as "the Lidl cloud" as it’s founded by Lidl’s parent company Schwarz Group. Because the name Lidl was taken from Ludwig Lidl, we found a name for our king: King Ludwig. And so his city became Ludwighafen.

  • The king would need a castle. We decided that we would build this ourselves, and in doing so develop a means of deploying buildings to Ludwighafen.

  • The King’s Council would suggest services the city needed, and our colleagues would be free to team up and build whatever they chose. This was to be the core challenge of the fullstackathon. It was the first time we went for a cooperative angle for this event, rather than making it a competition.

  • The King would have an unreasonable and authoritarian streak and intentionally be vague and change his mind on requirements, in case the assignment would turn out to be too easy to complete.

  • Regardless of what the teams came up with, it would need a frontend and a backend and would have to be built into a Docker image, uploaded to a container registry and deployed into the Kubernetes cluster we prepared for them. It would also need health-check endpoints. And people would have to supply the king and his council with three images for their piece: one under construction, one finished and one burning.

Ludwighafen example images

The setup

The basics: kubernetes and the means to use it

Our organising team set up accounts in STACKIT and set up a container registry via the STACKIT web portal. Anything any team would construct, they would have to put into a Docker image and upload it there.

We then set up a project fullstackathon and in it, under Runtime → Kubernetes Engine, we created a cluster. Under IAM, we created a custom role for our fullstackathon participants, allowing access to the Container Registry, adding a pod to a namespace and starting it. We weren’t very familiar with the particular access structure so we chose to be very restrictive and add permissions later if needed.

We used infrastructure as code to set up http-routes (using a Gateway API), limit-ranges, resource-quotas, and a service-account. This was all tied to together with Kustomize and its built-in secretGenerator in combination with STACKIT’s Robot Accounts to allow every team’s pod to use the image-puller Service Account to pull the uploaded Docker Image from the Container Registry and effectively deploy and run their application in Ludwighafen.

Keys to the kingdom

Ludwighafen was set up to be a website reachable via (the now defunct) ludwighafen.eu and any city service a team would build would have its own namespace and a corresponding subdomain. To keep a bit of control, we’d create the namespaces when a team indicated what service they were going to build and give them an upload key for it. We built a form for requesting it, where they could upload their visuals too. To ensure the image would fit the plot, we supplied an example AI-prompt for generating images in the right style and size. We added a shell-script for generating namespaces so that we’d be able to get teams going quickly during the fullstackathon.

All any team would have to do besides dockerizing their application and pushing it to the Ludwighafen (STACKIT) Container Registry was to create a deployment.yaml mentioning the namespace, selector, metadata and container image, and call kubectl apply -f deployment.yaml to deploy and activate their application in Ludwighafen.

Central application

We then decided to build the central application, that would visually be the city as well the castle at its center, and technically be charged with checking the availability of the other services in order to show the right image for it in the city map. Once a team requested to build a service and supplied us with the name (for the namespace and subdomain) and the visuals for it, the castle application would show it as under construction. Once the application gave an HTTP 200 OK on an HTTP request to its subdomain, the castle would consider it finished and show the appropriate visual. If after that the service ceased to be 200 OK, it would be rendered on fire and the king would make his concerns known.

The castle application was a Python application with a simple HTML/CSS/JavaScript frontend. And because the proof is in the pudding, we used the mechanisme we were going to unleash on our colleagues as the means to deploy it and make it available.

Ludwighafen without any services

We tested one demo service: it showed up in the alloted plot in the browser, and clicking it opened the frontend at the intended subdomain.

We did run into some snags which we documented and that ended up becoming our tutorial. In the final minutes before the hackathon we decided to deploy that tutorial itself as an HTML page served via an Nginx application that ran at scroll.ludwighafen.eu, styled appropriately in medieval fashion.

Instructions

We were ready for the event.

The hackathon

We kicked off the event with a presentation by me dressed as king, explaining I had heard all about digital sovereignty being a thing. Supposedly all colleagues in attendance were hired by me with the irrational expectation that AI would allow them to build whatever I wanted in less than a weekend. I presented the list of requirements that the royal council had put up for me, which as you would expect was very superficial and lacked important details.

Example services

After mentioning that people could decide for themselves how to form teams, as long as everything got built, and someone on the council remarked that OpenAPI might be useful for integrating services, it was clear for attendants that this was going to be a collaborative effort full of surprises. When I explained the King likes diversity and, having seen the Tech Radars of Conflux, expected as many technologies as possible to be used, people understood the freedom and challenges they faced. And of course there was still the looming threat of the graphics they had to provide for their service being on fire.

As teams formed, they sent ambassadors to the council to claim plots for services and gather requirements. Some caught on early and came up with their own services to implement. The King and his council, being the group that had prepared this fullstackathon, became somewhat of a platform team, correcting access rights, activating STACKIT AI-model serving, and troubleshooting deployment issues.

While IDEs were being set up and tools like k9s were being configured (as included in the instructions), newly-formed teams scattered across the StayOK location where the event took place, drawing up plans on flipovers or using post-its on windows.

Other people preferred diving straight into code, AI-bootstrapping some unknown tech to get some early results to iterate on quickly. Some people focused on fleshing out the idea, while others wanted to figure out how to upload to the STACKIT container registry and deploy a pod in Ludwighafen kubernetes cluster as soon as possible to make sure they had the basics down and would be able to deliver whatever they’d produce later on.

Challenges

During the hackathon, people were surprisingly creative and productive off of a minimal set of requirements. However, not everything went smooth:

  • We had limited the available resources for the cluster, thinking it would force people to be more conscious of their resource usage and collaborate on getting the most of out it. But in reality, it was a detriment to the fun process of building things when people had to wait for over 10 minutes for their images to be uploaded.

  • We had prepared the idea of some chaos engineering to see if people had autohealing and high availability. But deployments took long and there was an abundance of ideas we saw people cramming into their services, so we decided against frustrating that more.

  • We had recommended Codeberg as a code forge. It sufficed, but had an unfortunate outage during the first day of the hackathon.

  • We had explained to people to create accounts on STACKIT so they could upload images and deploy their applications. That process had its hiccups, with STACKIT refusing to send passwords or passwords resets to people, and two developers actually ended up locked out of their accounts.

  • Although the use of AI for vibecoding in new languages and frameworks yielded quick and impressive results, it also plunged teams in technical debt at record speed. Some developers ended up having to wrestle with generated code, rewriting big parts to get desired results.

Especially the constrained resources were a miscalculation. People consequently resorted to more local development first, and as a result one or two teams failed to deploy their latest working application before the end, demonstrating it from their local machine instead. A reminder that proper resource allocation for delivery pipelines and test environments is crucial for timely feedback and the ability to deliver solutions.

The results

At the end of Saturday afternoon every team showed what they had built, and it was glorious. While they had been working and uploading, the city which was always active on a central monitor had been filling up with interesting services.

Ludwighafen filled with services

Developers also quickly learned that if they messed up an application deployment once it had been added, it would lead to a spectacle.

Ludwighafen services on fire

Royal municipal records

The municipal records were a service we had indicated would be crucial. The team that picked this up had dubbed it the Blue Kremlin and went all-in on Big Brother features in a 90s style.

Royal municipal records

It featured registration of civilizans with name, age and the role & permissions they had. It offered an interface for other services to determine permissions (and no other details) for certain features they offered. The Blue Kremlin showed ads in true 90s fashion, and these actually led to other services in the city.

Community hall

In the community hall you could log in as a civilian and create an avatar.

Community hall

It featured multiple rooms to explore, like a neighbourhood cafe that served fresh beers from the brewery, a chatroom where you could request songs for the radiostation to play and a dark room which required a special permission, requested from the Blue Kremlin.

Bank

The bank allowed the creation of accounts for every registered civilian and also interfaced with the Blue Kremlin for checking that that civilian was indeed permitted to do so. Civilizans could make payments and transfer funds to each other and get an overview of their transactions.

Bank

Visually, the bank website had every feature frontend developers have nightmares of, like a bouncing logo with a lensflare, animations and misaligned boxes.

AirDnD

The AirDnD service did not offer a way to rent rooms for guests of Ludwighafen. Instead, it offered cheap uncomfortable dungeons to sleep in, some even featuring a dragon.

AirDnD

There was also the possibility for citizens to put up and rent out their own dungeons to visitors of the city.

Brewery

The brewery was a neat gamified service for brewing bear. You could pick ingredients, set the temperature and choose a fermentation method to end up with unique beers.

Brewery

These beers then went up for sale and became available in the Ludwighafen community hall.

Radiostation

Unfortunately, the radiostation service frontend was not caught on camera, as this was one team that had decided to focus entirely on local development first and ended up not being able to deploy it in time.

Ludwighafen radiostation on fire
Ludwighafen radiostation finished

The radiostation could play songs from Spotify, as requested in the radiostation chat, or via the community hall. Between songs, AI-rendered commercial audiotracks spoke highly of Ludwighafen, its king and the available services.

PortHub

The PortHub was the harbour and shipyard of Ludwighafen. Nothing but a means of uploading videos sharing the wholesome appreciation for hard labour and beautiful ships.

PortHub

Powerplant

The idea behind the powerplant was that it kept an eye on the amount of services in the Ludwighafen cluster and calculated an amount of power needed to run those. If the power demand was too high, it would raise a loud alarm and eventually kill off a random pod. To increase the power, a small game was introduced reminiscent of the dinosaur jumping over cactuses in FireFox, but it instead had a knight jumping over beer barrels, each jump counting towards added power to run the city.

Powerplant

Actually killing off pods is something we implored the team to not implement, for reasons mentioned above.

Palace of Soestdijk

As the hackathon participants hacked, they became thirsty. Every time they ordered drinks, they’d tell the bartender at the hostel a little more about their ideas and efforts. Eventually the bartender, a proud inhabitant of Soest, requested Ludwighafen to feature the Palace of Soestdijk. We were happy to oblige.

Palace of Soestdijk

Arcade hall

At the end of the presentations of the participants of the fullstackathon, the royal council showed that it had also secretly built an arcadehall with a powerful feature. Now that the work was complete and people were about to head home, we felt it was the right time to show we had planned some chaos engineering.

Arcade

The arcade hall allowed you to play Doom. But it was a special version in which level 1 spawned demons that represented all the pods running in the Ludwighafen kubernetes cluster. Any demon shot meant a pod killed. As we demonstrated it and the buildings in the Ludwighafen city map caught fire, it was a testament to the fact that autohealing indeed did work and buildings would go back to being 200 OK.

Ludwighafen torn down

That is, until we shot a demon that was some crucial pod of the kubernetes management plane itself, and everything grinded to a halt.

A fitting end of a successful fullstackathon.

Tech Stack

As said, the King wanted diversity. Here is a list of technologies employed during the 24 hours in which we built Ludwighafen in all its glory.

Platform

  • STACKIT cloud

  • Kubernetes

  • Docker

  • k9s

  • Kustomize

  • Envoy

  • Nginx

IDE

  • JetBrains IntelliJ

  • Cursor

  • VSCode

Backend

  • Kotlin

  • Java

  • Spring Boot

  • Thymeleaf

  • Rust

  • Python

Frontend

  • HTML

  • CSS

  • JavaScript

  • TypeScript

  • Vue

  • HTMX

  • Angular

  • React

AI

  • Big Pickle

  • Kiro

  • Google Gemini

  • Proton Lumo

  • Claude Sonnet

  • OpenCode

Forge

  • Codeberg

  • GitHub

  • BitBucket

The cost

From the start of March, when we set up the STACKIT account, created the fullstackathon project and the container registry and activated the kubernetes engine, through the hackathon itself on the last weekend of March when we created accounts, uploaded application images and pulled in npm and maven dependencies and started all those applications, and generated STACKIT AI-tokens, we burned approximately 250 euros.

Every day afterwards that we kept the entire cluster running we spent another 25 euros.

STACKIT offers hibernation, which means servers running in the kubernetes cluster are turned off, but the cluster itself remains operational along with its persistent volumes and container registry. This reduced the cost to 15 euros a day and allowed us quickly getting everything back up and running in case we wanted to show off Ludwighafen or iterate some more on it.

The aftermath

In the weeks following the fullstackathon, several people were still inspired and continued adding features. The royal municipal records was upgraded with a true Big Brother gridview of the city, showing the location of every logged in citizen. The bank, built in HTMX, received some additional features.

It turns out the concept of Ludwighafen, a place running in the familiar kubernetes but on a totally new cloud, where the sky is the limit as far as technical choices go, was an inspiration for exploring and trying out new technology.

At the time of writing, Ludwighafen has been torn down completely, ready to be reconstructed on a different cloud or on-prem.

shadow-left