/projects/ulbra-crm

← All projects

Ulbra CRM

Where the university works the leads for its next intake of students.

Head of Technology — direction & review · Apr 2026 – Current

ReactTanStack RouterMongoDBDocker Swarm
Private

Overview

Prospective students arrive as leads — from a campaign, a form, an event — and someone works each one until it becomes an enrolment or does not. This is where that happens. I inherited it rather than built it: no automated tests, and a structure that had not kept up with the product. It is now fully covered by tests and materially better to work in, and that work was the team’s — I set the direction and reviewed it, and did not write it.

What I did

I set the direction and reviewed the work; the engineering was the team’s.

  • The decision to cover the codebase with tests before changing its behaviour.
  • The routing migration that made filter state survive navigation.
  • Review of the work as it landed.

None of this implementation is mine. It was built by the engineers on the team; my part was deciding what to do and reviewing what came back.

The problem

The CRM arrived with no automated tests at all, which made every change a gamble, and with usability debt that the people using it every day absorbed silently. The worst of it: changing screens reloaded the application, so the filters someone had just set were gone. Work that goes through the same three or four filters all day pays that cost on every navigation.

By the numbers

0% → 100%test coverage

Engineering decisions

  • Tests first, behaviour second

    The codebase was unstructured and untested. Coverage came first and the restructuring second: tests written against the behaviour as it already worked, then the behaviour changed underneath them. That order is why the coverage number is worth quoting at all.

  • Routing as state, not as navigation

    Moving to a router that holds application state in the route turned filters from something the page owned into something the URL owned. The visible win is that a screen change no longer discards them; the quieter one is that a filtered view became a link somebody can send to a colleague.

  • Directed, not written

    This is the one system in the group I did not build. With three engineers and six systems, my leverage as lead is in deciding what gets done and reviewing what comes back, not in adding a fourth pair of hands to a codebase that already has an owner.