-
Notifications
You must be signed in to change notification settings - Fork 2
Conference Tooling
While we organised Heart of Clojure 2024, we put a lot of effort in figuring out tooling and process. Part of that was to make organising this conference easier for oureslves, but more than that we wanted to build a "conference stack" that we could leverage for future events. This is a post-hoc (written two years after the fact) write-up of what we used and built.
Pretalx is an open source CFP app written in Python. We used this to collect talk proposals, and to vote on them. There's a hosted version or you can self-host which we did.
We were very happy with Pretalx. It's just a docker container, you set up postgres/SMTP/cron and a mount for file uploads.
We used it for reviewing and selecting talks, it'll send emails to speakers confirming or rejecting them. It has extra features, like building a schedule, which we did not use.
It has an API, which we made good use of.
We use Ti.to for ticketing. They're an Irish company rooted in the Ruby community. I've met one of their founders, Paul. They're good people. Since the first HoC in 2019 our account has been flagged as a "community" event, meaning we get a reduced ticketing fee. We use Stripe for payment, which also comes with a fee.
Stripe is fine for the vast majority of people. Some Germans will be incredulous that there's no paypal, some Dutch people will ask to pay via IBAN, we accomodated where we could. (Paypal: no, IBAN: ok).
We're very happy about Ti.to. It lets you elegantly handle things like early bird tickets, custom discounts, takes care of VAT, etc. It also has an accessible API, which we made good use of.
It has a check-in app/API where you can check people in based on QR code or ticket code entered manually. We kept it lo-fi and just had a printed list of attendees and a box of premade attendee badges at the entrance.
In the lead-up to HoC 2024 we developed Compass as an attendee companion app. Compass is heavily inspired by the old EuruCamp Activities app. It serves a few different purposes.
In the first place it's a schedule app, attendees can see the talks, workshops, and activities on the schedule. They can sign up for activities, and see how many spots are still available.
Attendees can also create their own activities, this was a big part of the HoC formula. Create space for people to just do stuff together. Go climbing, go shop for presents, do circus stuff, hold a book swap, an emacs user group, etc.
We integrated Compass with both Discord and Ti.to. People would authenticate (log in) using Discord. When they did, we would automatically add their Discord user to the HoC discord. They could then input their Ti.to ticket code, this allowed us to see if they were a regular attendee, a sponsor, on organiser, a volunteer, and assign them roles accordingly in Discord. So e.g. speakers would get access to the speaker lounge channel, sponsors to the sponsor helpdesk, etc.
We used discord for chat, and also for live streaming the talks. Anyone with a valid ticket (regular or online-only) got access to the channel where we streamed the talks.
Apart from Ti.to, Discord is the only commercial/corporate app we depended on. Discord can be a little confusing at first, but it is genuinely good at what it does. The permission system is fine-grained and automatable, which served us well. There are good moderation capabilities built-in. We much prefer it over slack. There's nothing in the open source world that compares.
As in 2019 we used a simple github-pages based site using the Jekyll static site generator. It's just handlebars/moustache style HTML templates, and YAML files (with speakers, sponsors, organisers, hosts, etc.). This made it easy for people to jump in and make changes, including people who aren't necessarily proficient in Clojure, like a designer. To automate e.g. speaker/talk pages it was just a matter of generating YAML files from the Pretalx data.
In 2019 we had the website on the top level domain, and then afterwards moved it to https://2019.heartofclojure.eu. For 2024 we immediately created a subdomain with the year, and made the top-level domain forward, so links wouldn't break in the future.
We had a bunch of things in Google sheets, this was mostly to keep track of people, sponsors, and accomodation. There are a lot of "flags" to track, e.g.
- Has the speaker confirmed that they're attending?
- Have they joined Discord?
- Have they claimed their speaker ticket?
- Have we received their travel receipt?
- Has their travel been refunded?
- Did they buy a ticket before they got accepted as a speaker, and has that been refunded?
- Do they want a double or a twin bed room?
- When are they arriving/departing? How many days of lodging do we pay for them? Which hotel are they in?
For sponsors we started with a long list of potential sponsors/prospects, and kept track of
- Who is contacting them?
- Contact person/email on the sponsor side
- When were they last contacted?
- Status (confirmed, brochure sent, follow-up sent, declined)
- Sponsor tier
Spreadsheets worked relatively well for these things, and gave us a shared source of truth. Other things we tracked in spreadsheets were volunteers, work shifts, accomodation.
In 2019 we used Mailchimp, and then lost our mailing list when we didn't log in for a few years... in 2024 we used the Gaiwan Ghost instance (sort of an open source Substack). We embedded a sign-up form on the conference website.
NAME
bin/hoc —— ✨ Heart of Clojure Command Line Magic ✨
SYNOPSIS
bin/hoc [speakers | site | tito | compass] [<args>...]
DESCRIPTION
You may need a `secrets.edn`, depending on what you are doing, see `secrets.template.edn`.
Configuration through `config.edn`, or for local changes: `config.local.edn`.
SUBCOMMANDS
speakers <list|update-sheet|show-changes|prep-emails|print-csv> Manage speakers
site <render-talks> Manage / update the website
tito <codes|do-email-signups> Ti.to ticketing
compass <export> Utilities related to the compass app
This is in a private repo, but I may try to open up some or all of it. The idea is to have a Clojure repo with utility namespaces connecting it to all the different services we are using, so that a lot of the tedium can easily be automated, and either done ad-hoc from a REPL, or in a reusable way through a CLI app.
One of the most helpful things here is the email template system. Based on the information from Pretalx, and information pulled from Google sheets, we could generate emails to all the speakers, here's a snippet of an email template.
Hi {{first-name}},
Thank you for your submission "{{title}}" to Heart of Clojure! Congratulations, you're in 🎉! We're really excited to have you! You should have received a confirmation email last weekend, but it seems we had some delivery problems. Don't worry, everything you need to know is in this email.
{% if not confirmed? %}
For starters, please confirm your talk, so that we know you have seen this email, and that we can still count on you
- [https://cfp.heartofclojure.eu/heart-of-clojure-2024/me/submissions/{{talk-code}}/confirm](https://cfp.heartofclojure.eu/heart-of-clojure-2024/me/submissions/{{talk-code}}/confirm)
{% endif %}
# 💫 Sharing
If you want to share the good news (say, on social media, in a newsletter, or in online communities you're part of), you can use this link: [{{talk-link}}]({{talk-link}})
This will unfurl to contain a nice image with your face, name, and talk title. (Once it is live, it may not yet be.)
Last but not least, here's a link for a 5% discount, which can be used 10 times. This is for you to share as you like. Send it to 10 friends, post it online, use it however you see fit: [{{discount-link}}]({{discount-link}})
# 📝 Checklist
- [Confirm your submission](https://cfp.heartofclojure.eu/heart-of-clojure-2024/me/submissions/{{talk-code}}/confirm)
{% if not abstract? %}- [Check abstract](https://cfp.heartofclojure.eu/heart-of-clojure-2024/me/submissions/{{talk-code}}/)
{% endif %}{% if not bio? %}- [Check biography](https://cfp.heartofclojure.eu/heart-of-clojure-2024/me/)
{% endif %}{% if not avatar? %}- [Upload avatar](https://cfp.heartofclojure.eu/heart-of-clojure-2024/me/)
{% endif %}- Post to social media (`{{talk-link}}`)
- Share your discount link (`{{discount-link}}`)
- [Register your speaker ticket on Ti.to](https://ti.to/heart-of-clojure/2024/with/speaker)
- [Book travel and upload receipts](https://cfp.heartofclojure.eu/heart-of-clojure-2024/me/)
- [Sign up for Discord](https://discord.gg/9EX2B6AJ7u)This would then create draft emails in FastMail, which I would review, sometimes add a personal note to, and then send. This meant that we had really good and clear communication with speakers, they felt like they were taken care of, and we minimised the amount of "chasing" and checking we had to do for all the little things we needed from them.
We also used this to contact mentors/mentees, and to send several more emails to speakers.
We used this to generate discount codes for sponsors and speakers, to pull out lists of attendees, and to summarise some of the questions people answer in Ti.to, e.g. get everyone who ticked the box saying they want to be on the mailing list, and then add them.
Pretalx was the source of truth for the speakers, from there we would generate site pages, import the sessions into Compass, and also copy some of the speaker info into the speaker google sheet.
We pulled the speaker avatars from Pretalx, resised them for the site, and for sessions with multiple speakers, used some Clojure/Java interop code to combine them into a single image for the session.
Despite all the dedicated tools, a lot of conference organising is just sending and answering emails. From what I remembered we had a few dedicated email accounts like speakers@ / volunteers@, this has the benefit that multiple people can log in to those accounts and see what has been said, or do some of the work of processing incoming email. I think we also had automatic forwarding from those addresses to the main organisers. This means if you send an email from your own account, you can cc e.g. the speakers@ account, so there's a shared log of the commnunication. If you're lucky people will respond with reply-all, so their response is also logged.
We used Dynogee to generate social media images. This is a project by Martin Klepsch, who was a co-organiser of HoC in 2019, so he happily gave us access to this service. You give it a URL with a bunch of parameters (talk title, speakers, type of session, speaker image), and it'll generate a nice image that you can use a social media "unfurl", based on a custom branded template he had set up.
Example Dynogee image:
