H. Chen 2009 – 2026 Sachse, Texas

Huajun
Chen

Forward Deployed Engineer · Applied AI · Full‑Stack

Looking for a forward deployed role · open to NYC, SF, Seattle

01

ACLogics — an AI diagnostic tool for HVAC technicians

Built it and shipped it alone: the LLM diagnostic engine, the regression evals that gate every prompt change, the iOS and Android apps, and the marketing site.

App Store
Google Play
Built by
One person
Four screens from the Android build. Each opens full size.
02

Four agent skills I built

I wrote all four from scratch. Each one turns a recurring job in building and releasing ACLogics into a fixed process: a boundary the model has to work inside, or a step it would otherwise skip.

  1. bug‑finder Every finding a hunter reports is handed to a model from a different vendor, scored on tearing it down. An isolated referee rules on both. A model is rewarded for finding bugs, not for being right about them. Source on GitHub
  2. working‑backwards Reads the repo, interviews me in rounds, then writes two documents instead of one: a press release that makes the case in one read, and a build spec that names the files and functions it expects to touch. A spec with every detail in it is one nobody reads. Source on GitHub
  3. i18n‑translate Launches a cheaper model in a separate CLI to batch the missing Lingui entries, translate, and audit every string for the Spanish word too long for its button. Translation lands at the end of a feature, when context is scarcest. Source on GitHub
  4. maestro‑autopilot Runs the user flows a unit test can’t reach, unattended on the iOS simulator and on a real Android phone, triages every failure into one of four classes, and inlines every screenshot into a single self‑contained HTML file. In a log, a broken app and a broken harness look identical. Source on GitHub
03

How it got there — the decisions, including the ones I reversed

My husband runs an HVAC company with a partner — that is where the problem and the first users came from. Eight turns, in order: what I decided, and what happened next.

  1. Spent three months building a Zoom Phone pipeline to capture escalated tech‑to‑manager calls, and build a knowledge base out of how those get worked through. It sat live with a dedicated number for three months, collected almost nothing, and was shut down.

    Two things ended it. Gemini 2.5 Flash arrived already knowing the trade well enough that the knowledge base was no longer the thing standing in the way. And dialing that number meant deciding first, on a roof, mid‑job, whether being stuck on this one counted.

  2. The first version was a web app that answered with one prompt and one essay. Rebuilt it into two stages: one model drafts the candidate causes, a second audits that draft — dropping what does not fit, fixing the obvious errors, and putting the cheapest check first. Only then does the technician start working the list, with explicit pass​/​fail criteria at every step.

    “Nothing looks broken, move on” is a verdict a first‑year tech cannot safely make. Naming what passing means is what let both the new hire and the fifteen‑year tech follow the same procedure.

  3. Wrote an eval harness in Python to compare models and score prompt changes against fixed cases. It is now the gate every prompt change goes through.

    Before it, prompt changes were a matter of opinion. It is the reason I trust the diagnostic logic enough to put it in front of someone holding a meter.

  4. Watched technicians in the field and saw how rarely they open a browser at all. Started an iOS app on Capacitor, then hit an auth deeplink bug inside the shell I could not instrument from either side. Threw away three weeks, restarted on Expo, and submitted to the App Store fifteen days later.

    Three weeks was the price of finding out I could not debug the stack I had chosen. Another three would not have made the answer any cheaper.

  5. The app was free, and Apple flagged the quota model and asked how billing worked. Sent an answer defending the web Stripe setup, then withdrew it and added in‑app purchase instead. Approval took a thirty‑seven‑day back‑and‑forth, my first time through Apple.

    I had built this for companies: a full team site, Stripe billing. Adding in‑app purchase cost fifteen percent under Apple’s small‑business rate and three days of work, but it changed the business, not just the review. The store put the app in front of individual technicians who had never heard about it from me, and Apple removes the trust barrier: anyone can cancel from their phone settings without talking to me, so buying does not require trusting a one‑person company.

  6. The app asked technicians to type in the equipment, and almost every one of them left the field blank. Removed it and built a camera path instead — photograph the nameplate. The idea came from someone in the trade: a Las Vegas company sends first-year students door to door taught to do one thing, photograph the nameplate and send it to ChatGPT. So I made that photo the first screenshot on the App Store listing.

    What moved the number was not the code. iOS sign‑ups went from about three a week to thirty or fifty, with nothing spent on acquisition, because technicians searching the store now saw a picture of what they were already doing.

  7. Built iOS only, because everyone I could watch — my husband’s crew, and my friends in the trade — carries an iPhone. Counterpoint’s US market‑share figures showed how much of the low end, Motorola especially, is Android. Built the Android version and shipped it two weeks later.

    The people I could reach were not a sample of the trade. They were a sample of who I know. Google Play brings an order of magnitude fewer installs than the App Store, and about five percent of them pay against one percent on iOS — but both of those percentages sit on single‑digit numbers of paying users, so the gap is not a finding yet.

  8. Coverage in new subdivisions is erratic across carriers. Spent a month and a half rebuilding the app offline‑first on PowerSync over Convex. An offline diagnosis now runs start‑to‑finish in a zero‑bar mechanical room, syncing when the truck hits the road.

    Convex let me ship without building a backend first, which as one person was the whole reason I got anywhere. That speed was a loan. When the field forced an offline‑first rewrite I priced the move to plain Postgres and found the backend — functions, crons, data flow — too tightly bound to Convex to lift out. So I made offline work inside it instead: waited for streaming support, then bridged PowerSync on top.

  9. I had instrumented aggressively — every warning went to Sentry. The free quota ran out and Sentry began dropping events on the floor: for several days the thing watching the app was itself rate‑limited. Split the stream instead. Warnings dropped to traces, logs moved to Axiom, and Sentry kept only real errors.

    The volume did not fall because the app got better. It fell because most of what I was sending had never been an error, and I had been reading it as if it were. Instrumenting everything cost me the signal it was supposed to buy.

