ANU Timetable

See how your ANU tutorial and lab groups fit around your lectures, one dated week at a time.

Live: https://comp4020-crit7-petrewei.fly.dev

MyTimetable shows each course’s groups on their own, with no way to see how the allocated groups fit together across courses. This app lists the groups for each lab and tutorial with the allocated one marked, lets you record a different group, and shows your lectures and allocated groups on the dates they meet, with clashes marked on the dates they happen.

It models my own Second Semester 2026 timetable (COMP3300, COMP3500 and COMP4020) and has no login, so anyone with the URL can change the recorded allocation.

Features

Data

Sessions and groups were copied from MyTimetable on 29 September 2026 into src/data/timetable-2026-s2.json, with the COMP4020 tutorial group names and tutors from the course website on 30 September, and the database is seeded from that file on every boot. The calendar feed URL stays out of the repo because it gives read access to my timetable.

Tech Stack

Getting Started

You need Node 24 and pnpm 11; mise install sets up both from mise.toml.

pnpm install
pnpm dev

The dev server runs at http://localhost:4321. The database is created at .data/app.db; set DATABASE_PATH to use another file.

Command What it does
pnpm dev Start the dev server
pnpm build Build the Node server into dist/
pnpm check Type-check, build and run every test
pnpm db:generate Generate a migration after editing src/lib/schema.ts

Testing

The tests in spec/ boot the built server against a fresh database and cover persistence across a reload and a restart, the page’s own form, the rejected requests, the clash rule, the Chinese pages, that every group comes from the MyTimetable copy, and that no feed URL or uni ID is committed. Whether the page is clearer than MyTimetable and reads well on a phone is left to judgement in a browser.

Deployment

Every push to main runs the checks in GitHub Actions and, when they pass, deploys to Fly.io. Migrations run at boot on the machine that holds the volume.

Project Layout

Not Built

Preference ranking, login, live updates between tabs, and editing the timetable.

The agent’s working rules are in CLAUDE.md, and the account of how the app was built is in PROCESS.md.