Dominic Hanzely
Systems architecture & integration · Minnesota — remote or Twin Cities
I work at the seams. Nearly every interesting problem I have had is the same problem in different clothes: keep a system running while the thing underneath it changes.
A lot of that work has meant putting incompatible systems behind one coherent model, then evolving that model without breaking what depends on it.
BuzzFeed, 2015 to 2026
Software Engineer, 2015. Senior Software Engineer, 2017. Staff Software Engineer, 2022.
For eleven and a half years I was a continuous technical thread through BuzzFeed's content-distribution platform: about thirty-five services abstracting six third-party publishing APIs (Facebook, Instagram, YouTube, X, TikTok, Threads) behind a single model of drafts, jobs, and credentials, fed by an event-driven automation pipeline. I was there at its inception, operated and evolved it through a decade of production use, and became its second-largest backend contributor.
The work I would actually want to talk about:
- An automation rules engine that lived in a single ~22,000-line configuration file (507 rules, 119 destination channels). I led the collaborative redesign and implementation that replaced it: a versioned relational model with tiered UI access for product and editorial users. We landed the v1-to-v2 cutover through a 21-step migration, with zero duplicate social posts and no interruption to automated publishing, then deleted the legacy system. The database was not the point. The point was that authoring automation stopped being an engineering pull request and became a product surface non-engineers use.
- A monolithic publishing router decomposed into five event-driven stages: ingest, safety screening, relevance scoring, rule matching, post creation. That shape has held for eight years, and the architecture diagram I drew of it remained a reference through four successive team incarnations; people occasionally discovered, years later, that I had drawn it.
- Carried several multi-service migrations through completion: two message-schema migrations across 4+ independently deployed services using phased dual-emit and per-consumer cutovers with no flag day; a three-month, zero-downtime data-model migration in the core publishing API; and consolidation of three credential-validation jobs into one stateless service spanning five platforms and unifying five incompatible expiry semantics, retiring ~2,500 lines of superseded code.
- A platform that started returning errors for publishes which had actually succeeded. The post was live, the system recorded failure, and a retry would duplicate it. I instrumented first, so an anecdote became a measurable rate, then recovered fail-closed: mark success only on exactly one unambiguous match, and let anything inconclusive stay failed.
- Built the request-path selection engine for an editor-configured on-site campaign-targeting service, using simple primitive comparisons, data structures, and caching to reduce p95 from 267 ms to 3.7 ms at 200 requests/second on one 512 MB container. I validated the work with the monorepo's per-service load-testing suite, then built an AI skill that orchestrated the tests and generated result artifacts; other teams reused it with little or no modification.
- Selected for BuzzFeed's AI tooling/workflow accelerator; conceived and shipped the organization's first AI developer tool, a VS Code chat extension doing client-side retrieval over internal documentation, through three releases with a CLI installer. Later implemented a 23-tool MCP surface on the internal agent platform, giving coding agents access to the automated-publishing system and its operational state. Engineers could use it to investigate questions like why a particular piece of content failed to auto-publish to a destination.
- Mentored a cloud security engineer through a three-month formal program that continued for nearly three years, supporting his growth in Python and software development as he earned a promotion. Taught a product owner with no engineering background to make production rule changes directly; she shipped 168 reviewed commits in a year. Managed a 2018 intern who was hired full-time in 2019 and remained at BuzzFeed through my departure.
What I am building now
Since July 2026 I have been building Uncompose, an open-source toolkit that separates recorded music into stems, alone, in public. I have played guitar for forty years, and it began with a practice problem I wanted to solve: isolate the part you are learning, keep the audio on your own machine, and be honest about how good the separation actually is.
It is three Rust command-line tools sharing one command namespace. uncompose
does the separation, over a runtime-provisioned PyTorch engine. uncompose-project
keeps a portable manifest of assets, derivations, and evaluations. uncompose-compare
is a blind A/B listening workbench with an embedded browser frontend. All three are published
on PyPI under MIT.
The architecture is the part a résumé cannot tell. The separation models are Python and
PyTorch; the Rust core never links against them. It provisions the engine environment at
runtime and drives it across a process boundary, with a fake-engine crate as the test seam and
an acceptance suite that runs against the installed artifact, so engines can be swapped,
pinned, and faked without touching the core. The tools themselves are connected by documented
contract rather than shared code: an external-dispatch convention, where uncompose
finds uncompose-* subcommands on PATH, plus versioned JSON schemas with integrity
states, atomic writes, and advisory locking, so each tool ships, versions, and fails
independently. Listening comparisons run blind by design, with identity concealment and
psychoacoustic loudness matching tested in their own harness, because an evaluation you can
peek at is not an evaluation.
uncompose project verify. The stems are fake so the demo runs anywhere;
the manifest contract is the real one.It is also where my current engineering practice sits on the public record. I work spec-first, and AI agents do the implementation, gated by human review: thirty-plus architecture decision records and roughly 135 issues and 80 pull requests across the family, agent-authored branches merged through review, releases tag-driven with trusted publishing to PyPI and no long-lived credentials. That workflow is a big part of how first commit to three published packages and a live site took thirteen days, in a domain that was new to me.
Before that
- 2013 – 2015University of Minnesota, OIT · Senior Web Developer. Integrations and core customizations to the University's fork of Moodle, and a video transcoding and short-term storage service for academic media.
- 2010 – 2013Media Logic Group · Director of Development. Wind energy: near-real-time SCADA integration with turbines over Modbus and OPC-XML, NOAA ingest, and WRF-tuned forecast models driving power-generation predictions.
- 2007 – 2010Star Tribune · Web Applications Developer. Full-stack internal and public work, including public data portals.
- 1999 – 2008Uniloc, then Cipher Multimedia · Software Engineer, then Head of Technology. Digital rights management and multimedia. Nine continuous years: the company's primary investor wound the first one down and backed me to build its successor.
Contact
email@dominichanzely.com · résumé · uncompose.org
software that is {test,read,maintain,extend,st}able