# middleman

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

```bash
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](https://github.com/kenn-io/middleman) — Go (1.26+) + Svelte 5, MIT, 110 stars, no tagged release yet. No hosted service, telemetry, or accounts.
