SENIOR DATA ENGINEER — DENVER, COLORADO — REMOTE
I build the platforms that move data from source systems to the dashboards and systems that clients actually make decisions on.
↔ swipe to follow the pipeline, tap a stage to highlight it
I've optimized my career for direct ownership, and that's been deliberate.
Direct ownership means you aren't handed a ticket three abstractions away from the customer — you sit with them directly, work out what they actually need, decide what gets built, build it, and you're there when it breaks. That's been worth it to me every time, and it's what I look for in where I work next.
What draws me in is the conversion — taking an idea and turning it into a production feature or product that gives clients real value. Revenue is the easier half of that test. The harder half is building something a client's business actually runs better with: data they act on, answers they couldn't get before, work they no longer have to do by hand. I've done that from an empty repository more than once: MVPs built from nothing, models delivered on infrastructure I provisioned myself, and platforms carried through to the client-facing products a business sells.
I do my best work where there's very little structure and a lot to build. Give me an unstructured problem and room to own the answer end to end, and that's where I'm most useful.
Building an analytics capability that didn't previously exist
There was data but no analytics. It lived scattered across the operational systems that produced it: MongoDB behind the product, PostgreSQL behind another service, files landing over SFTP. There was no way to ask a question that touched more than one of those at a time.
I was one of two founding engineers on the platform that changed that, and I built it from the ground up: the architecture, the infrastructure it runs on, the ingestion into it, the transformation layers through it, and the delivery out of it. Bronze for raw landing, Silver for governed and conformed data in Unity Catalog, Gold for the customer-facing aggregated models and predictive results that everything downstream reads from.
Two things came out of it: an internal analytics capability that didn't exist before, and multiple channels for clients to actually get their data — dashboards they log into, scheduled reports, or direct delivery into their own systems.
I own the repository, its architecture, and its release process. Every system further down this page — the delivery channels, the agent, the classifier, the deploy tooling, the knowledge graph — runs on this foundation.
A typed, tested, governed deploy path across ~80 Databricks jobs
The legacy dbx deployment path made every release a question of what state the workspace was actually in. Jobs drifted between staging and production, and nobody could tell you with confidence which.
Nothing off the shelf fit, so I built the deploy path myself. Infrastructure as code first: every job and pipeline became a typed Pydantic definition, so the repository is the source of truth for what should exist rather than a rough description of what probably does. Deploys turned into idempotent name-based upserts rather than creates, rollout follows dependency order, and drift between environments is detected automatically instead of discovered during an incident.
Around that I built the team's CI/CD process — automated test gates before anything promotes, a defined release cadence rather than deploys whenever someone felt ready, and a governed path from staging to production that applies to everyone including me. Deployment stopped being an act of institutional memory.
The real outcome was social rather than technical: the barrier to shipping a pipeline change dropped enough that other engineers stopped routing changes through me. I own this release process, along with the architecture of the repository it governs.
Custom Python, then AWS Glue, then write-ahead-log CDC
I've rebuilt the ingestion layer three times. Sources change, volumes grow, and whatever approach was right at the start usually stops being right about a year and a half later.
The first generation was hand-built Python pipelines — fast to write, total control, and increasingly a maintenance tax as the number of sources climbed. The second moved to AWS Glue, trading some of that control for managed infrastructure and less operational surface.
The third is Estuary Flow reading the PostgreSQL write-ahead log directly. Change data capture rather than scheduled extraction, which cut replication latency and deleted an entire category of custom ingestion code along with the maintenance it demanded.
The useful thing isn't the final answer. It's having built all three and knowing concretely what each costs — where hand-rolled beats managed, and where paying for managed infrastructure buys back more than it costs.
Turning undocumented business logic into the models clients actually see
Getting the data to move was the straightforward part. Deciding what it should actually become once it landed was the real job, and that answer almost always started as something a project manager or a client said out loud in a meeting, not anything written down as a spec.
Raw to Silver is mapping and cleanup: enum and field mappings, flattening unstructured sources like MongoDB documents and scraped web data into something conformed and queryable. Silver to Gold is where it turns into an actual answer: model predictions get attached, and the conformed data gets shaped into what a client receives — Delta Shares, filterable data models, CSV extracts, dashboards.
That design work started with people more than code: sitting with project managers, clients, and leadership to work out the business logic behind how a given lender actually operated, then turning that into SQL models built on a real understanding of the data. It's closer to business analysis than engineering some days, and at a company this size it landed on me anyway, along with every test, alert, and quality check behind it. There's no separate data-quality team here.
It started as five models for one client. It's roughly 80 now, across a growing client base and a widening set of use cases. The pipelines that build them are dynamic rather than fixed-batch — refreshed live on a cadence, with some running as streaming builds outright, so the lag between a source system updating and a client seeing it stays close to nothing.
Three channels: scheduled files out, hosted SFTP to pull from, and live Delta Sharing
Plenty of clients don't want to log into a dashboard at all. They want files landing in their own systems on a schedule, in formats their existing processes already understand, so the data shows up where their analysts and their downstream tooling already live.
I built the delivery system for that end to end. Reports generate as CSV and PDF off the Gold models and go out to client-owned SFTP endpoints on a schedule — no manual export step, no analyst assembling a file on a Friday.
The other direction needed solving too, so I built and operate SFTP hosting on our side. Clients who would rather pull than be pushed to can connect directly and take what they need on their own cadence.
The third channel skips files entirely. Delta Sharing gives clients live read access to the Gold tables themselves — no export, no copy, no transfer window. They query the data where it already lives, which is both the lowest-latency option available and the cheapest, since nothing is duplicated or moved to serve it.
It's the same infrastructure problem as ingestion pointed the other way: scheduling, credentials, formats, failure handling, and a delivery guarantee. Getting data out reliably turns out to be roughly as hard as getting it in, and it's the half that clients actually notice when it breaks.
Databricks, Metabase, Tableau, Power BI — and custom tooling when those didn't fit
Every data role I've had turned into a BI role too, whether or not that was the actual title. If nobody can see the data, nobody uses it, so I ended up building the reporting layer by default at every one of them.
I've built dashboards inside GUI tools — Databricks' native dashboards, Metabase, Tableau, Power BI — and built custom dashboards from scratch with Apache ECharts when none of those fit what a specific report needed.
The audience was never just internal. Some of it is analytics for the team itself and operational metrics like billing. Some of it goes straight to clients, as the actual interface they use to see their own data.
It started as something only I built. As teams grew, other people started building and owning dashboards of their own — but I'm still the one accountable for the whole layer.
Currently building: letting clients ask questions of the platform in plain language
A dashboard only answers the questions you thought to build it for. I'm building an analytics agent to handle everything else, so clients can ask questions about their own data directly instead of filing a request and waiting on the analytics team.
Making model output auditable enough to run over client data
Every lender names their loan pipeline stages differently, and analytics across clients needs one vocabulary. The system that solves this was co-built with the data science team: a three-tier pipeline that tries a deterministic lookup first, then a cross-client SQL consensus, and only pays for LLM inference on genuinely novel cases.
My piece was making that model tier trustworthy enough to run unattended over client data. Being usually right isn't good enough for that, so I built the reliability layer around it. Each classification samples five times and resolves by majority. Every prediction carries a confidence score and flags itself for human review below threshold. Results land in an append-only Unity Catalog ledger, so nothing is silently overwritten and every decision stays traceable to the run that produced it.
General-purpose models read mortgage acronyms as ordinary English and confidently guess wrong, which turned out to be the real accuracy problem, not the model's underlying statistics. Enriching each prompt with the lender's own preceding and following statuses, pulled with SQL window functions, gave the model the sequence context to disambiguate them.
Terraform-built environments serving forecasting models over healthcare and PII data
Getting a model to a client at DataPrime meant standing up the infrastructure it would run on first, inside SOC 2 boundaries, with the data itself being healthcare records and personally identifiable information.
I provisioned that infrastructure with Terraform so environments were reproducible rather than hand-assembled, and owned them through deployment. Where client access restrictions blocked the straightforward path, I designed a compliant handling system that met the constraint instead of routing around it.
The models themselves projected freight shipping costs and logistics — forecasting work whose value depended entirely on it being delivered somewhere clients could actually use it.
Making the repository navigable by people and by coding agents
A platform this size accumulates knowledge that lives in the heads of whoever built it. "What breaks if I change this column?" was a question only a few people could answer, and answering it took an afternoon.
I built a machine-navigable knowledge graph over the pipelines — lineage, blast radius, field-level mapping across ingestion, Delta Live Tables, and dbt — then wrapped it in agentic tooling: five custom Claude Code skills and three specialized agents covering lineage lookup, guided deployment, workspace drift reconciliation, safe deprecation, and dependency modernization.
New contributors could answer impact questions in their first week without interrupting anyone, instead of waiting on whoever happened to remember the answer.
More recently the emphasis has moved from documenting the platform to making it workable by agents. The skills and tooling I've built encode how this repository actually behaves — its conventions, its deploy path, its dependency structure — so a coding agent operating in it works from real context instead of inferring from filenames. Whatever's in the editor, Claude or ChatGPT or whatever comes next, arrives at the same authoritative answer a senior engineer on the team would give.
This has become the part of the work I'm most interested in. Every workflow that gets automated is one fewer thing that depends on somebody remembering it, and the velocity gain compounds across the whole team rather than stopping with the person who built the tool.
Polly (PollyEx, Inc.) · Remote
Own the analytics repository — its architecture, its release process, and the deployment tooling, ingestion, and production LLM systems inside it. Set the engineering standards the team builds against and mentor contributors on the platform.
Polly (PollyEx, Inc.) · Remote
One of two founding engineers on the analytics platform. Built the Bronze/Silver/Gold medallion architecture on Databricks and AWS from an empty repository, and became its largest contributor — 850+ commits and counting.
DataPrime
Provisioned client-facing cloud infrastructure with Terraform and built freight cost and logistics forecasting models. Worked with healthcare and PII data under SOC 2, designing a compliant handling path within client access restrictions.
TallyScore · Denver, CO
One of two engineers at a six-person bootstrapped startup, working full stack. Built a public-sentiment application that scraped public sources and applied NLP to surface how customers talked about a company, plus several POCs and MVPs demoed to investors.
Galvanize · Denver, CO
Taught Python, machine learning, and neural networks in the Data Science Immersive program, and coached students through technical assignments and capstones.
Virtuoso Sourcing Group · Denver, CO
Ran firm finance and operations, reporting to the CEO and COO. Used analytics to evaluate contract profitability and automated the firm's invoicing and HR processes — the work that pulled me into data engineering.
Python · SQL · PySpark · Databricks · Delta Lake · Delta Live Tables · Unity Catalog · dbt · dbt Cloud · Redshift · S3 · AWS · Estuary Flow · Change data capture · Medallion architecture · Dimensional data modeling
Databricks Foundation Models · Anthropic Claude · Prompt engineering · Multi-vote inference and confidence scoring · Claude Code · AI agents · Knowledge graphs
Pydantic · REST APIs · Alembic · Git and GitFlow · CI/CD · Automated testing · Jira
Terraform · Infrastructure as code · Cloud provisioning · Kubernetes · SOC 2 compliant data handling · PII governance
Forecasting · Natural language processing · Sentiment analysis · MLOps · Model monitoring · scikit-learn
PostgreSQL · MongoDB · Redshift · SFTP ingestion
Tableau · Power BI · Metabase · Databricks dashboards · Apache ECharts
I didn't take the traditional route into this.
I graduated from Boulder with an economics degree and a business minor, and started out in finance — running budgets, forecasting, and reporting for a sourcing firm in Denver. The part of that job I actually cared about turned out to be the analytics. Finding the trend in the numbers, working out why a contract was quietly losing money, automating the process that produced the report so nobody had to build it by hand again.
The computers half was never foreign. I built my first PC at 14 and had been pulling things apart ever since. So I taught myself to code, then went to Galvanize's Data Science Immersive to do it properly.
What followed was a run of projects built mostly to find out whether I could:
Those are the projects that turned a career change into a career. They also set the pattern I've followed since: pick a problem where the answer isn't obvious, build the whole thing including the infrastructure it runs on, and find out.
The industry I started in barely resembles the one I work in now. When I began, everything was written by hand. In the last couple of years AI has absorbed a real share of that, and raw velocity has gone up something like tenfold.
What I've taken from it is that the code was never going to stay the bottleneck. If you can build ten times faster, everything around the code has to move ten times faster too — the planning, the review, the deployment discipline, and the decision about whether a thing is worth building at all. Otherwise you just produce ten times the work nobody asked for. A fair amount of what I've built at the platform level exists for exactly that reason.
It's a shift I welcome, and keeping current with it has been a deliberate goal rather than something I've let happen around me. I'm curious what the next few years do to this work.
I grew up just outside Washington, D.C., in Langley, Virginia. Close enough to the city to have opinions about it, far enough out to have spent most of my time in the woods behind the house.
Then I went west for the University of Colorado Boulder — Sko Buffs!! — and never found a good reason to leave the state. Shortly after graduating I moved down to Denver, which is where the professional half of this story starts and where I still am.
Denver is also where I picked up snowboarding and fly fishing, and both now shape a good part of my year. Working remotely turned out to be ideal for that. I can chase good snow and good water across the country and overseas instead of rationing it into long weekends.
It has fed a broader travel habit. I'm working through a list of countries and states and trying to cross them off about as fast as I reasonably can.