The official site for hackPHS 2026
From the project folder run
python wsgi.pyThen open http://localhost:3000
Press Ctrl+C in the same terminal to stop the server
index.htmlcontains the page content and accessible markupstyles/contains focused stylesheets for the layout and each visual areascripts/contains the page behavior split by responsibilityassets/contains branding sponsor images and documentswsgi.pyruns the small local development server
Questions about the event can be sent to team@hackphs.tech
Registration and the waitlist are closed. The homepage and FAQ display the closed
status, including when JavaScript is disabled. scripts/registration.js shows the
registration status and waiver reminder after the hero scrolls out of view.
Registered attendees must print, complete, and bring the participant waiver and their ID to check-in. Participants under 18 also need a parent or legal guardian signature. The PDF is an unchanged copy of the organizer's waiver.
The homepage schedule and event details follow the logistics schedule. Elad Hazan's talk is Saturday, 11:30 AM–12:30 PM, per the organizer's correction.
Open /leaderboard.html, also linked in the main navigation. Update scores in
the existing Google Sheet as usual. The site reads only the Sorted Teams tab
(gid 857309), columns A and B, with the headers Teams and Score.
Keep that tab in the desired ranking order. Equal adjacent scores share a rank;
the site does not recalculate totals or sort the raw event scores.
The sheet must remain viewable by anyone with the link. Only share team names
and scores, not private attendee information. Sharing the whole workbook makes
its other tabs public too. For tab-only publishing, publish Sorted Teams as CSV
and replace standingsUrl in scripts/leaderboard-data.js with that published URL.
The page polls every 30 seconds while visible and refreshes when reopened or when Refresh is clicked. Google may cache results briefly. On connection failure, the last successful standings remain visible and are labeled as out of date. An empty sheet shows an awaiting-scores state, not example teams. A team with a blank score waits for a score; zero is a valid score. Formula errors are reported as unavailable updates instead of becoming fake scores.
Event dates remain October 10-11, 2026, as confirmed by the organizers. The linked event guide is maintained separately and still needs its dates corrected.
The website and Python preview do not need Node or npm. If Node is already
available, run the data checks with node --test tests/data.test.mjs.
Browser checks use Playwright and Edge: with the Python preview running and
Playwright available to Node, run node --test tests/browser.test.mjs.
Those checks include the real public sheet connection, mocked score updates and
outages, closed registration and waitlist status, schedule rooms, and phone layouts.
Test teams are browser-only fixtures and are never written to the Google Sheet.
/judging (judging/) is where judges enter rubric scores for calibration, round 1, finals, and track prizes.
Scores go to a Google Sheet through the Apps Script in judging/apps-script.gs; setup steps are at the top of that file.
The deployed web app URL is set in ENDPOINT in judging/judging.js. If it is left empty the page runs in local mode
(scores stay in the browser and can be exported as CSV).