A puzzle-style Git and GitHub orientation. Solve questions in the web UI, generate a submission token, and submit your answers via Pull Request. CI validates your PR automatically.
- Question navigation: the Q buttons at the top switch questions.
- Media: some questions include a video (Watch video) or image (View image) link shown at the top. They open in a new tab.
- Hint Mode: click the small rotating pyramid at the bottom-right of the terminal area to toggle Hint Mode. In Hint Mode, the panel shows a typewriter reveal for Hint and Format. Some questions may provide a Copy value.
- Editing inputs: You can edit your GitHub username and answer any time using the EDIT buttons.
- Generate token: After entering both fields, a token appears under “Hash:”. Use the COPY HASH button in the lower-right to copy it.
Notes on readability and visuals:
- The terminal uses a toned-down CRT/post-processing effect. If WebGL is unavailable, it falls back to 2D.
- Text and glow effects were tuned for clarity; the green theme is softened. Hint Mode flips to a red-on-black theme.
All submissions go under submissions/{your-github-username}/ with a specific filename pattern per question:
- 
File path format: submissions/<username>/<username>_q<N>.txt- Example for user octocatanswering question 3:- submissions/octocat/octocat_q3.txt
 
 
- Example for user 
- 
File contents: a single line with the format <hash>:<nonce>- Example: 2f5a...be9e:ab12cd34
- You generate this from the UI by entering your username and your answer, then copying the token.
 
- Example: 
Important details:
- The PR author username must match the <username>segment in the path. CI uses your PR author login to validate.
- One file per question; submit as many questions as you want in a single PR, following the same pattern.
This repository includes scripts used by CI to validate your PR:
- 
Path validation: tools/validate_pr_paths.py- Ensures every changed file is under submissions/<your-login>/<your-login>_q<N>.txt.
- If any file is outside the pattern or there are zero valid files, the check fails.
 
- Ensures every changed file is under 
- 
Answer verification: tools/verify_answers.py- Reads the PR author (your GitHub login) and your changed files.
- For each submission file, it reads <hash>:<nonce>and matches it against the expected token derived from:- sha256(sha256(username) + sha256(correct_answer) + nonce)
 
- Correct answers are provided to CI via a secret JSON (CORRECT_ANSWERS_JSON).
- If the derived token equals your submitted <hash>, the check passes; otherwise it fails.
 
- 
Commit signature check: tools/check_commit_signatures.py- Fails if a commit is detected as an unwanted bot-generated merge or otherwise flagged.
 
- 
Leaderboard (maintainer utility): tools/leaderboard.py- Tallies question counts per user and gives small bonus for earlier submissions per question. Outputs /tmp/scores.jsonwhen run by maintainers.
 
- Tallies question counts per user and gives small bonus for earlier submissions per question. Outputs 
If a check fails, open the PR “Checks” tab to see which script reported an error and fix your submission (path, username mismatch, or wrong token).
- Double-check that the folder and filename use your exact GitHub login (case-sensitive where needed), e.g., submissions/octocat/octocat_q1.txt.
- Ensure file contents are exactly <hash>:<nonce>on one line with no extra spaces or newlines.
- If the UI shows —for the hash, it means a token hasn’t been generated; make sure both fields are filled and confirm with Enter.
- You can edit your username/answer via the EDIT buttons and regenerate the token at any time.
- Some questions include media links (video/image) at the top—open them for extra context.
- Click around stuff. Maybe you'd find something.
- At the top of the terminal area: Watch video and View image links open in a new tab.
- Can I submit without using the UI token?
- CI requires the token format. If you know your answer is right, still use the UI to produce the correct <hash>:<nonce>pair.
 
- CI requires the token format. If you know your answer is right, still use the UI to produce the correct