{"id":50754874,"url":"https://github.com/hytfjwr/dbtl","last_synced_at":"2026-06-11T04:01:11.950Z","repository":{"id":363856892,"uuid":"1265224125","full_name":"hytfjwr/dbtl","owner":"hytfjwr","description":"A terminal UI for exploring dbt model lineage as ASCII art","archived":false,"fork":false,"pushed_at":"2026-06-10T16:34:46.000Z","size":377,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-10T18:06:02.437Z","etag":null,"topics":["analytics-engineering","cli","data-lineage","dbt","ratatui","rust","terminal","tui"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hytfjwr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-10T15:21:05.000Z","updated_at":"2026-06-10T16:38:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hytfjwr/dbtl","commit_stats":null,"previous_names":["hytfjwr/dbtl"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/hytfjwr/dbtl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hytfjwr%2Fdbtl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hytfjwr%2Fdbtl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hytfjwr%2Fdbtl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hytfjwr%2Fdbtl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hytfjwr","download_url":"https://codeload.github.com/hytfjwr/dbtl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hytfjwr%2Fdbtl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34181555,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analytics-engineering","cli","data-lineage","dbt","ratatui","rust","terminal","tui"],"created_at":"2026-06-11T04:00:28.570Z","updated_at":"2026-06-11T04:01:11.890Z","avatar_url":"https://github.com/hytfjwr.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003edbtl\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\nA terminal UI for dbt model lineage — no compile, no browser.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/hytfjwr/dbtl/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/hytfjwr/dbtl/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/hytfjwr/dbtl/actions/workflows/security.yml\"\u003e\u003cimg src=\"https://github.com/hytfjwr/dbtl/actions/workflows/security.yml/badge.svg\" alt=\"Security\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/hytfjwr/dbtl/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/hytfjwr/dbtl\" alt=\"GitHub release\"\u003e\u003c/a\u003e\n\u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"License: MIT\"\u003e\u003c/a\u003e\n\u003cimg src=\"https://img.shields.io/badge/rust-1.92+-orange.svg\" alt=\"Rust 1.92+\"\u003e\n\u003c/p\u003e\n\n`dbtl` renders your dbt project's dependency graph as ASCII art in a two-pane terminal UI. Pick a model on the left, see its lineage on the right, and answer \"what does this model depend on, and what does it affect?\" without leaving the terminal.\n\n```\n╭Seed────────────────────╮   ╭View───────────────────╮   ╭View────────────────────╮\n│ source_datetime_policy │──▶│ stg_payment__shoppers │──▶│ int_shoppers__combined │\n╰────────────────tests:4─╯  │╰───────────────tests:5─╯   ╰────────────────────────╯\n                            │\n╭Source────╮                │\n│ shoppers │────────────────╯\n╰──────────╯\n```\n\nKey features:\n\n- **No `dbt compile` required.** Builds lineage straight from `dbt_project.yml` + model `.sql` (`ref()`/`source()`) + `schema.yml`. Uses `target/manifest.json` automatically when present.\n- **Single static binary, works over SSH.** Everything happens inside the terminal — no `dbt docs serve`, no browser.\n- **Navigate the graph, not just the list.** Move a cursor between lineage nodes, re-root on any model, filter by direction and depth, and walk your re-root history.\n- **Built for test-coverage and impact chores.** Coverage/blast-radius/layer lenses, a stats dashboard, untested-model cycling, and one-key export to Mermaid / Graphviz / Markdown impact reports.\n\n## Quick Start\n\nRun it at the root of any dbt project:\n\n```console\n$ dbtl\n```\n\nThat's it. If `target/manifest.json` exists it is used; otherwise the project source is parsed directly.\n\nSource mode infers lineage from the raw SQL (no Jinja rendering), so a compiled\nmanifest is always more accurate — if `dbt` is on your `PATH`, press `P` inside\nthe app to run `dbt parse` and switch to the generated manifest in place.\n\n## Install\n\n**Homebrew (macOS / Linux):**\n\n```console\n$ brew install hytfjwr/tap/dbtl\n```\n\n**Prebuilt binaries:** grab a tarball for your platform from the\n[releases page](https://github.com/hytfjwr/dbtl/releases) (`checksums.txt`\nincluded).\n\n**From source (requires Rust 1.92+):**\n\n```console\n$ git clone https://github.com/hytfjwr/dbtl.git\n$ cd dbtl\n$ cargo install --path .\n```\n\n## Usage\n\n```console\n# Auto-detect: reads ./target/manifest.json if present, otherwise parses ./ as source\n$ dbtl\n\n# Point at a project directory\n$ dbtl --project /path/to/dbt-project\n\n# Force a mode\n$ dbtl --manifest /path/to/target/manifest.json\n$ dbtl --source /path/to/dbt-project\n\n# Select a model at startup and auto-reload on source changes\n$ dbtl --select stg_orders --watch\n```\n\n### Keybindings\n\nPress `?` inside the app for the full list. Highlights:\n\n| Key | Action |\n|------|------|\n| `j` `k` `h` `l` | Move in the list / move the lineage cursor |\n| `Tab` | Switch focus between list ⇄ lineage |\n| `Enter` | Structure view (columns / tests / description); on a lineage node, re-root to it |\n| `/` | Fuzzy search (list filter / lineage jump) |\n| `u` `d` `[` `]` `0` | Filter the lineage view (direction / depth / reset) |\n| `b` `f` | Back / forward in re-root history |\n| `t` | Cycle lineage lens (test coverage → blast-radius heat → layer → layer violation) |\n| `s` / `S` | SQL preview / project stats dashboard |\n| `o` | Open the model's SQL in `$EDITOR` |\n| `m` `x` `c` | Copy lineage as Mermaid / Graphviz DOT / ASCII art |\n| `i` / `e` | Copy a Markdown impact report / write the diagram to a file |\n| `Space` `'` | Bookmark / cycle bookmarks |\n| `T` `*` | Filter the list to untested / bookmarked models |\n| `P` | Run `dbt parse` and switch to the compiled manifest |\n| `Ctrl-p` | Command palette |\n| `q` | Quit |\n\nMouse is supported too: click a lineage node to re-root, wheel to scroll.\n\n### If borders look doubled or misaligned\n\nUnicode box-drawing characters are East Asian Ambiguous width; some terminal configurations draw them 2 cells wide. `dbtl` probes the terminal at startup and falls back to pure ASCII (`+ - | \u003e`) automatically, and you can force a mode:\n\n```console\n$ dbtl --ascii     # pure ASCII rendering\n$ dbtl --unicode   # skip the probe, keep Unicode box drawing\n```\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhytfjwr%2Fdbtl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhytfjwr%2Fdbtl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhytfjwr%2Fdbtl/lists"}