Skip to content
Ben Ralton

whoami

Ben Ralton

Senior DevOps Engineer

Cloud engineering, Full Stack Development & DevOps

  • AWS
  • Terraform
  • System Design
  • CI/CD
  • Team Leadership
  • Full Stack
Tidewatch Card

Tidewatch (IN PROGRESS) active

Tidewatch is a portrait, one-thumb tower-defence game for iPhone and Android, set on a chain of tidal islands where the sea itself moves: towers built on the flats go dark at hi…

  • Typescript
  • PixiJS
  • Preact
  • Vite
  • Capacitor
  • Vitest
  • Playwright
  • Github Actions
full write-up

Tidewatch is a portrait, one-thumb tower-defence game for iPhone and Android, set on a chain of tidal islands where the sea itself moves: towers built on the flats go dark at high water, buoys only fire when it comes in, and the light you defend is a lighthouse. Free, ad-free, no in-app purchases. Built solo — design, balance system, art pipeline and a deterministic simulation verified across engines.

vercel discord alerts project card

vercel-discord-alerts active

vercel-discord-alerts is a single Vercel Function that turns Vercel's webhooks into Discord messages. Failed deployments, spend alerts and firewall events each arrive as one emb…

  • TypeScript
  • Vercel Functions
  • Node.js
  • Vitest
full write-up

vercel-discord-alerts is a single Vercel Function that turns Vercel's webhooks into Discord messages. Failed deployments, spend alerts and firewall events each arrive as one embed, coloured by severity, in the channel you choose.

You deploy it as its own Vercel project, point a team webhook and Spend Management at its one endpoint, and give it the Discord webhook URL and the Vercel secrets as environment variables. Vercel can POST to any URL but sends its own JSON, and Discord's webhook endpoint only accepts messages, so something has to sit between the two. The relay checks each delivery's HMAC signature before doing anything, answers 502 when Discord is unavailable so Vercel keeps retrying for up to 24 hours, and drops the duplicate deployment events Vercel sometimes sends a second apart. Without both variables it answers 503, so a public deployment cannot be used to spam a channel.

Built to get a failed production deploy or a blown spend budget in front of me without watching the Vercel dashboard.

Sourdough Planner

Sourdough Planner active

Sourdough Planner is a small web app that plans one bulk batch of sourdough and splits it into several bakes: rolls, loaves, pizza bases, or whatever you keep as presets. It wor…

  • React 19
  • TypeScript
  • Vite
  • Node 22
full write-up

Sourdough Planner is a small web app that plans one bulk batch of sourdough and splits it into several bakes: rolls, loaves, pizza bases, or whatever you keep as presets. It works out the flour, water, starter and salt, the weight per piece, and a clock-time schedule from mixing to baking with a lane per item.


Enter the starter you have and it sizes the batch and spreads the dough across your items, or enter the items you want and it tells you how much starter to have ready. Every percentage uses true hydration, counting the flour and water already inside the starter, and flex presets absorb any surplus or deficit in priority order. Built for a phone or tablet on the kitchen counter, with a keep-awake kitchen mode, dark mode, and print layout; everything is stored in the browser and the app ships as a zero-egress multi-arch container for the homelab.


Built to solve the Saturday-morning problem of turning one jar of starter into pizzas, rolls and loaves without a spreadsheet and a calculator.

finance-planner-card

Finance Planner active

Finance Planner is a self-hosted web app for planning savings toward upcoming payments. Record your income and your bills, goals and recurring payments, and it tells you how muc…

  • React
  • Vite
  • Fastify
  • PostgreSQL
  • Turborepo
  • Zod
  • Kubernetes
  • AI-Assisted Development
full write-up

Finance Planner is a self-hosted web app for planning savings toward upcoming payments. Record your income and your bills, goals and recurring payments, and it tells you how much to set aside each month per goal to hit its date — and what's left over, per account, per person, and across a household.

The core idea is that the unit of planning is the person, not the account. A bills pot fed by a current account can't be planned on its own, so one funding pass covers everything you own, and every screen — account page, household plan, flow diagram, forecast — is a view of that single pass. Income is money arriving from outside; a transfer between two of your own accounts is just your own money moving, and the two are never double-counted. Expenses are always funded before savings, funding loops are detected and reported rather than refused, and goals can be paced by a target date or driven by a fixed monthly contribution.

Households are an attribution layer over the same engine: tag accounts as shared or personal, set each member's contribution share, mark expenses shared or personal, and the app splits shared costs, funds everything by priority and works out the transfers each person should make. The plan is grounded in reality by a contributions ledger — record what you actually set aside, check in real balances, tick off transfers and close your month — and from that history it projects twelve months forward.

I built the whole thing: domain engine, multi-service backend, React PWA, and deployment. It's a pnpm/Turborepo monorepo with a pure TypeScript domain package (the savings engine, pinned to the penny by parity tests across every view), Fastify services for API, auth and calculation, Postgres via Drizzle, Zod contracts shared end to end, OpenTelemetry tracing across the service hops, and cloud-agnostic Kubernetes deployment via Helm. Most of the implementation was orchestrated across parallel AI agents from plan documents I wrote, with CI gating every wave.

experience

2018 — present
  1. Senior DevOps Engineer

    LIO Health

    Jan 2026 — present

    Responsible for managing and architecting AWS cloud environments for a healthtech platform. Designing infrastructure as code with Terraform, building and maintaining GitLab CI pipelines, and designing scalable cloud architectures to support the platform's growth.

  2. DevOps Engineer

    M3 EU

    Aug 2024 — Jan 2026

    Migrated from on-premise Linux and Windows servers to AWS ECS, RDS, and EC2 — fully implemented in Terraform for disaster recovery and review control. Replaced legacy monitoring systems with BetterStack and Axiom, and introduced incident management playbooks for cross-team response and escalation.

  3. Technical Lead

    Airseed Technologies

    Jan 2024 — Jan 2026

    Built an MVP for a carbon project assessment platform by end of February 2024, then stayed on to scale the project. Hired and managed a cross-functional team of five — two full-stack developers, a Python data engineer, a DevOps engineer, and a UX/UI designer. Responsible for system design, unblocking developers, and managing stakeholder expectations across sprint cycles.

  4. Full Stack Developer

    M3 EU

    Sept 2020 — Aug 2024

    Built and maintained microservices across a diverse tech stack — from legacy ASP.NET and C# with MSSQL, to newer services in TypeScript and React with Postgres. Worked with frameworks including Create React App and Next.js. Operated in an agile environment using the Atlassian suite, with Docker images built via CircleCI pipelines.

earlier roles (1)
  1. DevOps Engineer

    BMW (UK) Manufacturing LTD

    May 2018 — Sept 2020

    Formed a new agile team to design and implement a global monitoring and data analytics platform using Splunk. Responsible for designing the scalable server architecture, implementing Bitbucket repositories and Jenkins pipelines, and building custom onboarding and alerting solutions in Python and Linux Shell.

contact

Say hello

Open to interesting conversations — infrastructure war stories, side-project ideas, or just what you're building. I'll get back to you quickly.