grading-game
08·info
08 · info

Credits & patch notes

A photo color-grading game built solo, in the open. Every release lands here.

01

Credits

grading-game is an independent project. The two columns below cover the human behind the design and the AI behind the code.

creator · designer

Jarod Buisson

Photographer & colorist based in France. I shoot and develop a lot of film, and I wanted a fun way for everyone to practice grading on real RAWs and scans — so I built it.

Every photo you grade in the random pool was contributed by a real photographer. Hit the Contributors page if you want to drop yours in.

code · co-author

Claude · Anthropic

The codebase was written in close collaboration with Claude, Anthropic's AI assistant. I steered the design, the look-and-feel and every product decision; Claude turned parts of that into HTML, CSS, JS, SQL and the bits of Python that hold it together.

02

Patch notes

Changes made in each update. Newest first.

1.7.0
A clearer front door
2026-06-03

The most common feedback was that newcomers didn't get the concept without someone explaining it. The landing is rebuilt around a single idea you can grasp in a few seconds: a real before/after, a three-step loop, and one obvious button. The chromatic wheel stays, just one scroll down.

highlights
  • New hero: a real contributor's flat RAW next to their edited result, the 3-step loop (download · edit · compare), and a primary "Try it — solo" call to action
  • The first-visit popup is gone — the explanation now lives on the page, always visible
  • The "support" button moved up into the top bar, reachable from every page
  • Session duration is now a draggable wheel that goes up to 120 min (was capped at 60)
cleanup
  • Removed the background-music widget entirely — it took up space for something nobody used
  • Hero images are heavily optimised so the new landing still loads fast
  • All new copy translated in EN / FR / IT / ES
1.6.0
Email sign-up · third login option
2026-05-31

Discord and Google were the only sign-in options until now — not great if you don't have either, or just don't want to connect a social account. The login modal picks up a full email + password flow with confirmation email, password reset, and the same nickname picker the OAuth flow uses.

highlights
  • Create an account with email + password + nickname — a confirmation link arrives in your inbox to activate
  • "Forgot password?" sends a reset link that drops you straight into your profile to pick a new one
  • Modal is fully translated in EN / FR / IT / ES, including all validation and error messages
  • Inline checks: nickname availability is validated against the server before the form is submitted — no more cryptic SQL conflict errors
behind the scenes
  • Same SQL trigger as Discord OAuth seeds the profile from the nickname you pick — no schema change required
  • Common Supabase errors (email taken, invalid creds, rate-limit, not confirmed) get translated into readable messages instead of stack traces
1.5.2
Profile mobile, dynamic version & live count
2026-05-29

Three small but visible polish items: the profile page joins the responsive layout, the top-bar version tag updates itself when we release, and mobile users finally get to see how many other players are online.

highlights
  • Profile page is now fully mobile-friendly — avatar, stats grid and account actions all stack into a single readable column with thumb-friendly buttons
  • Live "X online" count moved into the mobile footer alongside info / legal — was previously hidden under 800 px because the top-bar was too cramped
  • The "v…" pill in the top-bar now reads itself from a single SITE_VERSION constant in chrome.js — bumping it in one place propagates everywhere
fixes
  • Top-bar version was stuck on "v0.1" since launch; it now matches the latest patch note (this one)
  • Sitemap was missing info.html — Google Search Console will pick it up on the next crawl
1.5.1
Real-device polish
2026-05-29

Fixes from testing on actual phones — HTTPS gets enforced, music goes away on mobile, the gallery becomes a scrollable list, and signing in finally survives the browser back button.

highlights
  • Gallery cards on mobile collapse to compact rows (small thumb + id inline) — 12 challenges per screen instead of 1
  • Contributors cards now show "challenges · 004, 005, 006…" on a single line — much shorter cards on desktop too
  • info / legal pills moved below the donate button on mobile so the top bar isn't fighting for space
  • HTTPS enforced site-wide via HSTS + inline redirect; the next visit goes straight to https:// automatically
