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.0Diagram 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.
- 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. - Docs in the right place — if the repo should have a docs site, it
answers at its
docs_urlondocs.bytestone.uk. A docs site is expected when the repo'stask-plus.ymlhas apages_deploytarget or whendocs_urlis set by hand. An rsync target'ssite:fills an emptydocs_urlashttps://<site>.docs.bytestone.uk/. - 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_TOKENis set (tp secrets task refresh); otherwise the previous value is kept.tp secrets task mirror(-- -dry-runto 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.
Links
| Documentation | https://dashboard.docs.bytestone.uk/ |
| Source | https://git.bytestone.uk/hum3/dashboard |