Andrew Smith outdoors, head and shoulders, with green trees behind him.

Andrew Smith

Backend Software Engineer

I build backends where a wrong number is the bug.

Most of my work has been around double-entry accounting, insurance billing, and data migrations — systems where the answer needs to be right, not close enough.

At ChiroHD I built Ledger V2, a double-entry accounting system for healthcare billing, and the migration that moved years of financial history into it.

One of the migration test suites once told me all four validation gates had passed. All 478 balances were wrong.

The tests were reading an inactive feature flag, so they weren't really checking anything. It was a good reminder that “the tests passed” and “the system works” are two very different statements.

That's the kind of problem I like working on.

Try the TurfOps demoMore about me

What I work on

Backend systems

I spend most of my time on backend systems — databases, APIs, and the infrastructure around them. At ChiroHD that has meant financial systems, insurance workflows, reporting, migrations, and internal tools, mostly in TypeScript, Node.js, PostgreSQL and AWS, with some Rust and frontend work mixed in.

I tend to end up in the parts of a system where something has to be reconciled, migrated, or figured out.

Data migrations

Moving data between systems sounds straightforward until the old system has been running for years and people depend on every number being correct.

I built the migration and validation tooling that moved ChiroHD's financial data into Ledger V2, along with the tools we used to work out what production data was actually doing when the numbers didn't match.

I like this kind of work because there is usually a real problem hiding somewhere. You just have to find it.

Internal tools

I like building tools for developers and for the people inside the company.

One example is an EHR migration tracker I built with Rust, React, TypeScript, Terraform, DynamoDB and AWS. It came together in about nine working days spread over five weeks — 41 endpoints, Google sign-in and role-based access, deployed and running for under $5 a month — while I was still learning parts of the stack I hadn't used in production before.

I've also spent a lot of time working out how to use AI coding tools without letting them turn a codebase into a mess. The idea is simple enough: if an agent makes the same mistake twice, the fix shouldn't live in a chat conversation. It should live in the repository. That is what I built for our team — agent definitions and convention files kept under version control, each one recording the failure that caused it, plus commit gates that don't negotiate. It runs across a codebase with more than 15,000 commits.

Stack

Languages
TypeScript, SQL, Rust, C#, Python, Java, jBASE
Backend
Node.js, REST APIs, AWS Lambda, API Gateway, Serverless Framework, Express
Data
PostgreSQL, DynamoDB, SQL Server, schema design, multi-tenant architectures, query optimization
Frontend
React, Angular, Tailwind CSS, Vite
Cloud and CI
AWS (Lambda, DynamoDB, S3, CloudFront, SQS, SNS, EventBridge, Cognito, Secrets Manager, CloudWatch), Terraform, GitHub Actions
Testing
Jest, Cypress, Playwright, Karma/Jasmine
Agentic
Claude Code, Cursor, GitHub Copilot, Amazon Bedrock, HumanLayer; multi-agent orchestration, git-worktree isolation, custom subagent definitions, deterministic verification gates

A little about how I got here

Before software I worked at UPS for several years, supervising the night shift in Baldwin, Wisconsin.

It was a different job from the one I have now, but more of it carried over than I expected. I was usually the only manager in the building, running two sorts — ground packages, and air shipments that went straight onto aircraft. The FAA, IATA and the TSA all audit that second one, so there were plenty of places where “probably fine” wasn't good enough. Four years, and nobody on my shift ever got hurt.

One of the stranger parts of the job was SALT testing — Service Awareness Label Testing. I would deliberately put a package somewhere it wasn't supposed to be and see whether the process caught it.

That experience stuck with me. A test that passes doesn't necessarily mean the thing you're testing works.

I was in school the whole time. I finished an A.A.S. in Web Design and Software Development at Wisconsin Indianhead Technical College while I was still on the sort line, then left UPS, moved to Florida for an IT internship, and finished a bachelor's in Information and Communication Technology at UW–Stout.

It wasn't a straight line into software, but it worked out.The longer version is here.

TurfOps

I've worked for three landscaping and lawncare companies, so I eventually decided to build software for an industry I already knew.

TurfOps is a field-service application for lawncare, landscaping and snow work.

The idea came from watching how information gets scattered around a landscaping business. Some of it is in QuickBooks, some in a spreadsheet, some on a piece of paper in a truck, and some exists only because somebody remembers it. I wanted to see what it looked like if all of that lived together.

Three decisions I'd defend

The owner asked for seven features. It was really one record.Equipment right-sizing, arrival and departure times, revenue per worker-hour, drive-time analysis, bundling two services at one address, keep-or-drop calls on accounts, crew colour-coding. Read as a list, that is seven screens and a year of work. Read carefully, it is one question asked seven ways: who did what job, on what equipment, from when to when, for how much. Capture that properly and the seven features are just queries. Capture it badly and none of them reconcile.

Crews never receive the money. Not hidden with CSS — absent from what the server sends. The easy version ships the price to the tablet and hides the column, which anyone can undo in a browser. Getting this right took three attempts, because deciding which fields count as money by their name is harder than it sounds: my first rule stripped the crew's “Stop 3 of 11” counter, and my second stripped how much salt to spread. The lesson was that a rule which can't tell which way it's wrong shouldn't be guessing.

The hosting bill is a design constraint. A two-truck operation will stop paying for a tool before it stops paying for fuel. So the budget came first — about $0 a month now, about $8 self-hosted later — and the architecture follows from it. Nothing goes in that would cost a rewrite to remove.

It has also been a good place to try things I don't get to try at work. I can change my mind, throw something away, and build it again without a deadline. It's still a work in progress, which is part of the fun.

Try the TurfOps demoAsk me for the source

The repository is private for now. If you want to read the code, email me and I'll walk you through it.

Where I've worked

ChiroHD
Full Stack Software Developer · remote · December 2023 – present
Eastern Metal Supply
Full Stack Software Developer · Fort Myers, FL · March – November 2023. Backend systems for manufacturing — production scheduling, batching and labeling — and the SQL underneath them.
GreyCastle Security
IT intern · remote · January 2022 – January 2023
United Parcel Service
Sort supervisor and PVD instructor · Baldwin, WI · October 2017 – December 2021
Education
B.S. Information and Communication Technology, UW–Stout,Magna Cum Laude. A.A.S. Web Design and Software Development, Wisconsin Indianhead Technical College, Summa Cum Laude.

Everything before that →

Outside of software

I spend most of my free time outside. I'm training for a half Ironman, though I'm still not entirely sure why I thought that was a good idea. I've run a few 5Ks, one of them a fundraiser for a K9 unit. I hike, camp, fish and snorkel, and I'm slowly working through the national parks.

I also bought a house and have been rebuilding pieces of it — wiring, a 9-foot fence, a retaining wall, gardens.Those projects are here, along withthe jobs that aren't on my résumé.

Contact

If you want to talk about software, something I'm building, or something completely unrelated, feel free to reach out.

New Richmond, WI · open to remote