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 95880be477
Some checks failed
Create gated semantic release tag / release (push) Failing after 1h2m8s
Merge pull request 'fix(deps): update weekly container digest refresh' (#302) from renovate/weekly-container-digest-refresh into main
Reviewed-on: #302
2026-09-30 19:15:23 +00:00
.forgejo/workflows ci: gate releases and enable persistent caching 2026-08-11 03:01:04 +02:00
.github chore(deps): update docker/setup-buildx-action digest to f87e599 2026-09-16 08:51:28 +00:00
.woodpecker fix(deps): update weekly container digest refresh 2026-09-30 15:35:07 +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-09-26 08:34:18 +00:00
Dockerfile.measurement fix(deps): update weekly container digest refresh 2026-09-30 15:35:07 +00:00
go.mod fix(deps): update module github.com/jackc/pgx/v5 to v5.11.0 2026-09-08 00:36:02 +00:00
go.sum fix(deps): update module github.com/jackc/pgx/v5 to v5.11.0 2026-09-08 00:36:02 +00:00
package-lock.json fix(deps): update dependency puppeteer to v25.12.0 2026-09-24 08:50:24 +00:00
package.json fix(deps): update dependency puppeteer to v25.12.0 2026-09-24 08:50:24 +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.