Backend & Platform Systems · Denver, CO

Hard problems. Quiet launches.

Staff-track software engineer. Spec-first APIs, safe large-scale migrations, identity and cloud platforms on .NET and Azure, backed by a decade of industrial-controls discipline.

rewards-migration — run log · Oct 2026 UTC
rows migrated~100.4M
  1. bulk load · 4 tables6h 24m ✓
  2. delta 1 · 401,678 events1h 32m ✓
  3. delta 2 (live) · 36,565 events43m ✓
  4. cutover · legacy → serviceΔ 1.4 s
  5. final delta · 9,755 events7m ✓
  6. reconcile · 735,361 / 736,10299.9% ✓
  7. incidents0
  8. $ all systems nominal

01About

Systems thinking, from the factory floor to the cloud.

I spent a decade engineering industrial control systems, where a bad release stops a production line. That is why I plan cutovers, rehearse failure and measure twice.

Eight years ago I moved into application code. At MarketOnce I was the main back-end implementor of a ground-up redesign of the Rewards platform, working alongside a Principal Engineer: a spec-first API, a four-table ledger, and a 100-million-row migration that went live with a 1.4-second gap and no incidents.

Colleagues bring me their Rewards and Auth questions. I am evidence-driven: I push back when the data says to, then aim that conviction at the company's goals.

Hired as a junior at my first software job; my manager said I thought and coded like a mid-level.— First engineering manager, BBG, 2018

01

Data systems & migration

Replay-based migration of about 100M rows with idempotent ids, delta sync and reconciliation to 99.9%.

02

API-first platforms

TypeSpec to OpenAPI to generated API and clients, so a spec change reaches every layer of the codebase.

03

Identity & access

OAuth 2.0, OpenID Connect and SAML; central contributor to moving IdentityServer4 to Microsoft Entra and Google.

04

Safe AI-assisted engineering

A Claude Code guard layer that gates Production writes, blocks credential reads and keeps an audit log.

02Flagship case study

Rewards platform redesign.

Replacing a corrupted legacy rewards ledger with a spec-first service and moving about 100 million rows across without a single incident.

Role
Main back-end implementor, working with a Principal Engineer
Stack
.NET, ASP.NET Core, TypeSpec / OpenAPI, SQL Server, Azure Functions, Service Bus
Timeline
Redesign began Mar 2026; went live Oct 2026
Release
One of the biggest releases at the company; I closed roughly half its tickets

BeforeThe legacy ledger

  • Years of misapplied sweeps had broken referential integrity
  • Balances could lose an update when two writes landed together
  • A reward fix took several days, or half a sprint
  • Several classes of data corruption were possible

AfterA four-table, spec-first ledger

  • Members, rewards, redemptions and transactions, with deterministic ids
  • Every migrated row traceable to its legacy source and migration run
  • Support ticket to production in under two hours, sometimes faster
  • 829 automated tests gate every change

What moved

About 100.4 million rows across four tables, in four phased runs.

  • 64.9Mtransactions
  • 33.2Mrewards
  • 1.6Mredemptions
  • 720,923members

The hard part: replaying history

A member's balance depended on the moment-in-time state of their rewards. A debit has to draw from the oldest rewards first, and only unredeemed points can expire, so the migration replayed each member's transactions instead of copying rows.

60-pt debit · left to allocate0
  1. Reward 120 pts−20 · fully drawn
  2. Reward 230 pts−30 · fully drawn
  3. Reward 340 pts−10 · 30 left
A 60-point debit becomes three transaction rowstx → R1 · −20tx → R2 · −30tx → R3 · −10

Illustrative numbers. Each part is allocated first in, first out by issuance.

Reconciled to the member

After cutover, every member's balance was compared with legacy.

735,361 of 736,102 members matched legacy exactly. I traced the other 741 to inconsistencies already present in legacy's own running balances: 397 before the snapshot, 344 after it. Few enough for reviewers to sign off on each one, with justification.

Four runs, one cutover

A bulk load, then three delta runs to sync live production data. Deterministic ids made every run safe to re-scan. All times UTC, October 2026.

Oct 15–16Oct 19Oct 20 Bulk load · 6 h 24 min ~100.4M rows across four tables Delta 1 · 1 h 32 min401,678 legacy events Delta 2 · 43 min (live)36,565 events Cutover 23:59:10 · 1.4 s gap Final delta · 7 min9,755 events

The 1.4-second handover

Legacy stopped writing and the new service took over, with no gap in member activity.

23:59:10.846UTC · 19 Oct 2026Δ 1.383 s

Replays the real timestamps at real speed. Gap drawn larger than scale.

Spec-first, end to end

One change to the spec regenerates the contract, the API and the clients, and the test suite catches what it breaks.

TypeSpecspec OpenAPIcontract API + clientgenerated Domainservices SQL Server4-table ledger CI: 829 unit and integration tests gate every change

From days to under two hours

Time to find, ticket, review, merge and ship a reward fix.

Before several days · ~½ sprint
Now < 2 h · as fast as 45 min

Bars are illustrative. The gain comes from the spec-first design plus AI-assisted workflows.

One sprint, 53 closed bugs

I closed 17 of them, a third of the team's output in a single sprint.

What I owned

  • Every back-end service, end to end
  • CI/CD pipeline and the unit and integration test suites
  • Migration pipelines, run registry and scripts
  • Migration data dictionary and documentation
  • Clustered-index design and SQL Server GUID-key behavior

What I shaped with the Principal Engineer

  • The four-table ledger design
  • REST design and the team's API governance rules
  • OAuth / OIDC token-scope strategy
  • The TypeSpec pattern now being adopted by other teams

03Experience

