glyf
Open source visualization build tool for your data pipeline.
Ship charts from the same pipeline as your data.
Define charts in SQL, compose dashboards in YAML, publish anywhere.
Install · Quickstart · How it works · CLI · Examples · Docs
┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
│ dbt project │ │ glyf sources │ │ glyf build │
├──────────────────────┤ ├──────────────────────┤ ├──────────────────────┤
│ models/*.sql │ │ charts *.ggsql │ │ resolve ref() │
│ target/manifest.json │──▶│ dashboards *.yml │──▶│ execute DuckDB │
│ warehouse relations │ │ macros *.py │ │ render Altair │
└──────────────────────┘ └──────────────────────┘ └───────────┬──────────┘
│
┌─────────────────────────┬───────────────────────┬───────────┘
▼ ▼ ▼
site/index.html charts/*.png *.svg export --zip
static dashboard chart artifacts zip for CI
The last mile
Every stage of the modern data stack has declarative, version-controlled, testable artifacts. Every stage except visualization.
Your models are versioned. Your jobs are automated. Your data quality is tested. Visualization is still the last artifact outside the pipeline.
- Dashboards live outside the workflow. Your dbt models are in Git. Your charts are usually configured in a browser, stored elsewhere, and maintained by whoever last touched the UI.
- Columns rename, charts break silently. When dbt models change, dashboard failures show up late. glyf moves chart definitions into a build step that validates earlier.
- Publishing should not require a vendor. For internal portals and product dashboards, rendered HTML and chart assets are usually enough.
glyf is artifact-driven, not dbt-runtime-driven: run dbt first, then run glyf against the resulting artifacts and relations.
Install
glyf is published on PyPI as glyf-core. The package installs the glyf
command and the glyf Python module; only the distribution name differs.
uv tool install glyf-core
glyf --version
Other ways to install — one-line script, Homebrew, pipx, pip, offline
One-line script (macOS and Linux). Installs uv first if it is missing,
never uses sudo, and accepts --update, --version X, and --help:
curl -fsSL https://raw.githubusercontent.com/glyf-data/glyf/main/install.sh | sh
Homebrew. brew trust is required, not optional — Homebrew 6.0 refuses to
load formulae from untrusted third-party taps:
brew tap glyf-data/glyf
brew trust --tap glyf-data/glyf
brew install glyf
pipx or pip. Prefer uv or pipx for a CLI tool; use pip when you want
glyf inside an existing project virtualenv, next to dbt-core:
pipx install glyf-core
python -m pip install glyf-core
Offline or air-gapped. Every release
ships platform wheels, an sdist, and a checksums.txt:
sha256sum --check --ignore-missing checksums.txt
uv tool install ./glyf_core-<version>-cp311-abi3-<platform>.whl
Prebuilt wheels cover Linux (x86_64, aarch64), macOS (Intel, Apple Silicon),
and Windows (x86_64). They target Python 3.11+ through the stable ABI, so one
wheel per platform covers every supported Python version and no Rust toolchain
is needed. Upgrade with uv tool upgrade glyf-core.
Quickstart
In an existing dbt project:
glyf init # scaffold glyf.yml, visualisations/, dashboards/
dbt build # produce the dbt artifacts glyf reads
glyf doctor # check artifacts, charts, and DuckDB execution
glyf build # compile, render, and export the site
glyf serve # preview it locally
doctor reports whether the dbt artifacts, chart files, and DuckDB execution
are ready before your first build, so the first failure is a readable message
rather than a stack trace.
How it works
01 — Write charts in GGSQL
SQL you already know, extended with a visualization grammar. Use ref() to
reference dbt models directly, exactly as a dbt model would:
SELECT month, revenue
FROM {{ ref('fct_orders') }}
VISUALISE month AS x, revenue AS y
DRAW line
LABEL title => 'Monthly Revenue'
LABEL subtitle => 'Revenue trend from dbt model'
CONFIG width => 900
glyf resolves each reference to its schema path from target/manifest.json and
validates the query before it renders anything.
02 — Compose dashboards in YAML
Lay charts out into sections. Use Python macros for labels, thresholds, and reusable components, so a dashboard change is a one-line diff in review:
name: executive
title: Executive Dashboard
summary:
- "{{ ui.label_value('Owner', 'Analytics Engineering') }}"
- "{{ ui.label_value('Generated', time.now('%Y-%m-%d %H:%M')) }}"
layout:
columns: 3
sections:
- title: Revenue overview
columns: 3
items:
- metric:
label: Sample revenue
value: "$7.6k"
- chart: revenue
title: Monthly revenue
width: 2
03 — Build once, publish anywhere
One command resolves dbt artifacts, validates chart specs, executes chart SQL with DuckDB, renders charts with Altair, and emits files you can publish:
target/glyf/
├── compiled/ resolved SQL
├── charts/ rendered PNG / SVG
├── dashboards/ dashboard specs
└── site/ self-contained static site ← publish this
No BI server to maintain. Drop site/ into S3, GitHub Pages, a docs site, or a
CI artifact.
CLI
| Command | What it does |
|---|---|
glyf init |
Scaffold glyf config, chart, and dashboard directories |
glyf doctor |
Check dbt artifacts, chart files, and DuckDB execution |
glyf build |
Full pipeline: compile, render, and export |
glyf serve |
Serve the generated site locally |
glyf list |
List discovered charts and dashboards |
glyf validate |
Validate chart and dashboard specs without rendering |
glyf render |
Render charts only |
glyf dashboard |
Build dashboards only |
glyf export |
Export the publishable site (--clean, --zip) |
Point any command at another project with --project-dir:
glyf build --project-dir examples/sales_dashboard
Examples
Four runnable projects live in examples/:
simple_dbt, sales_dashboard, product_analytics, and finance_metrics.
uv sync
cd examples/simple_dbt
uv run dbt seed --profiles-dir . --full-refresh --no-partial-parse
uv run dbt run --profiles-dir .
uv run dbt compile --profiles-dir .
uv run glyf build
uv run glyf serve
Then open examples/simple_dbt/target/glyf/site/index.html.
Who it's for
| Analytics Engineer | You work in dbt and version-control everything. You should not need LookML or a BI platform UI to publish a declared dashboard artifact. |
| Data Scientist | Write SQL-style chart definitions that run in the pipeline and stay current, instead of one-off notebooks that drift. |
| Data Leader | Open source, runs locally, and produces outputs your team already knows how to deploy and review. |
| Application Engineer | The data team owns the spec; you consume rendered output without negotiating with an embedded analytics vendor. |
Status
| Capability | |
|---|---|
dbt ref() and source() resolution from manifest.json |
shipped |
| GGSQL chart definitions, DuckDB execution, Altair rendering | shipped |
| Dashboard YAML, Python macros, self-contained static site | shipped |
PNG / SVG chart artifacts and --zip export |
shipped |
| Generated typed React components | planned |
| MCP server so agents can reason about the chart graph | planned |
| Visual diff between builds as a CI artifact | planned |
See ROADMAP.md for the longer view.
Documentation
The full docs site is built from docs-site/
and published at glyf.pages.dev. These guides are also
readable directly in the repository:
| Quickstart | First build, end to end |
| Configuration | glyf.yml reference |
| Visualisation syntax | The GGSQL grammar |
| Dashboard YAML | Layout, sections, macros |
| dbt integration | Artifacts, ref(), adapters |
| CI/CD | Building glyf in a pipeline |
| Troubleshooting | Common failures |
Contributing
Developing from this repository
uv sync
Dev dependencies include dbt-core and dbt-duckdb for the bundled examples.
The Makefile runs the same checks locally and in GitHub Actions:
make ci # the full pipeline
make ci PYTHON_VERSION=3.12 # against a specific Python
make on its own lists every target. Individual steps: make install,
make test, make coverage, make build, make dashboard-ci. make test
runs pytest with coverage and writes coverage.xml, which CI uploads to
Codecov.
Run the docs site locally with Node.js installed:
cd docs-site
npm install
npm start
Issues and pull requests are welcome. Paths in glyf.yml and dashboard YAML use
forward slashes on every platform.
License
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file glyf_core-0.4.0.tar.gz.
File metadata
- Download URL: glyf_core-0.4.0.tar.gz
- Upload date:
- Size: 213.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0151ec693cbe5ea37052ce445750bfadd31b4230f2a89304124e535e78b97f5b
|
|
| MD5 |
01ac9186940434d6e24821057bdfa6e7
|
|
| BLAKE2b-256 |
05837d1fa860bbadf120e5c951afff404be52efd03975eeb91b0c8d0dff8c164
|
Provenance
The following attestation bundles were made for glyf_core-0.4.0.tar.gz:
Publisher:
release.yml on glyf-data/glyf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
glyf_core-0.4.0.tar.gz -
Subject digest:
0151ec693cbe5ea37052ce445750bfadd31b4230f2a89304124e535e78b97f5b - Sigstore transparency entry: 2645343011
- Sigstore integration time:
-
Permalink:
glyf-data/glyf@0993b28c8ee46024f149914f88a45f753f058315 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/glyf-data
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0993b28c8ee46024f149914f88a45f753f058315 -
Trigger Event:
push
-
Statement type:
File details
Details for the file glyf_core-0.4.0-cp311-abi3-win_amd64.whl.
File metadata
- Download URL: glyf_core-0.4.0-cp311-abi3-win_amd64.whl
- Upload date:
- Size: 3.8 MB
- Tags: CPython 3.11+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
69d6753ac377130c12b6154448bd0fec872bd5ebc2b5ea0e4359e95ccee0e15d
|
|
| MD5 |
2894ef1ca4b9c5fa64deff2fe6619842
|
|
| BLAKE2b-256 |
91c671bcb3405fdc37099156b4a9610e6d9d9bf53c58d47e4ab94a0c231a3db2
|
Provenance
The following attestation bundles were made for glyf_core-0.4.0-cp311-abi3-win_amd64.whl:
Publisher:
release.yml on glyf-data/glyf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
glyf_core-0.4.0-cp311-abi3-win_amd64.whl -
Subject digest:
69d6753ac377130c12b6154448bd0fec872bd5ebc2b5ea0e4359e95ccee0e15d - Sigstore transparency entry: 2645343021
- Sigstore integration time:
-
Permalink:
glyf-data/glyf@0993b28c8ee46024f149914f88a45f753f058315 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/glyf-data
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0993b28c8ee46024f149914f88a45f753f058315 -
Trigger Event:
push
-
Statement type:
File details
Details for the file glyf_core-0.4.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: glyf_core-0.4.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.4 MB
- Tags: CPython 3.11+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
36f8edf612c7ed0df245435d2aab8b276472bc686055bec80ffb7bdbbceb23c5
|
|
| MD5 |
7a419af86e71f5a6b72833da7e772d15
|
|
| BLAKE2b-256 |
aada6e3fc421af169398828dfda610cd3389f452e44e1c23c24f777a5022758f
|
Provenance
The following attestation bundles were made for glyf_core-0.4.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on glyf-data/glyf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
glyf_core-0.4.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
36f8edf612c7ed0df245435d2aab8b276472bc686055bec80ffb7bdbbceb23c5 - Sigstore transparency entry: 2645343013
- Sigstore integration time:
-
Permalink:
glyf-data/glyf@0993b28c8ee46024f149914f88a45f753f058315 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/glyf-data
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0993b28c8ee46024f149914f88a45f753f058315 -
Trigger Event:
push
-
Statement type:
File details
Details for the file glyf_core-0.4.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: glyf_core-0.4.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 4.3 MB
- Tags: CPython 3.11+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb1c92949045dbd0d2da9749b03e95bcc1913307de57f87a33e4373d6beec6d5
|
|
| MD5 |
74e7bbfde820a42cdad4063864fb65b8
|
|
| BLAKE2b-256 |
dab01d65f8db0f38d9a17bc511358acb296467330110a47128bda4b69da4d48f
|
Provenance
The following attestation bundles were made for glyf_core-0.4.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on glyf-data/glyf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
glyf_core-0.4.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
fb1c92949045dbd0d2da9749b03e95bcc1913307de57f87a33e4373d6beec6d5 - Sigstore transparency entry: 2645343019
- Sigstore integration time:
-
Permalink:
glyf-data/glyf@0993b28c8ee46024f149914f88a45f753f058315 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/glyf-data
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0993b28c8ee46024f149914f88a45f753f058315 -
Trigger Event:
push
-
Statement type:
File details
Details for the file glyf_core-0.4.0-cp311-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: glyf_core-0.4.0-cp311-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 3.7 MB
- Tags: CPython 3.11+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48f8b7a400d5a2cfbfc98e91323ded27a915dcd8588f868187855d1e465b868b
|
|
| MD5 |
4d365b134122516bd4ceeb08386cacfc
|
|
| BLAKE2b-256 |
a2e1a1b3ab45dd2a73a37106ce433a37d8a189fc8529302bd50f501e339f8ffd
|
Provenance
The following attestation bundles were made for glyf_core-0.4.0-cp311-abi3-macosx_11_0_arm64.whl:
Publisher:
release.yml on glyf-data/glyf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
glyf_core-0.4.0-cp311-abi3-macosx_11_0_arm64.whl -
Subject digest:
48f8b7a400d5a2cfbfc98e91323ded27a915dcd8588f868187855d1e465b868b - Sigstore transparency entry: 2645343014
- Sigstore integration time:
-
Permalink:
glyf-data/glyf@0993b28c8ee46024f149914f88a45f753f058315 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/glyf-data
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0993b28c8ee46024f149914f88a45f753f058315 -
Trigger Event:
push
-
Statement type:
File details
Details for the file glyf_core-0.4.0-cp311-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: glyf_core-0.4.0-cp311-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 4.0 MB
- Tags: CPython 3.11+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fefe995e7e3471fa9d621eaf0276b2213dac4cc8811406399a22c93cec520ba4
|
|
| MD5 |
2f0f99873e2effe5249af9b05123e0cd
|
|
| BLAKE2b-256 |
093fe5ce7d24e60e819b7ac9a823745f1d384cb64e5a055b1fddc0e30f8888be
|
Provenance
The following attestation bundles were made for glyf_core-0.4.0-cp311-abi3-macosx_10_12_x86_64.whl:
Publisher:
release.yml on glyf-data/glyf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
glyf_core-0.4.0-cp311-abi3-macosx_10_12_x86_64.whl -
Subject digest:
fefe995e7e3471fa9d621eaf0276b2213dac4cc8811406399a22c93cec520ba4 - Sigstore transparency entry: 2645343016
- Sigstore integration time:
-
Permalink:
glyf-data/glyf@0993b28c8ee46024f149914f88a45f753f058315 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/glyf-data
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0993b28c8ee46024f149914f88a45f753f058315 -
Trigger Event:
push
-
Statement type: