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)
├── convex/ # Convex schema/functions for dataset reads, search, rate limits, ingest
├── backend/ # Legacy FastAPI API service (kept for maintenance/tests during cutover)
├── ingestion/ # Ingestion pipeline (dataset builds into Convex)
├── 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.4(tagv0.6.4) - 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 (used as Railway project-token auth in CI). - Current runtime:
nextjsreads datasets/search/rate limits from Convex. - Legacy
webFastAPI service may still exist during the infrastructure transition, but the active Next.js app no longer requiresFASTAPI_INTERNAL_URL.
- 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_CONVEX_HTTP_URL+BETTERMAN_CONVEX_INGEST_SECRETGitHub Actions secrets. - Ingest activates
stagingrelease pointers; promotion copies active staging pointers toprodin Convex. - Production Convex rebuild/import runbook:
docs/runbooks/convex-production-cutover.md.
- 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: generated OpenAPI types for both
frontend/src/api/openapi.gen.tsandnextjs/lib/openapi.gen.tsare 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.
Environment variables:
NEXT_PUBLIC_CONVEX_URL/CONVEX_URL(Next.js): Convex client URL.BETTERMAN_DATASET_STAGE(Next.js):prodby default;stagingfor staging previews.CONVEX_HTTP_URL+CONVEX_INGEST_SECRET(ingestion): Convex HTTP actions URL and ingest bearer token.
- 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 legacy 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— Convex watcher + Next.js dev serverpnpm convex:check— one-shot Convex schema/function validationpnpm 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 Next.js + Convex 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.
