preferred-libraries.md

Preferred libraries

Prefer the standard library until a library earns its keep. When a library is needed, these are the usual defaults.

Need Default Notes
TOML config github.com/BurntSushi/toml Preferred for direct, boring TOML parsing. Avoid heavy config frameworks by default.
CLI commands github.com/spf13/cobra + charm.land/fang/v2 Cobra for command structure; Fang for polished help, errors, version, and signal handling. Tiny tools may use stdlib.
TUI implementation Charm v2 stack via golang-tui Load golang-tui for Bubble Tea, Lip Gloss, Bubbles, testing, layout, keymap, terminal, and performance details.
MCP server github.com/modelcontextprotocol/go-sdk Use typed parameter structs, tool annotations, stdio by default.
Wails desktop github.com/wailsapp/wails/v2 Go owns domain logic; frontend renders state and calls bindings.
Light web server net/http, html/template, embed Default web stack for mostly server-rendered apps.
User-provided HTML sanitisation github.com/microcosm-cc/bluemonday Use strict or UGC policies intentionally.
SQLite without CGO modernc.org/sqlite through database/sql Useful for easily shipped binaries. Reconsider if CGO is already required.
RSS/Atom github.com/mmcdole/gofeed Fine for feed ingestion.
Git access in-process github.com/go-git/go-git/v5 Useful when shelling out to git is not acceptable.
Behaviour specs github.com/regen-network/gocuke Explicit opt-in only. Ask whether the project wants gocuke before adding it.
Property tests pgregory.net/rapid Add around parsers, state machines, and merge logic.
Comparisons in tests github.com/google/go-cmp/cmp Prefer over ad-hoc string diffs for structured values.
Linux packages nfpm Prefer for .deb, .rpm, .apk, and Arch package artifacts.

Dependency rules

  • Add dependencies with the relevant CLI (go get, go install, package manager command); do not hand-edit manifests.
  • Keep direct dependencies direct and intentional. Run go mod tidy after changes.
  • Prefer concrete types. Avoid broad maps, any, or reflection unless parsing a real untyped boundary.
  • If a project already made a different good choice, preserve it unless the user asked for an opinionated migration.