frontpage.
newsnewestaskshowjobs

Open Source @Github

fp.

Open in hackernews

Show HN: BetterMan – man pages for all of Debian, with explain and portability

https://betterman.sh
2•amanthanvi•1h ago

Comments

amanthanvi•1h ago
Hi HN. BetterMan is a web reader for Unix manual pages. I've been working on it for a while; version 2 is a large rework, which is why I'm posting it now. It has 107,143 pages from about 17,300 Debian trixie (13) packages, plus full archive imports of Ubuntu (104,763), Fedora (87,890), Arch (49,306) and Alpine (41,920), FreeBSD (12,096) and macOS (447). There are no accounts. Bookmarks, history and reading preferences stay in your browser.

Why. I look up flags constantly, and the existing options each do part of the job. man7.org and manpages.debian.org are faithful but plain. tldr shows the examples but not the manual. explainshell parses a command line but is a separate tool. I wanted one place where the exact manual is the base, and everything I add sits on top of it, marked as mine.

What it does.

- `betterman.sh/tar`, `/tar.1`, `/tar/-x` go to the page or flag. A bare name opens the section `man` itself would pick on that distro. `curl -L betterman.sh/tar.txt` returns plain text: a running header, then NAME, with each option listed once. Browsers can add it as a search engine.

- Each page opens with a one-sentence summary, up to five examples (each labelled with its source) and the most-used flags. The upstream manual follows unchanged, with a filterable options index.

- Search matches task phrases ("extract a tarball" finds tar(1)), manual citations such as `open(2)` and clustered flags.

- Explain: paste a shell line, get each command and flag linked to its definition. Clustered flags are split. It is a deterministic parser, not a model. For input it can't parse safely it says so instead of guessing.

- Flags that differ between distros get a marker, computed by diffing the actual manuals. Where several packages ship the same page, a provided by switch lists them.

- Translations in six languages (de, fr, es, pt-BR, ja, ru) come from Debian's manpages-l10n packages, 9,552 pages in all. Add `?lang=`; each page credits its source package and notes the options it lacks compared with English, and a page with no translation shows in English. The UI is localized into the same six languages.

How it's built.

- Ingestion is Python. `mandoc -Thtml` renders each page, and I convert that into a typed block/inline document model that is mirrored in TypeScript, with golden fixtures keeping the two in sync. Debian pages come from checksum-verified `.deb` archives that are unpacked, not installed (the way debiman does it). Installing everything is not feasible: it would be 18 GB to download and 74 GB installed, with conflicts.

- The data lives in Convex. Releases are immutable once sealed. A dataset update goes ingest, verify, seal, stage, then promote, with a compare-and-swap on the release ID, so a bad release can be rolled back by pointing at the previous one. Next.js reads Convex server-side only; there are no client subscriptions.

- Man pages are plain server-rendered HTML. The only script is one hashed inline boot script (theme and reading preferences before first paint) plus a small static bundle. The CSP is hash-based, with no per-request nonce, which lets Vercel's CDN cache pages. The cache key includes the active release, so a promotion changes it.

- CI enforces budgets (`pnpm perf:check`): JS and HTML bytes per route, Convex calls and documents read per page view, and a cap on LCP minus FCP. A change that raises one needs an explanation in the PR.

What's generated and what isn't. The manual text is upstream, parsed, not rewritten. Generated at build time by DeepSeek V4.1 Flash (`deepseek-v4.1-flash`): the one-sentence summaries, task phrases, and some examples when a page has fewer than three. There is no model call when you load a page. Generated text is labelled with the model and date. A generated example must be one simple command, and every flag in it is checked against that page's options table; if a flag isn't there, the example is dropped. Pages for commands that destroy data (`rm`, `dd`, `mkfs` and the like) get no generated text. Examples from tldr-pages (CC BY 4.0) are credited and link to the exact upstream file.

Limits.

- Translations cover 9,552 pages, so most pages are English only.

- Ubuntu 24.04, Fedora 44, Arch and Alpine 3.23 are full archive imports like Debian. FreeBSD (15.1) is base-system manuals. macOS is limited to pages whose license allows it.

- One current release per distro. There is no history, so you can't read what tar(1) said in an older release.

- Portability compares distros, not versions of a distro.

- Explain covers a defined shell grammar. It will refuse some valid lines.

- Generated summaries can be wrong or flat. Every page has a report a problem link that opens a prefilled GitHub issue.

- Search engines may index pages in sections 1, 5, 7 and 8, plus pages from packages with at least 10,000 installations in Debian's popularity contest. That is 48,416 of Debian's 107,143 pages and 49,744 of Ubuntu's 104,763. Every other page is served and searchable but marked `noindex` and left out of sitemaps, to avoid 100k thin pages. Translated pages are `noindex`, with the English page as canonical when that page is indexable.

- Parsing man pages is messy. Pages that mandoc warned about carry a note, and some will still render badly.

- No CLI, API or editor extension for now. `/api/` is disallowed for crawlers.

