# Geoguessr Self-Hosted Reimplementation ## Back End ``` API Endpoints GET / Returns { "version": string } POST /name Accepts { "name": string, "secret": string } Returns 400 vs 204, sets session cookie GET /valid-session Returns { "valid": boolean } PUT /game Requires session cookie Accepts { "timer": number } Returns { "gameId": string } GET /game/{ID} Returns { "game_id": string, "creator": string, "timer": number, "coords": { "1": { "lat": number, "lng": number, }, ... }, "players": [ { "name": string, "currentRound": string || null, "totalScore": number, "guesses": { "1": { "lat": number, "lng": number, "score": number }, ... } }, ... ] } POST /game/{ID}/join Requires session cookie Returns 201 vs 401 GET /game/{ID}/guesses Requires session cookie Returns { "currentRound": string || null, "guesses": { "1": { "lat": number, "lng": number, "score": number }, ... } } POST /game/{ID}/guesses/{round} Requires session cookie Accepts { "lat": number, "lng": number } Returns 400 vs 201 and { "score": number } ``` ## Front End ``` - Render streetview pano - Render map for guessing - On click, place and track marker for guess - Render control pane - Submit button - Timer - Round counter - Current scores - Fetch /game/{ID}, extract coords and timer length - Main Loop - Fetch /game/{ID}/guesses/{name}, update scores and round - if round comes back null, redirect to /summary/{ID} - Extract current coord - Clear map markers - Zoom out map - Change pano to coord - Reset timer - On timeout or submit -> POST to /game/{ID}/guesses/{name}/{round} ```