middleman
- title
- middleman
- type
- toolbox
- summary
- Local-first PR and issue review dashboard across GitHub, GitLab, Forgejo and Gitea
- tags
- go, svelte, github, code-review, dashboard, local-first, kenn-software
- language
- Go
- license
- MIT
- created
- 2026-05-22
- updated
- 2026-05-22
Local-first dashboard for maintainers who review pull requests and issues across many repositories and don't want to live in GitHub's notification email firehose. A single Go binary syncs PR/issue data into local SQLite and serves a fast Svelte 5 UI. Part of the kenn-software-suite.
What it does
One unified activity timeline across all your repos โ comments, reviews, commits โ in flat or threaded view, filterable by time range (24h/7d/30d/90d), event type, repository, and item type. From the same UI you can act on PRs: comment, approve, merge (choosing the commit strategy), mark a draft ready, close/reopen, and star items for quick filtering. Diffs render inline with a collapsible file tree, directory grouping, status badges, and Shiki syntax highlighting. A local kanban board moves PRs through New/Reviewing/Waiting/Awaiting-Merge columns with drag-and-drop โ board state is middleman's own, it doesn't touch GitHub labels.
Multi-provider: GitHub, GitHub Enterprise, GitLab, Forgejo, and Gitea. Mutating actions only appear when the provider reports it supports them.
How it works technically
Go backend (~57%) plus a Svelte 5 / TypeScript frontend embedded into the binary. SQLite via the pure-Go modernc.org/sqlite driver, so no CGO; WAL mode. The REST API is built on the Huma framework. The server binds to loopback (127.0.0.1:8091) by design โ this is a personal tool, not shared infrastructure โ with a configurable base path for reverse-proxy setups and graceful SIGINT/SIGTERM shutdown.
Config defaults to ~/.config/middleman/config.toml: sync interval (5 min default), listen address, activity-feed defaults, and per-repo provider host + token. Tokens are keyed by (provider, host), so separate credentials for distinct hosts (e.g. github.com vs. an Enterprise instance) coexist. Migrations live in internal/db/migrations/, embedded and applied on startup via golang-migrate; a dirty migration state requires deleting and recreating the database.
Embeddable two ways: as a Go library through the Instance type (which exposes an http.Handler), and the frontend ships separately as @middleman/ui for custom builds.
Basic usage
make build # needs Go 1.26+, plus Bun or mise for the frontend
./middleman # starts the server, syncs, opens the UI on 127.0.0.1:8091
Keyboard-first: j/k to move, 1/2 to switch views, Escape to close. Dark mode auto-detects system preference with a manual override.
Limitations
- Loopback-only by design โ not meant to be exposed as a team service.
- Local-only state (kanban columns, stars, worktree links) is non-recoverable if a migration fails and you have to recreate the database.
- Mutating actions are gated on provider capability reporting.
Related
- forge โ Nesbitt's unified Go CLI/library over the same set of forges; forge is the scripting/agent bridge, middleman is the human review surface.
- roborev โ Kenn Software's continuous code-review tool; complementary (roborev reviews your own commits locally, middleman triages others' PRs on the forge).
- kenn-software-suite โ the rest of the suite.
Repo
github.com/kenn-io/middleman โ Go (1.26+) + Svelte 5, MIT, 110 stars, no tagged release yet. No hosted service, telemetry, or accounts.