From dbt Cloud to Core: How a Tech Company Saved $100K+ and Got the Flexibility dbt Cloud Couldn't Offer
Zero-downtime migration with better tooling on the other side
Tony Zeljkovic
2025-04-15
Case study
How Narona Data migrated a high-growth tech company from dbt Cloud to dbt Core with zero downtime, saving over $100K annually while delivering custom tooling that dbt Cloud couldn't match.
- Industry
- Technology
- Duration
- ~2 months
- Stack
- dbt Core, VS Code devcontainers, custom CLI wrapper, YAML linter, pytest, CI/CD
Discovery
Audit & Team Assessment
The engagement started with an audit of the existing dbt Cloud setup, team interviews, and security policy review.
Key Findings
- dbt Cloud couldn't meet the team's development environment requirements — VPN access, lineage integration, custom querying
- The team preferred local development over another managed cloud environment
- No mechanism existed to enforce best practices (defer commands, blocking expensive upstream builds)
- YAML configuration quality was inconsistent — errors caught in production, not during development
- Existing tools (dbt-checkpoint) lacked the extensibility the team needed for custom governance
Migration Strategy
A phased approach was chosen: devcontainer first (foundation), then CLI wrapper (best practices), then YAML tooling (governance). Each phase was sequenced so the team always had a working environment — zero downtime was a hard requirement.
Week 1-2Engagement KickoffAudit dbt Cloud setup, team interviews, security policy review
Result unlocked here
Build
VS Code Devcontainer
The foundation of the migration: a custom development environment that matched or exceeded dbt Cloud's capabilities.
What Was Built
A VS Code devcontainer with warehouse connection through VPN, lineage tracking, and database query tools. Compatible with both local machines and GitHub Codespaces for flexibility.
Why devcontainers over alternatives: The team needed a reproducible environment that worked identically across machines, supported VPN, and didn't require each engineer to maintain their own dbt setup. Devcontainers encapsulated everything — one setup, every machine.
What This Enabled
The team could develop dbt models locally with full warehouse access, lineage visibility, and query capabilities — things that had required workarounds or were impossible in dbt Cloud.
Week 2-4VS Code DevcontainerReady-made dbt environment with warehouse connection, VPN support, lineage, and query tools
Result unlocked here
Week 5-7Custom dbt CLI WrapperExtendable CLI enforcing defer commands, blocking expensive upstream builds
Result unlocked here
Week 6-8YAML Linter & Pytest FrameworkReal-time YAML validation, manifest-based custom governance tests in CI/CD
Result unlocked here
Enable
Team Onboarding
With the devcontainer ready, each team member needed to be set up and comfortable before the old environment was retired.
Onboarding Approach
Documentation was written for the new environment, and scheduled 1:1 sessions were held with each team member to get them set up. This wasn't a group demo — each engineer's machine and workflow had specific considerations.
Why individual sessions: Engineers had different local setups, VPN configurations, and workflow habits. Group training would have papered over individual issues. One-on-one sessions ensured everyone was actually productive, not just "onboarded."
This phase ran in parallel with the CLI wrapper work — onboarding didn't block the next build phase.
Week 4-6Team OnboardingDocumentation, scheduled sessions with each team member to get set up
Result unlocked here
Deliver
Migration Complete
The migration was complete with zero downtime — the team transitioned seamlessly from dbt Cloud to dbt Core with custom tooling.
| Metric | Before | After |
|---|---|---|
| Annual platform cost | dbt Cloud licensing | >$100K saved |
| Development speed | Slowed by workarounds | 30% faster |
| Migration downtime | — | Zero |
| Best practice enforcement | Manual | Automated via CLI |
| YAML quality | Caught in prod | Real-time linting + CI/CD |
What Made It Work
Three factors combined:
- Phased migration with zero downtime — The team always had a working environment. No "dark period" where productivity dropped.
- Custom tooling that exceeded dbt Cloud — The devcontainer, CLI wrapper, and YAML linter weren't just replacements — they were upgrades. The team was more productive after the migration, not just cheaper.
- Iterative refinement — The CLI wrapper rules and governance tests were tuned through experimentation with the team, not imposed top-down. Adoption was natural because the tools fit the team's actual workflow.
Week 8ResultMigration Complete>$100K annual savings, 30% faster development, zero downtime
Result unlocked here
Closing readout
The migration became a self-service analytics platform.
The dashboard migration removed the immediate Looker cost and backlog pressure. The metadata captured along the way became the stronger asset: a verified semantic layer and agent loop that keeps improving with actual stakeholder use.
Talk through a similar migration