Feedback I'd like. Pages that render wrongly, or flags missing from the options index. Explain results that are wrong or too cautious. Portability markers that don't match what you see on your machine. A package that owns the wrong clean URL (`nc`, `awk`, `vi` were the hard ones). And whether the answer-first layout helps or just gets in your way.

It's MIT licensed: https://github.com/amanthanvi/BetterMan. I'll be around to answer questions.

Show HN: Every satellite that passed over any place this week, and its photos

https://www.watched.earth
242•a585gupt•9h ago•45 comments

Show HN: MeowDisplay Is iPhone Mirroring, but in Reverse

https://meowdisplay.app/
78•raiseCatError•8h ago•30 comments

Show HN: Someone Was Here – Find out who used your Mac while you were away

https://someonewashere.app/
68•4onthefloor124•8h ago•25 comments

Show HN: Dating app based on your LinkedIn profile

https://synergy.dating/
3•Startup4Life•50m ago•0 comments

Show HN: STE80 Humanizer – de-AI text by writing 80% of the way to ASD-STE100

https://github.com/Dodaios/ste80-humanizer
63•Dodaios•9h ago•20 comments

Show HN: BetterMan – man pages for all of Debian, with explain and portability

https://betterman.sh
2•amanthanvi•1h ago•1 comments

Show HN: DBDelve – Open-Source DB Client Made with Rust and GPUI

97•shayan_abbas•10h ago•34 comments

Show HN: Recalc – Spreadsheet where cells can be Claude Code or Codex terminals

https://github.com/sshah03/recalc
28•sshah03•1d ago•8 comments

Show HN: Flide: Make Jev-like decision models up to 9.5x faster

https://github.com/OmniJev/Flide
120•unikcc•22h ago•29 comments

Show HN: Rat Race (After Dark, 1994), ported from 68k assembly to TypeScript

https://rat-race.heyitsjam.es/
2•shijie•3h ago•0 comments

Show HN: My daily word puzzle Jointter revisited

8•proy87•12h ago•4 comments

Show HN: Airgap-check – find what your AI app silently downloads offline

https://github.com/humanethq/airgap-check
4•humanethq•6h ago•0 comments

Show HN: Rollare – Bracket maker with registration and live scoring

https://rollare.com/
6•cloudyer•9h ago•1 comments

Show HN: Live counts of AI assistants reading a diaspora business directory

https://nibiashara.com/agent-index
3•NiBiashara•4h ago•1 comments

Show HN: Every Job in the Observability Space

https://o11y.jobs/
2•ScarZy•4h ago•0 comments

Show HN: Camwall – all your camera feeds on one screen, no black bars

https://github.com/vinodhalaharvi/camwall
2•vinodhalaharvi•4h ago•0 comments

Show HN: Totle, daily math puzzle game; Saturday puzzles have the fewest answers

https://playtotle.com/
2•zemelett•4h ago•1 comments

Show HN: Write GitHub Actions in any language: Loopt

https://github.com/preloopdev/loopt
12•Bnjoroge•9h ago•5 comments

Show HN: JavaScript web apps with WASM layout and GPU rendering in 280 KB

https://github.com/rkaehn/uniform
46•rkaehn•2d ago•21 comments

Show HN: Vork – headless 3D and VFX engine for agents

https://github.com/voyager-so/vork
5•raviparikh•5h ago•2 comments

Show HN: Fable 5.2 made a fun Claude castaway clone

https://claude-castaway.zachy.dev/
4•nzach•5h ago•0 comments

Show HN: Brick Atlas: Explore 1000+ LEGO sets on one zoomable canvas

https://showcase.zoomhub.net/ecommerce/brick-atlas
4•gasi•5h ago•0 comments

Show HN: Bottled Reset Rune – auto-use spare Codex resets before they expire

https://github.com/sufferfml/reset-rune
2•morrowf•5h ago•1 comments

Show HN: Agent-email-guard – agent tried to send 400 receipts, stopped at 5

https://github.com/agentisend/agent-email-guard
3•Iammnhamza•5h ago•1 comments

Show HN: Emma, a real-time AI video persona from Nuance Labs

https://app.nuancelabs.ai/try
6•cvanea•5h ago•1 comments

Show HN: Coldframe, a honeypot that poses as a supermarket fridge controller

https://github.com/hedgerow-dev/coldframe
285•hedgerow-dev•2d ago•69 comments

Show HN: Secure browser sessions for agents

https://easi.run/
3•roxygens•6h ago•2 comments

Show HN: ApiClay – Turn a Website, Google Sheet or Database into a Paid API

https://apiclay.com
4•apiclay•6h ago•1 comments

Show HN: Negs (Spektrafilm) brings spectral film simulations to the browser

https://getnegs.com/try/
2•haasisnoah•6h ago•0 comments

Show HN: Static analysis for JavaScript/TS test suites, written in Rust

https://spirolo.com/
3•AlexFromTwelve•7h ago•0 comments