SENIOR DATA ENGINEER — DENVER, COLORADO — REMOTE

Thomas
Duffy

I build the platforms that move data from source systems to the dashboards and systems that clients actually make decisions on.

Founding engineer on Polly's analytics platform and owner of its repository — four years from an empty repo to production infrastructure, and the architecture and release process behind it.

Thomas Duffy
0YEARS ENGINEERING
EXPERIENCE
0COMMITS TO PRODUCTION
REPOSITORIES
0PIPELINES & ETLS
BUILT
THE PLATFORM I BUILT, END TO END — A MEDALLION ARCHITECTURE FROM RAW SOURCES TO WHAT CLIENTS RECEIVE
MEDALLION ARCHITECTURE SOURCES BRONZE SILVER GOLD PRODUCTS Structured dataPostgreSQL Unstructured docsMongoDB Files & objectsAmazon S3 CSV feedsExternal SFTP Web-scraped dataPublic web sources RAW LANDING Custom Python pipelines Live CDC ingestion WAL replication PySpark · AWS Glue DLT · Estuary Flow Transformations, mappings, encoding ML- & model-ready Unity Catalog Delta Lake · PySpark Customer-facing aggregated models Predictive analytics results dbt · Redshift Client dashboards Reports & data delivery Loan-status classifier Analytics agent

↔ swipe to follow the pipeline

How I work

I've built my career at small companies, and that's been deliberate.

Small teams mean direct ownership of the product. You aren't handed a ticket three abstractions away from the customer — you decide what gets built, you build it, and you're there when it breaks. That tradeoff has been worth it to me every time.

What draws me in is the conversion — taking an idea and turning it into something running in production that clients pay for because it genuinely helps them. 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.

Systems I designed and shipped

the work is proprietary — the architecture is not

The analytics platform, built from nothing

Giving Polly an analytics capability it did not previously have

+

Polly had data. It did not have analytics. Everything lived in the operational systems that produced it — MongoDB behind the product, PostgreSQL behind another service, files arriving over SFTP — and there was no way to ask a question that spanned any two of them.

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. Polly can now run analytics on its own data — the internal capability that didn't exist before. And clients receive their data through multiple channels: dashboards they log into, reports delivered on a schedule, and direct data 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.

Stack
Databricks, AWS, Spark, PySpark, Delta Lake, Delta Live Tables, Unity Catalog, dbt, Redshift, Terraform
Sources
MongoDB, PostgreSQL, Amazon S3, external SFTP feeds, web-scraped public data
Owned
Architecture, infrastructure, release process, repository

CI/CD and infrastructure as code, built in-house

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.

There was no off-the-shelf answer that fit, so I built one. 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.

Stack
Python, Pydantic, Databricks SDK, Terraform, GitHub, CI/CD, Delta Live Tables
Scale
~80 jobs and pipelines across staging and production

Three generations of the ingestion layer

Custom Python, then AWS Glue, then write-ahead-log CDC

+

Ingestion is the part of a platform that never stops being wrong. Sources change, volumes grow, and the approach that was right at the start stops being right about eighteen months in. I've rebuilt Polly's ingestion layer three times.

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.

Stack
Python, AWS Glue, PySpark, Estuary Flow, PostgreSQL, Delta Lake
Sources
MongoDB, PostgreSQL, Amazon S3, external SFTP feeds, web-scraped public data

Client reporting and data delivery

Three channels: scheduled files out, hosted SFTP to pull from, and live Delta Sharing

+

A dashboard assumes the client wants to log into your product. Plenty don't. 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.

Stack
Python, SFTP, CSV and PDF generation, Delta Sharing, Delta Lake, Redshift
Channels
Scheduled push to client endpoints; hosted pull from ours; live Delta Sharing access

Client-facing analytics agent

Letting lending clients ask questions of the platform in plain language

+

Dashboards answer the questions you anticipated. The analytics agent exists for the ones you didn't — letting clients interrogate their own data conversationally rather than filing a request and waiting on the analytics team.

Draft — needs your detail: what the agent can do, who uses it, whether it shipped, and how design responsibility split with the wider team.

Owned
Design

Reliability engineering for a production LLM classifier

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 the model tier trustworthy. A language model that is usually right is not the same as one you can run unattended over client data, and the gap between those two is entirely engineering. 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.

The accuracy problem turned out to be linguistic rather than statistical. General-purpose models read mortgage acronyms as ordinary English and confidently guess wrong. 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.

Stack
Databricks Foundation Models, Unity Catalog, PySpark, SQL
Owned
The reliability and auditability layer, and the prompt-context design
Shared
Overall system co-built with the data science team

Regulated-data delivery on provisioned infrastructure

Terraform-built environments serving forecasting models over healthcare and PII data

+

At DataPrime the modelling was rarely the hard part. Getting a model to a client meant standing up the environment it ran in, and doing it inside SOC 2 boundaries where the data was 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.

Stack
Terraform, Python, cloud infrastructure
Context
SOC 2, healthcare and PII data

Agentic tooling and the pipeline knowledge graph

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.

Tribal knowledge became self-service. New contributors could answer impact questions on their first week without interrupting anyone.

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.

Stack
Python, Claude Code, dbt, Delta Live Tables

Where I've worked

Nov 2023 — Present

Senior Data Engineer

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.

Jul 2022 — Nov 2023

Data Engineer

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.

Oct 2021 — Jul 2022

Data Scientist

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.

Apr 2020 — Jun 2021

Head of Data Science

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.

Dec 2019 — Mar 2020

Resident Data Scientist

Galvanize · Denver, CO

Taught Python, machine learning, and neural networks in the Data Science Immersive program, and coached students through technical assignments and capstones.

Jul 2016 — Feb 2019

Finance and Accounting Manager

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.

What I work in

Data platform

Python · SQL · PySpark · Databricks · Delta Lake · Delta Live Tables · Unity Catalog · dbt · Redshift · S3 · AWS · Estuary Flow · Change data capture · Medallion architecture

AI and LLM engineering

Databricks Foundation Models · Anthropic Claude · Prompt engineering · Multi-vote inference and confidence scoring · Claude Code · AI agents · Knowledge graphs

Software engineering

Pydantic · REST APIs · Git and GitFlow · CI/CD · Automated testing · Jira

Infrastructure

Terraform · Infrastructure as code · Cloud provisioning · SOC 2 compliant data handling · PII governance

Machine learning

Forecasting · Natural language processing · Sentiment analysis · MLOps · Model monitoring · scikit-learn

Data sources

PostgreSQL · MongoDB · Redshift · SFTP ingestion

How I got here

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:

  • A Where's Waldo finder — computer vision trained to pick him out of the page, which I deployed and hosted end to end on AWS myself.
  • A self-driving RC car — object detection and a convolutional neural network running on a Raspberry Pi.
  • A cryptocurrency sentiment tracker — scraped public Twitter data and tested whether mention volume and sentiment around a token actually tracked its price, or whether that correlation is just a story people tell each other.

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.

Away from the terminal

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.

Thomas Duffy walking a cobbled street
SAN MIGUEL DE ALLENDE