jonathan.costin
← All work

Client work · Nov 2025 - now

Operations platform

A production internal operations platform for a hospitality client. I'm its only engineer, and I work directly with the client's leadership on scope and priorities.

  • React
  • TypeScript
  • Node.js
  • Express
  • PostgreSQL
  • Drizzle ORM
  • Entra ID
  • Terraform
  • Google Cloud
  • Docker
Platform architecture: a React and TypeScript frontend calls a Node.js and Express API. Sign-in is Microsoft Entra ID. The API uses PostgreSQL through Drizzle ORM, runs background jobs and stores versioned documents. The client's SharePoint library came in through the Microsoft Graph API. It runs on Google Cloud under Terraform and Docker, with GitHub Actions deploying to staging and production.Google Cloud · Terraform · DockerReact + TypeScriptTanStack QueryNode.js + Expressshared Zod schemasPostgreSQLDrizzle ORM · full-text searchEntra ID sign-inOAuth 2.0 + PKCEbackground jobsdocument storageversioned filesSharePoint importMicrosoft Graph APIGitHub Actions CI/CD → staging → production
ArchitectureNo client data shown

Frontend and API

I built the React and TypeScript frontend and the Node.js and Express API. Zod schemas are shared between them, so the client and server agree on every request and response.

Data

I rebuilt the data layer on PostgreSQL and Drizzle ORM and wrote the migration from SQLite. It verifies per-table checksums and row counts and rolls back completely on any mismatch.

Sign-in and access

Microsoft Entra ID sign-in uses OAuth 2.0 with PKCE and server-side sessions. Role-based, per-property access control sits under every list, search and download.

Documents

Document storage keeps every version, with full-text search in Postgres and background jobs. I imported the client's SharePoint library through the Microsoft Graph API.

Infrastructure and releases

I manage the infrastructure with Terraform on Google Cloud, Docker and Linux servers. GitHub Actions runs CI/CD into separate staging and production, with monitoring, backups and tested rollbacks.

Testing and AI

Vitest, Playwright and integration tests against a real Postgres database, all run in CI. I added an LLM feature on the OpenAI API.

The code and the product belong to the client, so there's no public demo or screenshot. I'm happy to walk through the design in an interview.