lkml-blastradius
The blast radius of every Looker change. Every morning: what changed (LookML deploys, Looker upgrades, Google releases), and which dashboards, Looks, explores and Conversational Analytics agents it hits.
pip install lkml-blastradius
lkblast init # writes blastradius.yaml + a daily GitHub Actions workflow
lkblast run # snapshot Looker, compare with yesterday, write the report
Each run takes a metadata snapshot through the Looker API and compares it with the previous one:
| It tracks | From |
|---|---|
Every explore and field: SQL, type, label, description, synonyms, joins, sql_table_name, always filters |
lookml_models, lookml_model_explore |
| Every dashboard tile and filter, Look, and merged query, with each field it uses (including filters, sorts, pivots, custom fields) | dashboards, looks, queries, merge_queries |
| Conversational Analytics agents in Looker: explores, golden queries, fields named in instructions | agents (beta API) |
| CA API data agents (optional) | geminidataanalytics.googleapis.com dataAgents |
| Broken content, whatever the cause | Looker content validator |
| Looker version and the deployed LookML commit of every project, including imported ones | versions, projects/{id}/git_branch |
| What Google shipped | Looker release-notes feed, CA API release notes |
Then it reports what changed, old → new, which content it touches, how badly, and why:
| Severity | Meaning |
|---|---|
| Breaking | A field, join or explore that the content uses was removed, or the content validator found a new error |
| Numbers may change | SQL, type, measure filters, joins, table or always-filters changed for a field the content uses |
| AI agents may answer differently | Descriptions, labels, synonyms, hidden flags or new fields changed in an explore an agent can use. Dashboards ignore these changes, but agents read them. |
| Cosmetic | Labels or formats on dashboards and Looks |
Every change is attributed to one of three causes: a LookML deploy in a named project (old → new commit), a Looker upgrade (old → new version) with no deploy, or neither. Changes from Google come from the upgrade line, the matching release notes, and the content validator.
Try it offline
lkblast demo # two days on a fake Looker (fictional Harborline Supply Co.)
open lkblast-demo/reports/blastradius.html
2 breaking, 3 numbers may change, 1 cosmetic
2 new content error(s), 2 open
Looker upgraded 26.14.2 → 26.16.1
LookML deployed in core_project, finance_project
3 new Google release note(s), 2 need attention
| Content | Severity | Why | Cause |
|---|---|---|---|
| Executive revenue / Revenue by region (tile) | Breaking | customers.region removed |
LookML deploy in finance_project |
| Executive revenue / Region (filter) | Breaking | customers.region removed |
LookML deploy in finance_project |
| Executive revenue / Net revenue by month | Numbers may change | orders.net_revenue SQL now also subtracts discounts |
LookML deploy in core_project (imported) |
| Collections / Amount due vs net revenue (merged query) | Numbers may change | same | same |
| Finance assistant (Looker CA agent) | Numbers may change | its golden query uses orders.net_revenue |
same |
| Executive revenue / Order volume | Cosmetic | orders.order_count label |
same |
The Refund watch Look and the Logistics helper agent are not listed because nothing they use changed.
Run it daily (GitHub Actions + Slack)
lkblast initin any repo (it can be an otherwise empty repo).- Add repository secrets:
LOOKER_BASE_URL,LOOKER_CLIENT_ID,LOOKER_CLIENT_SECRET, and optionallySLACK_WEBHOOK_URL. - Push. The workflow runs at 06:00 UTC daily (change the cron in
.github/workflows/lkml-blastradius.yml) or on demand from the Actions tab.
Every run writes reports/blastradius.{md,html,json}. The Markdown goes to the job summary, the reports are
uploaded as an artifact, and a short summary with a link to the run is posted to Slack. Snapshot history
lives in the Actions cache. Each run refreshes it, so it doesn't expire while the job runs daily.
The first run saves a baseline. Impact is reported from the second run on.
API user. Use API credentials of a user that can see all content (an admin, or a role with
see_lookml, see_user_dashboards, see_looks, access_data on all models). Content the user
can't see is not analyzed. Reading deployed commits needs see_lookml/develop; without it, the
report still works but can't tell a LookML deploy from a Looker upgrade.
Options
blastradius.yaml (written by lkblast init; every key is optional):
looker: {models: [], workers: 8, timeout_seconds: 120}
content: {dashboards: true, looks: true, looker_agents: true, content_validator: true}
ca_api: {enabled: false, locations: [global]} # + GOOGLE_CLOUD_PROJECT, GOOGLE_OAUTH_ACCESS_TOKEN
releases: {enabled: true, lookback_days: 7}
storage: {dir: .lkblast, keep: 30}
report: {dir: reports}
lkblast run --fail-on breaking # exit 1 when something breaks (for alerting)
lkblast compare OLD.json.gz NEW.json.gz # report between any two saved snapshots
To include CA API data agents, set ca_api.enabled: true and provide GOOGLE_CLOUD_PROJECT
and an access token in GOOGLE_OAUTH_ACCESS_TOKEN. In Actions, get one with
google-github-actions/auth (token_format: access_token). Agents that point at another Looker
instance are ignored.
What it does not do
- It reports changes after they reach production (daily). It doesn't check a LookML branch before merge.
- It never runs queries and stores no row data. It can't see a number change that comes from the warehouse data itself.
- It can't see a Google change that alters behavior but not metadata, such as how an agent picks fields. That shows up only as an upgrade line and release notes. Agent answer regression testing is what lookml-agentops does.
API sources
Every Looker endpoint and attribute used is checked against Looker's OpenAPI spec
(looker-open-source/sdk-codegen, spec/Looker.4.0.oas.json, 4.0.26.12). The list is in the
docstring of looker.py. /agents is marked beta by Looker.
CA API fields come from the v1 REST reference. Release-note formats were checked on 2026-10-03
(see releases.py). If Google changes the page layout, the run
records a warning and continues.
Development
uv sync && uv run pytest && uv run ruff check src tests && uv run mypy
Apache-2.0. Not affiliated with or endorsed by Google. Looker is a trademark of Google LLC.
Metadata
Release files for lkml-blastradius 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| lkml_blastradius-0.1.0.tar.gz | 75.3 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lkml_blastradius-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 118.7 kB
Release files / lkml_blastradius-0.1.0.tar.gz
| Download URL | lkml_blastradius-0.1.0.tar.gz |
|---|---|
| Size | 75.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a408c7fa8073bb7cef249ce9b47128baa25f700bcaa618735370e587c08dcaf5
|
|
BLAKE2b-256 checksum How to use checksums |
01b0e540e5b6f39a92f6c7fe73ecb7b9a78c4b355084466f60bff6e4137dc69e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency logRelease files / lkml_blastradius-0.1.0-py3-none-any.whl
| Download URL | lkml_blastradius-0.1.0-py3-none-any.whl |
|---|---|
| Size | 43.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a242232aded7d66a63a563b724597f1925dcc1cf7c3fec550aacb2e69b8e56b9
|
|
BLAKE2b-256 checksum How to use checksums |
fb6d61b93ac18090630ea4a0e21ad789611516d878d53d8a35862c1ad88f2d8b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency logSecurity for lkml-blastradius 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for lkml_blastradius-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.