
I make software work inside real organizations.
Ten years in and around local government: two village halls, then court and payments systems deployed into 100+ Illinois municipalities, from legacy data conversion to go-live. This site is where I build in public.
AI voice and music by ElevenLabs. Photographic scenes are AI-generated. Stamped page shots are recorded from jakelawrence.xyz.

AI voice and music by ElevenLabs. Photographic scenes are AI-generated. Stamped page shots are recorded from jakelawrence.xyz.
Three things I built
All work


How I decide
- The constraint
- The reviewer is a clerk with a browser, not an engineer. Real client data can never sit in git, and the application tier can never hold the identifiers that make a court export sensitive.
- What I chose
- Redact at the boundary and build the console for the reviewer: a pass that blanks SSN, date of birth, license number, address, ZIP, phone, and email while keeping names; an auth-gated review console behind a court-branded magic-link login; a plain-language guided wizard with a finish flow; document serving with an in-app reader and PDF download; an onboarding email that carries the end-to-end instructions; and an admin runbook.
- Cited pull requests
- #570, #571, #573, #574, #579, #581, #1918
Eight cases with receipts
All eight casesIn the order I would show a hiring manager for:
- Applied AI engineerYou need proof I can direct models, check their work, and turn the result into something that runs. Verification cases come first.Case studies
- Solutions or implementationYou need someone who has already lived through a hundred municipal rollouts and knows where they break. Legacy and stakeholder cases lead.Case studies
- GovTech productYou need domain fluency plus the ability to build. I clerked plan commissions before I wrote the tools for them.Case studies
Run it yourself
The full profilerThe frequency list in the first proof exists so a learner can tell whether a Ukrainian text is within reach. This is the profiler built on it. Pick a reader's level and every word above it gets marked.
Я живу в невеликій квартирі. У квартирі є кухня, спальня і вітальня. У вітальні стоїть диван, а біля дивана є маленький стіл. На стіні висить картина від друзів. У спальні стоять ліжко і шафа. Балкона немає, але в кабінеті є полиця для книжок. У будні я встаю о сьомій. Іду у ванну кімнату, потім снідаю з родиною. На роботу їду автобусом. Увечері вечеряю на кухні і читаю книжку перед сном.
Excerpt from Мій дім, мій день (A2), learn-ukrainian (Krisztian Koos and contributors), the open A1 to C2 Ukrainian course. CC BY-SA 4.0. One of the profiler's validation texts.
The share of running words a reader at each level already knows. The dashed line marks 95 percent, the usual target for reading with support (Laufer 1989; Hu and Nation 2000).
Run downloads the lexicon once, about 600 KB. The measuring happens on your device.
- known60
- above the level8висить, Балкона, кабінеті, полиця, будні, родиною, перед, сном
- not matched to a lemma2снідаю, вечеряю
Unmatched means the profiler could not reach a lemma. The list carries the nouns сніданок and вечеря, both A1, and lacks the verbs снідати and вечеряти, so снідаю and вечеряю stay unmatched at every level.
Nothing you paste leaves your browser: the lexicon is downloaded once and the analysis runs on your device. No text is stored, logged, or sent anywhere. An analytics ping records that Run was pressed. It never carries the text.
Get the next written case studyNewsletter
Each written case study shows the constraint, the decision, and the pull requests behind it. Subscribe and the next one reaches you when it is published. It is the one list for the whole site, so you will get the rest of the work too. No schedule, easy out.
Now
Taking the Ukrainian Frequency study from dataset to product: a hosted lemmatizer, a Python package, and a free course built on the same data. Also reading about how public records systems decide what counts.