Repository navigation
Releases
Releases · ardalan-jalal/dagwick
Dagwick 0.3.0
Install: pip install dagwick==0.3.0
Added
- Seasonal themes for all of Airflow (
themes/, config only): realistic
snow, Halloween, Newroz and Kurdish Language Day as plain[api] theme
files for Airflow 3.2+. The scenery is drawn behind the page, stops under
reduced motion and loads nothing from the network. No plugin code. - Seasonal themes for all of Airflow, built in. A new Themes tab next to
Fleet lists them. By default each theme appears on its dates on every Airflow
page and goes away afterwards, with nothing to set in Airflow's
configuration. The first theme is Christmas snow (18 December to 2 January):
snowflakes drift over Airflow, some carried sideways by the wind, snow
settles on top of cards, and a drift lies along the bottom. The snow is moved
by the graphics card, so pages stay smooth; clicks go through it, and viewers
who prefer reduced motion get still snow. Each viewer can switch off "Show
themes on their dates", and apply or remove any theme whenever they like; the
change shows at once, without a reload. Choices are saved in their browser,
and Dagwick still writes nothing to Airflow's database. Any theme the admin
already set in Airflow is kept. - Halloween theme (24 October to 1 November): dark bats flit about on
their own random paths, beating their wings, ghosts drift across Airflow,
embers rise, a full moon with seas, craters and thin clouds peeks from the
corner, darkness closes in from the edges, glowing eyes blink in the fog along
the bottom, a small cobweb hangs in the corner, black gnarled branches lie on
top of the cards (like the snow at Christmas), and spiders dangle from them.
Airflow's sidebar, with the user menu, always stays clear of the decorations.
Switching between themes without a reload clears the old theme first. - The banner follows the theme. When a seasonal theme is showing, by date
or applied by the viewer, Dagwick's banner takes the matching seasonal look
(Wick in a Santa hat with snow at Christmas, a witch hat and pumpkin at
Halloween), whatever theseasonal_moodssetting says. - Themes coming soon. Newroz, Eid, Ramadan, Kurdish Language Day, New
Year, Dagwick's birthday, Çarşema Sor, Diwali and the Lantern Festival are
listed on the Themes page as "Coming soon", after Christmas and Halloween.
They can't be applied until their decorations for all of Airflow are made;
on their dates Dagwick's banner still dresses up (the seasonal mood), unless
the viewer turned off "Show themes on their dates": that switch now turns off
the banner's date-based look too. Eid
and Ramadan follow the Islamic calendar, from a table of approximate dates
for 2026-2031. - Sidebar icon in Airflow's style: a candle outline in the same line style
and colours as Airflow's own sidebar icons, with a version for dark mode, and
white while Dagwick's page is open, like Airflow's highlighted items. - Download the fleet as CSV. A button on the fleet page saves the DAGs
shown (with the current search and filters) as a CSV file: dag_id, owners,
tags, paused, score, grade, failing and warning checks, runs and success
rate over 30 days. It is built in the browser from/api/fleet, so it holds
only the DAGs the user may read. Cells that a spreadsheet would run as a
formula are written as text. /api/fleetincludes each DAG'stags.- Fleet data in a dashboard (
docs/dashboards.md): how to read
/dagwick/api/fleetwith an Airflow API token and feed it to Grafana, a
warehouse or alerts. Dagwick does not add a metrics endpoint or push
metrics: scrapers can't easily authenticate against Airflow 3, and the
plugin makes no network calls. - Tune the scoring in
airflow.cfg. Three optional[dagwick]settings:
disabled_checksleaves checks out of every score,weightschanges how
many points a check is worth, andgradessets the grade thresholds.
Invalid values are logged and ignored. The DAG tab, the fleet page and
dagwick checkall follow them. Seedocs/checks.md. /api/checksshows each check'sdefault_weightand whether it is
enabled;/api/configincludes the grade thresholds.- Check packs. A guide, "Write a check pack", in
docs/checks.md, and an
example pack inexamples/dagwick-pack-examplewith one check and its
tests. The guide says which parts of the check interface are stable. - Each check now records which pack it came from:
packin/api/checksand
in score reports, and a tag on pack checks in the DAG tab. - Signed releases. Each release now has a build provenance attestation,
and its GitHub release carries the wheel, the sdist and their Sigstore
bundles. See "Verify a release" in the README.
Changed
- New mascot and icon. Dagwick's mascot is now Wick, a little flame on a
candle stamped with a DAG: one more node lights up with every grade, and at F
the flame is out and only smoke is left. The seasonal moods dress Wick up
(a bonfire at Newroz, a pumpkin at Halloween, a fanous at Ramadan, a cupcake
on its birthday, ...). The sidebar icon and the README banner match. SECURITY.mdlinks the private reporting form and published advisories,
and lists every[dagwick]setting.- Seasonal moods are on by default (#35).
seasonal_moodsnow defaults to
auto, so Wick dresses up on each holiday's dates with nothing to configure.
To keep the old behaviour, setseasonal_moods = off. Each viewer can still
hide them with Hide on the greeting. - Three new moods (#35): Çarşema Sor, the Yazidi New Year (red spring
flowers, painted eggs, a flower crown for Wick), Diwali (Wick in a clay
diya, marigold garlands, a row of lit diyas) and the Lantern Festival
(a red-and-gold candle, red lanterns swinging, sky lanterns drifting up).
Diwali and the Lantern Festival follow lunisolar calendars, so their dates
are listed per year for 2026–2031. Each also appears on the Themes page
as "Coming soon". A short festival wins over a longer one it falls in:
Dagwick's birthday over Diwali 2026, Diwali over Halloween 2027, the Lantern
Festival over Ramadan 2026. - Smoother mood scenes. Falling snow and confetti, flying bats, rising
balloons, embers and letters now move with GPU transforms instead of
changing their position, so the page isn't laid out again on every frame.
Fixed
- Newroz's embers in the banner never rose: Wick's own ember style overrode
them. They now drift up again. - A DAG file with a bare carriage return (
\r) before a non-ASCII character
could not be scored on Python 3.12: reading its# dagwick: ackcomments
crashed. Such a file is now scored as if it had no ack comments. Found by
the new fuzz tests. - Phones and a narrow DAG panel. Below about 440 px the header no longer
clips the score ring and Wick's speech bubble: both shrink to fit side by
side. On the fleet page the search box now spans the row below 720 px, as
intended, instead of staying 260 px wide and pushing the DAG list past the
edge. Found in the 0.2.0 QA (#34). /dagwick/api/healthand/dagwick/api/historynow return 404 for a DAG
that does not exist, like/dagwick/api/score, instead of an empty 200. A
typo in a script or dashboard now fails loudly (#60).- The README now explains that Viewer and User roles need
can read on Plugins(FAB) to see Dagwick's pages, and how to give it (#58). - Text contrast now meets WCAG AA (4.5:1). The A–D grade badges use darker
shades so their white letter is readable at small sizes, and small amber text
in the light theme ("Dagwick", "Next step", "How to fix") uses a darker amber.
Tab counts and "passed" chips are darker too. Bars and the score ring keep
their colours (#59). - Themes apply without a hard refresh. Airflow's
/ui/configreply now
saysCache-Control: no-storeandVary: Cookie, because it depends on the
viewer's theme cookies: a browser or proxy can no longer keep showing the
theme from before an Apply or Remove. - Halloween now decorates Airflow's sidebar too: a dusk glow behind the
icons, a cobweb in the corner by the logo and a spider letting itself down
along the edge. Nothing covers the icons or the user menu, and clicks pass
through.
What's Changed
- feat(settings): disable checks, change weights and grade thresholds in airflow.cfg by @sako-ranj in #39
- feat(packs): example check pack, pack guide, and the pack behind each check by @sako-ranj in #40
- feat: add scope filtering for DAGs with tags and owners by @ardalan-jalal in #42
- feat(fleet): download the fleet as CSV by @sako-ranj in #41
- ci: CodeQL scanning and OpenSSF Scorecard by @sako-ranj in #44
- docs: fleet data in a dashboard by @sako-ranj in #43
- Refactor mascot components from Lamp to Wick and update styles by @BawarX in #45
- ci: fix the OpenSSF Scorecard findings we can fix in code by @sako-ranj in #54
- Airflow-wide seasonal themes (config only) by @BawarX in #55
- docs(readme): add PyPI, Python, CI and license badges by @ardalan-jalal in #56
- fix(api): serve static files from fixed paths in the allowlist by @sako-ranj in #57
- fix(ui): fit the header and fleet toolbar on phones and narrow panels by @sako-ranj in #61
- Dev by @ardalan-jalal in #62
- feat: built-in seasonal themes for all of Airflow, ...
Dagwick 0.2.0
Highlights
- Acknowledge a check on purpose:
# dagwick: ack <check> -- <reason>marks a check a DAG breaks on purpose; it shows greyed out with its reason and leaves the score. - Run health on the DAG tab: success rate, retries, typical run time and trend, and the last run over 30 days, next to the score but not part of it.
- Score history: the score of the last 20 DAG versions, with which checks started or stopped passing.
dagwick checkcommand and pre-commit hook: grade DAG files before they're merged and fail below--min-grade.- Six new checks: no
Variable.getat parse time, fast to parse, sensors free their worker slot, no secrets in the DAG file, current Airflow imports, file named after the DAG. - Seasonal moods (experimental, off by default).
- Tested on Airflow 3.1, 3.2 and 3.3, from Python 3.10 to 3.13.
Install: pip install dagwick==0.2.0
What's Changed
- fix(ui): match fleet headline to the counts and fit narrow panels by @sako-ranj in #4
- feat(checks): parse-time Variable.get, deprecated imports and parse time by @sako-ranj in #5
- Feat/seasonal moods by @ardalan-jalal in #6
- feat: add acknowledgment feature for DAG checks by @ardalan-jalal in #7
- fix: count @dag bodies as parse time; repair main after merges (CI is red) by @sako-ranj in #8
- feat(checks): flag hard-coded secrets in DAG files by @sako-ranj in #13
- ci: test against Airflow 3.1, 3.2 and 3.3 by @sako-ranj in #15
- fix(ui): center the page on wide screens by @sako-ranj in #16
- feat(checks): warn when a sensor holds a worker slot while it waits (#10, part 2) by @sako-ranj in #22
- feat: show run health next to the score (#10, part 1) by @sako-ranj in #17
- feat: add the dagwick check command and a pre-commit hook by @sako-ranj in #24
- feat: show score history across DAG versions by @sako-ranj in #23
- ci: test Airflow 3.1 on Python 3.10 by @sako-ranj in #25
- fix(history): re-score a DAG version that Airflow rewrote in place by @ardalan-jalal in #26
- docs(changelog): date the 0.2.0 release by @sako-ranj in #27
New Contributors
- @sako-ranj made their first contribution in #4
Full Changelog: v0.1.0...v0.2.0
Dagwick 0.1.0
Install: pip install dagwick==0.1.0
Added
- Dagwick tab on every DAG page: a score from 0 to 100, a grade from A to F,
a lantern mascot, the next step to the next grade, the affected tasks, and a
fix with a copyable code example for every check that does not pass. - Fleet page in the Airflow sidebar: every DAG the user can read, ranked by
score, with grade filters, search, sort, and the most common issues. - 14 built-in checks covering reliability, observability, scheduling,
ownership and structure. dagwick.checksentry point so other packages can add or override checks.- Scores reuse Airflow's own permission checks and are cached per DAG version.
Full Changelog: https://github.com/ardalan-jalal/dagwick/commits/v0.1.0