11 August · foundations and deployment
Made the old application runnable in a modern environment.
Prepared the Django backend for Render, documented deployment gotchas, added missing migrations, switched storage configuration to the R2-compatible path, repaired dependency problems, served static assets, and made the frontend API base URL configurable.
11–12 August · backend safety and data contracts
Reduced hidden failure modes around uploads.
Removed dynamic header evaluation, rejected empty CSV drafts, normalized legacy header metadata and owner phone values, scoped upload access to the correct owner, restricted telemetry/origins, consolidated duplicate backend logic, and extracted validation phases so they could be tested.
11–12 August · frontend wizard and authentication
Made the upload wizard easier to reason about and recover.
Centralized session and resume state, made requests use the correct session-first token, split the large wizard component into clearer pieces, cleared stale matching state, escaped server-controlled messages, and added reproducible frontend verification.
13 August · final review and release
Closed the last release-blocking upload defects.
The backend now handles blank rows atomically and rolls back a partial upload if a later storage operation fails. The frontend accepts legacy licence naming, keeps Argos optional when that is the current business rule, preserves retryable wizard steps after request failures, and avoids race conditions when users select files quickly.