About

One table, seven columns, no account. The constraints are the point.

What the page does

It generates one HTML table: a row for every time slot between the start and end you choose, and a column for each day of the week. The cells are editable, which is the whole tool. There is no calendar backend, no account and no sync.

Everything else on the page — the print stylesheet and the CSV writer — exists to get that table out of the browser.

The generation rules

DecisionRuleConsequence
RowsFrom the start time up to, but not including, the end time07:00–22:00 with 60-minute rows gives 15 rows, the last at 21:00
Empty end timeEnd must be later than startAn invalid range clears the grid and says so, rather than guessing
Row length15, 30 or 60 minutesShorter rows mean more cells; the printout gets longer and the browser slower
Row cap96 rowsEnough for a 15-minute grid across 24 hours; beyond that the grid stops and says so
DaysMonday to Sunday, always seven columnsNo weekend-only or weekday-only views; print a narrower time range instead
RebuildText is matched by day and timeText survives a change of hours; text on a time that no longer exists is dropped

Keyboard and typing

Cells are ordinary contenteditable elements, so the browser's own editing applies: Tab moves forward, Shift+Tab back, Enter moves down the same day and Shift+Enter adds a line inside a cell. Pasting inserts text, but how much formatting survives is up to the browser, so a clean cell is best filled by typing.

Each cell carries an accessible label such as "Tue 09:00", so a screen reader announces the position rather than an empty box. The table has header cells for both the time column and the day columns.

Printing

The print button calls the browser's own print dialog; there is no server-side PDF. The print stylesheet hides the header, footer, navigation, controls, heading and FAQ, sets a landscape page and keeps each row from splitting across pages. What remains is the title line and the table.

Margins, scale and paper size are still the browser's: choose landscape, and if the columns look cramped, set 15-minute rows aside and use 30. Safari and Firefox occasionally ignore the @page hint and print in portrait; selecting landscape in the dialog fixes it.

CSV export

The export is a grid, not a calendar file: the first row is Time,Mon,Tue,…,Sun and each following row is one time slot. Cells containing a comma, a double quote or a line break are wrapped in quotes with internal quotes doubled, following the usual CSV convention. Line endings are CRLF so Excel opens the file without the columns collapsing.

The file is assembled in memory and downloaded through a temporary blob URL; the bytes never touch the server. File names are fixed as weekly-schedule.csv, so a second export will not overwrite the first unless your browser is set to do so.

What it deliberately does not do

A plan you cannot keep is worse than no plan. If the grid comes out full, remove something before printing. The empty rows are the part that makes the week survive contact with reality.

How the pages are built

Four static pages, one stylesheet and one script, served from this domain. No framework, no third-party script, no analytics, no cookie. The grid builder is plain JavaScript using DOM APIs; the slot arithmetic and the CSV writer are pure functions and are covered by tests outside the browser.

Corrections

The slot and CSV rules live in the shared script, not in the page text. A fix goes there and is checked against the tests, so the tool and this description cannot drift apart.