The same dashboard, rebuilt three times

Davilo, a German language-learning platform · contract, remote · 2019 to 2021, and again in 2025

  • React
  • TypeScript
  • Material UI
  • Bootstrap
  • REST APIs

Outcome

  • Six years with the same German client, across two engagements four years apart
  • Existing exercises reused inside a new web and mobile product rather than rebuilt
  • Teacher, student and administrator flows delivered through three successive access models

The problem

Davilo began as a self-study site: browser-based exercises written in JavaScript — matching pairs of cards, filling in blanks, connecting recorded audio to the right word. I built web and mobile interfaces for it from 2019, and in 2025 the client came back for a restart: the same learning material, now inside a platform with classes, courses, examinations, and separate portals for teachers, students and administrators.

The exercises were not the problem. They existed, they worked, and years of teaching judgement were sitting in them. The problem was everything wrapped around them, and one question in particular that nobody could settle: who logs in, and what do they see when they do.

What I did

I wrapped the existing material rather than rebuilding it. The original JavaScript exercises stayed as they were, and the new application took ownership of accounts, authentication, and how an exercise is presented — on the web and inside a mobile app. The part of the product with real pedagogical work behind it was left alone, and the new engineering went where the new requirements actually were.

Then the dashboard question was answered three times. First, one dashboard serving teachers and students alike, changing what it showed according to the role. Then a single login routing to two entirely separate dashboards. Then two separate logins, each leading to its own. Those are three different shapes for routing, session handling and component boundaries — not three stylesheets.

Working with the client meant not sharing their hours. The engagement was a contract alongside other work, so the thing I had to be deliberate about was availability: reachable when something broke, and never the reason someone else was blocked.

FirstOne loginOne dashboardrole switches insideThenOne loginTeacherdashboardStudentdashboardAnd thenTeacherloginStudentloginTeacherdashboardStudentdashboard
Three shapes for the same product. Each one is a different routing, session and component boundary, which is why redrawing it is not a restyle.

What I would do differently

Press harder on the things I was sure about. There were moments in that project where I could see a direction would have to be undone later, and I said so once and then let it go. The dashboard was rebuilt three times, and at least one of those rebuilds was avoidable — not because anyone was careless, but because the person with the clearest view of what the change would cost stopped arguing for it.

← All work