Skip to content
Esteban Padilla
Back to the projects

Replacing two SaaS tools without anyone missing them

The internal operations portal of a digital-services consultancy, for time, tasks and website audits.

Role
Lead engineer; took it over before launch
Time
8 months
Stack
Next.js · Postgres · Prisma
Team
A previous developer laid the first foundation

Problem

A growing team split its day between a third-party time tracker and a third-party task manager, and its website audits struggled with large sites.

Constraints

  • The whole team moves at once, and its history has to come along.
  • Nobody can lose an hour of tracked time in the move.
  • Audits have to fit on the machines that already run them.

Decisions

  • Moved the time history with an importer that is a dry run by default, insert-only and idempotent, verified per person and month, and refuses a partial pull, because a half-imported history is worse than none.
  • Attributed and froze hours when they are written instead of recomputing them later, with a database rule that allows one running timer per person.
  • Took project-wide row locks in a fixed order when tasks move, so concurrent reparenting cannot create cycles or deadlocks.
  • Split each audit into child tasks, one Lighthouse run per machine and a second wave for leftovers, so large sites finish.
  • Moved reads from Server Actions to GET handlers after finding that Server Actions run one at a time, and made timers optimistic so the screen never waits.

Outcome

The whole team moved off both tools, and audits now cover twice as many pages per site.

  • 200 → 400 pages per audit
  • About 3,600 commits in 8 months

Credits

The first stretch of the project (the original scaffold, a framework port and the first audit tool) was a previous developer's work.

Next case One backend, many brands, no leaks between them