<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: remis haroon</title>
    <description>The latest articles on Forem by remis haroon (@remis_haroon_230334c87790).</description>
    <link>https://forem.com/remis_haroon_230334c87790</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2751574%2Fa19616d5-4829-477c-88b8-8b03223320ab.png</url>
      <title>Forem: remis haroon</title>
      <link>https://forem.com/remis_haroon_230334c87790</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/remis_haroon_230334c87790"/>
    <language>en</language>
    <item>
      <title>Building a dbt-UI I Wish Existed</title>
      <dc:creator>remis haroon</dc:creator>
      <pubDate>Mon, 15 Dec 2025 11:07:59 +0000</pubDate>
      <link>https://forem.com/remis_haroon_230334c87790/building-a-dbt-ui-i-wish-existed-3mn9</link>
      <guid>https://forem.com/remis_haroon_230334c87790/building-a-dbt-ui-i-wish-existed-3mn9</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F717c5acf9aquhu1xb7ha.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F717c5acf9aquhu1xb7ha.jpg" alt=" " width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/rezer-bleede/dbt-Workbench" rel="noopener noreferrer"&gt;dbt-Workbench&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;p&gt;A few months ago, I found myself doing the same thing over and over again.&lt;/p&gt;

&lt;p&gt;Open dbt Cloud.&lt;br&gt;
Click through models.&lt;br&gt;
Check lineage.&lt;br&gt;
Open docs.&lt;br&gt;
Switch projects.&lt;br&gt;
Repeat.&lt;/p&gt;

&lt;p&gt;None of this was bad. dbt Cloud does its job well. But the more I worked across different environments — local setups, on-prem systems, restricted networks — the more friction I felt. Not enough to complain loudly, but enough that it stayed in the back of my mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does this workflow feel heavier than it needs to be?
&lt;/h2&gt;

&lt;p&gt;The gap I kept running into&lt;br&gt;
Most dbt workflows eventually revolve around the same questions:&lt;/p&gt;

&lt;p&gt;What models exist here?&lt;br&gt;
How does this model depend on others?&lt;br&gt;
What changed recently?&lt;br&gt;
Can I quickly inspect the SQL behind this?&lt;br&gt;
What happened in the last run?&lt;br&gt;
You don’t need a lot of bells and whistles to answer those questions. You need visibility, clarity, and speed.&lt;/p&gt;

&lt;p&gt;But when you’re not fully cloud-native — or when you care about running things locally, on-prem, or inside constrained environments — options thin out quickly. You either stitch together scripts, or you accept that some things will always live behind a hosted service.&lt;/p&gt;

&lt;p&gt;That’s fine for many teams. It just wasn’t fine for all of my use cases.&lt;/p&gt;

&lt;p&gt;So I started experimenting&lt;br&gt;
At first, it was just curiosity.&lt;/p&gt;

&lt;p&gt;What if dbt artifacts themselves — manifest.json, run_results.json, catalog.json—were enough to power a clean UI?&lt;br&gt;
What if you didn’t need a remote service to explore your project?&lt;br&gt;
What if switching between dbt projects felt as lightweight as switching folders?&lt;/p&gt;

&lt;p&gt;I started hacking together a small UI that simply read what dbt already produces. No magic. No extra metadata. Just visibility.&lt;/p&gt;

&lt;p&gt;That experiment slowly grew into something more intentional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter dbt-Workbench
&lt;/h2&gt;

&lt;p&gt;I ended up building dbt-Workbench: a self-hosted, open-source UI for dbt projects.&lt;/p&gt;

&lt;p&gt;Not as a replacement for dbt Cloud, but as an alternative for situations where you want:&lt;/p&gt;

&lt;p&gt;Local or on-prem setups&lt;br&gt;
No vendor lock-in&lt;br&gt;
Multiple dbt projects in one place&lt;br&gt;
Direct access to compiled SQL and artifacts&lt;br&gt;
A UI that stays close to how dbt actually works&lt;br&gt;
The idea was simple:&lt;br&gt;
Let dbt be dbt. Just make it easier to see what’s going on.&lt;/p&gt;

&lt;p&gt;What it focuses on (and what it doesn’t)&lt;br&gt;
dbt-Workbench isn’t trying to reinvent dbt. It leans on what dbt already does well.&lt;/p&gt;

&lt;p&gt;Become a member&lt;br&gt;
It gives you:&lt;/p&gt;

&lt;p&gt;Model browsing and documentation&lt;br&gt;
Lineage visualization&lt;br&gt;
A SQL workspace that shows compiled SQL side by side with model code&lt;br&gt;
Run history and logs&lt;br&gt;
Multi-project support with proper isolation&lt;br&gt;
A plugin-friendly architecture for extensions&lt;br&gt;
What it doesn’t try to do:&lt;/p&gt;

&lt;p&gt;Abstract dbt away&lt;br&gt;
Hide how dbt works&lt;br&gt;
Replace your existing workflows overnight&lt;br&gt;
You can run it locally with Docker, point it at your dbt artifacts, and see value almost immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open source mattered here
&lt;/h2&gt;

&lt;p&gt;This kind of tool only makes sense if it’s transparent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Teams have different constraints:
&lt;/h2&gt;

&lt;p&gt;Air-gapped environments&lt;br&gt;
Strict security policies&lt;br&gt;
Custom dbt setups&lt;br&gt;
Unusual warehouse configurations&lt;br&gt;
Open source makes it possible to adapt the UI to those realities instead of forcing everything into one mold.&lt;/p&gt;

&lt;p&gt;It also keeps the project honest. If something feels wrong or unnecessary, it shows up quickly when other engineers look at it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Still early, intentionally
&lt;/h2&gt;

&lt;p&gt;dbt-Workbench is very much a work in progress. Some parts are solid, others are actively evolving. That’s intentional.&lt;/p&gt;

&lt;p&gt;I’d rather build it in the open, shaped by real feedback, than polish something in isolation and hope it fits.&lt;/p&gt;

&lt;p&gt;If you’re curious, the project lives here:&lt;br&gt;
&lt;a href="https://github.com/rezer-bleede/dbt-Workbench" rel="noopener noreferrer"&gt;https://github.com/rezer-bleede/dbt-Workbench&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No signup. No sales pitch. Just code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Most of us don’t need more tools.&lt;br&gt;
We need tools that quietly reduce friction.&lt;/p&gt;

&lt;p&gt;dbt-Workbench is my attempt at one of those. If it resonates, great. If it sparks ideas or critiques, even better.&lt;/p&gt;

&lt;p&gt;That’s usually how the best tools start anyway.&lt;/p&gt;

&lt;p&gt;Connect with Me on LinkedIn&lt;/p&gt;

&lt;p&gt;I’d love to keep the conversation going. If you found this article insightful or have thoughts, experiences, and ideas to share, let’s connect on LinkedIn!&lt;/p&gt;

&lt;p&gt;I’m always eager to engage with fellow professionals and enthusiasts in the field.&lt;/p&gt;

</description>
      <category>dbt</category>
      <category>data</category>
      <category>dataengineering</category>
      <category>dataanalytics</category>
    </item>
  </channel>
</rss>
