Skip to content

B2B Customer Portal

Active

A B2B portal for customers, backed by NetSuite. Deployed to a company server in September 2026 and used internally; not yet open to customers.

Tech Stack

.NET 10ASP.NET CoreEF CoreSQL ServerReact 19NetSuiteGitHub Actions

Deployment

  • A v* tag releases only if it matches the version number and points at a commit on main; offline tests run before the build.
  • Migrations run before the service starts, under a separate migration login. They only add, never drop, because a rollback reverts the code, not the schema.
  • A health monitor outside the app checks every five minutes; releases open a maintenance window so they don't raise false alarms.

Network

  • The app listens only on loopback behind a reverse proxy. Admin and debug paths return 404 at the proxy, and the app checks permissions on them too, so both layers block them.
  • HTTPS is required: the session cookie is Secure, and a non-Secure setting fails at startup.
  • Opening the database port to the internet was proposed and rejected.

Verification

  • Every custom CI check was tested against a planted violation, which turned up three checks that could never have failed.
  • CI confirms the tests actually ran: no silent skips, and "0 tests, exit 0" doesn't pass.
  • CI never touches the live ERP; everything runs against fixtures.

Writes

  • Every ERP write takes two steps: the first request is forced to dry-run and shows exactly what would be sent. The idempotency key is the portal's own order number.
  • Going live is a separate manual step that a release never turns on.
  • The ERP is written first, and the local copy updates only after it succeeds; the local mirror tables are read-only, enforced by separate database logins.

Record-keeping

  • The decision log is append-only: an overturned decision stays, with a note. By the log's own account, the table of rejected alternatives is the part that matters most.
  • Each risk is paired with the check that guards it. Some passages in the docs were wrong for weeks; once that came to light they were kept, with a note on what was wrong, instead of being quietly fixed.
← Back to Projects

Other Projects

DataHubActive

An internal data hub, rewritten in C#/.NET: an older system split across three services became one ASP.NET Core application. In production since June 2026, released by tag ever since.

.NET 10ASP.NET CoreDapper
Enterprise Manufacturing Analytics PlatformActive

A dbt + Databricks pipeline using a medallion (Bronze→Silver→Gold→Mart) architecture to turn raw ERP data into analytics-ready models for manufacturing, inventory, sales, and workforce reporting.

dbtDatabricksUnity Catalog
jackdeng.cc — Personal HubActive

The site you're reading: the frontend and Payload CMS 3 live in one Next.js 16 app, the data sits in Supabase Postgres, and it deploys to Vercel, in English and Chinese.

Next.js 16Payload CMS 3PostgreSQL