Projects

osprey Integration & reliability engineering

A workflow automation backend on AWS Lambda, Terraform-provisioned end to end, that runs the contact-form and status automations for my client sites.

HTTP callers forms · API keys EventBridge cron · DLQ CloudFront + WAF API Gateway HTTP API Lambda Express · workflow engine secrets from SSM Postgres Neon · run log Gmail · Twilio + SSRF-safe HTTP
Problem
Static client sites had nowhere to send form submissions, and glue automations were scattered across third-party tools with no reliability guarantees.
Approach
Workflows are declared as JSON, validated, and run step by step from the CLI, over HTTP or on a cron schedule. Infrastructure is Terraform (Lambda, API Gateway, CloudFront, WAF, EventBridge, SSM-managed secrets). Outbound requests are SSRF-hardened, and the repo carries ADRs and a self-graded service assessment.
Outcome
A v0 built for internal use: CI-gated with Vitest coverage thresholds and graded honestly per pillar, with the gaps before external traffic documented in the repo.

Private repository.

coast-crm SaaS & observability

A multi-tenant business portal for home-service companies: customers, quotes, invoicing, payments and job dispatch.

origin secret browser owners · teams · pay links CloudFront + WAF S3 /_next/static Lambda: Next.js container image every query scoped by ownerId Postgres Neon · RLS Stripe Connect SES · Gmail email DynamoDB rate limits Honeycomb OpenTelemetry traces + metrics
Problem
The home-service businesses I operate needed one system for customers, invoices and jobs, with each business strictly isolated from the others.
Approach
Next.js and Prisma on Neon Postgres, run as a container on AWS Lambda behind CloudFront. Tenant isolation is enforced in the service layer (every query takes an explicit owner id), with Postgres row-level security as defense in depth on the billing tables. Payments go through Stripe Connect, and traces and metrics go through OpenTelemetry to Honeycomb.
Outcome
In production since October 2025, with Stripe in test mode until the first pilot business is onboarded. Customers, quotes, invoicing, payments and jobs are built.

Private repository.

gulf-coast-fishing-app Mobile & external data

An offline-first Expo app that puts Gulf Coast tide and water conditions on a map of fishing spots.

NOAA CO-OPS tides · currents NDBC · NWS buoys · wind data layer typed, fixture-tested clients + solunar · bundled spots React Query one hook per data need SQLite offline cache screens map · spots
Problem
Fishing spots are often out of signal range, but tide and conditions data comes from live public APIs.
Approach
Expo and React Native with a SQLite offline cache and React Query persistence that follows connectivity. Tide data comes from a NOAA CO-OPS provider tested against recorded fixtures rather than the live API.
Outcome
An early prototype, local-first, with unit tests and CI coverage reporting in place from the start.

Private repository.

Client sites

Shipped and billed for real clients: