← Client work

Case study · Client: Teach for Romania · 2025-2026

Edu-Start: teachers measure how pupils progress, not just what grades they get.

A platform for Teach for Romania teachers in vulnerable schools. It assesses pupils in three areas, social-emotional skills (SEL), reading (LIT) and maths (NUM), at the start, middle and end of the year. Reports show progress by pupil, class and cohort of teachers.

Client
Teach for Romania
Role
Full rebuild: platform, site, integration
Period
2025 - 2026
Status
In production, on dev.edu-start.ro
The problem
The old platform measured only social-emotional skills. The programme also needed reading and maths, in the same place.
What I built
An SEL, LIT and NUM assessment platform, with questionnaires editable from the admin, reports by pupil, class and cohort, and an integration with an external partner.
The result
In production on dev.edu-start.ro, for Teach for Romania teachers.
dev.edu-start.ro
The Edu-Start site: we share opinions and experiences from education
  • 3 areas assessed: SEL, LIT, NUM
  • 3 moments a year: T0, Ti, T1
  • 18,056 schools in the imported register
  • 41 thousand lines of code written for the project

Counted in the project code and in the test database structure, on 5 November 2026. The schools come from the national register, imported from CSV.

01 · The problem

What the grade book does not show.

Teach for Romania sends teachers to schools in vulnerable communities. There, a child’s progress does not show only in grades: it matters whether they manage their emotions, whether they understand what they read, whether they cope with simple calculations.

The old Edu-Start platform measured only the social-emotional side. The programme needed all three areas in the same place, with reports a tutor can use for a whole cohort of teachers.

02 · What it does

Assessment at the start, middle and end of the year.

The teacher creates the class, adds the pupils and fills in the SEL and LIT questionnaires at each stage: T0 at the start, Ti in the middle, T1 at the end. Answers are saved automatically as a draft, with the completion percentage, and scores are calculated by chapter. Maths results (NUM) come in automatically from an external partner.

Tutors see all the classes of the teachers they coordinate. Teach for Romania administrators switch modules on and off for each cohort and export the data.

The LIT - Literacy (reading) page on the new Edu-Start site
The page about the reading assessment (LIT): comprehension and accuracy, measured between stages.

03 · How the data flows

From the school register to the cohort report.

  1. 01

    Register

    • 42 counties, 7,467 localities
    • 18,056 schools, with SIIIR code
    • CSV import, from the admin
  2. 02

    People and classes

    • Teachers, tutors, mentors
    • Cohorts and classes
    • Pupils added by the teacher
  3. 03

    Assessments

    • SEL and LIT questionnaires by stage
    • Automatic saving as a draft
    • Score by chapter
  4. 04

    Reports

    • By pupil, class, teacher, cohort
    • Charts with Chart.js
    • PDF and CSV export

NUM results come in separately, from the external partner, through signed webhooks.

04 · The main decision

Questionnaires are content, not code.

Each assessment tool is a WordPress post, with its structure described in ACF fields: chapters, questions, options, scores. There are versions by level, for example for early primary, upper primary and lower secondary, and by stage.

The Teach for Romania team can change a question or add a new tool without a developer. Answers are stored as JSON, with scores by chapter and the completion percentage, so old reports stay valid even after the questionnaire changes.

05 · The partner integration

Built to survive network failures.

The maths assessment happens on a partner’s platform. Edu-Start sends it the teachers, cohorts and pupils and receives the results back. Neither side may lose data if the other is down.

  1. 01

    Outbox queue

    • Message table with retries
    • Protection against duplicates
    • Batches of 25, every 2 minutes
  2. 02

    Opaque identities

    • 26-character keys, not internal IDs
    • Resolution in both directions
    • Backfill for old data
  3. 03

    Webhooks

    • Signed with HMAC-SHA256
    • Rejected after 5 minutes
    • Every call logged, with status
  4. 04

    Authentication

    • OAuth2, client credentials
    • 9 REST routes
    • Health check

The partner never receives the pupils’ internal IDs, only opaque keys, generated once.

06 · Components

What I built.

01

The teacher dashboard

An application inside the WordPress theme, with its own routes.

  • Classes, pupils, assessments
  • SEL and LIT forms with prefill and progress
  • Profile with schools chosen by county, town, school
  • In-page notifications
  • Pupil report, with SEL and LIT tabs
02

The tutor and admin dashboard

39 views and 22 dashboard partials.

  • Cohorts, with modules switched on one by one or in bulk
  • Schools, teachers, tutors, pupils
  • Reports and analysis by cohort
  • CSV exports
  • User documentation
03

The locations plugin

Reference data and school structure.

  • Counties, localities on three levels, schools
  • CSV import, with SIIIR code and region
  • Roles: teacher, tutor, alumni, non-teach
  • Classes, pupils, cohorts
04

The marketing site

In the same theme, with editable page blocks.

  • Pages for SEL, LIT and NUM
  • Pages for teachers, schools and programmes
  • Blog
  • Built on Tailwind, Alpine.js and Flowbite

07 · Metrics

What I counted.

The project has no git history in the copy I have, so I do not publish a commit count. I do not publish usage figures, and I do not count or show pupil data.

  • 18,056schools in the imported registermeasured
  • 7,467localities, on three levels: county, town or commune, villagemeasured
  • 42AJAX actions for the dashboardin code
  • 9REST routes for the partner integrationin code
  • 5 minthe window in which a signed webhook is acceptedin code
  • ~41klines of PHP and JavaScript written for the projectmeasured

How much code

115
PHP files in the theme
32k
lines in the theme
18
files in the locations plugin
13
files in the integration plugin
9
custom tables
39
dashboard views

08 · What I learned

What I take with me.

Put the tools in the client’s hands

With questionnaires editable from the admin, changing a tool no longer needs a developer. The programme changes from one year to the next, and the platform keeps up without a new project.

An integration must assume the partner goes down

The retry queue and the opaque keys made the integration boring, which is exactly what it should be.

Protect real data in development too

The local copy has a plugin that blocks every email and only logs it, so nobody receives a test message.

Working on an education programme that needs data?

I build assessment and reporting platforms, with safe integrations between partners. Write to me and we will see if it fits.