A single-file, dependency-free dashboard that monitors your local projects AND/OR any public GitHub repositories — branch, latest release, open PRs/issues, stars, CI status, and an "● NEW" badge when a repo's owner just pushed.
Live showcase: https://ronaldeira.github.io/control-tower-template/ (regenerated by CI from public data only — see
.github/workflows/showcase.yml).
You manage several projects and want one page that shows their live state without babysitting a wiki. GitHub Projects doesn't show "what changed 2 hours ago" across repos; Notion goes stale. This reads live public data (and, optionally, local git / service state) into one static HTML page you can publish or open locally.
Scope — read this first. This is the generic OSS template. It is not a full ops platform: richer private-infra features some maintainers run (SSH-to-prod health checks, host CPU/RAM/disk stats, git ahead/behind vs. origin) are intentionally not included here. Fork it and add what your setup needs.
- You use managed Kubernetes dashboards (Lens/kubectl already cover that).
- You want a kanban/planning tool — this is a status page, not a board.
- You need multi-host monitoring of private/local state (local mode is single-host; remote mode monitors any number of public repos across hosts).
- Python 3.11+ (uses stdlib
tomllib). Nopip install, no third-party deps. - Optional:
git(local mode); the GitHub CLIghfor remote mode — withghauthenticated (or aGITHUB_TOKEN), the GitHub API allows 5000 req/hr; without it, remote mode is capped at 60 req/hr and repos past that limit render asn/a. Also optional:pm2/docker(local service status).
Note: the per-repo "issues" count comes from GitHub's
open_issues_count, which includes open pull requests — so "PRs" and "issues" on a card can overlap.
git clone https://github.com/ronaldeira/control-tower-template
cd control-tower-template
# 1) See it work immediately with synthetic data:
python3 scripts/build_dashboard.py --demo -o dashboard.html
# open dashboard.html in your browser
# 2) Monitor real projects: copy the example and edit it.
cp control-tower.config.example.toml control-tower.config.toml
python3 scripts/build_dashboard.py # writes dashboard.htmlcontrol-tower.config.toml is gitignored — your real paths never get committed.
Remote mode (public repos, safe to publish — this is the showcase):
[[projects]]
id = "aquila-guardian"
name = "Aquila Guardian"
repo = "owner/aquila-guardian"
url = "https://example.com" # optional; HTTP HEAD for up/downAny public repo works — including ones you don't own. A remote-mode entry (a
[[projects]] block with a repo and no path) needs no clone and no access: it
reads public data via the GitHub API. Point it at a dependency, a tool, or a maintainer
you follow — e.g.:
[[projects]]
id = "codexbar" # must match ^[a-z0-9_-]+$
name = "CodexBar (watching)"
repo = "steipete/CodexBar" # someone else's public repo — that's fineThe card shows its default branch, latest release, open PRs/issues, stars, CI status,
and a "● NEW" badge when its owner just pushed. (Tip: authenticate gh or set
GITHUB_TOKEN to lift the API limit from 60 to 5000 req/hr.)
Local mode (your machine; branch, dirty, services — never publish this config):
[[projects]]
id = "my-api"
name = "My API"
path = "/abs/path/to/my-api"
[projects.services]
pm2 = ["my-api"]
[projects.urls]
prod = "https://api.example.com"The included GitHub Action builds the dashboard from control-tower.config.example.toml
(remote-only) in a clean runner and deploys it to Pages. After your first push, set
Settings → Pages → Source = GitHub Actions. Because the published artifact is built
only from public data in CI, no local path/host/IP can ever leak into it.
git config core.hooksPath .githooks # blocks committing generated artifactsMIT — see LICENSE.