Skip to content

About

Entangling Minds. Empowering Romania

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

142 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RoQTeam

Entangling Minds. Empowering Romania

RoQTeam is Romania’s hub for quantum curiosity — a community where scientists, students, and dreamers connect to explore the most fascinating frontier of our time. Through events like BreaQ, we turn the mysteries of quantum physics into moments of clarity, creativity, and collaboration. Whether you’re here to learn, to share, or to shape the future, you’re already part of the quantum story we’re writing together.

Registration form

register.html is the sign-up form for the BreaQ 2026 hackathon and register-conference.html the one for the conference. Both post JSON to a small Google Apps Script (tools/register-backend.gs) that writes a Google Sheet and sends the confirmation email. Until the script is deployed, the page sends people to the Google Form in data-fallback, so nothing is lost.

Switching it on (about five minutes):

  1. Create a Google Sheet, for example "BreaQ 2026 registrations", from the account that should own the data.
  2. In the sheet: Extensions -> Apps Script. Replace the editor content with tools/register-backend.gs. Save.
  3. Deploy -> New deployment -> type "Web app". Execute as: Me. Who has access: Anyone. Deploy and authorise.
  4. Copy the web app URL (it ends in /exec) into both register.html and register-conference.html: data-endpoint="https://script.google.com/macros/s/.../exec".
  5. Fill the form once on the live site: a row appears in the sheet, a confirmation reaches the email you used and a notice reaches registrations@roqteam.ro.

Changing the script later: edit, save, then Deploy -> Manage deployments -> pencil -> Version: New version -> Deploy. The URL does not change.

Notes: two emails go out per registration: the confirmation, and a notice to registrations@roqteam.ro. Google allows 100 a day, on a personal account as on Google for Nonprofits (1,500 on paid Google Workspace). With fewer than 30 left for the day, the notice is left out, so the confirmations keep going, and the "Emails" column says so.

The web app's address is in every form's page, so the script itself guards what anyone can send it:

  • Deadlines: nothing after the deadlines (the hackathon: 18 October; the conference: 5 November). Late registrations come by email.
  • Names: only names that are names, with no links, addresses, digits or symbols, so nobody can put their own words in a confirmation email.
  • The same name with another email: this no longer merges into the row already there. It goes in as a row of its own, marked ⚠ in "Merged" and listed under Problems on the admin page. If it is the same person, merge the two rows by hand.
  • Repeat confirmations: at most one per address and event every 6 hours.
  • A flood of registrations: past 25 registrations in an hour, their emails are held ("emails held" in "Emails", and listed under Problems). Past 60 new ones in an hour, the form is refused. Someone who applies again for the same event, with the same email or with the same name and another email, updates their row instead of adding one: new answers replace the earlier ones, the tracks add up, every email they used is kept ("Email" and "Other emails"), and the "Merged" column logs what changed. The hackathon and the conference each get their own row, told apart by the Attends column. To merge the duplicates already in the sheet, run findDuplicates in the Apps Script editor to see what would be merged, then mergeDuplicates (it copies the tab first). The hidden "website" field and submissions faster than three seconds are treated as bots and dropped silently.

Votes

