All projects

NXStage Platform

The core backend behind a digital agency's business intelligence, social, and support tooling.

2024 — present · Lead backend engineer. I've written most of the platform and set the module conventions the rest of the team builds against.

Node.jsTypeScriptPrismaPostgreSQLAzure

The problem

Reporting, social media management, customer support and research each started as its own tool. Keeping them separate meant four sets of auth, four data models, and no way to answer a question that crossed two of them.

What it does

One layered Node and TypeScript platform — controllers, services, repositories, Prisma — with a standard module shape every feature follows, and scheduled work driven externally rather than from inside the process.

Engineering decisions

One module shape, repeated everywhere

Every feature is the same four layers in the same order, with the same naming. It's boring on purpose. A standardized shape means a new module is mostly a known quantity, reviews look at the logic instead of the layout, and nobody has to relearn where things live when they move between features.

Scheduled work lives outside the application

Recurring jobs are plain authenticated endpoints triggered by an external scheduler, not timers inside the process. Retries, alerting and history come from the scheduler for free, the work is reproducible by calling the endpoint directly, and running more than one instance of the app doesn't run the same job twice.

Clear schema ownership when other services share the database

The platform owns its tables and their migrations outright. Services built alongside it read a small number of those tables and own their own schema, with guards that fail loudly on drift rather than quietly reading a column that changed meaning. Sharing a database is fine; sharing ownership of a schema is not.

Where it landed

  • One platform behind business intelligence, social, support and research tooling
  • Module conventions the rest of the backend team builds against
  • Continuously developed since 2024