Home Work About Skills Contact
case study · 01

Card Table

A desktop app that scores and ranks physical card games in real time — starting with Call Break — so the table can focus on the game instead of the tally.

Role
Solo build — design, code, data
Stack
Python, Flet, Supabase
Status
In active development
Platform
Desktop
the problem

Card games don’t need a spreadsheet, but they end up with one anyway.

Call Break and similar card games are played casually — a group, a deck, a running score kept on paper or in someone’s notes app. It works, until someone loses track of a round, or a dispute over the tally breaks the flow of the game. I wanted something purpose-built: fast to update mid-game, clear at a glance, and able to remember past matches without anyone having to.

the approach

A native-feeling desktop app, not a form.

I built Card Table with Flet, which lets Python drive a real desktop UI instead of a browser tab. That mattered here — a scoring app should feel like part of the table, not like opening a browser mid-game. The interface leans into a dark, game-inspired look: per-round score entry, running rankings, and a match history view.

Match and player data is stored in Supabase, so scores persist across sessions and multiple people could eventually track the same running leaderboard.

PythonFletSupabase (Postgres)Desktop UI
what got in the way

The parts that don’t show up in a screenshot.

Most of the real work on Card Table has been underneath the interface — dependency and rendering issues that only show up once you're past the "hello world" stage of a framework:

issue — Flet's BoxDecoration API changed between versions; layouts built against the old signature silently stopped rendering.
fix — pinned the Flet version and rewrote the affected decoration calls against the current API.
issue — Supabase key format differed from what older examples assumed, breaking the client init.
fix — matched the client setup to the current Supabase key format and re-verified the connection.
issue — a silent grey-box rendering bug at the Flutter layer (Flet's underlying engine) with no error output.
status — actively being isolated; narrowing down which widget tree triggers it.
where it stands

Still on the table.

Card Table is in active development. The core scoring flow for Call Break works end to end; ranking history, a cleaner UI pass, and support for a second game mode are next.

let’s talk

Have something worth building? Let’s talk it through.