
My own coaching platform: programs, nutrition and check-ins for online coaches and their clients, in one app.
Overview
Voinic is my own product: a coaching platform that replaces the WhatsApp threads, spreadsheets and separate tracker apps between an online coach and their clients. Coaches build programs and meal plans; clients log workouts, food, habits and weekly check-ins; both read the same timeline. Romanian and English from day one.
Two roles with opposite needs share one product. A coach with many clients has to see at a glance who is slipping and why, while a client in the middle of a set needs logging to take seconds. And because it holds people's training, body and nutrition data, every read and write had to be provably limited to the people allowed to see it.
Challenge
Approach
One Supabase backend whose row-level security is the single source of truth, a Next.js web app that is the product, and an Expo app for Android and iPhone, in development, that reuses the web's own reads through a versioned API instead of reimplementing them. Every screen is exercised per role, on desktop and phone, by an automated soak run in which a seeded coach, their client and a solo trainee use the app against each other round after round.
The app, on a phone
Real screens from the running app, signed in as seeded demo accounts — a coach and their clients.

Coach · who needs you today

Coach · one client, in context

Coach · building a program

Client · today

Client · logging a set

Client · progress
The public site, as built

Design & Development
- A status for every client, with the reason spelled out
- The coach's dashboard opens on who needs them today: every client carries On Track, Needs Attention or Needs a Restart, with the reason written underneath — a missed check-in, no logs for eight days — rather than a score to interpret.
- Logging a set in three taps
- Targets are pre-filled from the coach's program, the rest timer starts on its own, the previous session sits beside the inputs, and a personal record is flagged the moment it is beaten.
- Years of history imported, not abandoned
- A CSV export from Hevy, Strong, Fitbod, FitNotes or a spreadsheet moves into Voinic: exercises are matched to the library, personal records are recalculated, and importing the same file twice adds nothing.
Technical Decisions
- Access rules enforced and tested in the database
- Who can see what is defined once, in Postgres row-level security, and checked by pgTAP suites that CI runs against a throwaway database built from every migration — not left to each screen getting its query right.
- One backend for the web and the phone
- The phone app calls a versioned /api/v1 on the web app with a bearer token, and each handler runs the web's own reads under the same security rules. The API only grows: old app builds stay installed for months, so fields are added, never renamed or removed.
- A demo mode removed to keep one code path
- An early demo mode had grown to 168 branches across 37 files. It was removed outright, so every read and write is the one real path to the real database, with seeded test accounts in its place.
Results
Lighthouse performance, desktop
95
voinic.fit home page, Lighthouse 12.8.2 desktop preset, 9 November 2026. The mobile preset scored 76 the same day, with a 6.1 s Largest Contentful Paint under simulated throttling — reported here rather than left out.
Accessibility · Best practices · SEO
96 · 100 · 100
The same Lighthouse runs; all three scores were identical under the desktop and mobile presets.
Cumulative Layout Shift
0
Measured under both presets: nothing on the page moves after it paints.
Automated test files
295
Counted in the repository on 9 November 2026: 149 unit and component test files, 111 database (pgTAP) test files and 35 end-to-end specs.
- Role
- Product, Design, Full-stack Development
- Stack
- Next.js, React, TypeScript, Supabase, Expo, Tailwind CSS
- Year
- 2026
- Industry
- Fitness Coaching Platform