Oxford Music Academy

The user manual

Everything the front desk, the teachers, and the owner need — organised by how often you'll need it. Each task is a short list of steps. Nothing here assumes you are technical.

Starting the system

The system is one program running on the school computer. Everyone — the web browser and the teachers' iPhones — connects to it.

  1. Open the Terminal application.
  2. Paste this line and press return:
    npm --prefix app start
  3. Open a browser to http://localhost:7070/welcome.html — the front page. The brass button opens the system itself.
To reset the demo school (fresh data, all demo history restored):
npm --prefix app run reset
This erases any marks you made while practising and rebuilds two clean years of history.

Signing in

Everyone has their own account, and the books record who did what — a mark made on Ruth's phone lands in the audit trail as Ruth, and nobody can act as someone else.

WhoUsernamePassword (demo)Where
The ownerowneroxford-owner-26Web
Front deskfrontdeskoxford-desk-26Web
Each teacherfirst name, e.g. ruthruth-key-26iPhone (and web)

Sign out is at the bottom of the sidebar, under your name. Sessions last 30 days on a device you keep using.

These are demo passwords. They are printed by the demo seed so the team can try every role. Before any real school's data goes in, every account gets a real password.

Setting up the iPhone app

  1. Open Oxford Teacher on the phone.
  2. Sign in with your own username and password (e.g. ruth / ruth-key-26). Only teacher accounts work here — the owner and front desk use the web.
  3. That's it. The app remembers you for 30 days; Sign out is in Settings (the circle icon, top right).
If the phone says it can't reach the school: the phone and the school computer must be on the same network, and the server must be running. In the app's Settings, check the Server address matches the school computer's — ask whoever started the system for the address. The demo simulator uses http://127.0.0.1:7070.

The Today screen

This is the first screen every morning. Four numbers, left to right:

NumberWhat it means
Lessons todayHow many lessons are on today's calendar, and who is next.
Needs attentionThings worth a minute today, listed underneath — most urgent first. Click any line and it takes you to the place where you can act on it.
Month so farRevenue this month, with teacher pay right under it. The difference is your margin.
Quietly leavingStudents showing exit signs — nothing booked, weeks of silence, mounting cancellations — and the monthly revenue that leaves with them.

The chart below is two years of monthly revenue. The dips are term breaks; they are supposed to be there.

The schedule

The Schedule view shows one week. Move between weeks with the ‹ › arrows; This week brings you home.

Taking attendance

  1. Click the lesson (web) — or, on the phone, swipe it right.
  2. Choose Attended or No-show. On the phone: swipe right for attended, left for no-show.

The mark lands in payroll immediately and is written to the activity log under your name.

Unmarked lessons become unpayable payroll. If a past lesson is still grey, the Today screen will nag about it — that nag is the system protecting the teacher's pay.

Cancelling a lesson

  1. Open the lesson and choose Cancel…
  2. Say who is cancelling — the family or the school. This matters: school cancellations always credit the family; family cancellations follow the policy.
  3. Read the decision. The system shows its reasoning as numbered steps — the notice hours compared against the cutoff, the family's cancellation count against the cap — and then what happened: a credit was issued, the lesson was forfeited, or the cancellation was blocked.

That reasoning is stored with the lesson forever. When a parent asks in July why March went the way it did, open the lesson: it answers with March's rules, not today's.

Undoing a cancellation

Open the cancelled lesson and choose Reinstate. The lesson returns to the calendar and any credit it created is voided — not deleted; the books remember everything.

On the phone, cancelling needs a connection. Attendance can wait for signal; a cancellation can't, because the refund answer depends on caps and history only the server knows. The app explains this itself.

Credits & makeups

A credit is a lesson the school owes a family — usually from a timely cancellation. The Credits view is the whole ledger: outstanding, booked, used, expired, voided.

Booking a makeup against a credit

  1. In Credits, find the outstanding credit and choose Book makeup.
  2. Pick the teacher and time. The system refuses slots that clash.
  3. The new lesson appears on the schedule marked makeup. When it's taught, the credit is used up.

Issuing a goodwill credit by hand

In Credits, choose Issue credit. A reason is required — it goes in the books and the family may one day read it.

