Back to selected work

Featured engineering case study

OpsFlow

A multi-tenant field-operations workspace that turns customer requests into scheduled, evidence-backed jobs, with human approval before any AI-proposed change.

Stylized preview of the OpsFlow dispatch dashboard
My role
Product owner & full-stack engineer
Architecture
TypeScript modular monolith
Delivery
Live demo, public source, CI-gated deploy

Product challenge

Keep every hand-off visible—and every write authorised.

Field-service work moves from customer intake to scheduling, assignment, on-site evidence, and final review. OpsFlow brings those hand-offs into one tenant-scoped workflow so the current owner, status, and operational history stay visible.

The harder engineering constraint was AI safety: an AI suggestion can be useful, but it should never bypass tenancy, permissions, or lifecycle rules. OpsFlow therefore treats AI output as a proposal that an authorised person must review before it can change operational data.

Job lifecycle

One traceable path from request to completion

Owner and Manager roles plan and review; Staff completes the work and attaches evidence.

  1. 01

    New

  2. 02

    Scheduled

  3. 03

    In progress

  4. 04

    Pending review

  5. 05

    Completed

My ownership

Independent product and engineering delivery

  • Product scope and workflow design
  • System architecture and data model
  • Frontend and backend implementation
  • AI safety boundaries and review flow
  • Testing, deployment, and engineering documentation

Technical foundation

A pragmatic modular monolith

Clear application boundaries without the operational cost of splitting an evolving portfolio product into distributed services.

  1. Product UI

    Next.js App Router

    React, TypeScript, Tailwind CSS, Zustand, TanStack Query, and Zod.

  2. Application API

    Express 5 modular monolith

    Tenant-aware middleware, RBAC, JWT sessions, and domain services.

  3. Persistence

    Prisma + PostgreSQL

    Tenant-scoped operational data, audit activity, and persisted AI proposals.

  4. Delivery

    Docker on AWS

    Nginx and HTTPS on EC2, Amazon RDS, plus GitHub Actions CI and deployment.

Decisions and trade-offs

The decisions behind the feature list

The value of the project is not just what it does, but why its boundaries were designed this way.

01

Modular monolith before microservices

Keep the web app and API modular, but deploy them as one product while the domain and traffic are still evolving.

Trade-off: This simplifies transactions, local development, testing, and delivery; modules still scale and deploy together.

02

Tenant context on every business operation

Business entities carry a tenant ID, while service queries combine tenant filtering with role checks.

Trade-off: The invariant must be preserved in every new query, so PostgreSQL integration and security tests exercise cross-tenant denial.

03

AI proposes; authorised people decide

AI-generated changes are stored as pending proposals instead of writing directly to operational records.

Trade-off: Confirmation adds a step, but it creates a review boundary where tenant, role, state, and domain rules are checked again.

Engineering evidence

Inspectable engineering evidence

The source, boundary tests, end-to-end journeys, and delivery workflow make the engineering claims below directly inspectable.

Tenant boundaries

PostgreSQL-backed integration and security tests cover tenant filtering and cross-tenant denial paths.

Role hand-off

A Playwright journey follows Owner creation, Staff execution, and Manager review through the job lifecycle.

AI safety path

Proposal end-to-end tests and deterministic evaluation cases cover routing, conflicts, and confirmation safety.

Release path

The public demo is delivered through a CI-gated GitHub Actions workflow to a deployed EC2 and RDS topology.

Explore the product

See the workflow in the live demo.

Open OpsFlow (opens in a new tab)