Case studies

What I've built, and what it changed

Client names are withheld unless their site is already public; the numbers are real. The second half is software I build and run for myself — the same tools and standards I bring to client work.

Client engagements

Electrical contractor: new website, IT, and local SEO

  • HTML/CSS
  • Vercel
  • Google Workspace
  • Search Console
  • GA4
  • Schema.org

The problem

Vili Power Solutions, an industrial and commercial electrical contractor in Northern Colorado, had a placeholder page, a contact form that never reached the owners, and no presence on Google at all. Their real specialty — dairy, agricultural, and anaerobic-digester electrical work — was invisible to the people searching for it.

What I did

  • Designed and built a fast static site around that specialty: service pages for VFDs, motor control centers, PLC controls, and dairy and digester work, city pages across Northern Colorado, and plain-English technical articles (stray voltage on dairy farms, VFD milking vacuum pumps).
  • Cut the mobile home page from 1.5 MB to under 500 KB with responsive WebP images, and added structured data, FAQ schema, a sitemap, and instant indexing (IndexNow) on every deploy.
  • Took over their IT: Google Workspace administration, email authentication (DKIM and DMARC), DNS, and a contact form that emails the owners and confirms back to the customer.
  • Set up and verified their Google Business Profile, Search Console, Bing, and analytics with lead tracking, and listed them on the directories that matter for a trade — without ever publishing a home address.
  • Track rankings for 14 target searches and send a weekly search report so progress is measured, not guessed.

