Sidemantic
The universal metrics layer for consistent metrics across your data stack. Compatible with 15+ semantic model formats.
- Supported Formats: Sidemantic (YAML, Python or SQL), Cube, dbt MetricFlow, LookML, Hex, Rill, Superset, Omni, BSL, GoodData LDM, Snowflake Cortex, Malloy, OSI, AtScale SML, ThoughtSpot TML
- Databases: DuckDB, MotherDuck, PostgreSQL, BigQuery, Snowflake, ClickHouse, Databricks, Spark SQL (also via ADBC)
Documentation | GitHub | Docker Hub | Discord | Demo (50+ MB data download, runs in your browser with Pyodide + DuckDB)
The installer downloads the skill to ~/.agents/skills/sidemantic-modeler and symlinks it into ~/.claude/skills/.
Quickstart
Install:
Malloy support (uv):
uv add "sidemantic[malloy]"Notebook widget (uv):
uv add "sidemantic[widget]" jupyterlab
uv run jupyter labMarimo (uv):
uv add "sidemantic[widget]" marimo
uv run marimo editimport duckdb from sidemantic.widget import MetricsExplorer conn = duckdb.connect(":memory:") conn.execute("create table t as select 1 as value, 'a' as category, date '2024-01-01' as d") MetricsExplorer(conn.table("t"), time_dimension="d")
Define models in SQL, YAML, or Python:
SQL (orders.sql)
MODEL (name orders, table orders, primary_key order_id);
DIMENSION (name status, type categorical);
DIMENSION (name order_date, type time, granularity day);
METRIC (name revenue, agg sum, sql amount);
METRIC (name order_count, agg count);YAML (orders.yml)
models: - name: orders table: orders primary_key: order_id dimensions: - name: status type: categorical - name: order_date type: time granularity: day metrics: - name: revenue agg: sum sql: amount - name: order_count agg: count
Python (programmatic)
from sidemantic import Model, Dimension, Metric orders = Model( name="orders", table="orders", primary_key="order_id", dimensions=[ Dimension(name="status", type="categorical"), Dimension(name="order_date", type="time", granularity="day"), ], metrics=[ Metric(name="revenue", agg="sum", sql="amount"), Metric(name="order_count", agg="count"), ] )
Query via CLI:
sidemantic query "SELECT revenue, status FROM orders" --db data.duckdbOr Python API:
from sidemantic import SemanticLayer, load_from_directory layer = SemanticLayer(connection="duckdb:///data.duckdb") load_from_directory(layer, "models/") result = layer.sql("SELECT revenue, status FROM orders")
CLI
# Query sidemantic query "SELECT revenue FROM orders" --db data.duckdb # Interactive workbench (TUI with SQL editor + charts) sidemantic workbench models/ --db data.duckdb # PostgreSQL server (connect Tableau, DBeaver, etc.) sidemantic serve models/ --port 5433 # Validate definitions sidemantic validate models/ # Model info sidemantic info models/ # Pre-aggregation recommendations sidemantic preagg recommend --db data.duckdb # Migrate SQL queries to semantic layer sidemantic migrator --queries legacy/ --generate-models output/
Demos
Workbench (TUI with SQL editor + charts):
uvx sidemantic workbench --demo
PostgreSQL server (connect Tableau, DBeaver, etc.):
uvx sidemantic serve --demo --port 5433
Colab notebooks:
SQL syntax:
uv run https://raw.githubusercontent.com/sidequery/sidemantic/main/examples/sql/sql_syntax_example.py
Comprehensive demo:
uv run https://raw.githubusercontent.com/sidequery/sidemantic/main/examples/advanced/comprehensive_demo.py
Symmetric aggregates:
uv run https://raw.githubusercontent.com/sidequery/sidemantic/main/examples/features/symmetric_aggregates_example.py
Superset with DuckDB:
git clone https://github.com/sidequery/sidemantic.git && cd sidemantic uv run examples/superset_demo/run_demo.py
Cube Playground:
git clone https://github.com/sidequery/sidemantic.git && cd sidemantic uv run examples/cube_demo/run_demo.py
Rill Developer:
git clone https://github.com/sidequery/sidemantic.git && cd sidemantic uv run examples/rill_demo/run_demo.py
OSI (complex adtech semantic model):
git clone https://github.com/sidequery/sidemantic.git && cd sidemantic uv run examples/osi_demo/run_demo.py
OSI widget notebook (percent-cell Python notebook):
git clone https://github.com/sidequery/sidemantic.git && cd sidemantic uv run examples/osi_demo/osi_widget_notebook.py
See examples/ for more.
Core Features
- SQL query interface with automatic rewriting
- Automatic joins across models
- Multi-format adapters (Cube, MetricFlow, LookML, Hex, Rill, Superset, Omni, BSL, GoodData LDM, OSI, AtScale SML, ThoughtSpot TML)
- SQLGlot-based SQL generation and transpilation
- Pydantic validation and type safety
- Pre-aggregations with automatic routing
- Predicate pushdown for faster queries
- Segments and metric-level filters
- Jinja2 templating for dynamic SQL
- PostgreSQL wire protocol server for BI tools
Multi-Format Support
Auto-detects: Sidemantic (SQL/YAML), Cube, MetricFlow (dbt), LookML, Hex, Rill, Superset, Omni, BSL, GoodData LDM, OSI, AtScale SML, ThoughtSpot TML
sidemantic query "SELECT revenue FROM orders" --models ./my_modelsfrom sidemantic import SemanticLayer, load_from_directory layer = SemanticLayer(connection="duckdb:///data.duckdb") load_from_directory(layer, "my_models/") # Auto-detects formats
Databases
| Database | Status | Installation |
|---|---|---|
| DuckDB | ✅ | built-in |
| MotherDuck | ✅ | built-in |
| PostgreSQL | ✅ | uv add sidemantic[postgres] |
| BigQuery | ✅ | uv add sidemantic[bigquery] |
| Snowflake | ✅ | uv add sidemantic[snowflake] |
| ClickHouse | ✅ | uv add sidemantic[clickhouse] |
| Databricks | ✅ | uv add sidemantic[databricks] |
| Spark SQL | ✅ | uv add sidemantic[spark] |
Docker
The published image is sidequery/sidemantic on Docker Hub. Mount your models directory as a volume at /app/models:
docker run -p 5433:5433 -v ./models:/app/models sidequery/sidemantic
Demo mode (built-in sample data, no volume needed):
docker run -p 5433:5433 sidequery/sidemantic --demo
See examples/docker/ for MCP mode, env vars, building from source, and integration test services.
Agent Skill
Sidemantic ships an agent skill that teaches Claude Code, Codex, and other SKILL.md-compatible agents to build, validate, and query semantic models.
One-liner install (no clone required):
curl -fsSL https://raw.githubusercontent.com/sidequery/sidemantic/main/skills/install.sh | bashnpx / bunx:
npx skills add https://github.com/sidequery/sidemantic --skill sidemantic-modeler
# or
bunx skills add https://github.com/sidequery/sidemantic --skill sidemantic-modelerHow mature is Sidemantic?
Sidemantic is an ambitious but young semantic layer project. You could encounter rough patches, especially with the more exotic features like converting between semantic model formats or serving semantic layers via the included Postgres protocol server.
