BetterMan is a fast, readable web UI for man pages — built to feel like a tool: crisp type, keyboard-first, and no accounts.
- Live: https://betterman.sh
- Spec / architecture:
SPEC.md - Architecture overview (quick read):
docs/ARCHITECTURE.md - Getting started (local):
docs/GETTING_STARTED.md - Governance:
GOVERNANCE.md - Roadmap (high-level):
ROADMAP.md - Execution plan (living checklist):
PLAN.md - Changelog:
CHANGELOG.md - Releasing:
docs/RELEASING.md - Support:
SUPPORT.md - Contributing:
CONTRIBUTING.md
- Search with clean previews
- Multiple distros (Linux + BSD + macOS BSD-licensed pages)
- Local-only bookmarks, history, and reading preferences
- Command palette + shortcuts
- PWA + offline caching for recently read pages
/
├── nextjs/ # Next.js App Router (public web)
├── backend/ # FastAPI (API-only; internal)
├── ingestion/ # Ingestion pipeline (dataset builds)
├── frontend/ # Legacy Vite SPA (used for CI/e2e harness only; do not add features here)
├── docker-compose.yml # Local Postgres + Redis
└── SPEC.md
- Latest release:
v0.6.3(tagv0.6.3) - In progress: TBD (see
ROADMAP.md+PLAN.md) - Default branch:
main
- Auto-deploy:
.github/workflows/ci.ymldeploys after all jobs pass on pushes tomain. - Manual deploy:
.github/workflows/deploy.yml(workflowdeploy-railway, inputref). - Requires
RAILWAY_TOKENGitHub Actions secret (exported to Railway CLI asRAILWAY_API_TOKEN). v0.5.0deploy topology: two Railway servicesnextjs(public web) → setFASTAPI_INTERNAL_URL=http://web.railway.internal:8080web(FastAPI API-only; private networking)
- Monthly ingest + promote:
.github/workflows/update-docs.yml(workflowupdate-dataset).workflow_dispatchdefaults:ingest=true,promote=false(ingest to staging only).- Promote-only:
ingest=false,promote=true(promotes current staging actives without re-ingesting). - Targeted ingest (debug): set
linux_distro=archand/orbsd=false.
- Requires
BETTERMAN_STAGING_DATABASE_URL+BETTERMAN_PROD_DATABASE_URLGitHub Actions secrets.
- Required PR checks for
main:dependency_review,frontend,backend,ingestion,api_types,e2e. - Code scanning:
.github/workflows/codeql.yml(CodeQL) +.github/workflows/scorecards.yml(OSSF Scorecards → SARIF). - Dependency updates:
.github/dependabot.yml(GitHub Actions, frontend npm, backend/ingestion uv, Dockerfile base images). - API contract:
frontend/src/api/openapi.gen.tsis generated from backend OpenAPI and enforced in CI.
Error tracking for both services.
Environment variables:
SENTRY_DSN(backend)NEXT_PUBLIC_SENTRY_DSN(Next.js)
Privacy-friendly analytics (no cookies, GDPR-compliant).
Environment variables:
NEXT_PUBLIC_PLAUSIBLE_DOMAIN(Next.js): Domain configured in Plausible (e.g.,betterman.sh)
Analytics are disabled if the env var is not set.
For accurate IP-based rate limiting behind a reverse proxy:
Environment variables:
TRUSTED_PROXY_CIDRS(backend): Comma-separated list of trusted proxy CIDRs (e.g.,10.0.0.0/8,172.16.0.0/12)
When set, X-Forwarded-For is only trusted from connections originating within these CIDRs.
- Desktop man pages: sticky sidebar (TOC + Find), collapsible via
b. - Mobile man pages: contents drawer (swipe from left edge,
b, or the header contents button). - Find-in-page: desktop in sidebar; mobile uses a compact sticky bar above content.
/bookmarksand/historyredirect to/(homepage dashboard includes Recent + Bookmarks).- Man sections support extended suffixes (e.g.
/man/openssl/1ssl,/section/3p).
pnpm db:up— start Postgres + Redis (Docker)pnpm db:down— stop services- Postgres exposed on
localhost:54320
- Postgres exposed on
pnpm backend:dev— FastAPI dev server (port 8000)pnpm backend:test— backend tests (pytest)pnpm backend:lint— ruff check + format check
pnpm next:dev— Next.js dev serverpnpm next:build— Next.js production buildpnpm next:lint— Next.js lint
pnpm frontend:dev— Vite dev serverpnpm frontend:build— production buildpnpm frontend:lint— eslintpnpm frontend:test— unit tests (Vitest)pnpm frontend:e2e— E2E tests (Playwright; expects backend running)
pnpm ingest:sample— ingest a small sample setpnpm ingest:run— ingest full datasetpnpm ingest:lint— ruff check + format checkpnpm ingest:test— ingestion tests (pytest)
- Read
CONTRIBUTING.md. - Be kind:
CODE_OF_CONDUCT.md. - Security issues:
SECURITY.md. - Support/questions:
SUPPORT.md.
MIT — see LICENSE.
