Skip to content

Repository files navigation

Control Tower Template

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).

Why

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.

Not for you if…

  • 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).

Requirements

  • Python 3.11+ (uses stdlib tomllib). No pip install, no third-party deps.
  • Optional: git (local mode); the GitHub CLI gh for remote mode — with gh authenticated (or a GITHUB_TOKEN), the GitHub API allows 5000 req/hr; without it, remote mode is capped at 60 req/hr and repos past that limit render as n/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.

Quickstart (≈2 minutes)

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.html

control-tower.config.toml is gitignored — your real paths never get committed.

Config

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/down

Any 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 fine

The 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"

Publishing the dashboard

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.

Recommended: enable the safety hook

git config core.hooksPath .githooks   # blocks committing generated artifacts

License

MIT — see LICENSE.

Releases

Packages

Contributors

Languages