Credits expire on their own. The system sweeps expiries automatically and warns you on the Today screen three weeks before a family loses one — that warning is your cue to call the family, not just a note.

Students & enrolment

The Students view is the roster. The filter switches between current students and those who have left (with when and why).

Enrolling a new student

  1. Click Add a student.
  2. Choose the family — an existing one, or type a new family's name and contact.
  3. Pick the lesson type, teacher, weekday, time, and how many weeks.
  4. Read the result: "11 lessons booked — 0 clashed, 1 fell in a school holiday." The system books only real, term-time, clash-free lessons and tells you exactly what it skipped and why.

Retention — who to call this week

The Retention view exists to catch families who leave without telling you. Most do.

A good weekly habit: open Retention every Monday, call the red cards, text the amber ones. The evidence sentence is exactly what to say: "We noticed nothing's booked since June — shall we find Auggie a new slot?"

Asking the assistant

The Assistant view answers questions in plain English from the school's actual books — it is handed a fresh summary of the ledger with every question and is under orders to refuse rather than invent a number.

Questions that work well:

One-time setup

  1. Create a file called .env inside the app folder.
  2. Put one line in it: ANTHROPIC_API_KEY=sk-ant-… (your key).
  3. Restart the system. Without the key, the assistant shows a setup card and everything else works normally.

Payroll

The Payroll view computes each teacher's pay for the period from the lessons actually taught — fixed per lesson, hourly, or a percentage of what the lesson earned. Percentages are stored exactly (62.5% is 62.5%, never a rounded approximation), so the run ties to the cent.

Heed the double-pay warnings. When a makeup lesson is taught, the late-cancelled lesson it replaced may also be payable. Every such collision this month is flagged on the run and on the Today screen. Check each one before approving — this is the single most common way music schools quietly overpay.

Closing the month

The Month end view answers: can this school close its month from its own records? Three numbers:

NumberMeaning
RevenueEvery lesson taught this month, at its price.
Teacher payThe payroll for the same lessons. Revenue minus pay is the margin, computed by subtraction — never rounded separately.
Credit liabilityWhat the school owes families in unused lesson credits — the number that surprises schools when a parent asks for a refund.

Under the liability is its movement: opening balance + issued − used − expired = closing balance. The residual line should always read zero. If it ever doesn't, the report itself is broken and you should say so — the system shows the discrepancy rather than hiding it.

The iPhone app — reference

To do thisDo this
See a different dayThe ‹ › arrows beside the date. Back to today returns.
Mark attendedSwipe the lesson right (or open it and tap).
Mark no-showSwipe the lesson left.
Cancel a lessonOpen the lesson → Cancel… → say who is cancelling. Needs a connection; the policy's reasoning is shown before anything is final.
Work offlineNothing to do — attendance marks queue on the phone and a banner counts them. They sync automatically; Settings → Sync now forces it.
Switch teacher / serverThe circle icon, top right → Settings.

When something looks wrong

SymptomWhat it is
Browser says "can't connect"The system isn't running. Start it (see Starting the system).
It keeps asking me to sign inYour session expired (they last 30 days) or the password is wrong. On the demo school, the passwords are in Signing in; a reseed resets them.
Phone shows old lessonsPull down to refresh. If a yellow banner shows queued changes, they sync the moment the server is reachable.
Assistant shows a setup cardNo API key yet — see the one-time setup. Everything else works without it.
A number looks impossibleClick it. Every figure drills down to the lessons and credits that made it. The books are append-only, so the explanation is always there.
Demo data got messy while practisingReset it: npm --prefix app run reset. (This wipes practice marks — don't run it on a real school's data.)

The words this system uses

WordMeaning
CreditA lesson the school owes a family, created by a cancellation or by hand. Has a dollar value and usually an expiry date.
MakeupA lesson booked against a credit. Marked distinctly everywhere, because it's the lesson payroll must treat carefully.
ForfeitA cancellation too late (or over the cap) to earn a credit. The lesson is charged; the decision explains why.
ReinstateUndoing a cancellation. The lesson returns; its credit is voided, not erased.
SweepThe automatic pass that marks expired credits. Runs on its own; you'll see it in the activity log as "system".
LiabilityThe total value of outstanding credits — money's worth of lessons the school still owes.
CohortAll students who started in the same month, tracked together to measure how long students stay.