
Learning Management System
Once their marketing site was live, it was time to replatform the #HalfTheStory Learning Management System.
The LMS curriculum lived on a separate learning platform on its own subdomain, with its own content management and its own database. A teacher who found a lesson through the marketing site had to leave the site to use it.
That old LMS was built for an earlier stage of the organization, and it did the job for a while. But the #HalfTheStory team needed something more scalable if the platform was going to grow. As it was, a school couldn’t sign itself up, teachers had to be added by hand, and nobody could buy access without someone at #HalfTheStory processing it personally. Each of these tasks required administrative work.

We opted to build the platform inside the existing site rather than keeping it separate. It shares the codebase, the domain and the CMS, and lives under a /learning/ path. Content editing for the LMS is handled directly through the same CMS as the marketing site.
This choice made some interesting content choices possible. We made lesson content public by default, so titles, objectives, grade levels and standards are visible to anyone regardless of access. Organizations are granted subscriptions instead of that being handled on an individual basis, so a school can buy a program once and its teachers inherit access.
Content and people are kept deliberately separate in data. Sanity holds the site and LMS content, while a Postgres database holds accounts, subscriptions and activity. The application merges them when it renders a page. That boundary lets a lesson be public while a teacher's private notes in the LMS stay tied to their authentication.

Self-serve signup allows a school to register, invite its own teachers via email, link or spreadsheet, manage its seats and handle its own billing through Stripe, with no one at #HalfTheStory having to be pulled into the loop. This saves hours of administrative work per week.
The old platform attached a survey to every lesson, and few teachers ever filled one in. We replaced this with a teaching journal tied to each lesson. Bilingual material used to require duplicate curricula, expecting editors to create an entire copy of a lesson to publish it in Spanish. Now English and Spanish sit as alternate resources on a single lesson, so translating something no longer doubles the maintenance work.
The platform is built with Next.js and Sanity, with Postgres for user data and Stripe for subscriptions, deployed on Vercel. It launched on July 31, 2026, with the old platform staying alongside it for a transition period.
#HalfTheStory now has one capable platform containing both their marketing site and their LMS instead of two separate products, and they’re now able to grow and sign on new schools without being bogged down by unnecessary admin work. For a nonprofit team of this size, that’s a huge difference, and is a big part of why we focus on building technology that simplifies workflows.
When we migrated the curriculum from the old LMS along with their professional development modules, we left their slides and video where they already were, in Canva and Vimeo. These are tools the team knows, referenced by the platform so the team can transition into the new LMS without having to learn entirely new workflows.
Details
- Client
- #HalfTheStory
- Year
- 2026
- Work
- Platforms and applications, Portals and member experiences, Platform architecture, Data modelling, Interface design, Multilingual and multi-region systems











