Case study · Harvard University Library
Moving a conservation records system to React in under eight weeks
ACORN is the system Harvard Library's conservators use to track every object that enters the lab, from treatment proposals and approvals to reports. Its Angular 14 front end had reached end of life. I led the front end of the move to React 19 and Next.js 16, from July 1 to production on August 24, 2026.
- Role
- Front-end lead
- Timeline
- July – August 2026
- Stack
- React 19, Next.js 16, TypeScript, Material UI, Node.js, MongoDB
- Team
- Notch8 with Harvard Library conservation staff
Under 8 weeks
from project start to production
100+
pull requests merged across client and API
~240
Playwright end-to-end tests in CI
WCAG 2.1 AA
audit led and findings fixed
The problem
Conservators rely on ACORN every day, so the new front end had to match the old one feature for feature before anyone could switch. That meant the full application: the records list, create and edit forms, proposals and approvals, item and treatment reports, advanced search, transfers, files and the admin lists.
It also had to keep the rules staff depend on: fields that only some roles can edit, warnings when someone else has a record open, and guards against losing unsaved work.
What I did
- Set up the React and Next.js app shell, routing, design tokens and shared component library that the rest of the migration followed
- Ported the full application to feature parity, working end to end from MongoDB schema changes through the API to the React UI
- Built PDF and Excel exports for treatment reports, including multilingual catalog data, and a rich-text editor for proposals and reports
- Wrote the project wiki and worked through review cycles with the library's conservation QA reviewer to confirm parity
Accessibility
I led a WCAG 2.1 AA audit of the new application and fixed what it found, setting a baseline in Material UI for focus order, skip navigation, dialog behavior and keyboard use across every migrated workflow.
The rich-text editor needed extra care: I added tab indentation, Escape to leave the editor, and correct focus inside dialogs, and stopped it from flagging unsaved changes the moment a form opened.
Quality
Moving fast only worked because every change was checked. I built the test suites and a GitHub Actions pipeline that blocks a pull request unless formatting, linting, TypeScript, unit and end-to-end tests all pass, and that rejects tests which pass only some of the time.
End-to-end
~240 tests
20 Playwright suites
Client unit
~1,200
assertions
Server
426
spec cases
Have a front end that needs to move?
Get in touch