Introduction
In today’s fast-paced development world, AI coding assistants have become game-changers. I’ve been experimenting with various AI tools to boost my productivity, and I want to share my current setup that allowed me to create a fully functional Golang CLI application template in under 2 hours.
The key principle: I remain the architect and decision-maker, while AI handles the repetitive implementation details. It’s about giving AI small, focused tasks while maintaining full control over the architecture and design decisions.
So first, I checked out the claude code documentation, Howto add Claude Code to my IDE and the following video:
My AI Coding Setup
Here’s what I’m currently using with a big thank you to Max Ritter’s post and some chatting after this:
- Cursor: Standard edition (no subscription) just for autocompletion
- Claude Code Max: €100/month subscription for doing the heavy lifting
- MCP Servers in Claude: context7 MCP to keep my LLMs up-to-date
The combination of these tools provides an incredible development experience where I can focus on high-level design while the AI handles the boilerplate and implementation details.
Let’s get it started!
Creating a Golang CLI Template in Under 2 Hours
Let me walk you through how I created a complete Golang CLI application template with all the modern development practices in place.
Initial Boilerplate
I started with a simple prompt:
> Create a golang cli application boilerplate code with the following setup: linting, test framework and github actions
Claude Code immediately generated a full project structure with:
- Organized directories (
cmd/
) and laterpkg/
,internal/
- Makefile with common commands
.golangci.yml
configuration for linting- GitHub Actions workflows for CI/CD
I personally found it impressive claude generated a Makefile
out-of the box without me saying anything.
Adding Release Management
Next, I wanted automated releases:
> Add goreleaser with config and add it to github actions
I mean, I specifically knew I wanted to use goreleaser as it is the standard tool for releasing Golang binaries and since v2 also other languages. And furhermore, I contributed major Gitlab features to it as a maintainer, which I still am to this day.
This resulted in:
.goreleaser.yaml
configuration file- Updated GitHub Actions workflow for releases
- Dockerfile for containerized builds
- A
make release-snapshot
command for local testing
Especially the release-snapshot
target surprised me, as this is also how I usually test the configuration locally before pushing it to any CI. claude code tested locally and adapted the configuration until the build was ✅
Let’s move on to adding documentation.
Documentation Setup
Every good project needs documentation and I wanted it to be with markdown and hosted on the corresponding GitHub pages site:
> Add mkdocs with an outline of the project, which deploys to github pages and add it to github actions as well
Claude Code created:
mkdocs.yml
configuration- Documentation structure in
docs/
directory - GitHub Actions workflow for automatic deployment to GitHub Pages
- Installation script for local development
However, in the first approach claude code wanted me to install python dependencies on my machine by providing a requirements-docs.txt
file. This is fine, however I do not want to pollute my environment, as I prefer the use docker container and mount the current directory into it. This I had to tell explicitly as follows:
> for local development use the docker container squidfunk/mkdocs-material for docs serving and docs-building. adapt the files accordingly
Let's look at the result at https://mavogel.github.io/cli-template/:
Now we’re ready for final touches 📝
Final Polish
As said, I requested some finishing touches via:
> Add a README.md and also install instructions for all tools needed in this project (mkdocs, goreleaser, etc.) with brew and remove unneeded files such as requirements-docs.txt
But claude code totally forgot a .gitignore
file, which I needed to tell it:
> Ignore appropriate files and add them to the .gitignore
Now I felt like, I want to do something myself in my craft 😆
Connecting to GitHub
After creating the repository on GitHub by hand (which I think claude could have also done for me):
git remote add origin https://github.com/mavogel/cli-template.git
git push -u origin main
The initial commit looked as follows: a0023a7
Locally, everything worked fine, as claude also ensured, however in the CI I first had errors. Let’s fix them.
Fixing CI Issues
The beauty of AI assistance is how quickly you can iterate. When GitHub Actions failed:
> Go to the remote github repo 'origin' (you should have access) and fix the github actions errors
Claude Code analyzed the error logs and fixed multiple issues: 2dc58b7
However, the lint action still failed. After checking the official documentation, I realized we needed a specific version:
> Use golangci/golangci-lint-action@v6 to be compatible with golangci-lint v2
After a few more iterations:
> Revert goreleaser/goreleaser-action as the latest version is v6
Which I had to look up myself, as claude mistakenly thought goreleaser/goreleaser-action
also exists in v8
, which is not the case. So it was important that I always stay in the driver seat 🚘
> Now git commit and push it, please
I felt like this tool is helping me so much, I need to stay polite. The final fix commit is here: 0621f15
Working Style Observations
What impressed me was how Claude Code works similarly to my own debugging approach:
It would run make lint
locally first, verify it works, then push to see the CI result. Exactly how I work!
After fixing all linting issues: f485372
Final Configuration Updates
A few more refinements were needed:
> Update the goreleaser config to v2
Result: 1c89f98
> Also update the github pages on tags
Result: f606ae7
Creating the First Release
Time to test the entire pipeline:
> Create a tag v1.0.0 and push it
The release workflow triggered but failed: Job #44555544269
> Fix the errors of the deploy-docs github action
Final fix: 74fd257
The Final Result
Check out the complete template: github.com/mavogel/cli-template 🎉
In less than 2 hours, I had:
- Modern Golang project structure
- Comprehensive linting with golangci-lint
- Testing framework with testify
- Complete CI/CD pipeline with GitHub Actions
- Automated releases with GoReleaser
- Documentation with MkDocs deployed to GitHub Pages
- Docker support
- Professional README with installation instructions
Things and behaviours that caught my attention
- claude tried to install goreleaser via
go install
, although it was already installed and available in the$PATH
. I had to remove it. Next time I will instruct claude to check if the binary is already available - claude also had some issues with
golangci-lint
and its versions. It constantly switched the config fromv1
tov2
and vice-versa. Futhermore, it also did not get the relationship of the corressponding version of the github-action. In the end, I fixed it manually
Conclusion
I’m genuinely impressed by what’s possible in such a short time with this quality. The combination of Cursor and Claude Code Max has transformed my development workflow, allowing me to focus on architecture and business logic while AI handles the implementation details.
I will keep on interating on the setup, as I still saw some flaws in it…
Next up: Creating an AWS-specific application template to further streamline cloud development, where I also want to take architectural choices from claude into consideration, especially using the AWS MCP server.
Special thanks to Max Ritter for the inspiration and rubber-ducking on the setup!
And if you want take a look at this great conversation of the cursor and claude engineers:
The key statement to quote was for me:
“I think it’s similar to going back to, let’s say before I was born, but you know, 1995 and asking a lawyer in the future what percentage of legal documents will be word processor generated and the answer is 100% or you know, close to 100% in that AI will be involved in almost all of the code that gets written. But still your role as a lawyer or as a developer in understanding what the code needs to do and having taste and guiding what is done with the software is going to be more important than ever.” - Jacob Jackson (cursor)
So essentially, having the high-level overview is crucial and staying in the driver seat. Love it.
Ah and btw you find the repo here: https://github.com/mavogel/cli-template
Let me dive more into MCP in an upcoming post and becoming an ai native dev
Like what you read? You can hire me 💻, book a meeting 📆 or drop me a message to see which services may help you 👇