TutorFlow is a desktop application for independent private tutors who teach around 20 students at several venues. It keeps students, lessons, homework, follow-up tasks and payments in one place, and answers "what does today require, what does each student need, and who still owes me" through a Command Line Interface (CLI) while retaining the benefits of a Graphical User Interface (GUI).
Ensure that Java 25 or later is installed on your computer.
Mac users: Ensure you have the precise JDK version prescribed here.
Download the latest .jar file from the TutorFlow releases page.
Copy the file to the folder you want to use as the home folder for TutorFlow.
Open a terminal, cd to the folder containing the JAR file, and run java -jar tutorflow.jar.
A GUI similar to the one below should appear in a few seconds. A new data set starts empty, so your own list will have no students until you add some. The screenshot below shows a list that already contains students.

Type a command in the command box and press Enter to execute it. For example, type help and press Enter to see the list of commands.
To explore a new data set, load the sample students with demo confirm. Some example commands you can try:
demo confirm : Loads sample students into an empty data set.
add n/John Doe p/98765432 l/S4 s/Math r/50 : Adds a student named John Doe, who is in Secondary 4, learns Math and pays $50 per hour.
delete 1 : Deletes the 1st student shown in the current list.
clear confirm : Deletes all students, lessons, homework, tasks, and financial history.
exit : Exits the app.
Refer to the Features section below for details of each command.
Notes about the command format:
Words in UPPER_CASE are the parameters to be supplied by the user.
For example, in add n/NAME, replace NAME with a value such as John Doe.
Items in square brackets are optional.
For example, n/NAME [e/EMAIL] can be used as n/John Doe e/john@example.com or as n/John Doe.
Items followed by ... can appear at least once and, where the command allows it, additional times.
For example, s/SUBJECT... in add must be written at least once, such as s/Math or s/Math s/Physics.
Items such as week/ and all/ are flags: write them on their own, without a value.
For example, agenda week/ is accepted, but agenda week/yes is rejected.
Parameters can be in any order.
For example, if the command specifies n/NAME p/PHONE_NUMBER, p/PHONE_NUMBER n/NAME is also acceptable.
Each prefix can normally appear only once, in any order. The exception is s/ in add and edit, which can be repeated to give several subjects. Repeating another prefix is rejected.
list accepts academic filters and archive flags; invalid or extra arguments are rejected.
For example, student list l/S4 s/Math shows active S4 Math students.
today, dues, save, undo and exit take no parameters. If you type anything after them, TutorFlow shows an error and does not run them.
For example, exit now is rejected, so a mistyped command cannot close the app.
Command words are not case-sensitive: LIST, List and list are the same command, and so are LESSON ADD and lesson add. The same goes for the keyword confirm. Parameter prefixes such as n/ and st/ must still be in lower case, and the values you type keep their case.
A mistyped parameter prefix is reported as Unknown prefix for this command: name/. instead of being absorbed into the previous value and blamed on that field. This includes a prefix that belongs to a different command, such as amt/ in lesson add, and an upper-case spelling such as N/. A lower-case single letter that is not a parameter, such as q/, is reported the same way, except inside a description, note, feedback or remark, where text such as c/o is kept as written.
Slash-bearing text is still allowed where it is ordinary content. A name or venue accepts c/o, d/o, s/o, n/a, w/o, h/o, m/o and Blk/123. Notes, feedback, reasons and remarks may quote a full command, including tokens such as n/ or desc/. A description accepts an unaccepted short prefix such as p/3 as prose, but still rejects a field-name spelling such as name/ and the retired a/.
The command box remembers the commands you have entered in this session. Press Up to bring back an earlier command and Down to move forward again, as in a terminal. Down past the newest command returns to what you were typing.
When a command fails, it stays in the command box, so you can correct it instead of typing it all again.
While the command box contains text, a cross button appears at its right edge. Click it to clear the box and return to typing; it disappears when the box is empty.
If you enter an unknown command, such as foo, TutorFlow shows Unknown command. Type "help" for list of commands. Type help to see the available commands.
If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.
addAdds a student to TutorFlow.
Format: add n/NAME p/PHONE_NUMBER l/LEVEL s/SUBJECT... r/RATE [e/EMAIL] [v/VENUE]
NAME is 1-100 printable characters after trimming and must contain at least one letter. It may contain letters in any language (such as José Álvarez or 陈伟明), digits, spaces and . , ' ( ) / - @, such as Tan Wei Ming (twin A), Priya d/o Kumar or John @ Tan. It does not matter how an accent is typed, so José written with one character and with a letter and a separate accent is the same name. Avoid typing a / right after a space when it would look like a prefix, such as s/o, because TutorFlow reads it as the start of the next parameter.NAME and VENUE reject a field-name typo such as name/ or email/ instead of absorbing it into the value. Ordinary relationship or address forms such as s/o, d/o, c/o, n/a, w/o, h/o, m/o and Blk/123 remain valid.LEVEL is one of P1 to P6 (primary), S1 to S5 (secondary) or J1 to J2 (junior college). It is not case-sensitive, so s3 is the same as S3.PHONE_NUMBER has 8 to 15 digits and can start with +, for example 91234567 or +6591234567. Spaces and hyphens between the digits are allowed and are removed, so 9123 4567 is stored as 91234567.SUBJECT is free text of up to 30 characters in any language, digits, spaces, & and -, such as Math, English & Literature or 华文. Subjects are not case-sensitive. When you enter one, its first letter is capitalized automatically, so math is saved and shown as Math. The rest of what you type keeps its case.RATE is the amount charged per hour, from 0 to 9999.99 with at most 2 decimal places. It is shown in dollars. A leading $ is accepted, so 50, 50.00 and $50 are the same rate.VENUE is where the student is usually taught, up to 100 characters.EMAIL can be at most 254 characters (an emoji or other symbol counts as one).a/ is no longer supported. Use v/ for a student's venue, such as v/2902 Yishun. An a/ parameter is rejected as an unknown prefix instead of being read as part of the preceding email or venue.name/, phone/, sub/, email/ or venue/ is named in an Unknown prefix for this command error. Correct the spelling instead of looking for a fault in the preceding field.NAME are ignored, so John Tan is stored as John Tan.s/SUBJECT values is rejected. The same limit applies when you edit a student.Tan Wei Ming with different phone numbers. TutorFlow adds the student and shows a note, so that you can spot a double entry.Tip: A student must have between 1 and 10 subjects. The email and the venue are optional.
Examples:
add n/John Doe p/98765432 l/S4 s/Math r/50add n/Betsy Crowe p/98761234 l/J1 s/Physics s/Chemistry r/62.50 e/betsycrowe@example.com v/Blk 123 Bishan St 13listShows the students in TutorFlow. Archived students are hidden unless you ask for them.
Format: list [l/LEVEL] [s/SUBJECT] [archived/|all/]
Listed active students.l/LEVEL shows only the students at that level, and s/SUBJECT only those who take that subject. Neither is case-sensitive. With both, a student must match both. A filtered list replies with the count, such as Listed 2 matching student(s).archived/ shows only archived students, and all/ shows active and archived students together. Use at most one of them, with nothing after the /.student list works the same way.Examples:
list Shows all active students.list l/S3 s/Math Shows the active S3 students who take Math.list archived/ Shows only the archived students, for example before you restore one.archiveTakes a student who has stopped lessons out of the active list, while their lessons and payment history stay available.
Format: archive INDEX
INDEX is the number in the displayed student list.list. list archived/, list all/ and find still show them, with (archived) after their name on the student card, and view shows Viewing: NAME (archived).dues still lists them, marked (archived).This student is already archived.student archive INDEX works the same way.Examples:
archive 3 Archives the 3rd student and replies, for example, Archived: Chen Hao. Lessons and history are retained. Run 'list' to refresh the student list.restoreBrings an archived student back to the active list.
Format: restore INDEX
list archived/ or list all/, then use the number shown there.This student is already active. Use student list archived/ before restoring.student restore INDEX works the same way.Examples:
list archived/, then restore 1 Restores the first archived student, for example Restored: Amy Tan. Lessons and history are retained. Run 'list' to refresh the student list.editEdits an existing student in TutorFlow.
Format: edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [l/LEVEL] [s/SUBJECT]... [r/RATE] [v/VENUE]
INDEX. The index refers to the index number shown in the displayed student list. The index must be a positive integer 1, 2, 3, ...edit 1 n/Alex Yeoh for a student already named Alex Yeoh, is rejected with The student already has these details. Changing only the letter case, such as e/ALEX@example.com, is a change.e/ or v/, for example edit 1 e/ v/.
Omitting a prefix leaves that value unchanged. Required fields cannot be cleared. Clearing contact details
preserves the student and all linked history; existing lessons keep their recorded venues.find or list filter after the edit (for example, a new name that the find keywords do not match): that student leaves the displayed list and the numbers below shift. Run list to show all active students again.lesson list st/STUDENT_INDEX again before using lesson numbers.add, so an email can be at most 254 characters.Examples:
edit 1 p/91234567 e/johndoe@example.com Edits the phone number and email address of the 1st student to be 91234567 and johndoe@example.com respectively.edit 2 l/S4 s/Math s/Chemistry Changes the 2nd student to Secondary 4, and the subjects to Math and Chemistry.findFinds students whose names contain any of the given keywords.
Format: find KEYWORD [MORE_KEYWORDS]
hans matches Hans, and ışık matches Işık,
using the same Unicode case equivalence as student identity. Accents remain significant.Hans Bo matches Bo Hans.Han matches Hans and Johan, and wei matches Tan Wei Ming.OR search); for example, Hans Bo returns Hans Gruber and Bo Yang.Examples:
find John returns john and John Doefind alex david lists Alex Yeoh and David Li if those students are recorded. If only those two students match, the result says 2 student(s) listed! and the student list shows their current details with new index numbers.viewShows what you need to prepare for one student, on one screen.
Format: view INDEX
INDEX.OUTSTANDING $X.XX, or the credit from paying ahead, as IN CREDIT $X.XX. A student who owes nothing shows OUTSTANDING $0.00.No upcoming lessons., instead of disappearing.Viewing: Chen Hao (archived), so that you can tell them apart from active students when you reach them through list all/ or find.…. The overview always shows them in full.Example: view 1 for a student with lessons, notes, a balance and homework:
The result box is made taller in this picture so that the whole overview fits. In TutorFlow, scroll the result box to see the rest.
Examples:
list followed by view 2 shows the overview of the 2nd student.find Betsy followed by view 1 shows the overview of the 1st student in the results of the find command.remarkSets a free-text remark on a student, such as a preference or something to remember.
Format: remark INDEX r/REMARK
INDEX, which is the index number shown in the displayed student list and must be a positive integer 1, 2, 3, ...r/ with nothing after it removes the remark.view.Examples:
remark 1 r/Prefers morning lessons sets the remark of the 1st student.remark 1 r/ removes the remark of the 1st student.deleteDeletes the specified student from TutorFlow.
Format: delete INDEX [confirm]
INDEX.confirm.confirm can be written in any letter case, such as CONFIRM.undo command.Examples:
list followed by delete 2 deletes the 2nd student, if they have no linked records.delete 3 on a student with 12 lessons shows a prompt; delete 3 confirm then deletes the student and the 12 lessons.find Betsy followed by delete 1 deletes the 1st student in the results of the find command.sortSorts all students by name, ignoring upper and lower case.
Format: sort [asc|desc]
asc sorts from A to Z and desc sorts from Z to A. If no order is given, asc is used.find command. Archived students stay hidden; use list all/ to show them.sort, new students are added at the end of the list.Examples:
sort sorts all students from A to Z.sort desc sorts all students from Z to A.lesson addSchedules a lesson for a student.
Format: lesson add st/STUDENT_INDEX [s/SUBJECT] d/DATE t/TIME [dur/MINUTES] [v/VENUE] [past/]
STUDENT_INDEX is the index number shown in the displayed student list, and must be a positive integer 1, 2, 3, ...DATE is written in any of the ways to write a date, such as 2026-12-22, 22/12/2026 or 22 Dec 26, or as the word today or tmr (tomorrow), in any letter case, which TutorFlow works out from the date on your computer. It must be today or later, and no more than 2 years ahead, which catches a mistyped year.past/ is a flag that records a lesson that has already taken place, so that you can complete it and bill it. With past/, a date before today is accepted, up to 2 years ago, but a date after today is rejected, so use past/ only for a lesson that has already taken place. Without it, a date in the past is rejected, because that is usually a mistyped year. Every other rule still applies.lesson list can still show it after the student moves up a level. Lessons that were booked before this version show unknown (not recorded).TIME is written in 24-hour time, such as 16:30. 4:30pm and 1630 are also accepted; 4pm and 16.30 are not.MINUTES is the length of the lesson, from 15 to 480 in steps of 15. If it is left out, it is 60.SUBJECT must be one of the student's subjects, and is not case-sensitive. If the student has only one subject, it can be left out. If the student has several, it must be given.VENUE is up to 100 characters. If it is left out, the student's usual venue is used, or — if the student has none.t/23:00 dur/120 is rejected. Split it into two lessons.agenda or lesson list st/STUDENT_INDEX to see and number it before you use lesson done, lesson move or lesson cancel.Overlaps only warn: if the new lesson overlaps another scheduled lesson by at least one minute on the same date, it is still scheduled and the result lists the lessons it overlaps with. Lessons that end exactly when the next one starts do not overlap. Cancelled lessons are ignored.
Examples:
lesson add st/1 s/Math d/2026-12-22 t/16:30 dur/90 Schedules a 90-minute Math lesson for the 1st student at the student's usual venue.lesson add st/3 d/2026-12-23 t/19:00 v/Online Schedules a 60-minute lesson online for the 3rd student, in the only subject that student takes.lesson add st/3 d/tmr t/19:00 dur/60 v/Online Schedules a lesson for tomorrow.lesson add st/1 d/2026-10-12 t/16:30 past/ Records a lesson on 12 October 2026 that has already happened, even though that date is past. This example works only when today is after that date.lesson repeatSchedules the regular weekly lessons of a student in one command.
Format: lesson repeat st/STUDENT_INDEX [s/SUBJECT] d/START_DATE t/TIME [dur/MINUTES] [v/VENUE] count/COUNT [every/WEEKS]
lesson add, except that past/ is not accepted: a series starts today or later.restore INDEX, as for lesson add.COUNT is the number of lessons, from 2 to 52. WEEKS is the gap between two lessons in weeks, from 1 to 12; if every/ is left out, it is 1. Every lesson must fall within 2 years of today.START_DATE. Each later lesson is at the same time of day, WEEKS weeks after the one before it.This exact lesson already exists. No occurrences were added.agenda or lesson list st/STUDENT_INDEX to see and number them. If adding the series changes the numbers on screen, the result ends with Lesson numbers have changed. Current lesson list: and the new numbering, as lesson add does. If more than 30 lessons are listed, only the first 30 are shown, followed by how many more there are; run lesson list or agenda to see every number.lesson add. If many lessons of the series overlap, the warning is summarised in one line.Examples:
lesson repeat st/3 d/2026-12-03 t/16:00 count/4 Schedules four weekly lessons, starting on 3 December 2026.lesson repeat st/3 d/tmr t/17:00 dur/90 count/10 every/2 Schedules ten lessons two weeks apart, starting tomorrow. The result says Scheduled 10 occurrences, every 2 weeks.agendaShows the lessons of a day or of a week, in the order that they take place.
Format: agenda [d/DATE] [week/]
d/DATE, it shows today. DATE is written as for lesson add. The year must be from 2000 to 2099.week/, it shows the Monday to Sunday week that contains the date, one day after another. A day without lessons shows — no lessons —.⚠ overlaps.Alex Yeoh (phone ending 4567), so that you can tell their lessons apart before using a lesson number. If the last four digits are the same too, a short reference is added, such as Alex Yeoh (phone ending 4567, ref 7b04d3c8). An archived student is marked, such as David Li (archived).lesson move, lesson cancel, lesson done and lesson missed take, so run agenda or lesson list first and then use the number you see.Lesson numbers have changed. Current lesson list: and the refreshed list. If every lesson keeps its number, for example when a lesson only changes its time or is cancelled but stays in the list, the numbers are not shown again. Use those new numbers for your next command. If more than 30 lessons are listed, only the first 30 are shown, followed by how many more there are; run lesson list or agenda to see every number. Running agenda or lesson list again also refreshes the list.No lessons on Tue 22 Dec 2026.Example: agenda d/2026-11-02 week/ for a week with lessons on four of the seven days:
The result box is made taller in this picture so that the whole week fits.
Examples:
agenda Shows today's lessons.agenda d/2026-12-22 week/ Shows the week of Monday 21 December 2026.todayShows what today requires: today's lessons, past lessons not yet marked completed, overdue homework, and the students who owe money. TutorFlow also shows this when it starts.
Format: today
TODAY'S LESSONS, shows the number of lessons today and their total time, followed by the time, student, subject and venue of each lesson. Lessons that overlap another lesson are marked ⚠ overlaps. Cancelled lessons are left out.LESSONS AWAITING NOTES, shows the scheduled lessons from earlier days that were not marked completed, the most recent first.Alex Yeoh (phone ending 4567), and an archived student is marked, such as David Li (archived), as in the homework and dues sections. If the last four digits are the same too, a short reference is added, such as Alex Yeoh (phone ending 4567, ref 7b04d3c8). agenda uses the same labels.OVERDUE HOMEWORK, shows assigned work due before today, or No overdue homework.. Run hw list overdue/ to get selectable numbers.DUES, is the list that dues shows: how many students owe money and the total, then each student's amount and the age of their oldest unpaid charge, such as oldest unpaid 2 days or oldest unpaid 1 day, the oldest first. If nobody owes money, it shows No outstanding balances. Everyone is up to date.agenda for today's lessons, or lesson list st/STUDENT_INDEX all/ for a lesson awaiting notes, and use the number shown there. Right after TutorFlow starts, no lesson has a number yet, so a command such as lesson done 1 is refused with a message that tells you to run agenda or lesson list.No lessons today., All past lessons are recorded., No overdue homework. or No outstanding balances. Everyone is up to date.today does not number lessons. Run agenda or lesson list st/INDEX before using a lesson number in a later command.Examples:
today on Thursday 17 September 2026 might show:Thursday, 17 September 2026
TODAY'S LESSONS (2, 2h 30m)
16:30-18:00 Tan Wei Ming Math Blk 512 Bishan St 13 ⚠ overlaps
17:00-18:00 Priya s/o Kumar Physics Online ⚠ overlaps
LESSONS AWAITING NOTES (1)
Tue 15 Sep Lim Jia Hui Science not yet marked completed
OVERDUE HOMEWORK (1)
Priya s/o Kumar Trigonometry worksheet due 2026-09-15 OVERDUE
DUES
1 student(s) with outstanding balances — $25.00 total
Tan Wei Ming $25.00 oldest unpaid 2 days
lesson listShows the lessons of one student.
Format: lesson list st/STUDENT_INDEX [all/]
STUDENT_INDEX is the index number shown in the displayed student list.all/, past, completed, cancelled and missed lessons are shown as well.[Level at booking: S3], and the status. A lesson that was booked before this was recorded shows [Level at booking: unknown (not recorded)].lesson move, lesson cancel, lesson done and lesson missed take.Examples:
lesson list st/1 Shows the upcoming lessons of the 1st student.lesson list st/1 all/ Shows every lesson of the 1st student.lesson moveMoves a lesson to another date, time, duration or venue, and keeps everything else.
Format: lesson move INDEX [d/DATE] [t/TIME] [dur/MINUTES] [v/VENUE]
INDEX is the lesson number in the list that is currently shown by agenda or lesson list, and must be a positive integer 1, 2, 3, ...lesson add. A new date must be today or later. Only a date that you give is checked, so you can still change the time of a lesson that has already passed.lesson add instead.lesson move can change the date, time, duration and venue, but cannot clear the venue or change the subject. A move that would leave the lesson exactly as it is is rejected.Examples:
lesson move 1 d/2026-12-24 Moves the 1st lesson to 24 December 2026 at the same time.lesson move 2 t/17:00 v/Online Moves the 2nd lesson to 17:00 and changes its venue to Online.lesson cancelCancels a lesson but keeps its record, so that you can still see that the slot was booked.
Format: lesson cancel INDEX [r/REASON]
INDEX is the lesson number in the list that is currently shown by agenda or lesson list.REASON is up to 200 characters on one line, such as Student unwell. Reasons are free text and may contain prefix-like words.lesson add with the same details. The cancelled record stays in your history.charge reverse.Cancelling a missed lesson replaces its missed record: the lesson then counts as cancelled, not missed, in view and lesson list, and this cannot be undone. Only cancel a missed lesson if the "missed" was a mistake.
Examples:
lesson cancel 1 Cancels the 1st lesson.lesson cancel 3 r/Student unwell Cancels the 3rd lesson and records the reason.There is no command to delete a lesson; cancel it instead. Deleting lessons is not supported in this version.
lesson series cancelEnds a recurring series without erasing its history.
Format: lesson series cancel LESSON_INDEX confirm
confirm is required, and can be written in any letter case. Without it, no lesson is changed.Series cancelled. No record is deleted.confirm is required because the change affects multiple bookings.Cancelled N series occurrences. (or Cancelled 1 series occurrence. for a single occurrence).Example: lesson list st/1 all/, then lesson series cancel 3 confirm cancels the eligible occurrences of the series containing the 3rd displayed lesson.
lesson doneMarks a lesson completed and optionally records what was taught.
Format: lesson done INDEX [n/NOTES]
INDEX is the lesson number from the current agenda or lesson list, not the student number. It must be a positive integer. The today dashboard does not number lessons, so run agenda or lesson list first.Charge of $X.XX recorded. Updating notes never charges again. A fee that is zero, including after cent rounding, completes the lesson without creating a charge and explains why: for a rate of $0.00 it says No automatic charge: This student's rate is $0.00. and how to specify an amount. Use charge to bill a lesson by hand.NOTES is optional free text of 1–1000 printable characters on one line. Leading/trailing whitespace is trimmed and repeated spaces are collapsed. An empty n/, line breaks and repeated n/ parameters are rejected.view STUDENT_INDEX to see recent notes and the completed-lesson count.n/NOTES updates the notes on the same completed lesson. Omitting n/ retains existing notes. A lesson previously marked missed can also be changed to completed.lesson list. Use lesson list st/STUDENT_INDEX all/ to include it again; check the current lesson number before updating notes.n/ starts a note parameter, so it cannot also appear literally inside the note text.Examples:
agenda followed by lesson done 1 completes today's 1st lesson without adding notes.lesson list st/1 all/ followed by lesson done 2 n/Covered quadratic roots. Revise factorisation. completes the 2nd displayed lesson or updates its notes if already completed.lesson prepRecords what to bring or prepare before a lesson, separately from the notes taken after it.
Format: lesson prep INDEX n/NOTES
INDEX is the lesson number from the current agenda or lesson list.NOTES is 1-1000 printable characters on one line. A new preparation replaces the previous one.lesson list and in the next-lesson section of view.Examples:
agenda followed by lesson prep 1 n/Bring the mock paper records preparation for the 1st lesson on display.lesson missedMarks a scheduled lesson as missed without deleting its record.
Format: lesson missed INDEX
INDEX is the positive lesson number from the current agenda or lesson list, not the student number. Use lesson list st/STUDENT_INDEX all/ to select a past lesson.view STUDENT_INDEX under lesson history.all/ to include it again and check its current lesson number.lesson missed on the same missed lesson leaves it unchanged. If the lesson actually took place, use lesson done INDEX [n/NOTES] to correct it to completed.Examples:
agenda followed by lesson missed 1 marks today's 1st displayed lesson as missed.lesson list st/1 all/ followed by lesson missed 2 marks the 2nd displayed lesson as missed, provided it is scheduled for today or earlier.hw addAssigns homework to an active student.
Format: hw add st/STUDENT_INDEX desc/DESCRIPTION due/DATE
STUDENT_INDEX is a number from the displayed student list. Archived students must be restored first.DESCRIPTION is 1-200 printable characters on one line. DATE accepts any way of writing a date and must be from today through one calendar year ahead.assigned.Example: hw add st/1 desc/Algebra Q1-10 due/tmr
hw listShows homework history in a numbered list.
Format: hw list [st/STUDENT_INDEX] [overdue/|outstanding/]
st/, every student's homework is shown. overdue/ shows assigned work past its due date, while outstanding/ shows assigned and submitted work.overdue/ and outstanding/ cannot be combined. The list shows the first 200 rows and then Showing 200 of N homework item(s).hw list and stay fixed until the next one.Examples: hw list, hw list st/1 overdue/
hw editCorrects a homework description or due date without changing its status or feedback.
Format: hw edit INDEX [desc/DESCRIPTION] [due/DATE]
INDEX is a number from the last hw list, and at least one of desc/ or due/ is required.Example: hw edit 1 due/tmr
hw statusChanges the lifecycle state of a homework item.
Format: hw status INDEX s/assigned|submitted|reviewed
INDEX is a number from the last hw list. Status values are case-insensitive.overdue is derived from an assigned item's due date and cannot be set directly. Repeating the current status reports that it is already set.Example: hw status 1 s/submitted
hw feedbackRecords, replaces or clears feedback on homework.
Format: hw feedback INDEX f/[FEEDBACK]
INDEX is a number from the last hw list. FEEDBACK is 1-1000 printable characters.submitted or reviewed homework. An empty f/ clears feedback at any status.Examples: hw feedback 1 f/Revisit negative indices, hw feedback 1 f/
hw deleteDeletes a homework item and any follow-up tasks linked to it.
Format: hw delete INDEX [confirm]
INDEX is a number from the last hw list.confirm is required; without it nothing is deleted.That homework was deleted. Run 'hw list' to refresh.Examples: hw delete 2, hw delete 2 confirm
task addKeeps a to-do attached to the student, lesson, homework item or payment that it is about, so that you do not forget it.
Format: task add st/INDEX|lesson/INDEX|hw/INDEX|pay/INDEX desc/TEXT [due/DATE]
st/INDEX takes a number from the displayed student list. lesson/INDEX takes a lesson number from the last agenda or lesson list.hw/INDEX takes a homework number from the last hw list. pay/INDEX takes a payment number from the last pay list. If no payment list has been shown, or INDEX is out of range, TutorFlow answers Invalid payment index. Run 'pay list' first. If the selected homework or payment was deleted since, TutorFlow says so instead of picking another item; for a payment, the message is That payment was deleted. Run 'pay list' to refresh.TEXT is 1 to 200 characters on one line.DATE is written as for lesson add. It is optional, and a task without one is shown as (no due date). A due date must be today or later (today and tmr work), otherwise TutorFlow answers Due dates must be today or later.st/, lesson/, hw/ or pay/ may be given. A task has no other link, so a linked record cannot be changed later.Examples:
task add st/1 desc/Call parent due/2026-12-01 adds a task to the 1st student, due on 1 December 2026.task add lesson/1 desc/Prepare mock paper adds a task to the 1st lesson in the current agenda.task add pay/1 desc/Remind about fees adds a task to the 1st payment in the last pay list.task listShows the tasks that still have to be done.
Format: task list [all/] [st/INDEX]
all/, completed tasks are shown as well.st/INDEX limits the list to the tasks of one student, including the tasks about that student's lessons.task list: completing or deleting a task does not renumber the others.Examples:
task list shows the open tasks.task list all/ st/2 shows every task, open or done, of the 2nd student.task editChanges the text, and optionally the due date, of a task.
Format: task edit INDEX desc/TEXT [due/DATE|due/-]
INDEX is the task number from the last task list.desc/ is always needed. Leave out due/ to keep the due date, give a date (today or later) to change it, or write due/- to remove it.Examples:
task edit 1 desc/Call parent again due/- changes the text of task 1 and removes its due date.task doneMarks a task as done. It stays in the history, which task list all/ shows.
Format: task done INDEX
INDEX is the task number from the last task list. A task that is already done answers That task is already done.Examples:
task done 1task deleteDeletes a task for good.
Format: task delete INDEX [confirm]
INDEX is the task number from the last task list.confirm, TutorFlow only asks you to repeat the command with confirm and deletes nothing.That task was deleted. Run 'task list' to refresh.Examples:
task delete 1 asks for confirmation, and task delete 1 confirm then deletes task 1.payRecords money received from a student and shows the updated outstanding balance or credit.
Format: pay st/STUDENT_INDEX amt/AMOUNT [d/DATE] [n/NOTES]
STUDENT_INDEX is the positive student number in the displayed student list. After find, use that filtered list's numbers. It is independent of lesson numbers, so payment can follow lesson done immediately without running agenda or list again.AMOUNT must be greater than zero with at most two decimal places, such as 50, 50.00 or 0.50. Dollar signs, negative amounts, zero, commas and scientific notation are rejected, as is an amount written with more than 30 characters.Warning: $100000.00 is an unusually large payment. Check that the amount has no extra digits. There is no hard upper limit.DATE defaults to today using your computer's local date. It accepts any of the ways to write a date, and cannot be in the future. A future date is rejected with Payment dates cannot be in the future.1990-01-01 is accepted.pay, pay list, charge, balance, withdraw and lesson list, a student who shares a name with another student is labelled with the last four digits of their phone number, as in agenda, and an archived student is marked (archived).NOTES is optional printable text of 1–200 characters on one line, such as a transfer reference. Extra spaces are collapsed and the notes are saved with the payment.st/ and amt/ are required. Empty or repeated fields are rejected.save to retry; repeating pay would record a second payment.pay list and pay reverse. A lesson charge is corrected with charge reverse.Examples:
pay st/1 amt/20 records $20 received from the first displayed student today.pay st/2 amt/50.25 d/2026-10-18 n/PayNow ref 4471 records an earlier payment with a reference.Example output:
Payment of $20.00 recorded for Alice on 2026-10-19.
Balance: OUTSTANDING $30.00.
Payment indices stay as last shown; run 'pay list' to refresh.
pay list, pay reverseShows the payments you have recorded, and takes back a payment that was entered wrongly.
Format: pay list [st/STUDENT_INDEX]
Format to take a payment back: pay reverse PAYMENT_INDEX
pay list shows every payment, oldest first, or only those of one student when you give st/STUDENT_INDEX (a number from the displayed student list). Each row has a number, the date, the student, the amount and any notes. A payment that was reversed stays in the list, marked [REVERSED].pay list displays the first 200 rows and then Showing 200 of N payments. Hidden rows keep their numbers, so pay reverse INDEX can still address them.PAYMENT_INDEX is the number from the last pay list. The numbers stay fixed until you run pay list again, even after you add or reverse payments, so a number always means the row you saw.pay.Invalid payment index. Run 'pay list' to display payments first. Reversing a payment twice says That payment has already been reversed.Examples:
pay list lists all payments.pay list st/2 lists the payments of the second displayed student.pay reverse 2 reverses payment 2 of the last list.Example output. pay reverse 2 replies:
Payment of $50.00 reversed.
and a later pay list shows that payment marked:
PAYMENTS
1. 2026-10-18 Priya Kumar $100.00 — PayNow ref 4471
2. 2026-10-19 Priya Kumar $50.00 [REVERSED]
Use 'pay reverse INDEX' with these rows. Indices stay fixed until the next 'pay list'.
chargeRecords what a lesson cost by hand, or takes a charge back. TutorFlow normally charges a lesson by itself when you complete it with lesson done. charge is for the cases that does not cover: billing a missed lesson, an agreed discount, or a lesson of a student whose rate is $0.
Format: charge l/LESSON_INDEX [amt/AMOUNT]
Format to take a charge back: charge reverse l/LESSON_INDEX
LESSON_INDEX is the lesson number from the current agenda or lesson list, not the student number.amt/, the charge is the student's current hourly rate × the lesson duration ÷ 60, rounded to cents. AMOUNT must be greater than zero with at most two decimal places and at most 30 characters.Cannot charge a cancelled lesson., and a lesson that is still scheduled gives Cannot charge a lesson scheduled for Thu 22 Oct 2026.That lesson already has a charge of $75.50.amt/, TutorFlow asks you to specify an amount.charge reverse adds an opposite entry dated today, so the account shows both the charge and its correction. After a reversal the lesson can be charged again, for example with a different amount. If the student has already paid, the reversal can leave them in credit.Reverse the active charge with 'charge reverse l/INDEX' before cancelling or rescheduling this lesson.charge can still be completed with lesson done to correct a wrong "missed". It becomes completed and is not charged a second time.charge reverse on a lesson without an active charge gives That lesson has no active charge; it may already have been reversed.Examples:
charge l/1 charges lesson 1 at the student's rate.charge l/1 amt/50 charges $50 for lesson 1.charge reverse l/1 takes back the charge of lesson 1.Example output:
Charge of $75.50 recorded for Priya Kumar — Math, Sun 18 Oct 2026.
Charge of $75.50 reversed for Priya Kumar.
balanceShows a student's account: every charge and payment in date order with a running balance, and the total owed or in credit.
Format: balance st/INDEX
INDEX is the positive student number in the displayed student list. After find, it refers to that filtered list.withdrawal -$X.XX. A reversal (see charge reverse and pay reverse) is shown as its own row, reversal of charge (DATE) $X.XX or reversal of payment (DATE) $X.XX with the date of the entry it cancels, and is taken out of the totals. Events on the same day keep the order in which they were recorded. The last line gives the total charged, the total paid, the total withdrawn and the balance. Debt is shown as OUTSTANDING $X.XX; an overpayment is shown as IN CREDIT $X.XX, and a running balance that has gone into credit is shown the same way instead of as a negative number.No charges or payments recorded for NAME.lesson done, TutorFlow records the student's current hourly rate × the lesson duration in minutes ÷ 60, rounded to cents using HALF_UP, as one charge. For example, $60/hour for 90 minutes costs $90.00. Updating the notes later does not charge again. Changing the student's rate does not change earlier charges.charge.pay st/INDEX amt/AMOUNT to record money received, and withdraw to return available credit.Example: balance st/1 shows the account of the first displayed student:
Account — Lee Bob
2026-10-17 charge Chemistry lesson $90.00 bal $90.00
2026-10-19 payment -$50.00 bal $40.00
Total charged $90.00 · total paid $50.00 (after reversals) · total withdrawn $0.00 · OUTSTANDING $40.00
withdrawReturns credit from a student's account, for example after an overpayment. A withdrawal is kept as its own history entry; it never deletes or edits the original payment.
Format: withdraw st/STUDENT_INDEX amt/AMOUNT [d/DATE] [n/NOTES]
STUDENT_INDEX is the positive student number in the displayed student list. Archived students with credit can be selected from list archived/.AMOUNT must be greater than zero with at most two decimal places and at most 30 characters, and cannot exceed the student's available credit. Withdrawing the full credit is allowed.DATE defaults to today, accepts any of the ways to write a date, and cannot be in the future. NOTES is optional printable text of 1-200 characters on one line.withdrawal -$X.XX and reduces the available credit.Examples:
withdraw st/1 amt/20 returns $20 of credit to the first displayed student today.withdraw st/2 amt/50.25 d/2026-10-18 n/Bank transfer records an earlier withdrawal with a reference.duesLists every student with a positive balance, ordered by their oldest unpaid charge first, with a total amount owed.
Format: dues
find; the current student list and its indices are unchanged.DUES, the number of students and total owed, then each student’s amount and oldest unpaid N days (1 day for a single day). Archived students are included and marked (archived).No outstanding balances. Everyone is up to date.The student cards provide shortcuts that fill the command box for you. They do not run the command or change any data; you still review or complete the command and press Enter.
edit 1 n/ or edit 1 s/. Type the new value after the prefix and press Enter. Selecting another field replaces the prepared command. For subjects, the existing edit command replaces the whole subject list, so add every subject you want to keep.archive INDEX and delete INDEX for that card. Archiving and deletion keep their normal confirmation behaviour, so nothing happens until you submit the command.Cancel appears beside the card's top-right pencil. Click it to leave field-editing mode; it then disappears with the field pencils. It clears the prepared command only if you have not changed it and another shortcut has not replaced it. A command you typed yourself is left alone.add n/ and puts the cursor there. Complete the remaining required prefixes and press Enter.help edit or help archive, in the terminal where TutorFlow was launched. Run that command in TutorFlow to read the full usage.The number in a prepared command is the number shown on the card in the current list. Commands use the same numbering as every other indexed command, so run list, list archived/ or a search first when you need to choose the numbering. If the displayed list changes, TutorFlow clears an unchanged prepared command and closes field-editing mode so that an old number is not submitted by mistake. Text you changed yourself is never overwritten.
travelSets one offline buffer for journeys between lessons at different physical venues. Warnings never block a booking and do not calculate routes or actual journey times.
Format: travel buffer/MINUTES
MINUTES must be a whole number from 0 to 180, inclusive. The default is 30 minutes; 0 disables travel warnings. The setting is saved and restored on reopening TutorFlow. Any other value, such as buffer/200, shows the command usage and changes nothing.Travel warning: Tan Wei Ming at Bishan -> Priya Kumar at Clementi (Sat 24 Oct 2026 11:10): 10 min available; 30 min required. Back-to-back lessons at different venues have a zero-minute gap and can therefore trigger a travel warning without overlapping.Online (ignoring case), or the same venue ignoring case. If several preceding lessons finish together, the first at a different physical venue is used.lesson add, lesson repeat and lesson move, warnings cover journeys into or out of the added or moved lessons, not unrelated journeys on those dates. Warnings also appear below each day's relevant lessons in agenda and below today's lessons in today, and when you change the buffer, which lists the warnings on every date, including past ones. Changing the buffer does not change the currently displayed lesson numbers.Examples:
travel buffer/10 sets a ten-minute buffer and reports insufficient gaps.travel buffer/0 disables travel warnings; overlap warnings still work.Every date parameter, such as d/ in lesson add, agenda and pay, due/ in hw add and task add, accepts the same ways of writing a date, so you can type the one you find quickest.
/, -, . or a space, the same one between all three.12/22/2026 is not accepted.9 or 09, or its English name in full or short, such as Sep, Sept or September, in any letter case.today and tmr also work wherever a date is accepted, in any letter case.30/02/2026, is rejected. It is never moved to a nearby date.| You can write | Meaning |
|---|---|
2026-12-22, 2026/12/22, 2026.12.22, 2026 Dec 22 | 22 December 2026, year first |
22/12/2026, 22-12-2026, 22.12.2026, 22 December 2026 | 22 December 2026, day first |
22/12/26, 22-Dec-26, 22 Dec 26, 22.12.26 | 22 December 2026, with a two-digit year |
35-12-31 | 31 December 2035, because 35 December is not a date |
Two-digit years are read day first: a date such as 05/10/26 is read as 5 October 2026, never as 26 October 2005. A year-first reading is used only when the day-first reading is not a real date, as in 35-12-31, which is 31 December 2035. Write the year with four digits when you want to be certain. Most commands that take a date show it in full in their reply, such as Tue 22 Dec 2026; some list-style replies use the stored YYYY-MM-DD form instead.
helpShows every command, or how to use one command, without leaving TutorFlow.
Format: help [COMMAND]
help shows every command with a one-line summary.help COMMAND shows what the command does, its parameters and an example. COMMAND is the command as you type it, so for the lesson commands write both words, such as help lesson add.help lesson lists the commands that start with lesson.COMMAND is not case-sensitive, like every command word, so help LESSON ADD works like help lesson add. For a name that is not a command, such as help foo, TutorFlow says No help available for 'foo'. Type 'help' for the full list.Help menu or press F1. The guide opens in a resizable window and works offline. Use its Contents links to jump to any feature. External links are disabled inside the offline viewer, which shows a message when you activate one. It shows the User Guide bundled with your version of the app. Click Reload guide to return to that bundled guide.help COMMAND are short syntax references. The full guide includes the field limits, examples and behavior rules.Reload guide does not download newer documentation into an older JAR.Example: help lesson add shows what the command does, its parameters and an example:
Examples:
help lists all commands.help lesson move shows how to reschedule a lesson.clearDeletes all students, lessons, homework, tasks, and financial history (charges and payments) from TutorFlow.
Format: clear confirm
clear on its own deletes nothing. It only reminds you what would be deleted and how to confirm.confirm can be written in any letter case. Anything else after clear is rejected, so a mistyped command can never wipe your data.undo immediately after the clear can restore it in this session, but it is still wise to keep a backup.clear confirm also resets the travel buffer to 30 minutes and the saved student sort order.undo restores it. Closing TutorFlow or making another change removes that undo opportunity.Examples:
clear shows This deletes ALL students, lessons, homework, tasks, and financial history. Type 'clear confirm' to proceed.clear confirm deletes everything.demoLoads sample students into a new data set so you can explore TutorFlow without entering your own records.
Format: demo [confirm]
demo previews the sample-data action. demo confirm loads the bundled sample students.clear confirm first if you have already entered data, used sort or changed the travel buffer.clear confirm to remove the sample data afterwards.undoReverses the latest deletion or clear made in this session.
Format: undo
delete, hw delete, task delete and clear confirm; it does not restore lesson cancellations, lesson prep, payments or other edits.list and view do not.save can retry the write.Examples:
undo with no eligible action shows Nothing to undo. Undo restores your latest deletion or clear, and only until you make another change.delete 2 confirm followed by undo shows Undone: student deletion. Your data is back as it was before., reversing the delete.exitExits the program.
Format: exit
TutorFlow automatically saves after a command changes data. If saving fails, fix the reported problem and use save to retry before closing.
Each save is written completely to a temporary file beside the data file before replacing the previous save. If writing fails, the previous saved contents remain intact. If your file system cannot replace files atomically, TutorFlow reports a save error; move the app to a local folder that supports atomic file replacement and retry.
If a change cannot be saved, for example because the disk is full or the file is read-only, TutorFlow says Your change was applied in this session but could not be saved, and the reason. The change is still in the running app, so fix the problem (free some space, or make the file writable) and run save to retry saving. Closing TutorFlow with exit, the window close button, or File > Exit retries saving and is refused if saving still fails, so that you do not lose the change.
Read-only commands do not routinely save. After a failed save, they display an unsaved-changes reminder. Run save after fixing the problem; a successful retry clears that reminder.
Only open one instance for a data file: concurrent instances use last-write-wins and can overwrite each other's changes.
Names, venues, reasons and notes must be printable text on one line; repeated spaces are collapsed. Values that an older version accepted stay readable when an older data file is loaded.
TutorFlow data is saved automatically as a JSON file data/tutorflow-v14.json relative to the folder from which TutorFlow is launched. Advanced users are welcome to update data directly by editing that data file.
Every lesson and homework assignment must link to a student in the same file through its internal student ID. Legacy lessons are linked by name and phone during migration. Missing student links are treated as invalid, as described below.
Caution:
If your changes make the data file invalid, TutorFlow does not delete it. At the next run it renames the file to tutorflow-v14.json.corrupt (or tutorflow-v14.json.corrupt.1 and so on, if that name is taken), starts with no students and lessons, and tells you where the file went. Fix the file and rename it back to tutorflow-v14.json while TutorFlow is closed to get your records back. We still recommend backing up the file before editing it.
If the original cannot be renamed (for example, while another program holds it open), saving is blocked and retries preservation before replacing it. The original bytes are retained in the .corrupt copy once the lock clears.
If TutorFlow cannot open the data file, for example because another program holds it open or you may not read it, the file can well be valid, so TutorFlow never renames it. It does not start: a window says why, nothing is changed, and nothing is saved over the file. Fix the problem and start TutorFlow again.
Furthermore, certain edits can cause TutorFlow to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.
Archiving whole data files is not supported in this version. Use archive to keep a student out of the active list, or copy the data file while TutorFlow is closed if you need a backup.
Q: How do I transfer my data to another computer?
A: Install the app on the other computer and overwrite the data file it creates with the data file from your previous TutorFlow home folder.
Q: How do I load the sample students?
A: Run demo confirm on a new data set. It does not replace existing records; use clear confirm first if you have already entered data.
Q: Why does lesson done 1 say the lesson index is invalid after start-up or today?
A: Lesson numbers come from the last list shown. Run agenda or lesson list st/INDEX first, then use the number shown there. today does not number lessons.
Q: How do I correct a payment entered by mistake?
A: Run pay list to display the payment numbers, then pay reverse PAYMENT_INDEX. Record the payment again if it was reversed by mistake.
Q: Where is my data file?
A: It is data/tutorflow-v14.json inside the folder from which TutorFlow is launched.
Q: How do I correct a charge?
A: Run charge reverse l/LESSON_INDEX, then use charge l/LESSON_INDEX again if a different amount is needed.
preferences.json file created by the application before running the application again.Help menu or the keyboard shortcut F1 again, the original Help Window will remain minimized, and no new Help Window will appear. The remedy is to manually restore the minimized Help Window. The help command displays command information in the main window.agenda, today and lesson list can therefore look misaligned when a name, subject or venue contains them. The same happens when a name is longer than 18 characters or carries a label such as (phone ending 4567). The information shown is still correct.These are known flaws in this version that the team plans to fix. Each one says what you see now and what TutorFlow will do instead.
add n/Cat Ho p/91234569 l/S3 s/Math r/25 junk, the word junk becomes part of the rate and TutorFlow answers Rate must be between 0 and 9999.99 with at most 2 decimal places, e.g. 45 or 62.50. TutorFlow will instead name the extra text, for example Unexpected text after the last parameter: junk, and keep the rate error for a rate that is really wrong.lesson add, the reply says Scheduled: ... without a lesson number, and the lesson appears in the list only if the list already covers its date or student. TutorFlow will add the number of the new lesson to the reply, and show the lesson in the list when it fits the filter, so lesson done, lesson move and lesson cancel can be used straight away.clear confirm. It cannot undo an edit, a lesson change or a payment, and it forgets the deletion as soon as you make another change. TutorFlow will keep a history of recent changes, so that undo can step back through several of them in one session.agenda, today and lesson list are padded by the number of characters, and a Chinese character is wider than a Latin letter. TutorFlow will pad by the width on screen, or show these results in a table.lesson list ... page/2, instead of repeating the command with a narrower filter.| Action | Format, Examples |
|---|---|
| Add | add n/NAME p/PHONE_NUMBER l/LEVEL s/SUBJECT... r/RATE [e/EMAIL] [v/VENUE] e.g., add n/James Ho p/22224444 l/S3 s/Math s/Physics r/55 e/jamesho@example.com v/Online |
| Delete | delete INDEX [confirm]e.g., delete 3, delete 3 confirm |
| Edit | edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [l/LEVEL] [s/SUBJECT]... [r/RATE] [v/VENUE]e.g., edit 2 n/James Lee e/jameslee@example.com |
| Find | find KEYWORD [MORE_KEYWORDS]e.g., find James Jake |
| List | list [l/LEVEL] [s/SUBJECT] [archived/|all/]e.g., list, list l/S3 s/Math, list archived/ |
| View | view INDEXe.g., view 1 |
| Sort | sort [asc|desc]e.g., sort desc |
| Archive / Restore | archive INDEX, restore INDEXe.g., archive 3, list archived/ then restore 1 |
| Student aliases | student add|edit|delete|find|view|list|archive|restore ... (with the same arguments)e.g., student list l/S3 |
| Remark | remark INDEX r/REMARKe.g., remark 1 r/Prefers morning lessons |
| Action | Format, Examples |
|---|---|
| Lesson add | lesson add st/STUDENT_INDEX [s/SUBJECT] d/DATE t/TIME [dur/MINUTES] [v/VENUE] [past/]e.g., lesson add st/1 s/Math d/2026-12-22 t/16:30 dur/90, lesson add st/1 d/tmr t/16:30, lesson add st/1 d/2026-10-12 t/16:30 past/ |
| Lesson repeat | lesson repeat st/STUDENT_INDEX [s/SUBJECT] d/START_DATE t/TIME [dur/MINUTES] [v/VENUE] count/COUNT [every/WEEKS]e.g., lesson repeat st/3 d/2026-12-03 t/16:00 count/4, lesson repeat st/3 d/tmr t/17:00 dur/90 count/10 every/2 |
| Agenda | agenda [d/DATE] [week/]e.g., agenda d/2026-12-22 week/ |
| Today | today |
| Lesson list | lesson list st/STUDENT_INDEX [all/]e.g., lesson list st/1 all/ |
| Lesson move | lesson move INDEX [d/DATE] [t/TIME] [dur/MINUTES] [v/VENUE]e.g., lesson move 1 d/2026-12-24 t/17:00 |
| Lesson cancel | lesson cancel INDEX [r/REASON]e.g., lesson cancel 1 r/Student unwell |
| Lesson series cancel | lesson series cancel LESSON_INDEX confirme.g., lesson series cancel 3 confirm |
| Lesson done | lesson done INDEX [n/NOTES]e.g., lesson done 1 n/Covered quadratic roots |
| Lesson missed | lesson missed INDEXe.g., lesson missed 1 |
| Lesson prep | lesson prep INDEX n/NOTESe.g., lesson prep 1 n/Bring the mock paper |
| Action | Format, Examples |
|---|---|
| Homework add | hw add st/STUDENT_INDEX desc/DESCRIPTION due/DATEe.g., hw add st/1 desc/Algebra Q1-10 due/tmr |
| Homework list | hw list [st/STUDENT_INDEX] [overdue/|outstanding/]e.g., hw list, hw list st/1 overdue/ |
| Homework edit | hw edit INDEX [desc/DESCRIPTION] [due/DATE]e.g., hw edit 1 due/tmr |
| Homework status | hw status INDEX s/assigned|submitted|reviewede.g., hw status 1 s/submitted |
| Homework feedback | hw feedback INDEX f/[FEEDBACK]e.g., hw feedback 1 f/Revisit negative indices, hw feedback 1 f/ to clear |
| Homework delete | hw delete INDEX [confirm]e.g., hw delete 2, hw delete 2 confirm |
| Action | Format, Examples |
|---|---|
| Task add | task add st/INDEX|lesson/INDEX|hw/INDEX|pay/INDEX desc/TEXT [due/DATE]e.g., task add st/1 desc/Call parent due/tmr, task add pay/1 desc/Remind about fees |
| Task list | task list [all/] [st/INDEX]e.g., task list, task list all/, task list st/1 |
| Task edit | task edit INDEX desc/TEXT [due/DATE|due/-]e.g., task edit 1 desc/Call parent again due/- |
| Task done | task done INDEXe.g., task done 1 |
| Task delete | task delete INDEX [confirm]e.g., task delete 1, task delete 1 confirm |
| Action | Format, Examples |
|---|---|
| Balance | balance st/INDEXe.g., balance st/1 |
| Charge | charge l/LESSON_INDEX [amt/AMOUNT], charge reverse l/LESSON_INDEXe.g., charge l/1, charge l/1 amt/50, charge reverse l/1 |
| Payment | pay st/STUDENT_INDEX amt/AMOUNT [d/DATE] [n/NOTES]e.g., pay st/1 amt/50 |
| Payment list / reverse | pay list [st/STUDENT_INDEX], pay reverse PAYMENT_INDEXe.g., pay list st/2, pay reverse 2 |
| Withdraw | withdraw st/STUDENT_INDEX amt/AMOUNT [d/DATE] [n/NOTES]e.g., withdraw st/1 amt/20 |
| Dues | dues |
| Action | Format, Examples |
|---|---|
| Clear | clear confirm |
| Help | help [COMMAND]e.g., help, help lesson add |
| Demo | demo [confirm]e.g., demo, demo confirm |
| Undo | undo |
| Save | save |
| Exit | exit |
| Travel | travel buffer/MINUTESe.g., travel buffer/30 |
TutorFlow reads data/tutorflow-v14.json. If it is absent, TutorFlow reads the legacy data/addressbook.json, assigns stable internal student and lesson identifiers, and saves a new tutorflow-v14.json. The legacy file is left untouched; if both files exist, the v1.4 file takes precedence. Keep both in your backup.
Files without later records, such as homework or financial history, start with empty records for those features. An unsupported newer schema stops startup and leaves the original file unchanged. Invalid content uses the recovery flow described under Editing the data file. A file that cannot be opened is never renamed or overwritten.
If the first migration save fails, TutorFlow reports unsaved changes; fix the write problem and use save before closing. The current file is created only after a complete atomic save, so a restart can resume from the untouched legacy source.