← All work

Ground-up build · Nonprofit · 2025

Coastal Literacy Project

A volunteer tutoring nonprofit ran 200 tutor-student matches on three spreadsheets and a shared inbox. We built something their staff can operate without us.

  • Rails
  • PostgreSQL
  • Hotwire
  • Sidekiq
6 hrs/wk
of staff time returned, previously spent reconciling spreadsheets
200+
tutor-student matches managed in one place
$0
in ongoing license fees — they own the code outright

The challenge

Three staff members coordinated volunteer tutors across eleven school sites. Matching one tutor to one student meant cross-referencing an availability spreadsheet, a background-check spreadsheet, and a school roster, then sending the introduction emails by hand. Quarterly grant reporting took the better part of a week.

What made it hard

  • The matching rules were real, and written down nowhere

    A tutor cannot be matched before their background check clears, some sites require two adults present, and certain students can only be seen during specific class periods. All of it lived in one staff member's head.

  • A fixed grant budget and a hard deadline

    Funding covered a defined scope, and the system had to be live before the fall term started. Going over meant not shipping.

  • No technical staff to hand it to

    Whatever we built had to be operable indefinitely by people who had never used an admin panel, without us on retainer.

What we built

  1. 1

    Wrote the matching rules down first

    Two sessions with staff turned tribal knowledge into an explicit list of constraints. That list became the test suite before it became code, which meant the rules were verified rather than assumed.

  2. 2

    Built the workflow around their actual process

    Not a generic CRM bent into shape. Screens that mirror the steps they already take, in their own vocabulary, so training took an afternoon.

  3. 3

    Automated the quarterly grant report

    The specific report their funder requires is now a button. It used to be a week of copying between spreadsheets.

  4. 4

    Documented it and handed it over

    A written runbook, a recorded admin walkthrough, and their own repository with their own deploy access. We're available to them, not required by them.

Scoping to a grant, not to a wishlist

Nonprofit budgets aren’t soft. When the money comes from a grant with a defined scope, there is no “we’ll find a bit more in Q3” — so the risk isn’t cost overrun, it’s ending the engagement with something half-built and unusable.

We handled that by sequencing the build so it was launchable early and got better, rather than all-or-nothing at the end. Matching and background-check tracking shipped first, because those two things alone eliminated the worst of the manual work. Grant reporting came second. The nice-to-haves were written down and explicitly deferred.

They hit the fall term with room in the budget. The deferred list is still deferred, which is the correct outcome — they have working software and their remaining funds, instead of features nobody had asked for twice.

“We have been pitched software that would have cost our entire technology budget every year, forever. We own this one. That distinction matters enormously to our board.”

[Client name], [Title], Coastal Literacy Project

Got something that looks like this?

Thirty minutes, no pitch. We'll tell you what it would actually take.

Book a free 30-min call

Rather not book a time? Send a message instead.