dashboard

Front page of git.bytestone.uk for visitors who are not signed in (Caddy serves the deployed files there; signed-in users see Forgejo). Lists all public repositories across Forgejo (git.bytestone.uk, hum3) and GitHub (drummonds) that have been updated this year.

Latest: v0.3.0

Diagram rendered with d2.

Build

task docs:build   # render diagram, assemble docs/
tp pages          # preview locally
task refresh      # rescan forges, update repos.json, regenerate d2 + HTML
task dia          # refresh + build + commit + push (origin and github) + deploy
task edit         # local editor for ecosystem groups (http://localhost:1350)

repos.json is the single source of truth: groups (ecosystems, with their colours) and repos. Public repos are discovered by the refresh; private repos are listed by hand (private: true, via the editor's Add a repo form) and get a badge, no forge links and no API checks. A repo that deliberately has no GitHub mirror sets no_mirror: true so flag 1 reads n/a. This repo is one of those: it lives on Forgejo only. cmd/refresh regenerates the group containers in dashboard.d2 (between the AUTO-GROUPS markers; the relationship arrows below them are hand-written and use group ids) and index.html.

Local dashboard

task local builds a private copy of the dashboard into local/ (gitignored) and task local:serve serves it on port 1351. It lays repos.local.json over repos.json: the overlay holds the repos that must never be published, extra groups, and roots, the directories scanned one level deep for git clones. Neither file nor the output is committed, and repos.json is never written by this path. The overlay is a symlink to a replicated copy outside the repo, like task-plus.local.yaml.

Each repo has a tier: public (repos.json), quiet (repos.json with private: true, or an overlay repo that says so) or local (overlay default). Quiet and local repos get a tier badge. The Local column shows the clone found for the repo: branch, ✎ when the working tree is dirty, ↑/↓ against upstream (∅ when there is none), +N linked worktrees, and the last commit date; the detail page lists path, remotes and other clones. Clones matching no listed repo are printed as UNLISTED; task local -- -add appends them to the overlay (group new, tier local, or quiet when a remote points at git.bytestone.uk).

Sorting and filtering in the browser

The repo table is an HTMX fragment. index.html embeds it sorted by name; sw.js registers main.wasm (built from cmd/app, the same internal/dash table code) as a service worker with go-wasm-http-server, so api/table?sort=…&dir=…&group=…&q=…&needswork=1 is answered in the browser from repos.json, and header clicks and the filter bar swap the table. Every other URL passes through to the static host. Until the worker controls the page, or where service workers are unavailable, a small in-page script sorts the static table instead and the filter bar stays hidden. task app serves docs/ with the API answered natively for development. The local dashboard does not ship the worker yet: its Local column comes from the clones, which repos.json never carries.

Detail pages

The first column of the table links to repos/<name>.html, one page per repo with its links (docs, website, origin, mirror, home Forgejo), stars by forge, issues, the status checks written out in full with a link to where each is fixed, and what was read from the repo (task-plus.yml, pages_deploy). Generated with the other pages; repos/ and docs/repos/ are not committed.

Stars

The master page shows total stars across all forges with a link to stars.html, the detail page: a column per forge (Forgejo, GitHub) by ecosystem and by repo. The refresh records stars_forgejo and stars_github per repo; stars is their sum.

Dependencies

deps.html maps which repo requires which, read from every go.mod in each repo — nested modules merged, vendor/ and testdata/ skipped (direct requires on git.bytestone.uk/hum3/*, github.com/drummonds/* or the old codeberg.org/hum3/*). The refresh reads the forge copy; the local dashboard reads the clone's, so private repos appear there. The graph is deps.d2, fully generated. The table is in work order: leaves first, then each repo after everything it depends on, so a fix released at row n is available to every later row. Each row flags a go.mod that still requires a codeberg.org path or carries a replace on one of our modules, where a plain git.bytestone.uk require would do. Non-module dependencies (a site built from a data repo) are not captured.

deps_views in repos.json adds domain-specific cuts of the same graph: each view names a few root repos (an ecosystem's deliverables, e.g. gobank and gobank-deploy) and gets its own page, deps-<id>.html, showing only what those roots transitively require, with its own work order. task docs:build renders every deps*.d2 it finds.

Editing ecosystems

task edit runs a small lofigui app that edits repos.json in place: create, recolour, reorder and delete groups, move repos between groups with a drop-down per row, and set a repo's public website (the www column, e.g. the site a static-site repo builds). Every save regenerates dashboard.d2 and index.html; the Run task docs:build button renders the diagram for a preview at /docs/. Commit repos.json, dashboard.d2 and index.html when done. Nothing is pushed or deployed by the editor.

Status flags

The Status column shows three dots per repo (green = desired state, red = needs fixing, yellow = partial, grey = n/a or unknown). Dots link to the place where the fix is made. The status panel above the table counts what is left.

  1. GitHub mirror in sync — the GitHub copy is at the same commit as the Forgejo original. Red if the mirror is missing or stale; n/a when the repo sets no_mirror: true.
  2. Docs in the right place — if the repo should have a docs site, it answers at its docs_url on docs.bytestone.uk. A docs site is expected when the repo's task-plus.yml has a pages_deploy target or when docs_url is set by hand. An rsync target's site: fills an empty docs_url as https://<site>.docs.bytestone.uk/.
  3. Local mirror — a pull mirror of the repo exists on the home Forgejo. Yellow if there is a copy that is not a mirror. Only checked when the home network is reachable and HOMELAB_FORGEJO_TOKEN is set (tp secrets task refresh); otherwise the previous value is kept. tp secrets task mirror (-- -dry-run to preview) creates a private pull mirror for every public repo that lacks one.

Flags 1–2 are temporary: they track the move to Forgejo + docs.bytestone.uk and will be removed once every repo is green. Two flags have already been retired: GitHub Pages (all sites deleted 2026-09-22) and Codeberg, where the repos were once hosted (last one moved 2026-09-23). The refresh command also records whether each repo has a task-plus.yml (tp_config), which drives the ⚠️ marker in the diagram.

Documentation https://dashboard.docs.bytestone.uk/
Source https://git.bytestone.uk/hum3/dashboard