Projects LessonLynx case study

LessonLynx

Scheduling and invoicing for freelance language tutors, built by a tutor who needed it first.

● Live · ~20 usersSolo projectv2 · rebuilt from a mobile MVP🔒 Private repo
Role
Everything: product, design, code, support
Users
About 20 tutors
Stack
Next.js · TypeScript · Supabase · Tailwind
Status
Live, actively maintained
LessonLynx dashboard in dark mode: total unpaid, lessons this week, earnings and students ready to bill

The real app, on a demo account with made-up students.

In short

  • WhatA web app where tutors plan lessons, track who has paid and send invoices.
  • Who forIndependent language tutors who run their business from spreadsheets and notepads.
  • Where nowLive, used by about 20 tutors. I keep shipping fixes and features.
  • NextPaid plans, so LessonLynx can pay for itself.

Why it exists

I've taught English online since 2021. My whole teaching business lived in one Google Sheet: who is booked when, which lessons happened, and who still owes money.

Sometimes weeks went by before I checked who hadn't paid, and I'd bill parents late. So I built the tool I wanted to open every morning. I was the first user, which meant I knew which problems were real.

I looked for a tool built for this and found nothing that fit how I actually teach. Most tutors I know still use spreadsheets, and years of doing that taught me how easy the mistakes are. So I made it a test of my design, product and coding skills at once.

Before✕Schedule, lessons and payments in one spreadsheet✕Weeks without checking who hadn't paid✕Invoices written by hand, sent late
After✓Today's lessons and unpaid totals on one screen✓A reminder when a student is ready to bill✓A PDF invoice in one click

A tutor's week

What LessonLynx does, in the order a tutor uses it.

  1. 01 · PlanSchedule the weekWeek and month views. Set a student's regular slot once and future weeks fill in. Time off cancels lessons without blaming the student.
  2. 02 · TeachLog lessons in seconds25 or 50 minutes, with notes on what you covered, straight from the schedule.
  3. 03 · Get paidBill on timeA "ready to bill" nudge, one-click mark as paid, and numbered PDF invoices with your logo and payment details.
  4. 04 · UnderstandSee the businessIncome trend, revenue by student, overdue payments, and who might need a check-in.

Also: Google sign-in · light & dark mode · pause a student without losing history · in-app bug reports

Student panel for a demo student: 9 unpaid lessons, $135 owed, with Add Lesson, Generate Invoice and Mark all as paid, and the lesson history
Teach + get paid · a student's lessons, what's owed, one click to bill
Invoice preview for a demo student listing six unpaid lessons and a total due of $135.00
Get paid · invoice preview before generating the PDF

Where it started

  1. v1 · mobileLessonLynx MobileMy first version, and the subject of my bachelor's thesis.
  2. v2 · web · nowRebuilt from scratch for the webA separate codebase, live with real tutors.

The first version was a React Native app for a university exam. Using it every day showed me what I liked and what was missing, and some features were beyond what I could build in React Native at the time. So I started again on the web, which I know better, with better planning and a cleaner architecture. One day both apps could share the same backend, so a tutor sees the same data on phone and laptop. Read about the mobile app and my thesis →

How it's built

A Next.js app on Vercel loads each page's data on the server and generates invoice PDFs on demand. Supabase provides the PostgreSQL database, sign-in and private file storage. Every tutor's data is isolated inside the database itself, with row-level security.

Key decisions

What I chose, what I gave up for it.

Backend

Supabase, with each tutor's data walled off

Why: as one person I needed a database, sign-in and file storage without building a backend. Row-level security means the database itself only returns a tutor's own rows.

Trade-off: I depend on one vendor, and the safety rules live in the database, so I review them carefully.

Scheduling

Recurring lessons create real, dated lessons

Why: a weekly template fills in each week as it comes up. Moving one week's lesson is then just editing an ordinary lesson, with no special exception rules.

Trade-off: more rows, and the generator must never create duplicates. I learned that one the hard way.

Recurring lessons, without the busywork

How a month runs in LessonLynx. Tap a step or let it play.

October

01 · Set a regular slotSet a student's regular time once and every future week fills in by itself.

week of
Oct 5
Tue 6 · weeklyMia · 17:00Thu 8Leo · 10:00
week of
Oct 12
Tue 13 · weeklyMia · 17:00Thu 15Leo · 10:00
week of
Oct 19
Tue 20 · weeklyMia · 17:00Thu 22Leo · 10:00
week of
Oct 26
Tue 27 · weeklyMia · 17:00Thu 29Leo · 10:00
New regular lesson
StudentMia
EveryTuesday · 17:00
Length50 min
Save onceEvery future Tuesday fills in. No copying lessons week by week.

Illustration in the app's own colors. Demo names, made-up amounts.

Bugs that taught me something

Lessons that moved by a day

For tutors east of UTC, some dates landed on the day before. Dates were being converted to UTC when saved. Now all date maths works in local calendar days.

Learned: a calendar date is not a timestamp.

Lessons that copied themselves

Editing one week's recurring lesson detached it from its pattern, so the generator saw a gap and filled it again. Two lessons, same week. Edited lessons now stay linked to their pattern.

Learned: test edits, not just creation.

A reminder that never fired

"Time to invoice" counted lessons, not billing units, so a student with long lessons never reached it. I spotted it within hours of release and moved the rule into one shared helper.

Learned: business rules belong in one place.

How I work on it

The direction was mine from the start. LessonLynx began as something I needed, and as the user base grows, I'm happy to shape it around feedback from real users.

My tools are Next.js, Supabase and Claude Code. Before a feature is built, I think through how it fits the architecture and the data. Then I read and review the code, and I test it against a real database, including checks that tutors can never see each other's data.

Where it is now

~20tutors using it
4–5 hof admin work saved every week
0invoices typed by hand, so no copy-paste mistakes
30 daysof income I can forecast, not guess

Time saved and forecasting are from my own teaching business.

What's next
  • Paid plans through Lemon Squeezy. It acts as the seller and handles VAT, which keeps billing simple from Serbia.
  • Invoices sent by email, and CSV export.
  • Billing students in different currencies.
About the code

The repository is private because LessonLynx has real users. I'm happy to walk you through the code in an interview.

The journey, on DevQuill

All posts →

Like what you see?

I'm looking for my first role as a junior full-stack or backend developer, remote or in Belgrade. Let's talk.