Results

  • Ranking on Google’s first page for “dairy barn electrician colorado” (#6) and “dairy electrician colorado” (#9) within two weeks of launch.
  • Every quote request now reaches the owners, and every lead is tracked in analytics.
  • A verified Google listing, consistent directory profiles, and a working email setup they don’t have to think about.
See it live: vilipowersolutions.com

Home builder: from a 60-word site to one that can rank

  • HTML/CSS
  • Python
  • Vercel
  • Cloudflare DNS
  • Schema.org

The problem

A residential general contractor in North Central Arkansas had a free site builder page with about sixty words of copy, no descriptions, no alt text on any of its 172 photos, and no mention of a single town it works in. Its main domain didn’t even resolve. It could not rank for anything.

What I did

  • Rebuilt it as a 13-page site: new construction, remodels, decks, post-frame shops, a full photo gallery, and pages for the towns they actually build in.
  • Used their own jobsite photography throughout — all 172 photos pulled at full resolution, resized for phones, and described properly for search and screen readers.
  • Kept the copy in their own voice and only stated checkable facts: real ratings, no invented testimonials, no promises the owners haven’t made.
  • Generated every page from one shared template so 13 pages never drift out of sync, with a quote form, structured data, and a sitemap.

Results

  • A fast, mobile-first site on their own domain, ready for a Google Business Profile and local search.
  • A written playbook for the off-site work — Google listing, service areas, photos, and reviews — in order of impact.

Replaced an expensive BI stack

  • Next.js
  • Supabase
  • Postgres RLS
  • Vercel

The problem

A multi-entity holding company was paying steep per-seat licensing for a legacy BI tool, mostly to look at a handful of operational reports. Every new viewer meant another license.

What I did

  • Rebuilt the reports that mattered as server-rendered dashboards on Next.js + Supabase/Postgres, matching the original workbooks figure for figure.
  • Enforced who-sees-what with row-level security in the database, so access rules hold no matter how the data is reached.
  • Diagnosed a login failure the client couldn't explain: their corporate email scanner was “clicking” one-time sign-in links before staff could. Replaced them with a scanner-proof password flow and a self-service admin page for adding users.

Results

  • Recurring per-seat spend replaced by low fixed hosting cost.
  • Unlimited viewers, self-serve CSV exports, and every sign-in event logged for audit.
  • Client admins add and remove their own users — no developer in the loop.

Multi-tenant donation management portal

  • Next.js
  • Supabase
  • Postgres
  • Vercel
  • Playwright

The problem

A nonprofit was managing donors, gifts, funds, and campaigns across spreadsheets and an aging tool, with duplicate donors everywhere and year-end tax receipts assembled by hand. The staff using it are not technical.

What I did

  • Built a multi-tenant portal: per-organization branding and feature toggles, per-user access, CSV import with deduplication, audited donor merges, custom reporting, and IRS tax summaries.
  • Migrated the organization onto its own isolated database with every row accounted for (24,682 donations, verified to the record).
  • Ran a multi-angle go-live review (UX, logic, security) and fixed what it found — including a floating-point rounding bug that could silently drop donors from the IRS $250 acknowledgment export, and spreadsheet formula injection in CSV downloads.
  • Profiled the slowest pages and found the database re-checking access rules on every single row; rewrote all 31 security policies to evaluate once per query.

Results

  • Donor list query: 1,008 ms → 13.7 ms (about 70× faster), with the same security guarantees.
  • Duplicate-donor scan: 9.7 s → 0.9 s, from an index-friendly rewrite with byte-identical results.
  • Money math moved to integer cents end to end; 150+ automated tests guard it.

One view of every student, member, and company

  • Python
  • SQL Server
  • HubSpot API
  • Power BI
  • QuickBooks API

The problem

A regional safety-training nonprofit had the same people and companies scattered across a class-registration system, a CRM (HubSpot), an events platform (Stova), and its accounting system. The same person could appear five ways, the CRM was full of duplicate companies, and every board report was assembled by hand.

What I did

  • Built a SQL Server data lake that restores the class system nightly and pulls the CRM, events, and accounting (QuickBooks) data alongside it with Python.
  • Wrote an identity-resolution process that matches individuals across systems even when their emails differ, with a manual-override table staff can correct.
  • Pushed the resolved records back into HubSpot automatically — contacts, companies, event registrations, renewals, and class history — with safeguards so a sync never overwrites what staff typed in by hand.
  • Built duplicate-detection and merge tooling that cleaned up the CRM’s companies and associations, then keeps it clean on every run.
  • Delivered Power BI workbooks for classes, membership and renewals, instructors, and conference KPIs — including a custom regional map that places students correctly by ZIP code.

Results

  • CRM syncs run on a schedule with no one touching them, with failure reports emailed when something needs a look.
  • Board-meeting reporting comes straight from the data, refreshed every morning.
  • More than 10,000 duplicate CRM company records merged down to 533 real companies, with contacts and history kept on the survivor.

Things I've built and run

CattleScout: regional cattle market prices

  • TypeScript
  • Next.js
  • Postgres
  • GitHub Actions
  • Vercel

The problem

USDA publishes cattle auction results for hundreds of sale barns, but it’s scattered report by report. A producer who wants to compare the barns within a couple hours’ drive has no easy way to do it.

What I did

  • Built a registry of 620 sale barns from the USDA market-news API and geocoded them, so any origin + radius picks the right barns.
  • Ingested 800,000+ individual sale lots across 32 states, keeping each lot’s own pricing basis (per hundredweight, per head, per pair) instead of assuming one.
  • Added a daily automated refresh, a market snapshot (best barn, regional average, week-over-week), price-trend charts, and CSV export.

Results

  • Live and free to use, updated every morning without anyone touching it.
  • Rolling 7-day comparison so barns that sell on different weekdays compare fairly.
See it live: cattlescout.sanders.farm

Household finance tracker with an AI connector

  • Next.js
  • Supabase
  • Cloudflare Workers
  • MCP

The problem

Off-the-shelf budgeting apps couldn’t handle the parts that mattered most: tracking a home-construction loan against contractor invoices, and keeping project spending separate from household spending.

What I did

  • Daily bank sync across 10 accounts with a deterministic rules engine for categories — no AI guessing in the nightly job, by design.
  • Imported the construction invoice ledger and auto-matched invoices to card transactions; project spend is excluded from household budgets everywhere.
  • Alerts-only email plus a Sunday weekly summary; safe-to-spend, budgets, and net worth on a private web app with database-enforced access.
  • Exposed it all through an MCP connector so either of us can ask an AI assistant “how much have we spent on the house this month?”

Results

  • One place for both of us to see where the money went, without a subscription.
  • Construction draws reconciled to invoices instead of tracked in a spreadsheet.

Dinner planner that builds the grocery order

  • Python
  • MCP
  • Cloudflare Tunnel
  • SQLite

The problem

Weekly dinner planning and the grocery order were two separate chores, and recipe ingredients never lined up with how things are actually bought.

What I did

  • Built an MCP server with 33 tools — meal library, weekly plan, suggestions, undo — used from both ChatGPT and Claude.
  • Put the smarts on the server, not the AI: every ingredient gets one canonical name (scallion = green onion), and quantities convert to how they’re bought (“1 bag = 4 cups”).
  • Generates the week’s order scaled to each night’s servings, skips always-on-hand items, and sends morning prep reminders (“thaw the roast”).

Results

  • Planning the week is a short conversation; the order builds itself.
  • Planned meals show up on the family calendar automatically.

Network status page and ISP outage reports

  • Python
  • Cloudflare Workers
  • Uptime Kuma
  • Docker

The problem

Rural fixed-wireless internet drops out, and the ISP’s answer is always “it’s on your end.” There was no record of when outages happened or where they started.

What I did

  • A collector on a home server checks the router, internet, DNS, and every service every 30 seconds, with speed tests every two hours.
  • A cloud-hosted status page and phone widget mirror the local page — and the local page keeps working when the internet is down.
  • Alerts by push and email, and a weekly availability report that classifies each outage as radio-side or upstream.

Results

  • Hard data to hand the ISP instead of a hunch.
  • Problems show up on a phone before anyone in the house notices.

Have a problem like one of these?

Get in touch