Skip to content
  • Own tool
  • Live

Pokuty, a team fines tracker

A fines board for an amateur football team. Anyone with the link can look. Only admins can change anything.

For
My own tool, for an amateur football team
Status
Live, in Czech. The live board shows real players, so it is not linked from here.
Period
2026
What I did
Web application, Admin login, Database security
The Pokuty fines board on a desktop screen, with a table of players and the fines they owe. Player names are replaced with Player 1 to 23. In Czech.
The public board. Anyone with the link can look.
The Pokuty fines board on a phone screen, with player names replaced. In Czech.
The same board on a phone.

Screenshots are real. Player names and the club name have been replaced.

The problem

An amateur team needed one shared place to record fines, see who owes what and mark fines as paid, without making every player create an account.

The approach

The database decides who can do what, not the screen. Visitors can read four tables and nothing else. Every change is re-checked on the server. Fines keep the amount they had when issued, so editing the price list never rewrites history, and nothing is hard-deleted.

What was built

A Czech-language dashboard with fines, players, a price list and an admin area. Admins sign in with e-mail and password.

Proof points

  • Postgres row-level security is the real gate: the public role can read four tables and can never insert, update or delete.
  • Every admin action re-checks the admin’s rights on the server, even if the screen hides the button.
  • Fines snapshot their amount when issued. Players deactivate, fine types archive and fines are voided, so nothing is lost.
  • Covered by unit tests, tests against the live database’s security rules, and browser tests at two screen sizes.

Built with

  • Next.js 16
  • Supabase (Postgres, Auth, row-level security)
  • Tailwind
  • Vercel

Want something like this built?

Tell me about your business. I’ll send a short video and a homepage preview, or tell you within 2 working days if I can’t take yours on. No obligation.