Eight years of shipping, a decade of discipline before that.

Senior Software Engineer

MarketOnce · Community platform · Denver, CO

Mar 2023 – Present
  • Rewards platform redesign. Main back-end implementor alongside a Principal Engineer: a spec-first API generated from TypeSpec, every service, the CI/CD pipeline with unit and integration tests, and the migration pipelines. The release closed roughly half its tickets in my name and shipped smoothly.
  • Legacy ledger migration. Moved about 100M rows (720,923 members, 33.2M rewards, 1.6M redemptions, 64.9M transactions) into a four-table design that removed several classes of data corruption, by replaying each member's transaction history in first-in, first-out order and honoring expiry.
  • Zero-incident cutover. Four phased runs with deterministic, idempotent ids; a 1.4-second gap at cutover; 99.9% of members reconciled exactly.
  • Delivery speed. Reward fixes went from several days to under two hours. Closed 17 of the team's 53 bugs in one sprint.
  • Schema and documentation. Clustered-index design, GUID-key handling in SQL Server, and a permanent migration data dictionary and run registry so the data stays traceable after the legacy database retires.
  • Open source and adoption. Accepted pull request fixing code-emitter bugs in the open-source TypeSpec ASP.NET emitter the team uses. The pattern has been adopted by another team and is next for the core community services.
  • Identity. Central contributor to replacing IdentityServer4 with Microsoft Entra (employees and partners) and Google (customer identity): OAuth 2.0, OIDC, SAML and token-scope design.
  • Business impact. Rewards and core membership API work contributed to the company's largest Community-domain contract, with one of the world's largest technology companies.
  • AI-assisted engineering. Built a hook-based guard layer for Claude Code on a shared VM that blocks destructive commands and credential reads, requires approval for Production writes, and keeps a daily activity log. It multiplied code throughput safely.
  • .NET 10
  • ASP.NET Core
  • TypeSpec
  • SQL Server
  • Azure Service Bus
  • Azure Functions
  • Azure DevOps
  • OAuth / OIDC
  • New Relic
  • Claude Code

Senior Software Developer

Inspirato · Denver, CO (hybrid)

Nov 2021 – Feb 2023
  • Developed and maintained the Subscription Members site (booking claims, balance tracking) and the Membership API, and built Bicep-based CI for Azure. Worked with the system architect to modernize legacy systems.
  • ASP.NET Core
  • Azure
  • Bicep

Senior Back End Engineer

Kin + Carta · Contract

Nov 2019 – Nov 2021
  • Designed and built .NET back-end APIs on Azure for client engagements, including work against Oracle Database. Early use of the spec-forward API design I later applied at MarketOnce.
  • ASP.NET Core
  • Azure
  • Oracle

Software Engineer

BBG Inc. · Contract

Aug 2018 – Nov 2019
  • First dedicated software role: web applications and APIs in ASP.NET Core and JavaScript. Hired as a junior; my manager said I thought and coded like a mid-level.
  • ASP.NET Core
  • JavaScript

04Skills

Depth, labeled honestly.

Grouped by how I have used each one, so you know what to expect.

Proven in production

Backend & APIs

  • C#
  • .NET 10
  • ASP.NET Core
  • REST API design
  • TypeSpec
  • OpenAPI
  • Spec-first / API-first

Data

  • SQL Server
  • T-SQL
  • Clustered index design
  • Data migration
  • Ledger integrity
  • Reconciliation

Cloud & delivery

  • Azure
  • Azure Service Bus
  • Azure DevOps
  • CI/CD
  • MSTest
  • xUnit

Identity

  • OAuth 2.0
  • OpenID Connect
Working depth

Identity & security

  • Microsoft Entra
  • SAML
  • IdentityServer
  • Least-privilege access

Architecture

  • Event-driven architecture
  • Event-sourced ledger patterns
  • Distributed messaging
  • API governance

Platform

  • Azure Functions
  • Bicep
  • New Relic APM
  • Observability

AI-assisted engineering

  • Claude Code
  • Hooks & guard rails
  • Permission design
Also worked with
  • Go
  • Python
  • OpenTelemetry
  • Terraform
  • Oracle
  • Redis
  • Docker
  • VB.NET
  • C / C++
  • MATLAB
  • PLC programming

05Journey

From PLCs to platform engineering.

Eighteen years in engineering. I got into software by building tools that made my own controls work faster, then kept going.

  1. Controls & systems integration2008 – 2018
  2. Software engineering2018 – 2023
  3. Platform engineering2023 – now
2008 – 2012

Automation control technician, then engineer: PLC programming, C and AutoCAD (certified, 2012).

2012 – 2015

Systems integration engineer at an instrumentation maker, working in MATLAB, PHP and Python.

2016 – 2018

Wrote .NET tools that generated XML to replace a macro-driven Excel workflow, and rewrote a Windows data-collection app: more statistics collected, flat files replaced by SQLite for charting.

2018

Moved into full-time application development, and never looked back.

06Selected work

Projects & open source.

Rewards ledger migration

About 100M rows replayed into a four-table ledger over four phased runs, with idempotent ids, delta sync and a permanent run registry.

Spec-first Rewards API

TypeSpec-generated REST API where a spec change propagates through every layer, backed by 829 automated tests.

Claude Code guard layer

Hooks and tests that gate Production writes, protect Azure subscriptions, and block credential reads and container escapes, with a daily audit log.

07Education & credentials

Foundations.

2006 – 2010

Bachelor of Engineering

Colorado School of Mines

Issued Aug 2022 · Expired Aug 2023

Microsoft Certified: Azure Developer Associate

Microsoft

Jun 2012

AutoCAD Certified Professional

Cad-1