Appearance
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.
| Target | Output |
|---|---|
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 — Cube | model/cubes/*.yml, views/*.yml (one view per fact, joins up to 3 deep) |
looker — LookML | Views 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 YAML | Keel'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).