DEV Community

Cover image for Go doesn't believe in frameworks, but teams still need them
Marcus Kohlberg for Encore

Posted on • Originally published at encore.dev

29 9 8 10 8

Go doesn't believe in frameworks, but teams still need them

Golang

Go is a powerful language known for its simplicity, speed, and concurrency model. But the Go community also traditionally takes a strong stance against frameworks and centralized conventions — and that’s where many teams, especially those coming from structured environments like Rails, Django, or FastAPI, hit a wall.

This post explores the structural gap in Go development, why it exists, and how Encore is helping fill that void with a convention-driven framework that brings clarity, consistency, and productivity back to backend development.

Go: Powerful, Minimal — and Unopinionated by Design

There is no explicit style guide, although there is certainly a recognizable “Go style”.
— Official Go Website - FAQ

From its inception, Go has been designed to avoid the complexity that often comes with large frameworks. Its creators intentionally left many things out — project structures, routing, migrations, background processing — in favor of giving developers freedom and flexibility.

This philosophy has real benefits. Go’s simplicity makes it easy to learn. Its concurrency primitives (goroutines and channels) are elegant and performant. And its standard library is solid and efficient.

But as many teams have learned firsthand: minimalism at the language level doesn’t scale effortlessly to the team level.

Why Frameworks Exist

Frameworks like Ruby on Rails or Django exist for a reason: they encode best practices, reduce boilerplate, and help teams move faster by making thousands of decisions for you — decisions about naming, folder structure, routing, testing, and how to glue everything together.

They offer what Go intentionally avoids: opinions.

When you use Rails or Django, you get structure, defaults, and integrated tooling out of the box. When you use Go, you get a blank slate.

And that blank slate can be liberating — or paralyzing.

The Problem: Go Leaves Too Much Up to You

Decision paralysis
Credit: cartoonresource / Adobe Stock

For individual developers or small projects, Go’s lack of structure may not seem like a problem. But for teams building serious systems, it introduces friction and inefficiency across the board.

Here’s what teams consistently run into:

1. No Shared Conventions

There’s no standard for project layout, file structure, service boundaries, or even how to write HTTP handlers. This leads to:

  • Internal debates over architecture
  • “Snowflake” services with custom layouts
  • Higher onboarding costs as each service is different

2. Too Many Decisions, Not Enough Guidance

In Go, many common tasks like background jobs, database migrations, and routing are handled through third-party libraries rather than built-in tooling. While the ecosystem offers high-quality options, there's no single "Go-endorsed" path or integrated framework, so teams often spend time researching libraries, wiring them together, and maintaining consistency across services.

3. Infrastructure is DIY

Since Go’s culture is intentionally anti-framework, most teams end up building everything themselves. That typically means spending precious development time on tasks not building any unique product value:

  • Writing boilerplate to connect services and handle cross-cutting concerns like tracing and auth
  • Managing secrets and configuration differently in each environment
  • Assembling infrastructure manually using tools like Terraform, Docker, and CI/CD scripts

4. Teams Drift Apart

Without enforced structure, codebases diverge. Teams working on different services develop their own conventions. As one engineer put it, "Every Go service felt like its own little world."

How Some Teams Solve This: Introducing Structure with Encore.go

Encore.go

Encore.go is one example of a framework that aims to help teams transition to Go more smoothly.
Encore gives teams conventions, built-in tooling, and cloud-native defaults that eliminate boilerplate and reduce DevOps overhead — so developers can focus on building products, not plumbing.

“We would never have been able to build our ebooks product in the time we did without Encore. It provided exactly the clarity, tooling, and stability we needed.”
— Mason Stewart, CTO at Bookshop.org

Encore includes:

  • Built-in functionality: Auth, routing, database migrations, service-to-service connection handling, etc.
  • Convention-driven development: Conventions for defining APIs, services, testing, integrating infrastructure, etc.
  • No configuration: One command to start the local environment, including all infrastructure.
  • Observability: Tracing, metrics, and structured logging are included by default and available in Encore's development dashboard.
  • Cloud-native design: Support for Docker or automatic deployment to AWS/GCP via Encore Cloud.

Rather than starting from scratch with raw Go, some teams use Encore as a way to adopt Go incrementally — without giving up the structure they’re used to.

Here’s what that can look like in practice:

Code Examples

Defining a service

Encore recognizes a Go package as a service. When running your app or deploying, it automatically provisions the required infrastructure and generates the connection boilerplate.

/my-app
├── encore.app          // ... and other top-level project files
│
├── hello               // hello service (a Go package)
│   ├── hello.go        // hello service code
│   └── hello_test.go   // tests for hello service
│
└── world               // world service (a Go package)
    └── world.go        // world service code
Enter fullscreen mode Exit fullscreen mode

See the app structure documentation for more details.

Defining APIs

Using the //encore:api annotation, you define an API endpoint in pure Go:

package hello // service name

//encore:api public
func Ping(ctx context.Context, params *PingParams) (*PingResponse, error) {
    msg := fmt.Sprintf("Hello, %s!", params.Name)
    return &PingResponse{Message: msg}, nil
}
Enter fullscreen mode Exit fullscreen mode

Encore then generates the required boilerplate and documentation automatically.

Learn more in the docs for defining APIs.

Running locally

Just run:

encore run
Enter fullscreen mode Exit fullscreen mode

Encore will automatically set up the local infrastructure and a local development dashboard with API docs, architecture diagrams, tracing, and logs.

Cloud Deployment

