The only workflow order that scales
Looky is deterministic when you build in this order. If you invert steps, you get ambiguous failures and slow delivery.
- Workspace structure and context are correct.
- Runtime source aliases are defined and valid.
- Malloy models expose stable, idiomatic query contracts (semantic layer, named views — not ad hoc SQL scattered across viz YAML).
- Visualizations map query fields to renderers.
- Dashboards compose validated visualizations.
- Validate, diff, push, and verify in UI.
The canonical chain inside a workspace
Every Looky workspace is the same four layers, in this dependency order — read your own workspace files in this order whenever you need to debug or extend it:
runtime/sources.runtime.ymldeclares source aliases (e.g. an aliasecommercepointing at a BigQuery dataset, or a Postgres / MySQL connection string).content/models/*.malloydefines reusable dimensions, measures, and named queries on top of those source aliases.content/visualizations/*.ymlbinds one model query to one chart/table renderer.content/dashboards/*.ymlcomposes visualizations into the final surfaces the audience sees.
Each layer references only the one above it. If a layer fails to validate, fix it before touching anything below — the layers below cannot recover on their own.
| Layer | Path | Declares | Reference page |
|---|---|---|---|
| Manifest | workspace.yml | Workspace id, name, UI locale/timezone | Workspaces |
| Sources | runtime/sources.runtime.yml + secrets/ | Connection aliases per adapter | Sources |
| Models | content/models/*.malloy (+ *.cache.yml) | Dimensions, measures, views, parameters; cache policy | Models, Cache |
| Visualizations | content/visualizations/*.yml | One query → one renderer | Visualizations |
| Dashboards | content/dashboards/*.yml | Composition + global filters | Dashboards |
| Exports | content/exports/*.yml | Scheduled PDF delivery of a document dashboard | Exports |
One workspace, end to end
The four files below are a complete, working workspace against the public BigQuery ecommerce dataset — the smallest thing worth publishing. Every downstream page elaborates one of these layers.
runtime/sources.runtime.yml:
sources:
ecommerce:
name: The Look Ecommerce
type: bigquery
project_id: my-gcp-billing-project
credentials_file: my-workspace-bq.json
datasets:
- bigquery-public-data.thelook_ecommerce
content/models/ec_revenue.malloy:
##! experimental.parameters
source: ec_revenue() is ecommerce.table('bigquery-public-data.thelook_ecommerce.order_items') extend {
dimension: order_month is created_at::date.month
measure: revenue is sum(sale_price)
measure: order_count is count(order_id)
view: kpi is {
aggregate: revenue, order_count
}
view: over_time is {
group_by: order_month
aggregate: revenue
order_by: order_month asc
}
}
content/visualizations/ec_revenue_kpi.yml and content/visualizations/ec_revenue_over_time_line.yml:
id: ec_revenue_kpi
title: Revenue
query: "models/ec_revenue.malloy::kpi"
type: kpi
mapping:
value: revenue
format:
revenue: "$#,##0a"
published: true
id: ec_revenue_over_time_line
title: Revenue over time
query: "models/ec_revenue.malloy::over_time"
type: line
mapping:
x: order_month
y: revenue
format:
revenue: "$#,##0"
published: true
content/dashboards/ec_revenue_overview.yml:
id: ec_revenue_overview
title: "Where is revenue going?"
layout_mode: fluid_grid
published: true
items:
- visualization: ec_revenue_kpi
- visualization: ec_revenue_over_time_line
width: 2
With those files in place, looky validate then looky push puts the dashboard in front of the workspace's users.
Builder loop you should run every day
cd <local_root>/<billing_account_id>/<workspace_slug>
looky status
looky validate
looky diff
looky push
looky list visualizations
looky list dashboards
Run this loop for every meaningful change. It catches structural issues before users see broken dashboards.
Definition of done for a content change
looky validatehas no blocking errors.looky diffonly shows intended files.looky pushsucceeds on target workspace.- Dashboard is visible and renders correctly in
https://my.looky.studio.