Inspiration

The hardest part of board-game night often happens before the first turn: no one wants to catalog the shelf, teach a box they barely remember, or pause a good game to search a rule dispute. BoredGame starts with the collection people already have. One shelf photo becomes a correctable library, then source-backed help gets the table playing.

What it does

BoredGame is a mobile-first PWA. A player photographs one board-game shelf; GPT-5.6 reads horizontal, vertical, and rotated spines, and the app matches the candidates to a local 126,266-row BoardGameGeek snapshot. The player confirms uncertain editions with large tap targets, and the resulting anonymous-device library survives refresh.

For the three source-checked showcase games, a detail page adds an original one-page Teach Sheet and one validated YouTube explainer. The implementation also contains a narrow rulebook Referee that refuses unsupported questions, but the submitted deployment invokes its kill clause: OpenAI file uploads returned 502, so the UI shows “rulebook not indexed” and the publisher link instead of manufacturing a citation. The app recognizes and canonicalizes arbitrary shelves; deep teaching is demonstrated on CATAN, Carcassonne, and Horrified.

How we built it

  • Next.js App Router, installable phone-first PWA, and Vercel.
  • Supabase Postgres for canonical games, anonymous shelves, retained scan evidence, enrichment caches, and private rulebook index metadata.
  • Direct signed browser uploads to a private Supabase bucket, so shelf bytes do not cross Vercel's request-body limit.
  • gpt-5.6-sol with high reasoning and strict Structured Outputs for the shelf scan.
  • PostgreSQL trigram/normalized search followed by text-embedding-3-small over only the observed title and 30-row shortlist—no full-corpus embeddings.
  • gpt-5.6-terra with built-in web_search for source-guarded Teach Sheets and videos, cached by canonical game.
  • A gpt-5.6-terra + file_search Referee pipeline with private per-game stores, server-validated printed-page mappings, and a stable cached prompt prefix. It remains unavailable in the frozen deployment because indexing failed closed.

All OpenAI calls use the Responses API and stay server-side. Agent Builder is not used. Rulebooks remain linked at publisher URLs; private processing copies are never redistributed.

Challenges we ran into

The real 8.2 MB shelf was more useful than a polished fixture. An 8,000-token scan ceiling produced an honest incomplete response; 20,000 was needed. High reasoning improved the provisional F1 from 88.0% to 89.8%, but cost about 50 extra seconds. Those are tradeoffs, not marketing numbers.

Production also found failures local checks missed. Supabase's pooler chain needed the fingerprint-verified Supabase Root 2021 CA on Vercel; weakening TLS was rejected. Two over-qualified PostgreSQL built-ins failed only on the live path. The BGG importer exposed a pg_attribute.atttypmod edge case. Finally, Ravensburger's English Horrified product link currently points to the wrong American Monsters rulebook, so the index uses a clearly labeled official Spanish Universal Monsters source or fails closed. Three controlled rulebook index attempts then hit OpenAI HTTP 502 during file upload; rollback removed the private stores/files, and I shipped the honest unavailable state.

Accomplishments that we're proud of

  • One real production photo reached 26 scan candidates, 25 confirmed canonical games, a refresh-persistent library, and a source-checked Carcassonne page.
  • The idempotent importer loaded 126,266 catalog rows while only 497 shortlist vectors existed after the demonstrated shelf—evidence that no corpus-wide embedding shortcut was taken.
  • The production MEDIUM/HIGH scan comparison is reproducible and keeps its incomplete, unverified truth-set warning beside the numbers.
  • Every uncertainty boundary is visible: correction choices, not-enriched states, publisher links, edition labels, quote caps, and Referee unavailable states.

What we learned

This app in it's current state is from 2 prompts - in itself was a measurement for 5.5 Sol Ultra performance, minimal additional prompting was required from my end once the project foundation was set.

Technically, structured output is only the beginning of reliability. The product became much stronger when model output was treated as a candidate that still needed database identity, source/edition checks, URL validation, cache evidence, and server-derived citations. Codex was most valuable as a parallel reviewer while tasks were in flight: it caught the BGG-year/physical-edition mismatch, the TLS downgrade risk, the Horrified source drift, and claims that were stronger than the evidence.

The fixed production key was pre-probed successfully with gpt-5.6-sol (resp_0b1fae34c1df5b22006a5ec3c244208191b963bac6c0a1cc82) and gpt-5.6-terra (resp_0714c946a1721a52006a5ec3c6f8f0819c87221ce70ab5dde2c2).

What's next for BoredGame

  • Grandma's Law: remember a table's friendly house rulings and distinguish them from official rules.
  • Voice referee: an opt-in hands-free ruling flow during play.
  • Shelf memory: compare later photos to the known shelf and highlight additions, removals, and unresolved spines.
  • Social features: share and upgrade your profile over time, compare and contrast libraries from friends, save game state

Built With

Share this project:

Updates