Under the hood

What the importer does, in full.

A tracker that gets one deadline wrong is worse than no tracker. So the rules are written down here rather than described as “smart”.

Step 1

Working out the shape of your file.

An .xlsx workbook takes a shorter path. It is a zip of XML, unzipped and read in your browser: the cells are already cells, so there is no separator to guess, and a date cell is a number with a format attached rather than text — which means it converts exactly, with no month-first or day-first question to ask. When there are several sheets you pick the right one.

Pasted text and CSV have to be worked out. Tab, comma, semicolon and pipe are each tried against the first twenty lines. The winner is the one that produces the same column count on every line — consistency identifies a separator far more reliably than frequency does. Quoted cells containing the separator or a newline are handled, a UTF-8 byte-order mark is stripped, and Windows line endings are normalised.

The header is the first row with two or more filled cells, so a title or a “Fall 2026” banner sitting above your column names is skipped rather than read as the header.

Step 2

Reading dates, and admitting when it cannot.

Your cellRead asConfidenceWhat happens
2026-09-1212 September 2026exactImported silently. ISO is unambiguous.
Sep 12, 202612 September 2026exactImported silently.
Mon Sep 1212 September, year inferredassumedImported, flagged, with a note saying which year was assumed.
9/12/202612 September or 9 DecemberambiguousBoth readings are shown. You say once whether the sheet is month-first or day-first.
9/25/202625 September 2026exactOnly one reading is a real date, so there is nothing to ask.
4636610 December 2026assumedRecognised as a spreadsheet serial number and flagged.
next Fridaythe coming FridayassumedResolved against today and flagged.
TBD—noneRow is kept with no date and listed in the review step.

Times of day are pulled out separately (Friday 11:59pm, due 5pm) and stored apart from the date, because a due time that shifts by an hour twice a year is a real bug. All scheduling arithmetic is done in wall-clock terms in your timezone, so a 7am reminder stays at 7am across a daylight-saving change.

Step 3

Matching a re-import to what you already have.

Each row gets an identity. If your sheet has an ID column, that is it. Otherwise the identity is the class name and the assignment title, both normalised — so “Problem Set 6” and “problem set 6” are the same thing, and “Problem set 7” is not.

New

No match

Created as new work.

Changed

One match, fields differ

Only the fields that differ are updated, and each one is listed in the preview.

Same

One match, identical

Left alone entirely. No write, no history entry.

Ambiguous

More than one match

Shown to you. Never merged automatically.

A blank cell never erases anything. If your sheet has an empty Notes column and the tracker has notes on that assignment, the notes stay. Deleting data requires you to say so explicitly.

Step 4

Undo, and what it costs you.

Every write records what the field held before it. An import is a batch, so reverting it walks its changes backwards: created rows are removed and updated fields are put back to their previous values. Undoing your most recent import is free. Restoring an older edit or an earlier import from the history page is part of the paid plan.

The original row from your file is stored alongside each imported assignment, so it is always possible to see the text the record was built from rather than only the interpretation of it.