The golang-templates/seed repository template, and the naming work it leaves you
Go application GitHub repository template.
At a glance
- What is it?
- seed is a GitHub repository template for Go applications that bundles GitHub Actions, Make targets, GoReleaser, golangci-lint, Codecov, Renovate, CodeQL and govulncheck into one starting point. It is CC0 licensed, recently pushed, and the price of using it is a rename pass across every file plus a token to configure.
- Who is it for?
- Adopt seed if you start Go services on GitHub and want CI, linting, coverage, release automation and dependency updates already wired together, and you are prepared to spend an hour renaming the repository and configuring the Codecov token. Do not adopt it if your Go projects are not on GitHub, or if you already have a working pipeline and consider the included toolchain noise.
- Can I use it commercially?
- Yes. CC0-1.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly Makefile, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A template, not a library, with two stated uses
The golang-templates/seed repository is described simply as a GitHub repository template for a Go application, and the documentation gives it two jobs. You can use it to create a new repository with automation and environment setup, or you can use it as a reference when improving automation for an existing repository.
That second use is the one most people miss, and it is arguably the more useful one. A template is something you adopt wholesale at the start of a project and rarely revisit, while the set of files here is a worked example of what a modern Go repository looks like when someone has already made the decisions. The Makefile is the clearest case, because it holds the whole pipeline in one place rather than scattering it across a dozen workflow files.
The top level of the repository shows how little is left when you take it apart. There are two Go files, main.go and main_test.go, a go.mod and go.sum, a Makefile, a Dockerfile, a .golangci.yml, a .goreleaser.yml, a .markdownlint.yml, a renovate.json, a CHANGELOG.md, a CODE_OF_CONDUCT.md, a LICENSE, a .vscode directory and a .github directory. There is no framework, no library code and no dependencies of its own. The project is the tooling.
The licence is CC0, which is worth noting because it is unusual for software and means the template itself is placed in the public domain rather than merely permissively licensed.
The Makefile holds the entire pipeline in dependency order
Everything the project does runs through make, and the pipeline target lists its steps in the order they run:
all: mdlint mod gen build spell lint testReading that line tells you the whole policy. Markdown linting first, then go mod tidy, then go generate, then a build, then a spell check, then the Go linter with --fix, and finally the tests. Each step has its own target, so a developer can run any one of them in isolation, and make help exists to print the list of targets with their descriptions.
The tooling is invoked through go tool rather than through a separate installation. The build step is GoReleaser:
go tool goreleaser build --clean --single-target --snapshotThe --snapshot flag matters, because it is what lets a developer build locally without producing a real release, and the --clean flag keeps stale artefacts out of the output. The lint step runs golangci-lint with --fix, so linting is not only a check but a writer that repairs what it can. The spell step runs misspell with -locale=US over the Markdown files, and the vulnerability step runs govulncheck over the packages.
The test target is where the detail sits:
go test $(RACE_OPT) -covermode=atomic -coverprofile=coverage.out -coverpkg=./... ./...
go tool cover -html=coverage.out -o coverage.htmlThe race detector is conditional on CGO being enabled, so the pipeline works on a builder with CGO turned off, and coverage is measured across all packages rather than only the package under test, with an HTML report written out.
Markdown linting runs in a container, and can be skipped
One of the pipeline steps is unusual enough to call out. The markdownlint step does not use a local binary, it runs a container image:
docker run --rm -v "$(PWD):/workdir" ghcr.io/igorshubovych/markdownlint-cli@$(MARKDOWNLINT_VERSION) "**/*.md"The image reference is pinned to a digest, with the version comment carrying the upstream release number, and a Renovate comment above it marking the datasource so dependency automation can bump it. That pinning is a deliberate supply chain decision, and it is why the step needs Docker at all.
The step is also conditional. A SKIP_DOCKER variable is filtered, and when it is set to 1 or true the target prints a skipping message instead of running the container. That escape hatch exists for environments with no Docker daemon, which is the same situation that shapes the Windows advice in the documentation.
The practical effect is that running the full pipeline on a developer machine requires Docker, even for a language whose toolchain is otherwise self-contained. The documentation points at goyek for people who want cross-platform build pipelines in Go without that dependency.
GoReleaser produces the binary and a scratch-based container image
Releases are handled by GoReleaser, and the trigger is simple: the release workflow runs each time a tag with a v prefix is pushed. The documentation puts a caution next to it, telling you to make sure you understand the consequences before you bump the major version, and links to the Go wiki and the Go blog on releasing modules v2 or higher. That caution is about the Go module major version rules rather than about GoReleaser, but the two are tied together in practice because a v2 tag has consequences for both.
The container image is unusually minimal, and the Dockerfile is three lines:
FROM scratch
COPY seed /
ENTRYPOINT ["/seed"]Building from scratch means no shell, no package manager and no base distribution in the final image, only the statically linked binary. The catch is visible in the second line: the binary is called seed, because the template is called seed. The documentation covers this in the usage steps, telling you to replace all occurrences of seed with your own repository name in the Dockerfile, alongside the instruction to replace all occurrences of golang-templates/seed with your_org/repo_name across all files.
The release configuration itself lives in .goreleaser.yml, and the documentation points at the GoReleaser documentation and at the GoReleaser repository as examples of how the project dogfoods its own features, mentioning deb, rpm and snap packages, a Homebrew tap and a Scoop app manifest as additions you can make.
Security and dependency automation come from four separate tools
Four separate integrations handle the parts of a repository that are easy to forget. Renovate handles dependency scanning and updating, configured through the Renovate GitHub App, with its settings in renovate.json. CodeQL runs as the CodeQL Action for security code analysis. govulncheck runs as a separate Go tool for vulnerability analysis of the dependency graph. And Codecov handles coverage reporting, with the report uploaded from CI and the HTML report produced locally by the test target.
The Codecov piece is the one that needs manual work. The usage steps start by signing up on Codecov and configuring the Codecov GitHub Application, and later by adding a CODECOV_TOKEN as a GitHub Actions secret following the Codecov documentation. That token is the only credential the template requires from you.
The remaining setup steps are all find and replace. You click the Use this template button, or clone or download the repository, then replace the module path occurrences, replace the binary name in the Dockerfile, add the token, and update four files: CHANGELOG.md, CODE_OF_CONDUCT.md, LICENSE and README.md.
A note on the licence is in that list. The template itself is CC0, but the LICENSE file you are told to update is the one you choose for your own project, so the CC0 status does not carry over to whatever you build from it.
Why GitHub Actions, and how to leave if you need to
The documentation answers its own objections in a FAQ section, and two of the answers are worth repeating because they explain the design.
On the choice of CI server, the argument is that GitHub Actions is out of the box if you are already using GitHub, with a link to the GitHub Actions for Go guide. The follow-up is the important part: changing to any other CI server should be very simple, because the repository has build logic and tooling installation in the Makefile. That is the structural decision that makes the template portable. The workflows are thin wrappers around make targets, so a different CI system means rewriting a handful of YAML files rather than porting a build graph.
On the editor configuration, the argument is that developers using Visual Studio Code can take advantage of it while others do not have to care, and that setting configs for each repo is unnecessarily time consuming. The Go team officially supports the Visual Studio Go extension, which the documentation cites, and the FAQ section notes you can always remove the .vscode directory if it does not help.
The Makefile is documented as the place holding the targets used for development, the CI build and the .vscode/tasks.json task definitions, so the same commands run whether you type them, whether CI runs them, or whether the editor runs them.
Windows support is a workaround, and the Go version is recent
The FAQ section on building on Windows is the most honest part of the documentation. The instruction is to install tdm-gcc and copy the mingw32-make.exe binary to make.exe, or alternatively install mingw-w64 and copy mingw32-make.exe accordingly. Both are manual steps that assume you know what a Windows toolchain looks like.
The alternatives offered are WSL, developing inside a Remote Container, or using goyek for cross-platform build pipelines in Go. The documentation is honest that going the WSL or container route means you are not using bare metal Windows, and it points at a specific workaround discussion for people who have trouble using Docker in Git Bash.
The toolchain version is recent. The go.mod file declares go 1.26.5, and the module also uses the tool directive to pin the development tools, so misspell, golangci-lint, GoReleaser and govulncheck are all tracked as part of the module rather than installed separately. The Makefile version comment shows a Renovate datasource annotation for the markdownlint image as well.
On maintenance, the last push was on 2026-10-22 and the release tags are v0.23.0 from 2025-12-23, v0.22.1 from 2025-09-17 and v0.22.0 from the same day. The tags sit below a v1 release, which is a sensible line for a template, and the CHANGELOG follows the Keep a Changelog convention.
Editorial conclusion
Adopt seed if you start Go services on GitHub and want CI, linting, coverage, release automation and dependency updates already wired together, and you are prepared to spend an hour renaming the repository and configuring the Codecov token. Do not adopt it if your Go projects are not on GitHub, or if you already have a working pipeline and consider the included toolchain noise. Before you use the template, check three things: that the Go version in go.mod, which declares go 1.26.5, matches the toolchain your team actually runs, that you can live with a Make-driven pipeline where several checks run inside Docker, and that you replace the seed binary name inside the Dockerfile, since the container image copies a file called seed and the documentation tells you to replace the occurrences of seed in the Dockerfile with your own repository name.
Frequently asked questions
How do I create a new Go project from the golang-templates/seed template?
Click the Use this template button on the repository, or clone or download it, then replace all occurrences of golang-templates/seed with your_org/repo_name in all files, replace the seed occurrences in the Dockerfile, add a CODECOV_TOKEN secret, and update CHANGELOG.md, CODE_OF_CONDUCT.md, LICENSE and README.md.
What does make do in the seed Go template?
The default all target runs the whole pipeline in order: mdlint, mod, gen, build, spell, lint and test. The build step runs GoReleaser with --clean --single-target --snapshot, the lint step runs golangci-lint with --fix, and the test step runs go test with coverage across all packages plus an HTML coverage report.
How do I build the seed template on Windows?
The documented route is to install tdm-gcc or mingw-w64 and copy mingw32-make.exe to make.exe, or to work in WSL, a Remote Container, or with goyek for cross-platform pipelines. The documentation notes that the WSL and container routes mean you are not using bare metal Windows.
How are releases triggered in the seed Go template?
The release workflow is triggered each time a tag with a v prefix is pushed, and the documentation warns you to understand the consequences of bumping the major version because of how Go module major versions work.
Can I use the seed template with a CI server other than GitHub Actions?
The documentation says it should be simple, because the build logic and the tooling installation live in the Makefile rather than in the workflow files. The editor task definitions in .vscode/tasks.json point at the same Make targets.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/golang-templates-seed)Was this useful?