Setton Farms · day job · 2024 to now
Setton Farms
Line-of-business systems for a food processing operation, plus the platform the other applications sit on. I am one of seven engineers. I set up the front-end and back-end architecture the others build on, review their work, and drove our move to AI-assisted development.
C# · .NET 8 and 10 · ASP.NET Core · EF Core · SQL Server · React 19 · TypeScript · TanStack Router and Query · MUI · AG Grid Enterprise · Hangfire · QuestPDF · Serilog
SMS 2.0, the ERP the business runs on
It replaced the VB.NET desktop application that ran the company for twenty years, and the business runs on it now. I was the lead engineer. Seventeen modules, covering most of what the business does in a day.
.NET 8 behind a React and TypeScript client, with TanStack Router for file-based routing, AG Grid Enterprise for the data-heavy screens, and generated API clients so the frontend cannot drift from the backend contract. It reads across separate SQL Server databases, and deploys blue and green, so a release is a slot swap rather than an outage.
I also moved its reports off a client-side renderer and onto server-rendered PDFs with QuestPDF.
Matching and payouts
The design is mostly mine; the build was a team effort. It is a state machine at two levels: each invoice moves through matching and approval, then invoices move together as a batch through payment and into the accounting system. Documents arrive by OCR from a watched folder through a background worker service, get matched three ways against each other, and route through an approval workflow with delegations and per-supplier rules. Approved batches go out as NACHA ACH files transmitted to the bank, are reconciled back, and post to Sage 300. A batch is marked as sending before its file leaves, so a failure mid-send is parked for a person to check rather than sent twice.
The document viewer serves three scanned documents side by side. Rather than base64 the images into JSON and pay a third more bytes for it, the API returns a multipart response with the metadata in one part and the raw image bytes in the others, drawn in a deep-zoom viewer.
Cost allocation
A .NET 10 service that splits invoices across a recursive tree of cost buckets, weighted per bucket rather than evenly. Multi-stage approvals, budgets against each bucket, and ACH payouts at the end of it.
Layered into domain, infrastructure, application and API projects, with EF Core migrations applied on startup and integration tests running against a real SQL Server in a container rather than an in-memory substitute. Data that belongs to the ERP is read through views mapped as keyless entities, so the two systems share information without sharing a schema.
The platform underneath
Background jobs used to run in-process inside each application, scattered across the apps with no one place to see what ran, when, or why. Now there is one Hangfire worker for all of them, so the technical leads can see, audit and stop any job from one place: a job catalog, run history, a kill switch, and a routing parameter that decides which data a given run operates against. It also ended a blue-green deploy running two copies of the same job at once.
I also maintain the shared C# libraries and the shared React packages the rest of the team builds on: data access, Active Directory and Windows authentication, email and messaging, printing, the PDF reporting library, and a design-system package set.
Other pieces I work on
The Android side of a handheld app, a React Native build that locks a rugged Zebra device into a single application for scanner operators through device-owner provisioning. And the Windows service that ingests scanned documents, converts them, and files them against the records the matching pipeline later reads. I rebuilt its OCR around a Qwen vision-language model served on-prem with vLLM, so invoices are read without any document leaving the building.