Use Encore’s open-source tooling to build Docker images, or opt into Encore Cloud for automated infrastructure provisioning and deployment to your cloud on AWS or GCP.

Real Teams, Real Impact

Bookshop.org

Bookshop.org

Bookshop.org started moving from Rails to Go for better scalability. But the team quickly realized Go’s minimalism came at a cost.

“We didn’t have the conventions we were used to, and that created inconsistency in our applications. And while Go produces a single binary, there was still a lot of Terraform and bespoke deployment work.”
— Mason Stewart, CTO at Bookshop.org

Adopting Encore brought back the structure and productivity they had with Rails — and the efficiency of Go and Google Cloud Run, automated through Encore Cloud, saved them serious money in the process.

“We’re on track to save over $60,000 per year compared to our legacy Rails application.”
— Mason Stewart, CTO at Bookshop.org

Quiqup

Quiqup

Quiqup hit performance ceilings with Rails and wanted to move to Go — but without the microservices overhead. Encore’s modular monolith model struck the perfect balance.

"I loved the modular monolith concept of Encore. Microservices are too heavy to manage without a big team, and monoliths have their own issues. Encore was the perfect balance."
— Danny Hawkins, CTO at Quiqup

Today, Quiqup runs over 30 services and 200+ API endpoints — with no dedicated DevOps engineers — thanks to Encore Cloud’s automatic infrastructure and observability.

“If we were onboarding people onto Go without Encore, it would have taken 2–3x longer to get productive.”
— Danny Hawkins, CTO at Quiqup

The Bottom Line

Go’s minimalism is a mighty feature — but not when it slows teams down.

Encore.go brings the structure, defaults, and tooling that Go leaves out, helping teams ship faster with fewer DevOps headaches and less duplicated effort.

It’s not about replacing Go’s strengths, it's about not forcing every team to reinvent the same foundations every time.

Top comments (13)

Collapse
 
nevodavid profile image
Nevo David

I've wrestled with Go's blank slate vibe before and it really does slow me down sometimes - these kinds of frameworks make it way less annoying. Respect for anyone still doing it all by hand though, that's a grind.

Collapse
 
juslintek profile image
Linas • Edited

Am I the only one to whom this post seems like Encore.go promo? There is huge amount of web frameworks available in go: awesome-go.com/web-frameworks/

Collapse
 
marcuskohlberg profile image
Marcus Kohlberg

It's an opinion piece written by me, and I work on Encore, not trying to hide that fact at all. It's written from the perspective of someone working on a framework in the Go community and even though there are several others, there's a strong culture against using framework.

Collapse
 
adaken4 profile image
Kennedy Ada

This is so timely man, thanks. As a junior developer who's primary language is Go. I came to ship a product so fast in django without knowing python deeply. I've been terrified to jumpstart my personal project and was considering django again, but thanks for this, I'll dive straight into encore

Collapse
 
hbenzaoui profile image
Hamza Benzaoui

I love Go’s simplicity, but for larger teams, the lack of structure can slow things down. Encore’s built-in tools and conventions help solve that by providing structure without sacrificing Go’s flexibility.

Collapse
 
goodevilgenius profile image
Dan Jones

All of the issues you discuss aren't really issues when you have a good Tech Lead or Architect who takes care of establishing team standards and ensuring they're followed by good code review.

In fact, I've found that frameworks are really helpful when you start out a new project for all the reason you discussed, but oftentimes become a hindrance when a project is well-established. Particularly, very opinionated frameworks can get in the way of innovation when you need to do something that's not already covered by the framework. After a while of working in a project, you end up subverting the framework's standard designs so that you can make it fit new and changing requirements.

I tried out encore a bit, and my impression of it was that it was too opinionated, and got too much in the way of just making a go app. It not only establishes its own conventions, it actively prevents you from following established go conventions. You don't write go apps. You write encore apps that happen to be in go (or TypeScript).

Collapse
 
drewknab profile image
Drew Knab

"We don't need community driven frameworks if there's a dedicated six-figure salary on the team creating an ad hoc framework."

Collapse
 
plutonium239 profile image
plutonium239 • Edited

#ad

Collapse
 
electromutex profile image
Cyber Master

That's what I was thinking about

Collapse
 
avisheks profile image
Avishek sharma

The less code you write, the less tests you have to write. Django exactly does this. You still have to take care of DB constraints by yourself and test them out anyways, but with class based views(with smaller apps) you are moving much faster.

Collapse
 
rock_brown_f9fb42569eab6a profile image
Rock Brown

I'm always surprised at how many "developers" know a framework but don't know the language. For example, many React developers don't know JavaScript...

Collapse
 
sebastian_mocanu_1691d2b6 profile image
sebastian Mocanu

"In Go, many common tasks like background jobs, database migrations, and routing are handled through third-party libraries rather than built-in tooling"-> I don't think that's true in the least, go has the best standard library out of all the languages, so don't know what you're talking about really

Collapse
 
deividas_strole profile image
Deividas Strole

There are quite a few Go frameworks for web development, such as Fiber, Echo, Revel, Gin, and others. They make life much nicer! 😄

👋 Kindness is contagious

Explore a trove of insights in this engaging article, celebrated within our welcoming DEV Community. Developers from every background are invited to join and enhance our shared wisdom.

A genuine "thank you" can truly uplift someone’s day. Feel free to express your gratitude in the comments below!

On DEV, our collective exchange of knowledge lightens the road ahead and strengthens our community bonds. Found something valuable here? A small thank you to the author can make a big difference.

Okay