Skip to content

Serve / Exports

Exports ​

One model, many targets. Keel renders a release into the formats downstream tools read, with owners, glossary terms, certification and trust carried as metadata, and a report of anything a target can't represent.

TargetOutput
dbt — dbt Semantic Layer (MetricFlow)semantic_models/*.yml, metrics/*.yml; Keel-only details in config.meta.keel. CI runs dbt parse on the export of the sample model.
cube — Cubemodel/cubes/*.yml, views/*.yml (one view per fact, joins up to 3 deep)
looker — LookMLViews and explores
powerbi — Power BI (TMDL)A TMDL folder: tables, relationships, DAX measures (named entity.measure), roles where mappable, and one KeelServer/KeelDatabase parameter pair
osi — open YAMLKeel's canonical model as keel-model.yaml plus a JSON Schema — vendor-neutral and loss-free

Every export is deterministic (sorted files, \n line endings, no timestamps) and lists Approximated and Skipped features — for example LookML has no segments (exported as yes/no dimensions) and no semi-additive measures.

From the UI ​

Models › Exports (/models/:id/exports): pick a release and a target, preview the files and the report, then Download (a zip with one root folder {model}-{version}-{target}) or Push to Git. The history lists every export with its report and delivery.

With the API ​

bash
# Preview (records nothing)
curl "$KEEL/api/v1/workspaces/$WS/models/$MODEL/releases/$RELEASE/exports/dbt/preview" -H "Authorization: Bearer $TOKEN"

# Export and download
curl -X POST "$KEEL/api/v1/workspaces/$WS/models/$MODEL/releases/$RELEASE/exports" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{ "target": "dbt", "delivery": "Download" }'
# → 201 { "id": "…", "downloadUrl": "…/exports/{exportId}/archive", "issues": [ … ] }
curl -o dbt.zip "$KEEL/api/v1/workspaces/$WS/models/$MODEL/exports/$EXPORT/archive" -H "Authorization: Bearer $TOKEN"

Downloading needs Read catalog (or an API key with export:read). The zip is stored with the history row, because governance metadata moves on after a release.

Git delivery ​

Connect a repository in Settings › Integrations (workspace admins): provider, repository URL, default branch, path prefix and a personal access token (write-only, kept in the secret store). A push creates or moves keel/export/{target}-{version} with one commit under {prefix}/{target}/ (files of an earlier export that are gone are deleted) and opens — or reuses — a pull request that lists the unsupported features. A failed push is recorded as Failed with GitHub's status; the zip stays downloadable.

Auto-export: a model can name targets to export and push as Keel on every release (needs a Git connection).

Known gaps

  • Only GitHub (github.com and Enterprise Server) pushes today. GitLab and Azure Repos connections can be saved, but pushing answers 422 Modeling.GitProviderNotSupported.
  • Exports carry no access policies yet (Cube access policies, Looker access filters and Power BI roles are mapped by the exporters but receive an empty list).
  • Pushing glossary, ownership and certification into data catalogs (DataHub, OpenMetadata) is planned for v1.1.

Power BI check before a release ​

CI validates the TMDL structure. Before a release that changes the Power BI exporter, load an export with the Tabular Editor CLI and open it as a PBIP semantic model in Power BI Desktop, and record the versions in the release notes (docs/10-devops.md §6).

Anchor Keel is a working product name: one platform, a shared core and licensed modules (Keel Semantic, Keel Migrate). Documentation built from the repository — facts are derived from code, ADRs and the decisions log.