The Summer Reading Program
we built for Josephine Library runs every summer. Families sign up, log the
time they spend reading, and library staff track participation across the
whole program. It's been running long enough now that the interesting work
isn't the initial build — it's what we've learned from watching it get used.
This year we shipped a round of improvements based on that.
Reporting that staff can actually read
The logged reading times were all there, but getting them out of the system
in a usable shape took more effort than it should have. We rebuilt the export
so staff can pull the data and work with it directly — no reformatting before
it's readable, no wrestling with it to answer a simple question about how the
program is going.
That matters more than it sounds. When reporting is awkward, people check it
less often, and a program that runs for a few short months doesn't leave much
room to notice a problem late.
A reset that doesn't cost readers their account
Because the program runs annually, every new summer used to raise the same
question: what happens to everyone who took part last year?
We built a reset that clears the logged times but keeps the accounts. Anyone
who participated before can sign in with what they already have and start
logging again. No re-registration, no duplicate accounts cluttering the
reporting, and no returning family being asked to prove they exist for the
second year running.
For staff it turns the start of the season into a single deliberate action
rather than a migration.
Why we keep coming back to this one
We've worked with Josephine Library for years — starting with their main site,
then this. Long relationships are where the useful work happens. You stop
guessing at what people need and start seeing which parts they actually use,
which parts they route around, and which parts quietly waste someone's
afternoon every week.
Most of what shipped this year came from watching, not from a feature request.