Back to works
PlateII

Hocam — Private Lesson & Payment Tracker

"Hocam" is what a player calls their coach.

Role

A solo project. I designed it, modelled the data, wrote the lesson and payment logic with its tests, built every SwiftUI screen, and set it up on his phone.

Stack

SwiftSwiftUISwiftDataiOS 17UserNotificationsXCTestXcodeGen

Overview

"Hocam" is what a player calls their coach. It's an iOS app I built for a football coach who gives private lessons, so his students, the lessons he's given, and the money he's taken in all sit in one place. Payments follow how he actually sells: a payment is a package, "six lessons at this rate", not a charge tied to one session. So the app keeps two counts that don't have to match, lessons done and lessons paid for. It runs on his phone alone, in Turkish, with no account and no server; everything stays on the device.

What it does

  • IA home screen with his students, a month that dots the days with lessons, and a panel for the day he taps
  • IILessons that hold a date, time, pitch, and a note, each with a box to tick when it's done
  • IIIPayments as prepaid packages, with an optional per-lesson pitch fee taken off so the total is what he keeps
  • IVPitches it remembers, sorted by how often he uses them, instead of retyping the same places
  • VAn evening reminder the night before that lists the next day's lessons

Screens

Students, the month, and the day you tap
Students, the month, and the day you tap
A student's lessons, newest first
A student's lessons, newest first
Collected so far, kept as packages
Collected so far, kept as packages
Selling a package, pitch fee taken off
Selling a package, pitch fee taken off
Adding a lesson from saved pitches
Adding a lesson from saved pitches
Parents, tap a number to call
Parents, tap a number to call
The pitches it remembers
The pitches it remembers

Technical notes

  • IBuilt with SwiftUI and SwiftData for iOS 17. No network and no accounts; the SwiftData store on the phone is the whole backend.
  • IIThe money rules live in the model as plain computed values, total collected, lessons paid for, lessons done, each covered by unit tests. Marking a lesson done and taking a payment are kept independent on purpose, because that's how prepaid coaching works.
  • IIIA cancelled lesson is a soft cancel, not a delete, so it drops out of the counts and the calendar but can be brought back. Past payments keep the fee they were made at, so changing a rate never rewrites history.

What I learned

The hard part wasn't the screens, it was matching the rules to how he already works. Lessons done and lessons paid for being two separate things sounds like a bug until you watch a coach sell a ten-lesson package and work through it. I spent more time on that than on anything you can see.