04

What the app keeps, and what it throws away

Every diagnosis carries somebody’s house with it — the technician’s name, and the address of the job. Deciding what to hold, for how long, and what to strip is the part no platform decides for you.

Live data is kept ninety‑nine days, because the app promises a technician three months of history — the window is the promise plus a margin, not a round number I liked the look of.

Deleting an account began as a direct delete, which worked until accounts had enough history behind them to time out halfway through, and a half‑deleted account is worse than either end state. It is asynchronous now: strip the identifying fields first — name, email, and the job‑site address on every job — then archive what is left to R2 and drop the live rows.

What survives in the archive is de‑identified and kept indefinitely, which is how I watch a diagnosis hold up across a whole season.

Live retention
99 days
Deletion commitment
24 hours
Actual
~5 minutes

Teams share a company account and nothing else. That is closer to one tenant per company than to a multi‑tenant system, and I have not run it at a size that would test the difference.

05

Seventeen years, three employers, one role: building for the field

Every job below was the same shape: sit with the people who don’t write code — inspectors, risk curators, technicians — and build the thing that lets them do the work themselves.

  1. City of Garland — full‑time GIS lead. Built the animal‑services pet finder, and the zoning‑notice site with its dashboard; the restaurant inspection app took one week. Also the part that is not mine to claim: a GIS analyst on the team now builds her own AI‑assisted macros. I helped her find which of her routines was worth automating and how to talk to the model about it. She built it. It still runs.
  2. Cognizant, embedded at FM Global Software engineer inside a client’s org for three and a half years, working across their teams — PM, dev, BA, data science — to turn data‑science output into field‑ready tools risk curators could actually use. Led development of the React/TypeScript curation platform where a risk analyst settles ownership, boundary, and entrance questions with street‑level and aerial imagery beside the parcel, and engineered the four‑stage Python property‑valuation pipeline on Azure that carries a property from raw ingestion through enrichment and spatial analysis to a finished report. Ran the evaluation that retired the automated utility‑pole extraction requirement.
  3. City of Garland GIS DBA and programmer. Built the citizen service lookup, the real‑time city vehicle map, and the Python integration that pulls Waze’s live traffic feed onto the city’s internal operations map; ran ESRI disaster response through the 2015 Christmas tornadoes and the 2020 pandemic.
  4. City of Dallas GIS analyst; built a VB.NET scheduler that let inspectors plan their own day while it held every site to its required interval, and the Python pipeline that loaded what they brought back.
06

Three times the thing they asked for was not the thing I built

Two at the City of Garland, one at FM Global. Each arrived as a specification somebody had already settled. What I brought was a reason to change it — and, the last time, a reason to stop.

  1. Animal Services ·

    They asked for a map with every animal on it. A map answers where, and the question a citizen is holding is whether this one is mine. The map stayed; what I argued for was making the list the instrument beside it — grouped by status, in shelter against found against lost, with a photograph on every row. I took that to Animal Services myself.

    It updates itself, and citizens have filed found‑ and lost‑pet reports through it every month since. The department head was the one who said it worked.

  2. Restaurant inspections ·

    The plan was to publish the PDF report staff assembled by hand, which ran five to twenty days behind. Nobody read the database directly not because they preferred the PDF but because nobody could: two hundred‑odd tables, no documentation, no schema access, nobody left who knew it. I scripted sample pulls — ten rows a table over the window I needed — and mapped the fields by working backward from real published reports, which turned reading it directly from something nobody would attempt into something I could show them. Then I argued for it.

    Inspections publish in real time and a manual step is gone. One week end to end. The argument only existed because the capability came first — you cannot talk anyone out of a workaround until the thing it works around is reachable.

  3. Utility‑pole extraction ·

    The requirement was to pull utility poles out of imagery automatically. The off‑the‑shelf detection APIs were not accurate enough. ESRI’s own tooling was not either. I surveyed what else there was, recommended SAM‑GEO, and built a demo that worked — on imagery sharper than the project had, with no route to that imagery at a price worth paying.

    I recommended stopping, and the requirement was retired. Three evaluations to arrive at nothing shipped, which was the correct deliverable and the hardest one to hand over.

Unnum.

Things I keep running at home, off the clock

8 hens

An automated coop we designed together and my husband built: refill water weekly, food bi‑weekly, rodent‑proof, minimal upkeep. Daily routine is just collecting eggs from an external hatch.

11 background scripts

IFTTT and Google Apps Script: recording the utility readings, matching them against the bill, monitoring the weather alerts and the recurring data jobs.

Back to top