Skip to content

Releases: CieriS/aria-er

v1.2.0

Choose a tag to compare

@CieriS CieriS released this 21 Oct 21:23
304e232

What's Changed

Features

  • feat(export): a page at the root of the published site by @CieriS in #70
  • chore(release): 1.2.0 by @CieriS in #72

Fixes and maintenance

  • fix(ingestor): fetch again a weather response that arrives cut short by @CieriS in #69
  • fix(export): count a month as loaded only when its weather is there too by @CieriS in #71

Full Changelog: v1.1.0...v1.2.0

v1.1.0

Choose a tag to compare

@CieriS CieriS released this 21 Oct 13:25
01c8e16

What's Changed

Features

  • feat(export): publish the marts as JSON on GitHub Pages every day by @CieriS in #66
  • feat(export): fill the months between the archive and the daily window by @CieriS in #67
  • chore(release): 1.1.0 by @CieriS in #68

Fixes and maintenance

  • docs(cloud): record that the GCP project of the first run was deleted by @CieriS in #63
  • docs(readme): replace the dashboard screenshot that showed a 'Page not found' dialog by @CieriS in #65

Full Changelog: v1.0.0...v1.1.0

v1.0.0

Choose a tag to compare

@CieriS CieriS released this 21 Oct 11:18
64e11bc

What's Changed

Features

  • docs(cloud): record the first run on a real GCP project by @CieriS in #59
  • chore(release): 1.0.0 by @CieriS in #61

Fixes and maintenance

  • build(deps): bump serde_json from 1.0.151 to 1.0.154 in /ingestor in the rust group by @dependabot[bot] in #55
  • build(deps): bump the python group across 2 directories with 4 updates by @dependabot[bot] in #56
  • Add a pre-push hook and a secret scan by @CieriS in #57
  • fix(completeness): leave out days not loaded for any station by @CieriS in #60

Other

  • docs: record that the REST archive is a single load, not yet a feed by @CieriS in #45
  • docs(ci): describe the branch protection now in force by @CieriS in #46
  • fix(transform): compute the 8-hour ozone windows on every hour by @CieriS in #47
  • docs: record that the REST archive caught up on 2026-10-13 by @CieriS in #48
  • fix(orchestration): let one run at a time write the raw layer and the warehouse by @CieriS in #52
  • docs: say why the ingestor is written in Rust by @CieriS in #53
  • docs(readme): show the running stack in a short recording by @CieriS in #54

Full Changelog: v0.9.0...v1.0.0

v0.9.0 — runs locally from a fresh clone

Choose a tag to compare

@CieriS CieriS released this 12 Oct 08:29
10015f9

First tagged version. The whole pipeline runs locally from a fresh clone; the cloud target is implemented but has not run on a real Google Cloud project yet, which is what v1.0.0 waits for (milestone v1.0.0).

What it does

  • Ingestion (Rust, aq-ingest): ARPAE air quality measurements, station registries and Open-Meteo weather into partitioned Parquet, idempotent, with a 30-day window reprocessed on every run to pick up revised values.
  • Models (dbt on DuckDB, portable to BigQuery): staging, intermediate and five marts — exceedances of the legal limits, multi-year trends, traffic against background, PM10 against wind and rain, data completeness — with 107 data tests and a unit test.
  • Orchestration (Dagster): daily schedule, backfills by range, asset lineage, freshness and completeness checks.
  • Dashboard (Streamlit) on the marts.
  • CI: Rust, Python, dbt on fixtures, the BigQuery dialect on an emulator, the Docker images.

Try it

With Docker only:

git clone https://github.com/CieriS/aria-er && cd aria-er
make up    # Dagster on http://localhost:3000, dashboard on http://localhost:8501

About six minutes after the start the dashboard shows ten years of measurements. Checked on a clean clone on 2026-10-12.

Checked against ARPAE

  • PM10 exceedance days of the Bologna stations equal the ARPAE annual report for every year from 2016 to 2025.
  • For 2026, PM10 exceedance days equal the ARPAE daily bulletin of 8 October for all 64 stations it lists, and NO2 hours for all 65.

Changed since the last state of main without a version

  • Measurements come from the archive of the ARPAE REST service instead of the CKAN datastore, which stopped on 2026-09-17 (#33, ADR 0008). The whole of 2026 can now be ingested, with 22 more stations.
  • Exceedances are counted on values rounded to a whole number, as ARPAE does (#33).
  • PM10 and PM2.5 of the current year were attributed to the following day; fixed with the new source (#33).
  • The Docker images build again: they had moved to a Python version the projects do not support (#35).
  • The dashboard and the README credit ARPAE and Open-Meteo as their licences ask (#34).
  • The code is under the MIT licence; ADR 0007 (no streaming) and ADR 0008 are accepted (#39).

Known limits

  • The REST archive had no value newer than 2026-10-09 11:00 on 2026-10-12 (#40).
  • Ozone exceedance days of 2026 differ from the ARPAE bulletin by 1 to 3 days for a third of the stations (#44).
  • A first start loads the last 30 days of the current year, not all of it: make ingest FROM=2026-01-01 loads the rest.
  • Everything else: docs/limitations.md.