❯ cd
← cd ..

Niscai

Carbon data for manufacturers

role
Senior full-stack engineer
at
Thought and Function
when
2025 – now
live
www.niscai.com ↗

// Client work through Thought and Function. The app is behind a login, so this page covers the architecture and my part in it rather than screens.

Niscai measures the carbon footprint of commercial equipment such as refrigeration, heating and display products. Manufacturers record their product models and get a product carbon footprint for each one, either calculated on the platform or taken from an existing study. Buyers and specifiers compare products' whole-life carbon side by side and request data from manufacturers.

I joined in early 2025 and work across the API, the web app, the background services, infrastructure and CI.

// architecture

  Next.js 16 (Vercel) ── GraphQL ──▶ core-api
                                     NestJS · TypeORM
                                     PostgreSQL (Cloud SQL)
                                        │
                              Google Cloud Tasks
              ┌───────────────┬─────────┴──────┬─────────────┐
              ▼               ▼                ▼             ▼
       notifications     PDF reports      data insights   bulk export
       email, webhooks   Puppeteer

  qr-router ── QR scan ──▶ product page
  infra: Cloud Run · Terraform · GitHub Actions

// how it works

  1. An AI-agent testing workflow

    I led the move from Cypress to Playwright and set up three Claude Code agents to write the suite. A planner explores the running app and writes a test plan, a generator replays each step in a real browser and writes the spec, and a healer runs failing tests and fixes them.

    Every spec gets its own seeded, isolated tenant, and the run fails if two spec files would share one. The suite grew to 140 spec files across projects, models, carbon comparisons, auth, admin and billing entitlements.

  2. Moving to Cloud Run with zero downtime

    The backends moved from App Engine to Cloud Run behind a load balancer. The cutover was a single environment variable on the web app, so traffic switched at one request boundary and could be switched back instantly.

  3. Safe migrations and rollbacks

    I wrote the team's migration rules: schema changes are additive only (expand, then contract), and data migrations run separately with their own runner and tracking. That makes the rollback runbook simple: production rolls back the app, never the database, with a decision tree and a rollback workflow for both Vercel and Cloud Run.

  4. A production domain migration

    When the company renamed itself from Impact Loop to Niscai, I led the move to the new domain: 301 redirects from the old domains and a parallel load balancer, then every environment's web app, QR code targets and email senders.

  5. Owning CI and security

    I effectively own the CI/CD pipelines: releases per environment, rollbacks, end-to-end runs and a shared Turbo cache. I also cleared critical dependency advisories, added OIDC token checks to the internal task endpoints, and did the Node 24 and Next.js 16 upgrades.

// stack

  • TypeScript
  • NestJS
  • GraphQL
  • TypeORM
  • Next.js 16
  • Tailwind
  • PostgreSQL
  • Cloud Run
  • Cloud Tasks
  • Terraform
  • Playwright