π goscaf
Enterprise-grade Go project scaffolder

Think create-react-app, but for Go services.
What is goscaf?
goscaf generates opinionated, production-quality Go project boilerplate via an interactive CLI. Stop copy-pasting skeleton code between projects. Start with:
- β
Graceful shutdown with OS signal handling
- β
Structured JSON logging (slog, zerolog, or zap)
- β
Your choice of HTTP framework (gin, fiber, chi, echo, gorilla/mux)
- β
Viper-powered config with
.env support
- β
Optional infra clients: Redis, Kafka, NATS
- β
Multi-stage distroless Dockerfile + docker-compose
- β
Makefile, GitHub Actions CI, golangci-lint - ready to go on day one
Install
Go install
go install github.com/iyashjayesh/goscaf@latest
Homebrew (coming soon)
brew install goscaf-dev/tap/goscaf
From source
git clone https://github.com/iyashjayesh/goscaf.git
cd goscaf
make install
Usage
Interactive mode
goscaf init my-api
Sample prompt flow:
? Module name: (github.com/your-org/my-api)
? Go version: (1.25.0)
? HTTP framework: gin
? Structured logger: slog (stdlib)
? Add Viper for config & env management? (Y/n)
? Add Redis client (go-redis)? (y/N)
? Add Kafka client (franz-go)? (y/N)
? Add NATS client? (y/N)
? Add Dockerfile + docker-compose? (Y/n)
? Add Makefile? (Y/n)
? Add GitHub Actions CI? (Y/n)
? Add golangci-lint config? (Y/n)
? Add Swagger/OpenAPI scaffold? (y/N)
βββββββββββββββββββββββββββββββββββββββββββ
Scaffolding project: my-api
Module: github.com/your-org/my-api
Go: 1.25.0
Framework: gin
Logger: slog
βββββββββββββββββββββββββββββββββββββββββββ
β cmd/main.go
β go.mod
β .gitignore
β .env.example
β internal/config/config.go
β internal/handler/handler.go
β internal/server/server.go
β Dockerfile
β docker-compose.yml
β Makefile
β .github/workflows/ci.yml
β .golangci.yml
β Running go mod tidy...
β go mod tidy
β Project created successfully!
Next steps:
cd my-api
cp .env.example .env
make docker-up
make run
Non-interactive / CI mode
goscaf init my-api --defaults
goscaf init my-api --framework fiber --logger zap --redis --kafka --docker
Flags
| Flag |
Default |
Description |
--module |
"" |
Go module path |
--go-version |
1.25.0 |
Go version (1.23, 1.24, 1.25) |
--framework |
gin |
HTTP framework (gin|fiber|chi|echo|gorilla|none) |
--logger |
slog |
Structured logger (slog|zerolog|zap) |
--viper |
true |
Add Viper for config & env management |
--redis |
false |
Add Redis client (go-redis/v9) |
--kafka |
false |
Add Kafka client (franz-go) |
--nats |
false |
Add NATS client |
--docker |
true |
Add Dockerfile + docker-compose |
--makefile |
true |
Add Makefile |
--github |
true |
Add GitHub Actions CI |
--lint |
true |
Add golangci-lint config |
--swagger |
false |
Add Swagger/OpenAPI scaffold |
--defaults |
false |
Skip all prompts, use recommended defaults |
--output |
. |
Output directory |
Generated Project Structure
my-api/
βββ cmd/
β βββ main.go # Entrypoint with graceful shutdown
βββ internal/
β βββ config/
β β βββ config.go # Viper (or stdlib) config loader
β βββ server/
β β βββ server.go # HTTP server for chosen framework
β βββ handler/
β βββ handler.go # HTTP handlers
βββ pkg/
β βββ redis/redis.go # (if selected) go-redis wrapper
β βββ kafka/kafka.go # (if selected) franz-go producer+consumer
β βββ nats/nats.go # (if selected) NATS client wrapper
βββ .github/
β βββ workflows/ci.yml
βββ .env.example
βββ .gitignore
βββ .golangci.yml
βββ Dockerfile
βββ docker-compose.yml
βββ go.mod
βββ Makefile
Generated Makefile Targets
| Target |
Description |
make run |
go run ./cmd/main.go |
make build |
Build binary to bin/<name> |
make test |
go test -race -cover ./... |
make test-coverage |
Generate coverage.html report |
make lint |
golangci-lint run ./... |
make fmt |
gofmt -s -w . && goimports -w . |
make tidy |
go mod tidy |
make docker-up |
docker compose up -d |
make docker-down |
docker compose down |
make docker-logs |
docker compose logs -f app |
make clean |
Remove bin/, coverage.* |
make install-tools |
Install golangci-lint + goimports |
Supported Frameworks
| Flag value |
Import path |
gin |
github.com/gin-gonic/gin |
fiber |
github.com/gofiber/fiber/v2 |
chi |
github.com/go-chi/chi/v5 |
echo |
github.com/labstack/echo/v4 |
gorilla |
github.com/gorilla/mux |
none |
stdlib net/http |
Philosophy
Idiomatic Go. Generated code uses standard patterns: context propagation, structured logging through slog as default, os.Exit(1) on unrecoverable errors, signal.NotifyContext for graceful shutdown.
Minimal opinions. goscaf picks sensible defaults but lets you override everything. Choose your framework, choose your logger, opt-in or out of every infrastructure component.
Production defaults from day one. Every generated project includes: server timeouts, race-detected tests, a multi-stage distroless Docker build, and a CI pipeline that runs lint before merge.
Contributing
# Clone and build
git clone https://github.com/iyashjayesh/goscaf.git
cd goscaf
make build
# Run the smoke test
make smoke-test
PRs welcome! Please open an issue first for major changes.
License
MIT Β© goscaf contributors