I co-organise1 a hackathon called ZuriHac that takes place in June every year. Last year when the pandemic hit, we had the choice to cancel the event or hold it online.
We tried to find some guidance on how to organise virtual events, but there wasn't much out there that we could apply. Most of the information was (and still is) geared towards conferences, often with a focus on corporate events.
Hackathons are different enough from conferences that we had to come up with our own approach. Here are some notes on what we learned.
You can jump straight down to the conclusions, but here is some context on the hackathon itself. I think that our learnings might only apply to you if you're trying to achieve similar goals. If you're organising a conference with a lot of talks, or a professional networking-plus-salespitch event, then your choices in structure, technology, and content will look very different.
In a normal year ZuriHac looks as follows:
Apart from just getting people together, we also try to make sure there are a bunch of interesting things to do at ZuriHac. This is what we want to replicate online.
Below is a screenshot of our 2020 schedule. As you can see, there is not a huge amount going on in terms of fixed events.
Which one of these is the most important?
In 2019 we conducted a survey after the event, to which 156 people responded. Amongst other things we asked: "Which aspect of ZuriHac is most important to you?". It was possible to choose multiple options, so the sum total is above 100%.
|Most important aspect of ZuriHac||number of respondents||% of respondents|
|Socializing & community||119||76%|
|The keynotes (talks)||103||66%|
|Hacking together on projects||75||48%|
|The beginner/advanced tracks||53||34%|
The social aspects clearly play a huge role in what makes a hackathon fun and rewarding. Incidentally, this is also the hardest part to move online. How do you provide a space for social interactions in an online setting? You've probably worked from home for a while now, and know what I mean when I say Zoom fatigue and lack of feeling engaged.
As a team of all-volunteer amateurs, we are very cost-effective. But we still rely on sponsors to help finance various things like drinks, coffee machines, BBQ equipment, snacks, t-shirts, scholarships, etc.
Here's the breakdown for the physical event:
But that all concerns the physical event! See below for how we decided to work with companies, in the light of needing much less money for the virtual ZuriHac.
So for the online event we want to:
There are some thing's that we don't need (but you might): Booking/ticket system, schedule software, event planning, marketing & analytics.
We were agnostic on virtual worlds (2D/3D spaces) for hanging out3. I've had superficial experience with Mozilla Hubs, and I've seen Online Town being used here and there. But as cool as the idea is, it's not clear how well this scales to 400 people.
Let me just spoil the outcome and tell you how we addressed the goals above:
On the organizational side, we've always used Google Docs to coordinate everything: budget, sponsorships, email drafts, a full event plan document, surveys, and much more. This was super valuable, and I'm even referring back to those old notes while writing this post.
Discord is great, and it mostly comes from how it combines features that you would otherwise need separate apps for. It's being used as a hub for a huge amount of online communities these days, so I don't really need to bang the advertisement drum.
In the past we've maintained a ZuriHac Slack server. This was great for having topical channels, technical discussions, and a way for participants to ping or find each other. IRC also plays an important part in the Haskell community, so many people hung out there too.
What Discord adds to this is:
None of these are revolutionary, but the UX works well to create a sense of togetherness and to facilitate "finding the action". To give an example, it's extremely easy to join a group of people in a video chat. You just click on the channel, and you'll immediately see the video feed and get audio. At most you'll spend one more click enabling your own video. Compare this to the weird dance that Zoom does whenever you join via a link.
It's also pretty polished and stable. Of course it's not without its small annoyances:
Not much has to be said about YouTube, except oh my god, is the backstage UI for streamers awful. It drove me insane to find any settings in the 2 (or 3?) competing interfaces, even after I had already performed the same action multiple times before. I've gained new respect for YouTube creators, and a small amount of doubt about my own intelligence.
StreamYard7 on the other hand is a godsend, it did exactly what we needed, and it did it in the simplest way possible.
Basically it lets you combine people's video feeds (like on a regular Zoom/Google Meet call), slides, and some framing and logos. That then gets streamed through YouTube. You can see the result below, but please don't judge out sense of aesthetics, we're engineers.
It's worth highlighting another amazing aspect of StreamYard: To invite somebody who has never used the platform, you just send them a link. This means that speakers don't need to create an account, and it's trivially simple for them to start presenting.
One minor sad thing was that it supported only up to 720p resolution, but that's fixed this year, so we can stream and record in glorious 1080p.
Due to the recent drama we will probably be a bit hesitant to recommend this as the default for newcomers. But last year it kind of saved our butts for a mob programming session.
I already mentioned Zoom, but we also tried to use Visual Studio Code with the LiveShare extension for mob programming. This failed hilariously, because with 30 people the syncing between the editors completely glitched out. I'm sure the extension has matured since, but repl.it worked in a pinch!
We also recommended it as the default environment for the beginner's track, and the lessons were structured such that they didn't require any external libraries that are not pre-installed on repl.it.
Not being able to install additional Haskell libraries on repl.it was a major downside, but because they now added nix support, we can theoretically add whatever we want, and even provide participants with fully preconfigured environments!
We looked at a bunch of other options before settling on the above. A common wish was to exclusively use free software/open source solutions. While I sympathise with that, it simply came down to what was available, stable, and could handle hundreds of simultaneous participants, while still being user friendly.
Here are some alternatives that we considered:
I'm not going through the pros and cons of each of these, so just know that we tested them, and they were not a good fit. But maybe they might be great for your event.
Tooling isn't everything, but here are a couple of random things that seemed promising:
Apart from that, there are the aforementioned virtual world spaces that mimick meeting in a physical space:
There are probably more, feel free to let me know of any amazing ones that you've come across.
The software and platforms above do a lot of the heavy lifting, but it's also worth mentioning how we structured the event.
We considered it extremely important to have one central hub, so that it was clear where to start and where most of the action could be found. As I said above, for us this was Discord.
Judging by the repeated questions we got about things that were already on our website, I'd say there almost can't be too much centralisation.
We had a few default channels, and then created new ones by request. There was a big demand for language-specific social channels, topical ones, and of course one for each project.
We also had moderator and organizer specific hidden channels that allowed us to quickly coordinate without having to go through yet another medium.
Just for fun and a sense of scale, here is what our channel list (excluding video/voice) ended up looking like:
General ├─ announcements ├─ beginners ├─ find-a-project ├─ helpdesk ├─ intermediates ├─ introduce-yourself ├─ jobs ├─ organizers ├─ post-anything ├─ shop ├─ talk-discussion └─ welcome Social ├─ aula ├─ barbecue ├─ coffee-machine ├─ lakeside ├─ lakeside-dutch ├─ lakeside-esperanto ├─ lakeside-french ├─ lakeside-german ├─ lakeside-hindi ├─ lakeside-italian ├─ lakeside-russian ├─ lakeside-spanish ├─ lakeside-voice-text ├─ next-to-the-fridge-that-had-the-free-redbull-and-people-drank-litres-of-that-stuff └─ photos-from-last-year-so-you-have-fomo Tracks ├─ advanced ├─ ghc-track-discussion └─ hallway-announce Beginner Track ├─ coordination ├─ links-and-instructions ├─ space-invaders ├─ workgroup-1 ├─ workgroup-2 ├─ workgroup-3 ├─ workgroup-4 └─ workgroup-5 Projects ├─ aeson ├─ apecs ├─ arduino-copilot ├─ ariel ├─ asterius ├─ beseder ├─ cardano ├─ carp ├─ contracts4tshirts ├─ convex-optimization-with-dependent-types ├─ curry ├─ cut-the-crap ├─ dependabot ├─ dhall ├─ disco ├─ distros ├─ fficxx ├─ fido2 ├─ futhark ├─ gadoc ├─ ghc ├─ gingersprinkles ├─ gnunet ├─ grpc-native ├─ haskell-code-spot ├─ haskell-editor-setup ├─ haskell-katas ├─ haskell-types-in-prolog ├─ hasktorch ├─ hatrace ├─ hip ├─ ide ├─ juvix ├─ mission-control ├─ neuron ├─ nix ├─ opaleye ├─ opt-expect ├─ pandoc ├─ pomelo ├─ servant ├─ smos ├─ spago ├─ talloy ├─ tasklite ├─ tcplugins ├─ tsearch ├─ utf8ãƒâ¼ ├─ xmobar └─ zephyr
That's a lot! I think it was quite discoverable, thanks in part to the grouping and the fact that you don't have join channels like you do in Slack.
The important stuff is already described in the StreamYard section above. What's worth mentioning is that we wanted to keep the activity withing Discord, so we held the Q&A session there. The first couple of questions were relayed to the speaker by a moderator, and we even had a bit of an upvote system (via Discord emoji reactions) to surface the best questions.
It turns out that an online event is orders of magnitude cheaper that holding a physical one. This put us in a somewhat embarassing spot, since we have many long-term and very trusting relationships with our sponsors and we're not super keen on amassing a huge war-chest for no reason. Zürich Friends of Haskell is a not-for-profit organisation, and we have about a year's worth of ZuriHac + general expenses in the bank account.
The easy thing to do was just to offer to reimburse all our sponsors, and get back to them next year.
This is where I want to mention a change for 2021 that I'm a bit prouf of. See, here's the thing:
So this year, we decided to have companies on board as partners instead of sponsors. Basically it means that instead of giving us money, they participate in the event, each in their own way. Some companies will hold Q&As and present a little bit about their industry, others will show off some cool technical thing, and others are gracious enough to hold tutorials and workshops.
And because there is no money involved, I feel a little bit less nervous about standardising company participation to give everybody exactly the same exposure and attention.
Some things worth mentioning for completeness' sake:
We had a registration system to control the flow of people a little. Basically this allowed us to send out announcement emails, as well as the Discord invite link. You can definitely do without, but for us the communication is pretty crucial. We often only finalise the schedule very late, so the last announcement email serves as both info about the content, as well as a timely reminder.
We decided to sell t-shirts simply because it turns out people really love and want their yearly t-shirt. Jasper set up a shop, and they were printed and shipped by an external company. This was fun (but see below for our bad experience with PayPal), and we committed to donating the money to a Covid-19 related charity, since we didn't need the money, as mentioned above.
It was great! But that's only the subjective experience of the organisers, so let's dive into some details.
Due to being online, we had a wider reach, and a lot of people could join ZuriHac for the first time without having to buy a plane ticket.
Some of the projects were amazing. I only had time for being a passive observer on a couple, but the level of know-how, diversity of domains, and quality of presentations was really impressive8.
People seemed to have a good time and we received positive feedback.
Q&A sessions after talks are much better! I didn't expect this, but because the questions can be a little async, and the speaker can stick around, the resulting discussion has a lot more depth, and isn't time constrained. Also, questions can be answered by other participants during the talk!
The community was extremely friendly, actively helpful towards newcomers, and just generally very chill. We had zero spam or moderation issues.
Virtual events are much cheaper.
In a lot of aspects they also create less work for the organisers. Not just that, but also somehow less stress and risk. The things that can go wrong IRL might result in people having no food (or worse, no coffee). Online, the worst that can happen is that the content is boring.
We actually managed to pull it off! We didn't have to cancel ZuriHac. Yay!
Gathering online isn't as great as seeing your friends and community in real-life. I'm sure we can make it a little bit better, but honestly it will never be the real thing.
Engagement is extremely hard to figure out. My personal feeling is that activity follows a 80-20 rule.
A small amount of people are participating the most, chatting everywhere, joining projects, impromptu talks, etc. These people are great, because a lot of them also helped out others everywhere, all the time.
A large majority seemed to enjoy themselves in smaller groups, maybe joining a project or chatting to the people they already knew.
Finally, a good amount of people were just lurking, or maybe lost interest after a short while.
I hope that shy people also managed to have some fun and find their little groups or projects. But without spying on everybody, it's kinda hard to know.
It was super hard to figure out how to hold a classroom online! The burden of this fell onto the teachers of the beginner's track, Julie Moroniku and Chris Martin of TypeClasses. They did an amazing job and even prepared a series of videos in advance.
But there was definitely a feeling of herding cats, and I think as organisers we failed to give a clearer structure to the participants. Overall, I think a bunch of people got good value out of it, but I wish it had been more. The physical class in 2018 was also held by Julie and it was insanely full and popular, so we have a high bar to aspire to.
T-shirts: We had a whole PayPal Odyssey that I was luckily less involved in. Of course they blocked our account (what else does PayPal do) after we had sold a couple thousand bucks worth of t-shirts. Solving this took more than half a year, but it's really not worth discussing in detail.
Instructions for participants:
Don't make up new concepts or complicated five step processes for participating in workshops, streams, etc. With a couple of different tools it's already hard enough to sheperd people into the right places at the right time. Our rule of thumb was that if you can't explain it in a sentence, it's too high-maintenance.
Examples from ZuriHac:
I've been to online events that made it super confusing to know how to even participate, and it's very tempting to overdo it with the rules and instructions. But nobody reads them, so keep things simple!
Have a registration system, even when the tickets are free. It's useful to keep track of interest, by seeing how many people intend to attend. It's also great to be able to send people announcements emails.
Definitely send a survey afterwards so that you can gauge how people felt, what was important to them, and how they rate individual aspects. Without this it's really hard to know what worked and what didn't. We failed to do that in 2020 and I hope we can make up for it this year.
Test the setup beforehand. For example we testes the streaming setup with every speaker individually. No issues popped up because StreamYard worked so well, but it bought us some peace of mind.
Have a runbook. We created a Google doc with super dumb instructions of what to do at which time, and who's responsible for it. Again, our event isn't crazy complex, but it's still easy to get lost in a dozen other things, and in the rush I can't always think straight. Having a runbook is good advice even for physical events.
Have a plan
If you've ever organised anything, you're mumbling "well duh" to yourself right now. But we're a bunch of nerds, so having a structured approach to an unforseen event like the pandemic was very helpful. Here's a screenshot of our "Plan B" document:
Here an excerpt is how we took a structured approach to the question "How the hell do we even hold this event online??":
We are solving two separate problems: broadcasting (one presenter, many viewers) and people p2p communicating in groups of various sizes. This will need something that is both video based and text based.
Criteria that we want from a combination of tools:
- Easy to set up multiple rooms.
- Should have good quality, even when scaled to a lot of participants.
- Should help foster some sense of presence / community.
- Has to work on Linux, Windows, and Mac.
Very scientific. But it gave us a lot of clarity, after the initial confusion. It might not be clear from the context, but just canceling the hackathon was the default alternative outcome.
Well, not quite! You can join us at this year's ZuriHac if you've ever had any inclination to learn (or continue practicing) Haskell. We're nice
and we have cookies!
The other organisers are Jasper Van der Jeugt, Prof. Farhad Mehta, and Bieke Hoefkens. In addition to that we rely on a dozen volunteers for the physical event.
I found this cute reddit post from 11 years ago that announces ZuriHac with 70+ people as the "largest Haskell hackathon ever".
This year our friends at digitally induced have built their own Virtual Office, so we'll definitely keep an eye on that one.
It's supported, but it can get glitchy or laggy or generally weird. At least that was our superficial experience before the event, so we didn't want to risk it.
You can have a look at the 2020 videos to see what I mean.
Shout-out to our role-models at !!Con, where I first saw it in use.
You might disagree with something here, but I'm personally keen on getting newcomers into the language, and it's not always productive to require them to jump through hoops to join your community. Maybe get them into IRC and Emacs after you've hooked them on the joy of your language.
I think my favourite was an intro to mission control software!