Forked netzbremse service for m0sh1.cc with CNPG-backed storage. https://bremse.m0sh1.cc/
  • Go 75.3%
  • JavaScript 13.2%
  • CSS 5.6%
  • HTML 4.9%
  • Shell 1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Yael bb9a44d6fc
All checks were successful
ci/woodpecker/push/build Pipeline was successful
Create gated semantic release tag / release (push) Successful in 21s
Merge pull request 'ci(deps): update dhi base images' (#252) from renovate/dhi-base-images into main
2026-08-12 02:39:41 +00:00
.forgejo/workflows ci: gate releases and enable persistent caching 2026-08-11 03:01:04 +02:00
.github chore(deps): update actions/attest-build-provenance digest to 4d10147 2026-08-06 20:33:58 +00:00
.woodpecker ci(deps): update dhi base images 2026-08-12 01:38:34 +00:00
cmd Update module namespace 2026-06-30 23:38:46 +02:00
db/migrations feat: use nullable metrics to distinguish failed from zero measurements 2026-03-31 17:50:45 +02:00
hack ci: gate releases and enable persistent caching 2026-08-11 03:01:04 +02:00
internal Update module namespace 2026-06-30 23:38:46 +02:00
scripts feat(measurement): capture browser diagnostics on failed runs 2026-04-30 20:44:33 +02:00
.dockerignore perf(docker): tighten context and dependency layers 2026-03-12 04:42:42 +01:00
.gitignore fix(build): commit dashboard and measurement sources 2026-03-12 04:00:25 +01:00
.releaserc.json fix(release): publish deployable dependency updates 2026-06-21 23:07:11 +02:00
Dockerfile.dashboard fix(deps): update weekly container digest refresh 2026-08-02 22:43:29 +00:00
Dockerfile.measurement fix(deps): update node.js to v26.7.0 2026-08-10 19:43:02 +00:00
go.mod fix(security): refresh and gate browser image 2026-07-23 12:41:16 +02:00
go.sum fix(security): refresh and gate browser image 2026-07-23 12:41:16 +02:00
package-lock.json Merge pull request 'fix(deps): update dependency semantic-release to v25.0.9' (#245) from renovate/semantic-release into main 2026-08-05 21:17:25 +00:00
package.json Merge pull request 'fix(deps): update dependency semantic-release to v25.0.9' (#245) from renovate/semantic-release into main 2026-08-05 21:17:25 +00:00
README.md Update module namespace 2026-06-30 23:38:46 +02:00
SECURITY.md Update module namespace 2026-06-30 23:38:46 +02:00

Netzbremse

build release

Self-hosted speed telemetry for netzbremse.de, backed by PostgreSQL.

About Netzbremse

Netzbremse ("net brake") is a campaign by AKVorrat.at investigating throttling and net-neutrality violations by Deutsche Telekom and other European ISPs. The project collects crowd-sourced speed-test data via a Cloudflare-backed browser measurement to build an evidence base for regulatory complaints.

This repository provides two service components that run the Netzbremse measurement on a schedule and present the results through a lightweight dashboard:

Component Description
measurement Headless browser worker that runs the Netzbremse speed test and writes results to PostgreSQL
dashboard Static web UI and JSON API serving measurement data from PostgreSQL

Repository layout

cmd/measurement/          Measurement worker entrypoint
cmd/dashboard/            Dashboard server entrypoint
cmd/dashboard/static/     Embedded HTML, CSS, and JS served by the dashboard
internal/                 Shared application code (config, model, postgres)
scripts/                  Puppeteer-based browser runner
db/                       SQL schema
.woodpecker/              CI and release pipelines

Configuration

Database

Variable Description
NETZBREMSE_DATABASE_URL PostgreSQL connection URI (preferred)
DATABASE_URL Fallback if the above is not set

Measurement

Variable Description
NETZBREMSE_MEASUREMENT_INTERVAL Time between runs (e.g. 1h)
NETZBREMSE_ENDPOINT Target URL (default: https://netzbremse.de/speed)
NETZBREMSE_SPEEDTEST_COMMAND Override the browser runner command
NETZBREMSE_SPEEDTEST_TIMEOUT Per-run timeout (e.g. 4m)
NETZBREMSE_IMPORT_DIR Directory to watch for legacy JSON result files

Dashboard

Variable Description
NETZBREMSE_DASHBOARD_LIMIT Max rows returned by the measurements API

Local verification

go test ./...
node --check scripts/netzbremse-browser.mjs
docker build -f Dockerfile.measurement .
docker build -f Dockerfile.dashboard .

CI and release

https://git.m0sh1.cc/m0sh1/netzbremse is the source-of-truth repository. GitHub is a push mirror for GHCR and GitHub-side automation. Pushes to main run tests and semantic-release against Forgejo. The release step needs Woodpecker secrets forgejo_username and forgejo_token with permission to push tags to the Forgejo repository; Woodpecker's clone-only netrc credentials are not available inside the Node release image. Tags (v*) trigger the full release pipeline:

  1. Build release images for linux/amd64
  2. Push to ghcr.io/isityael/netzbremse-{measurement,dashboard}
  3. Trivy scan, Cosign sign, SPDX SBOM + vuln attestations
  4. Mirror to harbor.m0sh1.cc/apps/ with Cosign + Notation signatures
  5. GitHub Actions generate CodeQL analysis and build provenance attestations

For the live GitOps deployment, ghcr.io is the source of truth. Harbor keeps a signed replica for storage and downstream reuse, but the cluster should consume ghcr.io/isityael/netzbremse-* images.

Licence

This project builds on the open measurement infrastructure published by AKVorrat. The PostgreSQL backend, dashboard, and CI pipeline are original work for m0sh1.cc.