The five organisers (Andy, Cristi, Alex, Filip, Tudor) grade each hackathon registration from 1 to 10, on the admin page. Once three of you have graded one, the average of the grades makes the decision: 7 or more is accepted, 5 or more the waiting list, below 5 denied. The two lines are ACCEPT_FROM and WAITLIST_FROM in tools/register-backend.gs (the page reads them from there, after a Deploy); changed later, they apply to each registration at its next grade.

  • Who you are. Open the admin page with the shared key (adminKey): it asks which of you is reading, and your grades go in your name. The device remembers it as long as it remembers the key; not Andy? at the top changes it, and Just looking opens the page without grading. Only the five of you have the key, so the page takes your word for it. A personal key (voterKeys in the editor's function list) still works: it grades as its own, without asking.
  • Your letters. Each registration goes to three of you, picked at random for it (a team's members to the same three; DEAL in admin.js changes the draw), so each reads about 90 letters of 150 rather than all of them. Your letters, above the table, says how many wait for you; Start reading shows them one at a time, the letter itself beside the facts (university, status, experience, tracks, team), with no need for the Drive folder. The keys 1 to 9, and 0 for 10, grade it and move on by themselves (or click the grade: edged red, orange or green by where it would put the average); S skips one for later, ← goes back to change a grade. A team's letters come one after another, and every 20 letters it suggests a five-minute pause. A grade can carry a short note for the others ("copied from the web"). The grades there show at once but wait on the page, and go to the sheet together, in one request: when you press Send N grades (at the top, or above the table), at each pause, and when you close the letters. Until then the tab keeps them through a reload; leaving the page asks first, and Lock asks before it forgets them. If the send does not go through, they stay, for Send again.
  • Before you grade, you do not see the others' grades. The tags show who has graded, not what, until you have (or it is decided), so that each of you judges a letter alone. Then you see their grades, their notes and the average.
  • Grading in the table. The table's Grade column has your grade as a list (– takes it back), saved at once; the full view has the ten as buttons. Then a tag for each of you with their grade: green where it would accept, orange for the waiting list, red for denied, grey for graded (before you have), empty for not yet, and under them the decision and the average ("Accepted · average 7.67 of 3"). Click the Grade heading to sort by the average, highest first (one you cannot see yet goes with the ungraded). To grade above the table lists what waits for you, as Your letters does. In the Teams tab, the row above a team grades all its members at once.
  • The sheet. Each grade goes in its own column ("Vote Andy", …: whole numbers from 1 to 10, the sheet refuses anything else), next to "Decision", and each note in "Note Andy", …. The third grade sets the Decision, and every grade after it (a fourth or fifth, if one of the others adds theirs) sets it again by the new average. Taking one back below three makes it undecided again. Typing a grade into the sheet by hand changes no Decision: grade on the admin page.
  • By hand. For the exceptions (someone away, an average just under the line), the full view still has Decide by hand. That decision stays until a grade next changes what the average says. The table marks it "by hand".
  • After an email. A grade that would change the decision of someone already emailed asks first, as a change by hand does.

The names are VOTERS in tools/register-backend.gs. To change a personal key: Project Settings -> Script properties -> delete their VOTE_KEY_<NAME> (for example VOTE_KEY_ANDY), then run voterKeys again; the old key stops working at once.

On their own or in a team

With Quantum AI or Quantum Hacking ticked, the hackathon form asks: On my own, With a team I already have (with the teammates' names) or Put me in a team (the organisers match them with others). The answer goes in the "Team" column (solo, team, match), and the admin page's To match tab lists who asked to be put in a team.

Quantum Hacking became a team challenge after people had registered for it, so one email asks each of them how they want to take part. In the Apps Script editor's function list:

  • previewHackingTeams logs who would get it, with what their form says now. Sends nothing.
  • sendHackingTeamsSample sends you the email (on your own, then with a team), to read first.
  • sendHackingTeams emails every hackathon registration with the Quantum Hacking track, once each, except the denied. The "Emails" column records it. It stops before the day's emails run out (keeping 10 for new registrations until 18 October): run it again the next day for the rest.

The email's button opens team-choice.html (roqteam.ro/team-choice) with the person's own code, the same as their dashboard code (which opens the dashboard only once they are accepted). There they choose, and can come back to change it. The answer replaces "Team" and "Team name and members", "Merged" logs what it replaced, and "Team answered" says when they last answered (the same answer again included). On the admin page, More filters → Team page lists who answered and who was emailed but has not answered yet, and the Team column's tooltip says when. The email asks for the answer, and the teammates' registrations, by Saturday 17 October (HACKING_BY in the script). Paste the current tools/register-backend.gs and deploy a new version before sending, so the page can save the answers.

Someone who came with a team, but whose teammates have no hackathon registration under the names given, gets a reminder: previewTeammatesReminder logs who and which teammates are missing (and which of those registered for the conference only), sendTeammatesReminderSample sends you the email, and sendTeammatesReminder sends it, once each, except the denied, stopping at the day's emails as above. Names are matched however they are written, as under "Teammates written another way" below: check the preview first. The email's button opens the same team page, to correct a name or change the answer, and the email says so plainly for a teammate who no longer takes part: take them off and stay with the others, go on your own, or be put in a team.

Decision emails

Hackathon applicants hear back from the same script, when the organisers choose:

  • The grades fill the "Decision" column of the sheet, and so do Accept, Waitlist and Deny by hand (in the full view, under Decide by hand). Nothing is sent.
  • Teammates written another way. A teammate is found by name among the hackathon registrations, however it is capitalised or ordered, and also when it is written another way: a given name more or less ("David Munteanu" for David-Andrei Munteanu), a typo or a short form ("Alex" for Alexandru), two names without a comma between them, the given names right with the family name in their email, or two words of the name of someone who named the writer back. Ioan and Ioana, Cristian and Cristina, Stan and Stanescu stay two people, and so does a name that fits more than one. The Teams tab says "Named another way: …" for each one matched like that, so you can check it; the decision emails and the teammates reminder go by the same matching.
  • Send decision emails first shows who gets what: how many of each, the teams held back because their registered members are not all decided the same (one accepted and another waitlisted, denied or undecided: no one in that team is emailed until they match), and what to check (a teammate not registered under the name given, a team over 3). Then it sends each person the email for their decision, once, and the "Decision email" column records it. Changing a decision after its email asks first, and the next send emails the new one.
  • It sends the accepted first, then the waiting list, then the denied. If the day's emails run out, those left are the denied, and Send the next day carries on; before sending, it says what goes out today and what waits. While registration is open, it keeps 10 of the day's emails for new registrations; after 18 October it uses them all. With about 150 registrations, the accepted and the waiting list hear on the first day and the rest of the denied on the second.

The same can be done from the Apps Script editor: previewDecisions, sendDecisions, and sendDecisionSamples, which sends you one of each email (personal and team version) to read first. The wording is in decisionEmail_ in tools/register-backend.gs; after changing it, deploy a new version so the admin page's button uses it.

Admin page

admin.html (roqteam.ro/admin) shows the registrations for the organisers: counts, registrations per day, what people answered (status, experience, tracks, T-shirts, universities, dietary needs) and the full list, searchable, with every registration in full, the emails to copy into Bcc and a CSV download. It reads the sheet through the same Apps Script, which answers only to the admin key or an organiser's own key.

Switching it on, once:

  1. Paste the current tools/register-backend.gs into the Apps Script editor and save, then Deploy -> Manage deployments -> pencil -> Version: New version -> Deploy. The URL does not change.
  2. In the editor's function list pick adminKey and press Run: the log shows the key, for the five of you.
  3. Open roqteam.ro/admin, paste the key and say who you are (see Votes). "Remember on this device" keeps the key, and who you are, in that browser; otherwise both are forgotten when the tab closes.

To change the key (someone leaves the team, it was shared too widely): Project Settings -> Script properties -> delete ADMIN_KEY, then run adminKey again. The old key stops working at once.

Filters. Every bar in the breakdowns (You are, Experience, Tracks, University, City, Heard from, …) is a filter: click one to keep only those people, click more to narrow it down (several bars in one breakdown mean any of them; across breakdowns, all of them). The other breakdowns, the per-day chart, the table, Copy emails and the CSV follow, and each filter on shows above the table, one click from off. More filters has the rest: registered between two dates, your grade (high, middle, low), the grades (none yet, some but undecided, with notes), the motivation letter, coming, checked in, put in a team, applied more than once, the confirmation email.

In numbers is the edition for the sponsorship brochure, counts only and never a name: applications, people, universities and cities, applicants per place, registrations over time, who they are (for the applicants, the accepted, those who came, the conference or everyone), the hackathon from application to feedback, how it went (rating, would come again, mentor requests, announcements) and how they found us. Each chart downloads as an SVG (to restyle in Illustrator or Figma) or a PNG; Download every number gives them all in one CSV. For "vs 2025", fill in last year's numbers in LAST_EDITION in assets/js/admin.js. To count registrations by post or channel, share the form with a tag: roqteam.ro/register?utm_source=instagram.

The page keeps the registrations in memory only and drops them on Lock. The "Letter" links open the PDFs in the Drive of the account that owns the script: share the "BreaQ 2026 motivation letters" folder with whoever reviews them.

Team dashboard

teams.html (roqteam.ro/teams) is the page for the hackathon's accepted teams: what is on now and next with the countdown to "Stop coding", the announcements (pinned first, then newest first; the page checks every minute and marks what is new), each challenge's resources, how to submit, the practical details (Wi-Fi, Discord, who to ask) and the schedule. Every time is in Bucharest time.

Only the accepted participants get in. Each has a personal code, which their acceptance email gives with a link that fills it in; the waiting list and the denied never get one. A code opens the dashboard only while that person's Decision is "accepted", so changing it shuts their code out at once, and someone accepted later gets in with the code in their new email. Someone lost the email? Their code is in their full view on the admin page (Registrations, then their name), with "Copy their link"; dashboardCodes in the Apps Script editor logs them all. The organisers open the dashboard with the admin key.

The organisers post from the admin page: Team dashboard at the top, then write, edit, pin or delete. Everything is kept in the "Team dashboard" tab of the same sheet, so rows can also be fixed there by hand.

Switching it on: paste the current tools/register-backend.gs into the Apps Script editor and deploy a new version (as for the admin page), before the decision emails go out, so the acceptance emails carry the link and each person's code. The schedule is in assets/js/schedule.js, shared by the dashboard and the big screen. It is the draft schedule, not yet on breaq-hackathon.html: check it before the event, and keep the two the same once the schedule goes on the hackathon page. Its "Stop coding" is when the hand-in closes, as HANDIN_BY in the script.

The look is the BreaQ 2026 design system (assets/css/team-board.css): the navy ground, gold as the one accent, Raleway 500–800 from assets/fonts (SIL Open Font License, in Raleway-OFL.txt), chamfered chips and fields, the circuit traces and the ghost layer, Lucide icons. mentors.html and team-choice.html still use teams.css.

Each participant also sees what is theirs:

  • Are you coming? Until the event starts. The acceptance email asks for an answer by Wednesday 21 October (CONFIRM_BY in the script and in teams.js). Answers go in the "Coming" column, and the admin page counts them on Teams and Check-in: someone who cannot come frees a place for the waiting list.
  • Your team. Its name, challenge, table, teammates and pitch time, from the admin page's Teams view. There, Make teams from the registrations puts the accepted people who registered together into a team each; New team, Add someone and Put in a team do the rest. Teams are kept in the sheet's "Teams" tab, and who is in which in the "Hackathon team" column. A team's place (1st, 2nd, 3rd in its challenge) goes on the certificates and shows on the dashboard after the awards.
  • Ask a mentor. During the hackathon. A team asks with a line about what it is stuck on and where it sits (one request at a time), sees its place in the line, and sees who is on the way. The mentors work from mentors.html (roqteam.ro/mentors): the requests oldest first, "On my way", "Done" or "Put back". Their link carries the mentor key, which opens the queue and nothing else. Copy it on the admin page (Team dashboard, then Mentors), which can also change the key, or run mentorKey in the editor. Requests are kept in the "Mentor queue" tab.
  • Challenge resources. The teams see them, and the checklist below, from Friday 23 October at 09:00 (PREP_FROM in teams.js), a day to get ready; the organisers always see both, with a note. The Apps Script leaves them out of what it sends the teams until then (BOARD_FROM, which also holds the submission posts until Sunday 00:00), so they are not in the page's data either, for anyone looking in the browser's developer tools.
  • Before you come. A checklist the organisers post like the rest (Checklist, on Team dashboard): what to install, which accounts to make, what to pack. Each item is for every challenge or for one, and each participant ticks them off on their own device.
  • Your team's name. A team of two or more names itself under Your team (the teams made from the registrations are "Team Ana, Mihai and Ioana" until then), and can change it until coding stops; any of them can, and the last one counts. The new name goes everywhere the old one was: the "Teams" tab, the members' "Hackathon team", the mentor queue and the audience votes. Two teams cannot have the same name, and the admin page can still change it (Teams, Edit).
  • Check-in pass. Under Your team, until they are checked in (on the day, at the top): their personal code as a QR code (assets/js/qr.js, made on the page), with the code written under it.
  • Hand-in. Under Submission, which the teams see from Sunday 00:00 (SUBMIT_FROM in teams.js; the organisers always), until coding stops on Sunday at 09:00: the link to the team's code (a repository, or a Colab or Drive link), and optionally the slides, a demo video and a line on what they built. Any of the team hands in, and changes it as often as they like; the last one counts. It goes in the team's row of the "Teams" tab (Repository, Slides, Video, About, Handed in, Handed in by), and the admin page shows it on each team under Teams, for the jury, with a tile for how many have handed in.
  • Audience award. While the organisers have the vote open: each participant checked in at the door votes for one team, not their own, and can change it until it closes. The votes are in the "Audience vote" tab.
  • How was it? From the awards on, a feedback form: 1 to 5, what worked, what to change, would you come again. Answers go in the "Feedback" tab without names. The admin page shows them under After the event.
  • Notifications ("Notify me"). New announcements, a mentor on the way, what starts in 5 minutes, and 15 minutes before coding stops. They work while the dashboard is open, also in a background tab, on laptops and Android. iPhones show web notifications only for sites added to the home screen, so Discord covers them.

Check-in (admin page): Scan passes opens the camera and checks each pass's owner in as soon as it reads it, saying who it was (team, T-shirt, diet), or that they are here already. It works on any phone or laptop with a camera: Chrome reads the passes with its own reader, and Safari (and every browser on an iPhone, which has none) with jsQR, assets/js/vendor/jsqr-1.4.0.js (Apache 2.0, its licence beside it), loaded only there. Without a camera, type the code under the pass, or a name, and press Enter or Check in. The test pass, the code BREAQ-TEST, says the camera reads and checks nobody in. The tiles count who is here, who is not yet and who said they cannot come. The rows of people not here yet carry their phone number.

The door, on a phone (door.html, roqteam.ro/door): the check-in as an app. It opens with the admin key once on the phone; Start scanning puts the camera across the screen with a gold viewfinder, and each pass read checks its owner in at once: a full-screen sheet with their name, team, T-shirt and diet, a buzz and a beep, gone by itself after a moment (Undo if it was the wrong one). Here already, or a code we do not know, it says so. A pass still held up after its sheet is not read twice. Find checks someone in by name, team or code. It keeps the screen on while it scans, counts who is here, and reads the list again every minute, so several phones can work the door. On an iPhone, Share, then Add to Home Screen, and it opens as an app of its own (door-manifest.json, the icons in images/brand).

Big screen (screen.html, roqteam.ro/screen): for the smart board or the laptop on the projector. It opens with its own password, set on the admin page (Team dashboard, Big screen, "Its password": a word of its own, not written anywhere in this repository, which is public) and kept in the SCREEN_KEY script property, never in the code: the password shows the screen and nothing else (the announcements, the mentor queue in numbers, the vote as the teams see it), so the admin key need not go on a shared screen. The admin key opens it too. Changing the password sends an open screen back to asking for it. It changes with the day: the countdown to the opening; then what is on now and next, the countdown to the end of coding, how many teams wait for a mentor, the announcements (one at a time in a card of their own, taking turns every 9 seconds, the newest six, so what comes up always stays on the screen however many there are) and what comes up; the judging and the awards; the audience award's vote count while it is open, then its podium. Full screen (or F) fills the screen, and the cursor hides when the mouse rests. It reads the dashboard every half minute. Every 4 minutes, for 22 seconds, the partners take the screen: the traces draw in from the edges, then the logos rise in out of a blur, tier by tier (gold, silver, bronze, the supporters, the hosts), each tier's chip in its colour, and a gold glint crosses the gold logos now and then, cut to their own shapes; not in the last 10 minutes before coding stops, nor while the audience vote is up. P plays it at once. The logos, for a dark ground, are the design kit's, in images/brand/partners; the tiers and their order are in screen.html.

A live message on the big screen (admin page, Team dashboard, Big screen): a line such as "Food is served: come and eat.", with an optional line under it, goes up over the whole screen within a few seconds (it asks every 6), for 2 to 30 minutes or until Take it down. The buttons above fill in the usual ones (food, the workshop, 15 minutes left, the photo, the awards); Also post it on the team dashboards makes it an announcement there too. It stays in the SCREEN_FLASH script property while it is up, and a partners interlude never covers it. So that a room heads-down in its code looks up, it comes in with a gold band sweeping across the whole screen ("Announcement") and a chime, and the screen's edge lights up gold again every 40 seconds while it stays. An announcement posted on the dashboards while the screen is up comes the same way, for 25 seconds (one posted with a live message is not shown twice), then stays marked New on the side for 10 minutes. Browsers let a page make a sound only once someone has touched it: touch the screen (or press Full screen) once after it opens, and the line at the bottom right stops asking.

Audience award (admin page, Team dashboard): Open the vote at the awards, then Close it and show the result: the podium goes up on the big screen and the winner on every dashboard. Put it back as before hides it all again, and Clear the votes deletes them after a test. The state is the AUDIENCE script property.

Certificates (admin page, After the event): a PDF for each accepted participant checked in at the door, emailed once, made from a Google Slides template with their name, team, challenge and place. Before the first send, pick certificateTemplate in the editor's function list and press Run once. It asks for permission to use Slides, makes a starter template in Drive and logs its link. Restyle it, keeping the {{…}} fields, then use Send me a sample. A copy of each certificate sent is kept in the Drive folder "BreaQ 2026 certificates", and the email links to the feedback form.

About

Entangling Minds. Empowering Romania

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages