← Work
Case No. 01EducationB2B + B2CMaintained

The brief was one app. The result is the platform.

Jolly Learning teaches millions of children to read. For six years we've been their software side: two Flutter apps, a gRPC backend, a live CMS, and the commerce layer behind their distributor network.

iOSAndroidWebmacOSWindowsLinux
platforms, one team, one contract6
installs on the consumer flagship, Jolly Phonics - Learn to Read5M+
stacks generated from one proto contract3
merged into a single systemB2B + B2C
ClientJolly Phonics
Engagementlong-term partnership, ongoing
Tech stackFlutter · Kotlin · TypeScript
PlatformsiOS · Android · Web · macOS · Windows · Linux
the product

The product.

Jolly Classroom activities screen: a core lesson of story, action, formation, song and worksheets above a grid of phonics activities, with classes in the sidebar
Jolly Classroom story activity: an illustrated scene with a snake and a boy, with the prompt "Listen to the story and discuss the picture"
Jolly Phonics Lessons home: a homework card with a mouse mascot above letter-sound tiles for group 1 - s, a, t, i, p, n - and a readers practice banner

classroom, the B2B flagship · lessons, the B2C flagship - one platform, thousands of activities

how the scope grew

Scope is the metric.

Six years, seven expansions, zero cold-start briefs. Every system below shipped because the one before it worked.

  1. 01Phonics course

    The brief: one teacher-led phonics course inside Jolly Classroom. It shipped, it held up in real classrooms, and that bought the next brief.

  2. 02Lessons overhaul

    The consumer app - millions of installs, untouched for years - was rebuilt without losing its audience. Trusted with the B2C line, the rest followed.

  3. 03Assessments

    Teacher grades, pupil reads, both devices in the same room, in sync. Assessments meant classes and pupils had to exist in the system for the first time - the platform's real foundation.

  4. 04Readers

    Decodable books joined the course, built through a dedicated readers pipeline instead of hand-placed. Content production started scaling - and the next brief leaned on it.

  5. 05Homework

    Classroom assigns; Lessons completes it at home. The first feature to connect the teacher app and the pupil app end to end.

  6. 06Grammar programmes

    SGP1, SGP2, and a ground-up rebuild of the flagship phonics programme - on the same content model, at a pace a hand-built course could never match. Scale, not scope, was the proof point.

  7. now
    07Jolly Connect

    Retail customers and school distributors merge into one login, one commerce layer, one CRM - the business side joins the classroom side.

the system

One team. One contract. Six platforms.

appsFlutter
  • ClassroomB2B flagship for schools - web, macOS, Windows, Linux
  • LessonsB2C flagship for home - iOS, Android
backendKotlin
  • Ktor gRPC APIcloud API gateway, gRPC-web
  • Firebaseauth + Firestore, read by client and server
cmsFlutter
  • Live content CMSbuilt into Classroom - courses, activities, media
  • ContentItem modelone shape for word, sound, letter, phrase
connectNext.js
  • Jolly Connectone portal for distributors, admins, trainers - CRM, analytics
  • Renewalsbespoke vouchers, VAT, multi-currency - next to RevenueCat retail
pipelinecontent
  • Readers builderdecodable books, built through a dedicated authoring tool
  • Offline bundlingchecksum-verified asset packs, downloaded ahead of the lesson

One protobuf contract generates Dart, Kotlin, and TypeScript. When the schema moves, every stack moves with it.

the hard parts

Four problems that earned the rest.

01

Rebuilt in flight

the problem

Lessons, the consumer flagship, had millions of installs and a UI frozen in years-old stock Material Design. A rebuild that deep usually means a relaunch - and a relaunch means abandoning the store listing, the reviews, and the audience the app had spent years earning.

what we did
A ground-up visual rebuild, shipped as an update to the live app. The new Lessons runs on the same design world as Classroom - one type system, one palette - so the two flagships finally read as one product family. And the rebuild unfroze the roadmap: digital readers and homework followed on the new foundation, wiring the consumer app into the platform instead of leaving it a satellite.
before
The inherited Jolly Phonics Lessons home: letter-sound groups as plain white pills on a cream background under a stock blue Material Design app bar
after
The rebuilt Lessons home: Group 1 letter-sound tiles with earned star stickers under a jungle-art banner, a readers practice button, and the locked Group 2 waiting below

the letter-sounds home, one rebuild apart · same listing, same audience

02

Assessments in lock-step

the problem

A teacher grades from one device while a pupil reads from another - in a real classroom, on school wifi that was never built for real-time sync. The two screens have to move as one, or the assessment doesn't work.

what we did
A synced session protocol: the teacher device owns the session, pupil devices join it and follow. Grading UI renders teacher-side only; content renders pupil-side only - neither device shows the other's half. Results roll into score tiers, the class dashboard, and parent reporting. This is also the moment classes and pupils became first-class objects in the system - assessments are the reason the platform has a roster at all.
The teacher's grading screen mid-assessment: the sentence 'We all had a good time at your party' with one word marked as an error, one as a self-correction, and the marking guide beneath
The pupil's side of a synced assessment: the sentence full screen, set in the letter-formation font

the teacher grades from their own device · the pupil only ever sees the sentence

03

Content as data

the problem

A literacy programme is thousands of activities across two accents and two handwriting styles. If every lesson is hand-built UI, every curriculum change is an app release - and a school without reliable internet still needs the lesson to load.

what we did
Four separate DTOs - WordDto, SoundDto, PhraseDto, WordSoundDto - became one ContentItem proto: a phrase composes of words, a word of sounds and letters, the same shape all the way down. A parallel media model resolves each asset to the right UK or US accent and print or precursive handwriting variant automatically. New activity types plug into that one content shape, and new lessons - or whole courses - now ship as data through a live CMS built into Classroom itself, not as an app release. The same asset model carries a build-time registry of checksums, so a class's content downloads and verifies ahead of the lesson and stays cached locally - a UK class never waits on, or accidentally pulls, US audio.
Jolly content editor: an activity group with a letter-formation preview of the letter B and a reorderable list of activity codes

the activity group editor · lessons assembled live, shipped as data

04

Two businesses, one login

the problem

Retail parents and school distributors lived in separate systems with separate identities, separate billing, and a renewal process that ran differently for every distributor and every currency. The client needed one platform without breaking either side.

what we did
Jolly Connect: a portal where one login spans both worlds. RevenueCat handles individual app-store billing on the retail side; a bespoke voucher, multi-currency, and VAT system - with human-in-the-loop approval on every renewal - runs the distributor side next to it. Primary auth bridges to the classroom backend through a custom token exchange, and the portal is generated off the same schema as the two apps - the third stack off one source. The business side now runs on the same platform as the classroom.
the design

The design system.

Jolly Phonics design specimen: shared Quicksand type, Sassoon print and precursive letter-formation fonts, and one core palette across both apps
One shared identity: both apps run on the same Quicksand type system and one core palette - primary yellow #FFC75E, pastel activity tints, a full gray ramp. The tell that it's one system: SassoonPrint and SassoonPrecursive, the letter-formation fonts, aren't a style choice - they're content, switching with whatever handwriting style the lesson teaches.
still shipping

Six years in, the platform still runs on one team and one loop.

Classroom runs on web and desktop, Lessons on iOS and Android, staging and live on separate infrastructure - and every one of those surfaces still ships through the same agent loop: an architect that plans, a maintainer that writes, a reviewer that checks, and a pre-commit gate that has the final word. That loop runs its own MCP server against this exact repository, on every change that ships.
talk to us

Building something with this much surface?

The engineers who run this platform answer the contact form.