looker-sync
Move LookML between a local folder and your own Looker dev workspace, with verification. Python 3.9+, standard library only, nothing to install beyond uv.
uvx looker-sync init --project <name>
Quick start
- In an empty folder, run
uvx looker-sync init --project <your Looker project id>. - It writes a
.envtemplate and adds.envand.looker-sync/to.gitignore, then stops with exit code 2. Fill in the three values below. - Run the same
initcommand again. It writes.looker-sync/config.jsonand pulls the project files into the folder. - Edit the LookML, then
uvx looker-sync push --dry-runanduvx looker-sync push.
.env holds an API key that belongs to your own Looker user:
LOOKER_URL=https://<your-instance>.looker.com
LOOKER_CLIENT_ID=...
LOOKER_CLIENT_SECRET=...
Create the key in Looker under Admin, Users, your user, Edit Keys. The tool looks for the
env file in this order: --env-file, the LOOKER_SYNC_ENV variable, the env_file in
.looker-sync/config.json, then .env in the project folder. Credentials are never printed
and never written anywhere else.
Commands
| command | what it does |
|---|---|
init [--project P] [--mode dev|prod] [--branch B] |
set up a folder (it may be empty), then a first pull. --no-pull writes metadata only; --force takes Looker's copy over files already there |
pull [--force] [--dry-run] |
copy Looker files to disk; never deletes local files |
status |
show what differs on each side, and how far the dev branch is ahead of and behind its remote; writes nothing |
push [--force] [--delete] [--dry-run] |
write local changes, read every file back, then validate |
switch (--branch B | --mode dev|prod) |
move Looker and the folder to another branch or mode |
skill [--path] |
print the full usage guide written for agents |
Global options: -C <project folder> (default: the current folder) and --env-file <path>.
--help is the short reference; looker-sync skill is the long one.
Exit codes: 0 ok, 1 Looker or network error, 2 refused by a guard, 3 validation errors.
What it guarantees
pushwrites your changes, reads every file back and compares bytes, then runs LookML validation and printsfile:line message.- It refuses to overwrite a file edited in Looker since your last sync (
--forceto override). pullnever deletes local files and refuses to overwrite unpushed local work.pushnever deletes files in Looker without--delete, and never writes in prod mode.- A push that stops partway records what it wrote; the next push retries only the rest.
What it does not do
It never commits, pushes to git, deploys, resets or creates branches. Looker's API has no commit or push endpoint, and the official Looker VS Code extension commits through local git too. Pushed files show up in the dev workspace as uncommitted changes; commit them from the Looker IDE or your own git checkout of the remote.
One key, one branch at a time
The checked-out dev branch belongs to the Looker user, not to an API token. A second client on
another branch is refused by a branch-mismatch guard; only switch moves the branch, and the
browser IDE follows.
For agents and Claude Code
uvx looker-sync skill prints the complete guide: the loop, every guard and what a refusal
means. The repo is also a Claude plugin, and skills/looker-sync/SKILL.md is the one
authoritative copy, shipped both in the plugin and inside the package.
Development
python3 -m unittest discover -s scripts -p 'test_looker_sync.py'
The tests run the CLI against a fake Looker with no network. A release is a v*.*.* tag that
matches the version in pyproject.toml; the workflow in .github/workflows/release.yml tests,
builds and publishes to PyPI with trusted publishing, using notes from releases/.
License
MIT
Metadata
Release files for looker-sync 0.1.1
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 | |
|---|---|---|---|---|
| looker_sync-0.1.1.tar.gz | 16.3 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| looker_sync-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.1 kB
Release files / looker_sync-0.1.1.tar.gz
| Download URL | looker_sync-0.1.1.tar.gz |
|---|---|
| Size | 16.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
858c92cdc4fda8587254a28cd8888497a4861986ef9fec803110835c60605139
|
|
BLAKE2b-256 checksum How to use checksums |
9aadf74453a15ec4dbb3c807eafe1b6c605a8ecc525a3dd9a4cb63217157000d
|
| 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 9, 2026.
Transparency logRelease files / looker_sync-0.1.1-py3-none-any.whl
| Download URL | looker_sync-0.1.1-py3-none-any.whl |
|---|---|
| Size | 16.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1a63dd9de12b97d4700497f401a44fd20b1e69882f98f24445ae3565659ac230
|
|
BLAKE2b-256 checksum How to use checksums |
1d9516eb2cf2616461ee6eaed5347a3497320300c6b2201a1705e610cf8f1656
|
| 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 9, 2026.
Transparency logSecurity for looker-sync 0.1.1
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 looker_sync-0.1.1.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 9, 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.