HAMMERWARS 2025: a postmortem
published March 21, 2026 in programming, icpc, hammerwars
I hosted HammerWars 2025 last November, Purdue’s biggest programming contest with 100+ participants from Purdue WL, Indy and UIUC and I’ve been thinking about recording the process long before the event. I think it’s fair to say this is my highest-impact work to date, and this post could be helpful for organizers in similar straits. It’s also for my own reflection.
Though I take responsibility for almost all the planning, this event wouldn’t have happened without Brijesh Patel, Mikah Kainen, Peter Jin, Munir Kudrati-Plummer, Aaryan Prakash, Arvind Ramaswami, Matthew Li and the members of the CPU.
Prologue
For a long time, I had zero social life. Throughout high school, I had nobody I was close enough to to meet outside of school. Being the withdrawn nerd I was, instead of actively trying to make friends, I wanted to start a CS club. That never happened.
The CS club that never existed.
Yet, there was still a shining highlight which solidified as my best high school memory: attending CHMMC. More than the actual mathematical content, I recall the incredible ambience: the bright building and cheerful atmosphere during the team competition, exploring campus with acquaintances during the scavenger hunt, discussing the results outside the Beckman auditorium.
Maybe this is how much fun people have at parties? I would not know. From my limited perspective, academic competitions perfectly balance the purpose of an addictive video game, the social environment of a party and the dopamine hits from solving hard problems.
I fantasized about being able to host an event at a comparable scale my freshman year. I joined the CPU and basically took it over, becoming president for the next two years. In the spring of my sophomore year, I organized
HammerWars 2024
For context, HammerWars is a Purdue tradition stretching back to 2022, when it was established by our ICPC team du jour in collaboration with Purdue Hackers. Back then, it was extravagant: $5k from AWS and Deloitte, sponsorship booths, 100+ attendees, multiple divisions.
That success would be impossible to replicate with the mere $2k in our club account, but I stretched it: e.g. a bag of 200 rubber ducks is sub-$30 and helps everyone debug. But with a plummet in participation, I could handle shirts, pizza and prizes.
It was not exceptional. We only had ~45 participants, and nobody got to the last few problems. During the contest, I discovered my garbage code for the custom scoreboard had gone untested, letting me enjoy a wonderful live-coding session alongside the contestants.
Fall 2025
It was my last semester at Purdue, and I resolved to do something with it; I would live to regret anything less. After competing in ICPC NAC/WF 2025 for Purdue and seeing the sheer immensity of what a programming competition could be, I knew I wanted to achieve something with a similar production value on a comparatively shoestring budget. With these constraints, I couldn’t make something as impressive, but my contest would be far more accessible: unlike ICPC finals, everyone who registered in time could participate without merit-based barriers.
Onwards! I spend months writing and preparing the problems, website, etc in parallel. I spam sponsors until they’re forced to stop ghosting me. And slowly, everything falls apart. Of course, I put plenty of effort into preparing the main fare, i.e. the contest problems. With the exception of Coloring Book, these were alright and you can see them for yourself here (download the PDF statements). But I tried to innovate further.
Sponsors and budget
I delayed the event from Oct. 26 to Nov. 16 because I couldn’t find sponsors for our original $5k budget, which included prize money. Once I realized we were only going to get HRT and Roblox, I nuked the prizes. After all, we knew they would only go to our neighbors at UIUC. The final spend was about $3872.
I wonder how prospective sponsors viewed us: as unproven, unreliable, unpopular, probably-embezzling scum of the earth, or merely a bad investment compared to MIT(^2)? Why didn’t (every quant company except HRT) bother to kick approx. 0.000000% of their funds to our student activities? Are they too preoccupied donating their profits to charity? How could you refuse, especially with our epic trailer?
I emailed all the companies you would think are inclined to sponsor contests, first through official channels, then by finding random employees (preferably Purdue alum) via LinkedIn and hunter.io until they explicitly rejected me. I hope our club isn’t blocked from any institutions.

