Skip to content

Commit 4980bc1

Browse files
AlexanderWangYwilliamchiiih1divp
authored
New docs for hackathon management. (#332)
* feat: add the existing email routes and handler to the API * docs: add guides for new teams (#331) * docs (hackathon mangagement): add development tips * docs (hackathon management): fix wording, fix formatting, make file name more descript * fix (hackathon mangagement): wording * fix (hackathon mangagement): wording * docs (hackathon management): write guide for major tech services * docs (hackathon management): format, add ending notes * docs (hackathon management): add judging section, format * style: rename --------- Co-authored-by: William Chi <williamc28275311@yahoo.com> Co-authored-by: Phoenix <71522316+h1divp@users.noreply.github.com>
1 parent 87b1438 commit 4980bc1

3 files changed

Lines changed: 261 additions & 0 deletions

File tree

apps/api/internal/api/api.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ func Run() {
133133
hackathon.RegisterRoutes(hackathonHandler, huma.NewGroup(api, "/hackathon"), mw)
134134

135135
emailService := email.NewEmailService(hackathonRepo, userRepo, taskQueueClient, sesClient, r2Client, logger, config)
136+
emailHandler := email.NewHandler(emailService, logger)
137+
email.RegisterRoutes(emailHandler, huma.NewGroup(api, "/email"), mw)
138+
136139
batService := bat.NewBatService(applicationRepo, hackathonRepo, userRepo, batRunsRepo, emailService, txm, taskQueueClient, nil, config, logger)
137140
applicationService := application.NewService(applicationRepo, userRepo, hackathonRepo, txm, r2Client, &config.CoreBuckets, nil, emailService, batService, config, logger)
138141
applicationHandler := application.NewHandler(applicationService, batService, config, logger)

apps/docs/mkdocs.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ nav:
8484
- Docs:
8585
- Overview: docs/index.md
8686
- Installation: docs/installation.md
87+
- Hackathon Management 101:
88+
- Overview: hackathon-management/index.md
8789

8890
extra:
8991
generator: false
Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
SwampHacks has a few major events which the tech team is required to provide
2+
services for.
3+
4+
---
5+
## Pre-applications release
6+
7+
Coming Soon Page
8+
9+
* A landing page will be needed to inform people that SwampHacks will indeed
10+
be happening soon. More importantly however, this page allows us to begin
11+
constructing an email list of people who are interested early on, which we can
12+
send emails to later asking them to apply.
13+
14+
A simple form with an email input will be needed. Make sure to validate
15+
emails appropriately (preferrably on both the front and back end) and return
16+
visible errors to the user.
17+
18+
* Note: you should also try to use last year's emails (participants, people
19+
from the interest list, everyone) in your email list.
20+
21+
## Applications Release
22+
23+
This is when we open the forms for people to start registering for the
24+
hackathon. While MLH gives some basic guidelines for what information should
25+
be included (including the stuff that they specifically need to know), the form
26+
data you include beyond this can help make deciding who to accept easier.
27+
28+
Note that while you are probably wanting as many people to apply as possible,
29+
you only will be letting a certain number of people participate after decisions.
30+
More people signing up means more people will be rejected, and this will
31+
ultimately affect a lot of people's self-perception of skill, career potential,
32+
etc. During XI we tried to keep things as fair as possible by also prioritizing
33+
people in "early-career," as well as their passion for engineering on top of
34+
experience. We will get into this more later, but at the very least, you need
35+
to carefully consider what information will let you make the most informed, fair
36+
decisions later on.
37+
38+
Also, it might be a good idea to get data that allows you to track some
39+
statistics for getting an understanding of what kind of people are applying,
40+
as well as some stuff to compare to for future years. For example, you could
41+
get info on who is applying inside and outside of UF, and who is attempting
42+
to join their first hackathon.
43+
44+
* Data that can show a person's experience
45+
46+
* This is pretty simple. Have them upload their resume. We then stored the
47+
resume in an amazon S3 bucket (using cloudflare r2 as a wrapper), using their
48+
userID as the filename. Files should be able to be replaced, preferably under
49+
the last filename as before. Please make sure that only platform admins (the
50+
people who will be making decisions based off of resumes) and the uploaders are
51+
the only people able to see these resumes. For XI this was implemented with
52+
[pre-signed objects returned from S3]().
53+
# TODO: add link
54+
55+
* Data that can show a person's passion
56+
57+
* This is a bit trickier. We had people answer a couple of essay questions
58+
that we thought would get a good understanding on if people actually like what
59+
they do or are just in it for the money. There's also some benefit in
60+
filtering out people who aren't willing to write something to apply.
61+
A GPT-ed response should (...hopefully) be obvious as well.
62+
63+
* Email compliance laws
64+
65+
* You should also include a check box & togglable setting for
66+
knowing whether or not certain candidates want emails from SwampHacks.
67+
This is to comply with laws that prevent businesses from spamming people.
68+
https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-bu
69+
siness
70+
71+
## Decisions
72+
73+
Decisions happened in XI like this:
74+
75+
1. Have staff individually review each application, and assign each person an experience and passion score on a 1-5 scale
76+
77+
* NOTE NOTE NOTE NOTE NOTE:
78+
79+
* PLEAAASE do not just make a 1-5 button for each one. Instead (say for
80+
Experience) make 1 = "Never programmed before", 3 = "Has had an internship",
81+
4 = "Has had multiple internships", 5 = "Has worked at FAANG or big tech".
82+
This way, *everyone* grading applications have a clear idea of what a 1, 2,
83+
3, 4, and 5 mean, and aren't going to grade people differently. Represent the
84+
values 1-5 internally, but on the UI just show what they mean pls
85+
86+
1. After all applications are done, run an algorithm that turns the raw scores
87+
into a ranked list, where every person is above and below someo else. Take the
88+
first X amount of values you want to hit your admissions quota.
89+
90+
* We also accounted for certain quotas we had to hit, like having 40%
91+
acceptances be people in early career, and 60% of people be from UF. Alex Wala
92+
wrote a [pretty good blog post]() about how we did it.
93+
# TODO: add link
94+
95+
1. Send out acceptance and rejection letters to everyone
96+
97+
1. If there are some rejected people you want part of the hackathon, change
98+
their user's status, and send them an email saying that they're actually
99+
accepted now
100+
101+
* We didn't have a system in place for this, but because there are some
102+
people you are certain you may want accepted or rejected no matter what (perhaps
103+
excluding them from the quota used by the admissions algo too) you should make a
104+
feature for flagging people
105+
106+
1. Now, for all of the accepted people, they will have to click a button to
107+
confirm their attendance. Not everyone will do this, so we need a way to let
108+
some of the rejected people back in. Which leads us to...
109+
110+
## Waitlist
111+
When a person is rejected, they should be able to click a button somewhere that
112+
allows them to join a waitlist. The waitlist might grow a lot and become very
113+
big.
114+
115+
At some point before the event begins, you will need to let people off of the
116+
waitlist, accept them, and allow them to confirm their acceptance just like
117+
before. Again, not everyone who is accepted will confirm.
118+
119+
The way you let people off of the waitlist is up to you. We did it in a
120+
rolling fashion in which, about a couple weeks before the hackathon, we
121+
would let 50 people off of the waitlist every couple of days, with the first
122+
people who signed up for the waitlist being the first people to be let off
123+
(first-come-first-serve). Everyone who had not been confirmed before a cycle was
124+
also automatically added to the back of the waitlist.
125+
126+
Again, when they are accepted, they get an email. As of XI we already have a
127+
system that handles this, but it is your job to test it and make sure that it
128+
works they way you and your team expects it to, and modify things as needed.
129+
130+
## Check-in & Redeemables
131+
### Background
132+
Now it's the day of the event. There are a few people lined up outside of a
133+
door, and many people just drove a long distance to get here. How are you going
134+
to make sure that anyone who hasn't actually signed up and been confirmed isn't
135+
let in?
136+
137+
On top of this, each person is going to get certain things like a t-shirt,
138+
and food throughout the event. We need to make sure we don't give out too many
139+
things and be able to track our inventory. Further, we might also want to know
140+
who attends what workshops, especially ones run by sponsor companies who might
141+
also want to know the specific people who attended. We call each t-shirt, food
142+
item, and workshop a "redeemable". When we check for them, we need to make sure
143+
the line also moves quickly.
144+
145+
For XI we solved this problem with a pretty cool badge system. Essentially,
146+
when you sign in you get a badge with a lanyard that also has a thin NFC
147+
sticker on it. When people got redeemables we scan the nfc sticker (which is
148+
very very quick, quicker than aligning a camera for a QR-code) and our database
149+
automatically updates, subtracting 1 from an item's counter and also updating a
150+
user to say that they received a redeemable.
151+
152+
NFC stickers are quite simple. They are a small circuit with a bit of memory (a
153+
stored unique identifier) that can be accessed by near-field radio. Most modern
154+
smartphones have support for this, but (at the time) API support on the web was
155+
very new, unlike RFID, a similar technology.
156+
157+
Our organizers thought that the RFID stickers looked too bulky, so they
158+
bought the NFC ones instead. Because there is very bad web support for NFC
159+
we had to build out a react native app for the scanning. That is why the
160+
swamphacks/xi-checkin-nfc repository exists.
161+
162+
### Anyways, on to check-in
163+
164+
Since users don't already have something like an NFC tag, QR-codes were our
165+
best option for quickly moving a line of people while having proof that people
166+
have been accepted and confirmed. We had the QR-code show up in the portal, but
167+
we also put them inside of emails sent out several days before the event. This
168+
was done by storing the QR codes as images in S3, and putting their appropriate
169+
links inside the sent emails (if you do this again, please test this
170+
rigorously).
171+
172+
During the check-in line, people would show the QR-code to someone with a phone.
173+
The person would scan the QR-code, verify that the user's name and profile icon
174+
was theirs, be assigned a badge after scanning it, and on they went to hack.
175+
176+
However, there are some edge cases you should know:
177+
178+
* Some people will arrive late
179+
180+
* Have a simple late form people can fill out *before* arriving late, with
181+
their expected time and preferably a Discord/phone number to contact. Make sure
182+
to have someone check them in once they arrive.
183+
184+
* Some people will show up without having submitted an application, and we are
185+
under quota
186+
187+
* Have them register on a form, accept them internally and check them in
188+
if everything looks good.
189+
190+
* Some people will show up still on the waitlist / rejected, and we are under quota
191+
192+
* If using the XI system, get the email associated with their Discord
193+
account, look them up in the database, change their status to accepted, and
194+
check them in. We should have a SQL script that does this btw
195+
196+
## Judging
197+
198+
### Process
199+
200+
The awards are organized like this:
201+
202+
* You will have multiple "tracks" that people submit their projects for
203+
204+
* One general one for everyone, as well as specific ones. The organizers
205+
are going to pick these out, and some can be in line with the hackathon's
206+
theme.
207+
208+
* There will also be smaller awards, like "least vibe-coded" and "best game design".
209+
210+
For the general track, all of the judges will review a list of projects that
211+
they are assigned according to a set scale. Projects should have multiple judges
212+
look at them, and their scores should be combined via some algorithm.
213+
214+
For other tracks, the same process holds. But rather than have all of the judges
215+
reviewing for every track, only the ones with the most relevant experience will
216+
judge for a track.
217+
218+
To this end, in XI we broke up judging into two rounds: one general and one
219+
track round. Judges had to review for both rounds but with the requirements for
220+
general and the specific assigned track in mind, respectively.
221+
222+
How did they input their scores for each project? We used a platform:
223+
224+
---
225+
226+
### Judging platform
227+
It's up to you if you want to make your own judging platform. That can also
228+
be quite an in-depth project though, and hackathon judging is a problem
229+
already solved by a good few repos out there. So for XI we used one called
230+
[hackutd/jury](https://github.com/hackutd/jury?tab=readme-ov-file).
231+
232+
While its ranking system allowed for multiple prize types, its authentication system
233+
was pretty bad. Multiple accounts had to be made for each judge for every prize
234+
that they judged for, and during the second round we also ran into an issue that
235+
prevented us from creating accounts that had to be quickly solved. You might
236+
want to try out a different platform.
237+
238+
We also set it up pretty quickly for XI and weren't able to test it before the
239+
event (yikes!)
240+
241+
Please test your judging platform before everything happens, please.
242+
243+
## After
244+
245+
Congratulations, at this point, the hackathon is over! Yippee! I hope that the
246+
experience is overall something that teaches you a lot and is enjoyable. There
247+
are a lot of moving parts, features, and testing, but you will come out as
248+
a much more experienced engineer as a part of this team, and hopefully have some
249+
stories to tell. A lot of people will have a direct benefit from the services
250+
that the tech team provided, whether they know it or not.
251+
252+
If you want some advice on making sure that all of the major points of this
253+
article goes well, please take a look at "Letter To New Tech Teams" in the main
254+
section of this documentation.
255+
256+
Good Luck Have Fun :)

0 commit comments

Comments
 (0)