Back to Golang: Why I Switched From Static to Dynamic Again

Back to Golang: Why I Switched From Static to Dynamic Again. I switched back to a dynamic Golang site because static had no control, AI got smart enough to handle complex codebases, and modern deployment tools closed the gap.

Back to Golang: Why I Switched From Static to Dynamic Again

Back to Golang: Why I Switched From Static to Dynamic Again

Not long ago, I wrote a post explaining why I abandoned my dynamic Golang website for a static architecture on Netlify. I argued that static files were the future, that AI could maintain them effortlessly, and that simplicity was the ultimate goal. You can read that post here.

I was wrong. Well, not entirely wrong — the reasoning was sound at the time. But the landscape shifted, and so did my needs. I switched back.

Here is why.

Static Sites Gave Me No Control

The promise of static is simplicity. The reality of static is limits.

With a static site, you get HTML. That's it. No database queries, no dynamic content, no server-side logic. Want to show related posts based on tags? Generate a search index at build time. Want a CMS? Bolt on a third-party service. Want user authentication? Add another service. Every dynamic feature becomes an integration problem, a workaround, or a compromise.

I missed having a real backend. I missed writing a SQL query and getting results immediately. I missed the ability to build features in the language rather than stitching together APIs and build scripts.

Static sites are great for brochures. They are painful for anything that resembles an application.

AI Got Better — Much Better

The original argument for static was that AI could maintain it. LLMs struggled with complex Golang codebases, so I simplified the architecture to meet the AI where it was.

That was months ago. AI has moved fast.

Models like Kimi 3 and GLM 5.2 can handle large, complex codebases with ease. Context windows have grown. Reasoning has improved. The barrier that drove me to static — AI's inability to work with dynamic code — has largely disappeared.

The irony is that the thing I simplified my architecture for got good enough to handle the architecture I simplified away.

Full Control

With a dynamic Golang site, I control everything. The routing, the database, the templates, the middleware, the caching, the deployment. If I want to add a feature, I write Go code. If I want to change behaviour, I change a controller. No external services, no API limits, no vendor lock-in.

Static sites force you to depend on platforms. Dynamic sites give you ownership. I wanted ownership back.

Easy Deployment Changed the Game

One of the original arguments for static was deployment simplicity: push to Git, Netlify handles the rest. That was a real advantage — at the time.

Today, self-hosting has caught up. Tools like Dokploy and Coolify make deploying a Docker container as easy as pushing to Git. Automatic SSL via Let's Encrypt. One-click databases. Git-based deployments. The gap between "push to Netlify" and "push to your own server" has shrunk to almost nothing.

And for databases, Turso has been a revelation. A distributed SQLite-based database that lives at the edge, scales globally, and has a generous free tier. It gives me the simplicity of SQLite with the reach of a managed service — perfect for a dynamic Go app that needs a database without the ops overhead.

And when you self-host, you keep the keys. No platform risk, no pricing changes, no feature deprecations.

My Framework, My Rules

I built a custom CMS in Go. It has a block editor, a blog system, a media library, user management, and an admin panel. It does exactly what I need, nothing more, nothing less.

With a static site, I was constantly working around the limitations of the format. With my own framework, I work with the platform instead of against it. When I need a feature, I build it. When I don't, I don't.

This is the freedom that static promised but couldn't deliver.

Go Is Simply Amazing

I missed Go. I missed its speed, its simplicity, its compiled binaries that just run. I missed goroutines, channels, and the standard library. I missed the tooling -- go build, go test, go fmt. I missed writing code that is fast by default rather than fast after optimization. I had written about this journey before -- when I migrated from Laravel to Golang, and when I built a bot-jailing middleware for my Go apps.

Go is a language that gets out of your way. Static HTML gets out of your way too, but then so does all the power.

Conclusion

The switch to static was an experiment. It was the right call at the time — AI was weaker, deployment was harder, and my needs were simpler. But the world moved on. AI got smarter, deployment got easier, and my ambitions outgrew what static could offer.

I'm back on Golang. I have my framework, my database, my server, and my rules. And this time, AI can keep up.

Sometimes the old way wasn't broken. It was just waiting for the tools to catch up.

Previous
Associations and Eager Loading in Go — Without GORM
Next
Deno Deploy Killed My Start Page

Keep Reading

Explore more articles and insights

Ork: SSH Server Automation in Go

Ork: SSH Server Automation in Go

Read Article
Deno Deploy Killed My Start Page

Deno Deploy Killed My Start Page

Read Article
Associations and Eager Loading in Go — Without GORM

Associations and Eager Loading in Go — Without GORM

Read Article
View All Blog Posts