Opinionated Go boilerplate for the indie hacker or early stage projects.
Why does JS, Rails, Django, and Phoenix have all the fun?
Let's use a Go stack for quickly building ideas.
Important: This is not a framework. It's boilerplate. A template.
After you create your project, use or discard what you wish.
- Go (duh)
- Cobra for cli
- Echo for web server and router
- HTMX for dynamic web pages
- Templ for HTML templates
- Ent for database/ORM
- Air for live reload
- Testify for test matchers
Fat free! No npm, npx, yarn, pnpm, webpack, and whatever else the Front End World conjures up.
Install the experimental gonew command.
go install golang.org/x/tools/cmd/gonew@latest
Then in a fresh directory:
gonew github.com/DavidNix/indie github.com/<YOUR_USER>/<YOUR_PROJECT_NAME>
All funneled through make
.
To see what you can do:
make
Then (assumes you have homebrew installed):
make setup
Generate code:
make gen
Run the server:
make run
Live reload:
make watch
Caveat: Any ent (data model) changes will require a manual restart.
Using ent allows automatic migrations. At scale, this is bad. But for iterating quickly, it's great.
Ent lets us use an in-memory sqlite database for unit tests. This is a huge win for speed.
The license still stands that this software is provided as-is with no warranty.
But I've tried to make reasonable security decisions such as server timeouts, CSRF protection, and secure headers.
I first tried Fiber which uses fasthttp as the
router. Unfortunately, fasthttp has a nasty race condition
when using database/sql. Also, Fiber makes you choose between c.Context()
and c.UserContext()
which is confusing.
Also, Echo is one of the older Go http frameworks, so hopefully has the Lindy Effect.
Those who know me will be shocked I'm using an ORM. (I typically despise them.)
But hear me out. In this context (getting a project off the ground at light speed), it's a good fit:
- Validation out of the box.
- Unit tests with in-memory sqlite.
- Automatic migrations.
If your project grows and becomes more complex, you should move off Ent (the ORM).