A simple, accessible Oscars prediction game built with vanilla HTML, CSS, and JavaScript. Users register with only a username, make picks, and see a local leaderboard once results are entered. No money, no betting, and no personal details.
- Shared leaderboard (Supabase-backed).
- Username + PIN login (no personal details).
- Admin-style results entry to calculate scores.
- Deterministic leaderboard with tie handling.
- JSON export/import for moving data between devices.
Open index.html in a browser. For best results, run a local web server (so fetch() can load data/categories.json).
# Example: Python simple server
python3 -m http.server 8080Then visit http://localhost:8080 in your browser.
This app uses Supabase RPC functions for shared users and picks.
- Create a Supabase project.
- Run the SQL in
supabase/schema.sqlin the Supabase SQL editor. - Set your keys in
js/config.js:
window.SUPABASE_URL = "https://YOUR_PROJECT.supabase.co";
window.SUPABASE_ANON_KEY = "YOUR_ANON_KEY";
Pick at least one category to submit your predictions. You can update your picks until the ceremony deadline (set in data/categories.json as ceremonyDate, 12:00 GMT).
Users share a personal link that includes their username + PIN for access.
Run the fetch script to populate data/categories.json from the Oscars site:
npm install
npm run fetch-nomineesYou can also pass a different ceremony URL:
npm run fetch-nominees -- https://www.oscars.org/oscars/ceremonies/2025Note: the Oscars site blocks automated requests. The script automatically falls back to a read-only proxy when direct fetches are denied.
When the Oscars site has winners, fetch and save them to data/results.json:
npm run fetch-resultsTo make the leaderboard viewable when the database is unavailable, snapshot it while Supabase is up:
npm run fetch-leaderboardThis writes data/leaderboard-{year}.json. The app loads from this file when the database returns no picks. Set SUPABASE_URL and SUPABASE_ANON_KEY (env vars) or use js/config.js for auth.
Edit data/categories.json to:
- Update the Oscar year.
- Replace nominees with the real list.
- Adjust per-category points (optional).
Local-only data is stored in localStorage under the following keys:
oscars_resultsoscars_current_useroscars_current_user_id
index.html– Accessible UI for registration, picks, results, and leaderboard.css/site.css– Styles and focus treatments (no Tailwind).js/app.js– App logic, storage, scoring, and rendering.data/categories.json– Categories and nominees.
The app is static but uses Supabase to share users and picks across devices.