Making an event management system from scratch

·8 mins

How I built a custom event operations platform for Hack Club, and what broke along the way.

The Problem

Let’s throwback to November 2025, I’m less than a month into my new role as Event Ops Lead at Hack Club. Deven and I were on a call, discussing Airtable naming conventions among other things, and Deven said how he’d love us to use a custom-built system to manage our in-person events. This got my brain spinning — how would I pull something like this off? It’s a massive task, having a system that can effectively, and efficiently manage an in-person event of avg. 60 people where having access to data - and fast - is a must. My teams are confident with Airtable, but can they navigate a custom platform? How do we make the ‘onboarding’ flow seamless for both parents & students? Lots of questions.

Why not just use Fillout?

My philosophy in life for apps like Fillout, or web-based productivity WYSIWYG apps is that the minute you start trying to find shortcuts, or hacks to bend that service to the way your program/service requires it is usually a good sign that you’d be better off making something yourself to cut out the middle-person.

Take Hack Club Hackathons. Previously, we worked with a mishmash of Airtables, and Fillout forms. The process for being an attendee, or heck - a parent, wasn’t straightforward. You’d have to fill out at least one Fillout form, the responses of which would go into an (oftentimes) messy, disorganized Airtable, but it worked. However, as Hack Club continues to grow as an organization, and we start to extend our safeguarding procedures so must the technical infrastructure that runs it.

Attend is a Rails-based event operations platform purpose-built for Hack Club’s in-person events. It handles participant and parent onboarding, digital waiver signing, flight tracking, mobile wallet passes, QR & NFC check-in, and bulk communications (think email, SMS, Slack DMs) from a single interface. Think of it as a custom Airtable where every view, workflow, and integration is designed around running a hackathon for 60-120 teenagers.

On the back of this history, and my thoughts, I set out to build Attend. I’m not great at naming things (see: Submit) - it’s usually “what does this service do?”. One attends an event, so Attend it is. I chose Ruby on Rails for this service, as I wanted to make this database first. All Airtable is is a fancy PostgreSQL web viewer with some well-implemented integrations - I wanted Attend to be that, but custom purpose for in-person events. Ruby on Rails’ email integrations, authentication, and the gems one can use to log/audit changes was also a driving factor.

Attend’s first outing

Attend saw its first outing for Prototype, the hardware hackathon we ran with AMD in late November 2025. By that point, Attend already supported mobile wallet - yes, both Apple & Android - passes, signing waivers directly in the onboarding flow, flight tracking, a fully comprehensive QR-code based check-in system, and did I mention an iOS app? The app is built in React Native, I chose this over a PWA because we needed reliable NFC access and push notifications, neither of which were stable enough through a mobile browser.

On Day 0 of Prototype when participants were beginning to land into San Jose’s two airports, my laptop gave up the ghost and the speakers went dead. Luckily, I’m fortunate enough to live relatively close to an Apple Store - only ~1 hour away by public transport - so I booked a Genius Bar appointment and headed in. As I was leaving the Pret next to the Apple Store I got a call from Dev - Attend had gone down, and check-in was in progress. Scratch that early night. I think I spent about 3 hours sitting in that coffee shop, closing countless Help Scout tickets, responding to Slack threads, triaging Sentry error logs, and trying to delegate as much debugging as possible to Amp Code - Sourcegraph’s answer to Claude Code - so I could focus on helping the on-the-ground operations. Airport Mode, the feature which tracked participant flights as they landed was bugging out - it was a time zone issue as it turns out. I got myself home (eventually) and continued working on fixing the system to be ready for venue check-in the next morning, staying up well after my PST colleagues had turned in for the night.

Prototype post-mortem

I was both gutted, and over the moon - the platform I’d spent about a month developing had finally got its first 100 real users beta testing it, albeit not without an embarrassing day of last-minute bug fixes.

After Prototype had finished and the last participant had checked out, Ian and I sat down and went through all the systems that had failed or errored. Ian rewrote the flight API aggregator to use a new dataset while I re-worked the event waiver flow and structurally changed the parent & teen onboarding process to make it simpler, having learned through Prototype that end-users don’t think in the same way that I do - unfortunately.

Attend in Vienna

Our next big outing was Midnight in January 2026 - Vienna! By that point, flight mode’s time zone problem was a relic of the past, and with the exception of some minor hiccups, I’d say that Attend’s second voyage was a success! The team loved text blasts - they could send out emails, Slack DMs, and texts with one simple message, and the QR Code scanning was a breeze. However… if your WiFi was bad, and you were on the iOS app and you scanned someone in, Attend helpfully gaslit you into thinking the participant had been checked in, however the request had timed out and it didn’t handle this - very handy to find out after you’d scanned in 120 kids into a venue..!

Hack Club as an organization runs at breakneck speed, which usually means we don’t get 100% confirmed participant lists until a few days before the event. This doesn’t sit great with vendors, like hotels, who need accurate rooming lists, for example. Attend tried to fix this with the room allocation feature, which uses a series of conditions to sort participants into pre-defined rooms by age, gender identity, and siblings. Despite my best attempts at some level of organization, Max still had to help me diff two complicated Excel rooming spreadsheets, finding diffs between two very different versions of our attendee list. I was, at the time, dashing between Vienna International Airport and the hotel in a very fetching yellow hi-vis jacket.

Introducing… NFC!

NFC support started as a request from Tongyu. Overglade was printing custom PCB badges, and she wanted to know whether Attend could work with NFC chips. Two and a half days of prototyping, playing with WebSockets, and React Native later, Attend had a viable NFC solution. Both the mobile app (now on Android!) and the website supported reading and writing of NFC badges upon check-in. On the web, this worked through a small local macOS helper app that bridged my hardware NFC reader to the browser via a WebSocket connection.

In doing this NFC research, I briefly explored contactless digital wallet tickets - Apple call it their VAS ticket system. While I did get a demo working, and while it’s super super awesome to play with, the hardware required, and the prohibitively expensive cost of getting certificates to create passes means that unless we figure out a way of bootstrapping both the hardware and software, there’s not a feasible option here.

Campfire Flagship

To the best of my knowledge, Attend got its first proper use of exclusive NFC during Campfire Flagship in Los Angeles, February 2026. A few app revisions post Overglade, and the iOS app was battle-tested and ready, and the team scanned in & wrote over 100 badges - simple laser cut wooden badges with a NTAG123 hand-stuck to the back. From the nightmarish experience of working with QR codes and reflections over Midnight, the NFC chips were a godsend - always being able to quickly boop someone’s lanyard and not have to worry about pulling a PDF up saved so much time.

What’s next?

Attend has a long way to go before I think it’s ready. Maybe it’ll never be ready. At the time of writing, Attend is still closed-source. It will be open-sourced once the codebase is in a state I’m happy putting my name next to. I want the people whose data flows through this system to be able to see exactly how it’s handled, and that’s coming soon.

Update (12/08/2026) - Attend is now open source! It’s accessible at https://github.com/hackclub/attend. Thank you to everyone that supported the development of the program during it’s closed source period, and I look forward to public contributions from here out!

I think from here, for the next few months, it will mostly be bug fixes. I hope that this platform outlives my time at Hack Club, and that it will be taken on by someone who saw the same optimization issues, and shortcomings of block-builder platforms as I did.

Closing

If you haven’t had the chance to use Attend yet, don’t worry! You can sign up for one of the amazing programs we run at Hack Club and get the privilege to attend an in-person event with us across the world.

If you found something interesting here or you want to chat more, my inbox is always open. You can find me at leo@hackclub.com, or @Leo on the Hack Club Slack (if you’re a teen 13-18).