Self-hosted · one binary · one dependency

Short links for your team, without the platform.

bridge turns go.acme.com/standup into that 190-character Meet link. Log in with GitHub, see who changed what, scrape it with Prometheus. It's one Go binary and a JSON file, and it depends on exactly one library.

go.acme.com

bridge in 23 seconds · sound on 🔊

What's in the box

Everything a link shortener needs. Nothing it doesn't.

No database, no queue, no sidecar. The Go standard library does the heavy lifting; the only third-party module draws QR codes.

Short links per host

Point several hostnames at one bridge; each gets its own links. /standup can mean different things on go.acme.com and go.beta.dev.

GitHub login

Optional OAuth with org or user allowlists and GitHub Enterprise support. Redirects stay public; the portal and API need a session.

Audit log

Every create, update and delete lands in an append-only JSONL file: who did it, their verified emails, when, and the old and new URL.

Prometheus metrics

--metrics exposes redirects, misses, route changes, latency and storage health. A Grafana dashboard ships in the repo.

QR codes

Every link has a QR code at /api/routes/barcode, for slides, posters and conference badges. This is the one dependency.

Boring storage

Routes live in a JSON file, written atomically, so a crash never leaves it half-written. Back it up with cp.

How it works

One lookup. One redirect.

bridge keys every link by host and path, so the same binary can serve as many short domains as you point at it.

🌐
Request
GET go.acme.com/standup
🔎
Lookup
"go.acme.com/standup" in routes.json
Redirect
302 Location: meet.google.com/…
Quick start

Run it in one line.

Grab the container image or a release binary for Linux or macOS (amd64 and arm64). Point a hostname at it and open the portal.

# docker $ docker run -p 8080:80 -v bridge-data:/data ghcr.io/alileza/bridge:latest --storage /data/bridge --metrics # or a release binary: bridge_<version>_<os>_<arch>.tar.gz from github.com/alileza/bridge/releases/latest $ tar xzf bridge_*_linux_amd64.tar.gz $ ./bridge --listen-address 0.0.0.0:8080 --storage ./bridgedata # with GitHub login $ ./bridge --github-client-id "$GITHUB_CLIENT_ID" --github-client-secret "$GITHUB_CLIENT_SECRET" \ --github-allowed-orgs my-org --session-secret "$(openssl rand -hex 32)"
FlagEnvWhat it does
--listen-addressLISTEN_ADDRESSHTTP listen address (default 0.0.0.0:80).
--storage-dirRoutes go in <storage-dir>.json, the audit log in <storage-dir>.audit.jsonl.
--metricsMETRICS_ENABLEDExpose Prometheus metrics at /metrics.
--metrics-addressMETRICS_ADDRESSServe /metrics on a separate port instead, off the public listener.
--github-client-id / -secretGITHUB_CLIENT_ID / _SECRETEnable GitHub login for the portal and API.
--github-allowed-orgs / -usersGITHUB_ALLOWED_ORGS / _USERSWho may log in. With neither set, any GitHub user can.
--session-secretSESSION_SECRETSigns session cookies, so logins survive restarts.
--github-urlGITHUB_URLGitHub Enterprise Server base URL.