Spending the money was another issue. I wanted to give our SAO and BOSO enough time to approve the APF, but when it was a week until the event, I just spent the money myself and requested the funds via PayPal (what are you going to do now, expel me?) SAO finally approved by APF the Friday before the event, because apparently they like to wait until the business day before the event. We technically weren’t even supposed to advertise the event until the APF was approved, which is ridiculous.
These delays broke everything. Without time, my plans were absolutely screwed. For one, let’s talk about the
Shirts
Like HammerWars 2024, I thought personalized shirts were a neat gimmick, and I botted Printful to order them on a Bella + Canvas 3001 base in bulk for a sweet discount on top of my student discount. I don’t have any experience with pedestrian solutions like CustomInk, but I think this is a good option. It’s not screen printing, but my DTG shirts have lasted decently long.

I wrote the shirt generator and embedded a low-res version on the website. One of the trickiest parts was dealing with alpha, since you aren’t supposed to print anything transparent. My lame first attempt was to threshold it, but this ended up in a few glitchy areas.

After a terrible test print, I instead deleted any mention of antialiasing from skia-canvas and rebuilt the Rust bindings to great success.
Another failure point was letting teams upload logos for their shirts. I added an AI image generator for novelty, which had the side effect of rendering most of the “logos” AI-generated. In fact, the garbage gpt-image-1 model would reliably name the contest after the team. I forgot to instruct it to create logos with bright backgrounds, so they would frequently clip to black / transparent.
Whatever. It sounds good enough to ship. And ship they did. But due to purchasing only the week before, they were delivered the day after the contest.

Well, that sucks.
Solve cubes
Giving balloons to teams on each solve is a hallmark ICPC tradition. But helium is too damn expensive, so we shot down balloons early. Air-filled balloons seemed depressing. What else, other than to laser-cut LED-lit cubes for each problem?
Instead of using an intuitive CAD like a typical Purdue engineer, I used jscad, an OpenSCAD imitation in JS/TS, to design the interlocking glue-free faces. Then, I tiled the faces with my design and a bunch of subtle squares which cleanly cross the faces. After a metric ton of trial and error, I got the top piece of the cube at just the right tolerance where it snaps into place, but is still easily removable to turn on/off the light inside (a cheap $1 adhesive SMT LED module with a switch from Amazon). It was peak art.

