Back to Cases
#arrow-left

Unibrix

#menu

Cases / EdTech / Reading Platform

#logo
#close
Start building now
#arrow-right
Get in touch
#envelope
LET'S BUILD

Ready to start your project?

Tell us about your challenge. We'll engineer a solution that scales with precision.

We typically respond within 24 hours
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
PROJECT OVERVIEW

Reading Platform

[ AI READING PRACTICE FOR SCHOOLS AND FAMILIES ]

A reading platform that listens word by wordand scores every passage a child reads aloud

CATEGORY
EdTech / Early Literacy / Speech AI
TIMELINE
November 2025 to March 2026
COMPONENTS
Design system, character system, installable web app, REST API, speech-scoringintegration
STATUS
● DELIVERED
SERVICES PROVIDED
UX/UI Design
Design System
Character Design
Front-end Dev
Back-end Dev
AI Integration
Cloud Deployment
QA Automation
TECHNOLOGY STACK
Next.js
React
TypeScript
Tailwind CSS
NestJS
PostgreSQL
TypeORM
WebSocket
AWS ECS
AWS S3
Playwright
wav2vec2
Interface showing a reading aloud passage with the phrase 'The little fox jumped over the stream' where some words are highlighted in blue and 'over' in yellow, a real-time audio waveform below, and a reading score of 92 in a circular progress indicator on the right.
01
STEP 01 — Project overview

Assembly Requirements

MODULE INVENTORY (5 COMPONENTS)

A European education technology company set out to build a reading practice platform for young children: an installable web app, designed firstfor tablets, where a child reads a passage aloud and the page follows along word by word.

Reading practice at home and in class rarely gets feedback in the moment. A child reads to a parent who is busy or to a teacher with a busyclassroom, and nobody records whether the passage was read fluently, only whether it was finished. The platform had to listen, respond while thechild was still reading, and turn every attempt into progress a teacher or parent could act on.

Unibrix designed the product and built both applications: the design system and Reedo, the character that gives the interface its voice; the RESTAPI that owns schools, classes, pupils, reading plans and progress; and the web client that runs the reading session, streaming the child’s voiceto the client’s speech-scoring service. The product serves administrators and young pupils who cannot yet manage a password.

The work was handed over to the client’s own engineering team, which continues to extend the platform on the same foundation.

Primary focus
#dot
Feedback that follows a child’s voice while the passage is still being
#dot
A character that gives the interface a face young readers respond to
#dot
Scores the platform can trust because the speech service has signed
#dot
Sign-in a young pupil never has to manage alone, with adults holdingthe exit
#dot
One product for administrators, schools, teachers, parents and pupils
What we delivered
#dot
Design system: product palette, Fredoka type and a radius scale fromone base
#dot
Reedo, an expressive mascot component with pointer-tracking eyes
#dot
UI design for role-specific dashboards and the reading session
#dot
NestJS REST API for school management and reading progress
#dot
Live reading session with streamed audio and word-level highlighting
#dot
Signed speech-session tokens and verified result submission
#dot
Containerised deployment to AWS ECS from GitHub Actions
02
STEP 02 — CHALLENGES IDENTIFIED

Assembly Requirements

MODULE INVENTORY (5 COMPONENTS)
REQUIRED CAPABILITIES
A
#checked
CHILD-SAFE ACCESS
Young pupils cannot be asked to type passwords, and a shared classroom tablet cannot stay signed in as an adult. A parent or teacher opens a pupil session on the child’sbehalf, and leaving it again requires the adult’s PIN, checked against a bcrypt hash on the server.
B
#checked
REAL-TIME FEEDBACK
Highlighting has to keep pace with a reading voice, not wait for the end of the passage. Interim transcripts may only advance the highlight within a bounded look-ahead,and final transcripts are re-aligned against the whole passage so a skipped or repeated word does not derail the rest.
C
#checked
TRUSTED SCORES
A reading score decides stars, streaks and what a teacher sees, so it cannot be something the browser simply reports. Every speech session starts from a short-lived tokenthe API signs, and a result is only accepted when it arrives signed by the speech service.
C
#checked
SCOPED DATA
Schools, teachers and parents each see only their own pupils. Scope is enforced in the service layer on every query, and a record outside the caller’s scope answers 404 rather than 403, so its existence is never confirmed to someone who should not know it.
03
STEP 03 — ASSEMBLY PROCESS

Solution Architecture

MODULE INVENTORY (5 COMPONENTS)
MODULE 3.1
● DESIGN FOUNDATIONS

The palette is declared once in globals.css as CSS custom properties and mapped into Tailwind 4 through an @theme inline block.Tailwind utilities, shadcn primitives and Radix components share the same values: #5AA6F2 for primary, #FFD84D for accent, #7EDCA0for success and #FF6B6B for alerts, over a sky gradient from #F9FAFB to #E8F4FF behind every screen. A complete dark set is definedalongside it.

Radius is one 8px base, and every step is derived from it with calc, from 4px on the smallest control to 24px on the large cards; rounded-full, 3xl and 2xl are what the interface reaches for most. Fredoka at 400, 500 and 700 is self-hosted through @fontsource and used forheadings and body alike, which is what gives the product its soft, child-facing voice.

