Skip to content

Configuration

Dan Riddell edited this page Sep 12, 2026 · 1 revision

Configuration

Zero config is the primary path

There is usually no config file. Everything is derived from go.mod, git, and your directory layout: project name, module path, main packages, repo owner and version.

Run letsgo plan --explain to see which defaults were inferred and from what evidence. Zero config only feels safe if the inference is inspectable.

letsgo.mod

When a config file exists it is written in the same directive syntax as go.mod, because you already read that fluently:

// letsgo.mod

project foo

build (
    linux/amd64
    linux/arm64
    darwin/arm64
)

archive (
    README.md
    LICENSE
)

budget linux/amd64 15MB

brew danielriddell21/tap

image

letsgo fmt formats it.

Directives

Directive What it does
project Overrides the project name inferred from the module path
build The target matrix, as os/arch entries
archive Extra files to include in each archive
budget Caps a target's binary size
brew Writes a Homebrew formula to the named tap — see Publishing
image Publishes multi-arch container images — see Publishing

Size budgets

A budget caps a target's binary. The size is parsed during plan, so a typo fails in two seconds rather than after a five-target cross-compile; the cap itself is checked the moment the binaries exist, and every target is reported at once rather than one rebuild at a time.

Reaching 90% of a budget is a warning, because a cap you only hear about on the day it breaks tends to break on release day.

The config surface should shrink, not grow

If a repo needs a new config option, the first question is whether we could have inferred it. A growing config file is the failure mode letsgo is specifically trying to avoid, and every option added is a small admission that inference wasn't good enough. See Design.

Clone this wiki locally