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}