Tiggy
Declarative Google Tag Manager. Describe a GTM container in YAML, then validate, plan and apply it the way Tundra does for Snowflake permissions.
Early days: validate works against a container export; the rest is planned.
pip install tiggy-cli
tiggy validate container.json # every reference between tags, triggers and variables resolves
tiggy spec-test spec/ # planned: the spec matches the live container
tiggy run spec/ --dry # planned: the GTM changes that would make it match
tiggy run spec/ # planned: make them, in a new workspace
tiggy import <container> # planned: write a live container out as a spec
validate
tiggy validate examples/broken-container.json
tiggy validate container.json --format json --strict
Takes a container export (Admin > Export Container). Reports references that don't resolve (triggers,
{{variables}}, setup and teardown tags, custom templates, folders), built-ins used but not enabled,
duplicate names and IDs, variable and tag-sequencing loops, and unused triggers, variables and templates.
Exits 0 when valid, 1 when not (--strict counts warnings), 2 when the input can't be read.
How it fits together
| Layer | Where | Does |
|---|---|---|
| Resource model | tiggy/gtm/ |
One Pydantic model per GTM resource, generated from Google's API schema |
| Adapters | tiggy/io/ |
Read and write a format (a container export today; the API and YAML next) |
| Graph | tiggy/graph.py |
What refers to what. The only code that knows GTM's reference rules |
| Checks | tiggy/checks.py |
Rules over the graph, each yielding findings |
| Report | tiggy/report.py |
Findings as text or JSON |
The models are generated from the Tag Manager API v2 discovery document, vendored in schema/. Either
enum spelling parses (the API's customEvent, an export's CUSTOM_EVENT), and fields GTM sends that the
schema lacks are kept, so a load and dump returns the input unchanged. To pick up API changes:
uv run python scripts/generate_resources.py --refresh
Metadata
Release files for tiggy-cli 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 | |
|---|---|---|---|
| tiggy_cli-0.1.0.tar.gz | 22.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tiggy_cli-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 47.0 kB
Release files / tiggy_cli-0.1.0.tar.gz
| Download URL | tiggy_cli-0.1.0.tar.gz |
|---|---|
| Size | 22.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
de8c8d954cd8f66e880f3fff7db7852bfa89d68821a8423df830fd6e0b028361
|
|
BLAKE2b-256 checksum How to use checksums |
a54d5bdba69662d048c3efe1e7963d932efa9e7aa891ba7716a50c60de202ada
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / tiggy_cli-0.1.0-py3-none-any.whl
| Download URL | tiggy_cli-0.1.0-py3-none-any.whl |
|---|---|
| Size | 25.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1b324c8d5c47ae5129c59faae03a3fb64a6511377c92eaf99496bce805bef30b
|
|
BLAKE2b-256 checksum How to use checksums |
9fcc181e391a52e0f7147d1e8bb22799dae405d26e41d3bcc5b0be70638c2dc9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|