fixes
  • Brave / Safari "Not secure" warning gone on the apex domain
  • No more background music or audio widget on mobile (was eating top-bar real estate and data)
  • Browser back button no longer signs you out — the bfcache auth state now re-syncs with localStorage and reloads if stale
  • multi.html "create room" modal button finally renders with its accent border (setup.css wasn't loaded on that page)
1.5.0
Mobile, everywhere
2026-05-28

Every page now has a real responsive mobile layout. The grading workflow itself is feasible from a phone thanks to Lightroom Mobile, Snapseed, VSCO & co. — the "desktop only" gate is gone for everything except the grading session screen.

highlights
  • Landing page on mobile gets a real hero card (H1 + tagline + 5 stacked nav cards) instead of the gate — huge SEO unlock
  • Solo flow (setup → game → result) and multi flow (lobby → room with its 4 states) all stack vertically with tap-friendly targets
  • Content pages (gallery, contributors, about, info, legal) all responsive — TOC stacks, grids collapse, form inputs use 16 px font to suppress iOS Safari focus-zoom
  • Mobile-first indexing now sees real, keyword-rich HTML (RAW, color grading, Lightroom, Capture One, anonymous voting) instead of "Desktop only"
fixes
  • Landing donate button no longer floats with a tall empty gap above it (menu-stage was inheriting flex: 1 from desktop)
  • game.html / room.html brand wordmark hidden on mobile when the live pill row is dense — was wrapping onto a second line
  • multi.html create-room modal goes full-screen on mobile with radios that wrap gracefully
  • Mobile-gate opt-in via class="mobile-friendly" — pages that are still desktop-only (none, currently) would just leave the class off
1.4.1
Security: stats lockdown
2026-05-28

The profile_stats view was returning every signed-in player's aggregated stats to anyone with the publishable key. Closed the leak on both the view and the underlying profiles table.

highlights
  • Profile stats are now strictly self-only (security-invoker view with an explicit WHERE id = auth.uid() filter — belt + suspenders)
  • Profiles table SELECT restricted to authenticated users — anonymous can no longer enumerate nicknames
  • New is_nickname_available(text) RPC returns only a boolean so signup / rename never needs direct SELECT on profiles
fixes
  • Closed the GET /rest/v1/profile_stats?select=* endpoint that previously dumped all players' stats to anon
  • Closed the GET /rest/v1/profiles?select=* endpoint that previously dumped all profile rows to anon
1.4.0
Category filter & discovery mode
2026-05-28

Pick analog or digital before you start. Signed-in players stop replaying photos they've already nailed.

highlights
  • Category dropdown in solo & multi setup (random · negative · digital)
  • Hosts now lock a category at room creation — every player sees it in the lobby
  • Discovery mode: signed-in random picks skip photos you've already unlocked, then re-open the pool for replay once you've done them all
  • Specific-challenge replay from the solo dropdown for everything in your gallery
fixes
  • Active solo session now stores the category so F5 doesn't widen the pool mid-round
  • Challenge dropdown resets to "random pick" when you switch categories instead of keeping a stale id
1.3.0
Legal page, Discord login & contribution form
2026-05-27

Sign in with Discord, see who's online, and submit your photos to the contributors pool without leaving the site.

highlights
  • Discord OAuth added as a second sign-in option next to Google
  • New "legal" link in the top bar — full Terms / Privacy / Copyright page, GDPR-compliant
  • Inline contribution form on the Contributors page (Supabase + Formspree)
  • Online presence pill in the bottom-right corner showing live player count
fixes
  • Provider-choice modal no longer flickers on first open
  • Login disclaimer links now point to the legal page sections directly
1.2.0
Pokédex gallery & solo session lock
2026-05-25

Your unlocked photos now live in a personal gallery — and F5 stops being a re-roll cheat.

highlights
  • Pokédex-style gallery showing every challenge with locked / unlocked state
  • Per-challenge selector on the solo setup so you can replay any photo you've completed
  • Solo session is now persisted in sessionStorage — refresh resumes the same challenge with the timer where you left off
fixes
  • F5 during an active solo no longer rerolls the photo or restarts the timer
  • "Start session" button explicitly clears the active-solo lock so a new round always picks fresh
  • Black screen on back navigation (bfcache) fixed
1.1.0
Cloudflare + R2 migration
2026-05-22

Big infra move: source files now live on Cloudflare R2 so downloading a 60 MB RAW costs us nothing and stays fast worldwide.

highlights
  • RAW / scan sources moved to Cloudflare R2 (sources.grading-game.com) — no more 25 MB Pages limit
  • Background music streams from R2 too — faster first play
  • Site hosted on Cloudflare Pages with privacy-friendly analytics (no cookies)
fixes
  • Auth widget no longer flickers between page navigations
  • Profile page no longer shows the anonymous AND authenticated sections at once
  • Bypassed Supabase SDK getSession on boot — fixes navigation hangs that some users were seeing
  • Added timeout protection to Supabase boot so a slow API never freezes the page
1.0.0
Public launch
2026-05-15

grading-game goes public. Solo training, multiplayer rounds with anonymous voting, and optional Google sign-in to keep track of your runs.

highlights
  • Solo training mode — download a RAW, grade it externally, upload your JPEG, compare with the reference
  • Multiplayer rooms — same photo, same timer, anonymous voting, podium at the end
  • Google OAuth + profile page with editable nickname and short bio
  • Game history tracked per user (challenges played, scores, ranks)
  • Real-time lobby and room state via Supabase Realtime
  • Auto-generated challenge manifest from the photos folder
fixes
← back to menu