Design style guide showing a color palette with six colors labeled Primary, Accent, Success, Alert, Ink, and Shell with their hexadecimal codes, a type section using Fredoka font in weights 700, 500, and 400 showing the text 'Read aloud' and 'Read aloud, word by word,' and a radius section illustrating rounded corner sizes from 4px to 24px labeled sm, md, lg (highlighted), xl, 2xl, and 3xl.
MODULE 3.2
● CHARACTER SYSTEM

Reedo gives the interface its tone through expressive mascot states, drawn as vector art and built as React components with sharedproperties. The character adapts to dashboard headers and sign-in screens, with an optional hover effect that gently lifts and enlarges it.

The watching state follows the pointer or a finger on a tablet, with movement constrained so the gaze stays within the eyes. Each statehas its place: watching on sign-in, happy in the header, stars during reading and celebrating on the session summary, with additionalstates held in reserve.

Chart showing six expressive mascot states with their appearances and contexts: Watching with wide eyes on sign-in screens, Happy with closed eyes in header and settings, With stars and small stars above in reading sessions, Celebrating with a holly decoration in session summaries, Encouraging with a neutral face drawn and in reserve, and Thinking with a similar neutral face drawn and in reserve.
MODULE 3.3
● LIVE READING SESSION

The reading session captures the microphone at 16 kHz mono and sends Int16 frames over a WebSocket to the speech-scoring service,in a continuous stream. Interim transcripts arrive while the child is reading; final ones arrive per utterance, and a reading score followsonce the service has run forced alignment on the passage.

Final transcripts are aligned to the passage by character-level edit distance across the whole accumulated transcript, which is what keepsthe highlight in place when a child repeats or skips a word. The same audio is encoded to FLAC in the browser and uploaded to S3 througha pre-signed URL the API issues with the session.

Flowchart showing process from microphone capturing 16 kHz mono audio to frames as Int16 stream, then sending via WebSocket to speech service, generating a transcript preview and final, and finally highlighting words one by one.
MODULE 3.4
● SIGNED SCORING LOOP

Each reading starts with the API minting an RS256 session token whose issuer, audience and expiry the speech service verifies, and whosesession identifier encodes the assignment, pupil, exercise and attempt. The web client opens the speech socket with that token, so theservice can attribute every score without trusting the browser.

Review selection is weighted against performance. calculateReviewWeight subtracts mean accuracy from 100 and adds a ten-point bonus while a child has two or fewer attempts on record, so an exercise averaging 60 percent carries a weight near 50 while one averaging 95 percent carries 15. Selection then walks the weighted total.

The result comes back as an HS256 token the API verifies before anything changes. Accepting it then updates stars with an atomic delta, rolls up study-plan progress, extends the reading streak, clears the class report cache and evaluates achievements, in that order, and theend-to-end suite exercises that path with signed results against a real Postgres.

Diagram showing a signed out and signed back process with three connected components: API (NestJS, Postgres), Web client (Next.js, mic), and Speech service (wav2vec2, client). The API connects to the web client via RS256 session, which sends audio and token to the speech service. The speech service returns an HS256 result to a Progress component tracking stars, streak, plan rollup, achievements, and report cache. The API verifies this progress. A note states no score is accepted unless signed by the speech service.
MODULE 3.5
● ROLE-SCOPED PLATFORM

The API uses NestJS 11 and Postgres 17 through TypeORM, with routes versioned under /api/v1 and documented through Swagger.Role-based access covers administrators, school administrators, teachers, parents and pupils, checked by a RolesGuard. Every servicescopes its queries with shared helpers that return a 404 for records outside the caller’s scope.

Teachers build ordered study plans from the passage library and assign them to a class or to one pupil, and parents get the same toolsthrough a personal group. Class reports are cached as jsonb with a configurable time to live and invalidated whenever membership orprogress changes, while role-sensitive fields are shaped by class-transformer groups so one endpoint serves a teacher, a parent and apupil different views of the same record.

Diagram showing role-based access across a product with four user roles: Admin (schools, school admins, every user), School admin (teachers and pupils in one school), Teacher (own classes, plans, assignments, reports), and Parent (own children, personal group, reports). Below, how a request is decided is explained in three sections: Role (RolesGuard against @HasRole, user and session re-read per request), Scope (ensure helpers in every service, out of scope answers 404), and Shape (class-transformer groups per role, one endpoint with several views).
04
STEP 04 — RESULTS

Delivered Impact

MODULE INVENTORY (5 COMPONENTS)
Word by Word
READING FEEDBACK
The highlight follows the child’svoice as
the passage is read, andre-aligns
on every final transcriptwhen
a word is repeated.
Signed Scores
INTEGRITY
Every speech session starts
from atoken the API signs,
and no scorechanges stars,
streaks or reportsunless the
speech service signed it.
Reedo
CHARACTER SYSTEM
Reedo carries the tone from sign-into
the session summary, onecomponent
per state, with eyes thatfollow the pointer.
PERFORMANCE OUTCOMES
A
#checked
Delivered a design system and an expressive mascot that set the product’s child-facing voice
A
#checked
Built a live reading session that streams a child’s voice and highlights each word as it is read
A
#checked
Established signed session and result tokens between the platform and the speech service
A
#checked
Enabled teachers and parents to assign reading and follow progress per class and per pupil
A
#checked
Handed over a foundation the client’s own engineering team continues to extend
ASSEMBLY PHILOSOPHY
We don't just code.
We build systems.
Piece by piece,
designed to snap perfectly
into your vision.
#dot-circle
#dot-circle
#dot-circle
#dot-circle