Success? You’d think so. But after spending ∞ time refining the design, it was only a week until the contest and Bechtel’s laser cutter is completely booked. As a result, I only partially cut cubes for the easy problems (where I allocated 90% of the cubes) which were not distributed and only finished the full set for the last 3 problems.
Desperation.
Scoreboard and resolver
My scoreboard was ok this time! It took a couple days, but my CPU-intensive scoreboard is way cooler than ICPC’s. It autoscrolls to active submissions, has hyperactive solve animations, tracks the judge queue, the works. I also wrote a view for post-contest submissions and team statistics. These displayed the actual code from the shortest/longest/fastest/slowest submissions plus a timeline of verdicts for problems and teams, and gave a glimpse into other teams’ (pre-freeze) solutions during dinner.
After seeing my crazy setup (imagine using Google Slides), zhtluo asked me if I vibecoded everything. This made me kind of sad. I wrote all this by hand because I love the process, and while my code isn’t maintainable in the slightest, I think it’s more concise than letting Claude roam free. It’s deeply satisfying to make these visuals, and I’m not sure I could even try to approach pixel perfection with coarse prompts as inputs to the system.
Madness
I didn’t mention the trophies because they didn’t work. It was very, very late the night before the contest and my friend’s friend just happened to have a desktop laser cutter. It was too weak to make serious progress on the cubes, but it was good enough to engrave the trophies. We hot-glued the poorly-soldered electronics on the back, flashed WLED, and powered them on. They were gorgeous infinity mirrors sandwiched in a tasteful wooden shadow box. Alas, I did not realize the power requirements. While the voltage was approximately correct, the puny 3xAA batteries drained too quickly and I deemed the result unacceptable to send to UIUC.
Everything was so far fallen that I opened the competition with a literal disclaimer that they would not receive any of the aforementioned goods, and that the “worst was to come.” I spoke the truth. I planned to visit the Lawson CS building much earlier in the morning and test the entire setup, which would have saved us later, but instead I wasted the all nighter on the nonfunctional trophies.
Once I got to the building, I found out that there was one less CS lab than I thought would be imaged, so we converted late arrivals and small teams into unofficial participants. That was pretty depressing.
Opening presentation
After the opening ceremony, I went to enter the teams into the machines, which should have been very fast: just enter the team id. This wasn’t working due to an outrageous auth error, so I redeployed the server without any authentication. We finished well after the practice contest should have started, and lunch was already underway. During lunch, we held a duel against UIUC, which was pretty epic for them and very reminiscent of football for us (they won 3-2).
When teams later tried to log in to DOMJudge, my fancy autologin script failed to retrieve the correct credentials. I pushed an update hardcoding the passwords for each team, and we were off to the races… an hour after the scheduled start.
Obviously, I should have tested these things ahead of time. And I did. Extensively. On an ICPC-based image in the same VPS datacenter where the server was hosted. But all the lab machines were only imaged for a few days, and I decided to take the risky bet that things would behave similarly or that I could hot-patch bugs quickly. However, something network-related was clearly misbehaving on the school network and by Monday, the machines were back to normal, so I couldn’t properly diagnose the issue (and this isn’t a real postmortem). I think if I spent the night testing the system instead of assembling the trophies, the critical issues would not have occurred. The damage wasn’t that bad: the practice contest and extra hour were used for the duel and a heavily extended Roblox propaganda session.

Epilogue
Some would say it was a success. They would look at my pain, tell me it was all good, everyone had fun, since how could they not? It’s literally free food, free plushies, good vibes. Nobody was barred from solving the problems or forced to go hungry. There was even an afterparty, with homemade “boba” (EHS can sue me.)
But this event strayed so far from what I wanted. For many months, I envisioned everything going smoothly, each piece falling into place. For me, every little mistake wasn’t a dissonant note: it was a needle into my skull. After so much trephination, I basically died inside. I wanted to grow this thing, show how it could scale, but instead I’ve offered a counterexample of a contest bloated with features yet somehow missing the core experience.
I’ve already mentioned what needed to change: time. Just a couple more weeks with sponsors and budget finalized, registration open, and a fixed date would have remedied all these issues. I knew I would be cutting it close but I also held out hope. My friends wonder why I didn’t have more help organizing, since e.g. our competitor BoilerMake apparently has entire teams on development, marketing, etc. I don’t think their setup is necessarily more effective because I had tons of free time and couldn’t expect other people to adopt my fanaticism for this contest.
I want programming contests to be shiny and alluring, in a vain, self-centered way. So many things have grown metastatically with GDP, while these student club-run programming contests haven’t really expanded in the same way as CTFs and hackathons, which are swimming in cash. I want the cinematic grandiosity of an ICPC opening ceremony right outside my Purdue dorm and available to every student. If I just ramped up the production value, made that day extraordinary, I might even get the ignorant mass of CS majors hooked on competitive programming for life. I was ambitious. I knew that a full day of 100+ people’s lives held so much potential and I didn’t want to waste it.
At first, the opportunities were endless, and now, they are all gone.
Like my memories of CHMMC, I wanted my event to be unforgettable. I think contests have a special affinity for this because compared to what our ancestors experienced, living today means reconciling an infinity of harsh conflicts: with competing companies, overlapping technologies, integrations and low-value propositions, the constant noise, life sometimes feels like a clash of variations on the same theme. Contests (and social problem-solving in general) are a healthy form of escapism, a reversion to simpler times: a tight-knit community of thinkers, clear goals, friendly competition. Despite devouring movie after show after movie, nothing feels as real as this, and I’m waiting for it to happen again.
HammerWars 2026? Not this semester, but it’s coming.