26 production-grade Go skills for Claude Code, Gemini CLI, and opencode. Battle-tested patterns from the Go community — codified as triggerable AI skills.
FAQ
gophers is a Claude Code plugin with 26 hand-picked skills for development work, indexed on Flowy. Install it with the command on its page. It includes go-clean-architecture, go-code-review, go-code-style. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
> /plugin marketplace add muratmirgun/gophers> /plugin install gophers@gophers
Repo: muratmirgun/gophers
26 production-grade Go skills for Claude Code, Gemini CLI, and opencode. Battle-tested patterns from the Go community — codified as triggerable AI skills.
Quick Start • Skills Catalog • How It Works • Examples • FAQ
Most AI assistants write Go like a senior JavaScript engineer pretending to like semicolons. gophers plugs in 26 opinionated skills that teach Claude (and friends) to write Go the way the standard library does — small interfaces, errors as values, no magic.
"The bigger the interface, the weaker the abstraction." — Rob Pike Now your AI knows that, before it writes a 12-method
UserManagerService.
What you get:
SKILL.md is ≤ 200 lines; deep dives live in references/.# Add the marketplace
/plugin marketplace add muratmirgun/gophers
# Install the plugin
/plugin install gophers@gophers
cd ~/.claude/plugins
git clone https://github.com/muratmirgun/gophers
Then restart Claude Code. Skills auto-load from skills/.
gemini extensions install https://github.com/muratmirgun/gophers
opencode plugin add github.com/muratmirgun/gophers
git clone https://github.com/muratmirgun/gophers ~/.config/ai/gophers
# Point your agent's CLAUDE.md / AGENTS.md / GEMINI.md at the skills/ directory.
26 skills, grouped by intent. One is user-invokable (/go-code-review); the rest activate automatically when their trigger conditions match.
| Skill | Emoji | Triggers when… |
|---|---|---|
| go-naming | 🏷️ | naming any identifier — packages, types, methods, errors |
| go-declarations | 📝 | declaring vars, consts, structs, maps, iota enums |
| go-control-flow | 🔀 | writing conditionals, loops, switches, type switches |
| go-functions | ƒ | organising functions in a file, designing signatures |
| go-data-structures | 📊 | choosing/operating on slices, maps, arrays, strings |
| go-packages | 📦 | creating packages, organising imports, structuring projects |
| go-error-handling | ⚠️ | writing, wrapping, inspecting, or logging errors |
| go-interfaces | 🔌 | defining/implementing interfaces, embedding, receivers |
| go-generics | 🧬 | deciding whether to introduce generics, writing constraints |
| go-functional-options | ⚙️ | designing constructors with 3+ optional parameters |
| go-defensive |
| Skill | Emoji | Triggers when… |
|---|---|---|
| go-context | 📦 | designing context.Context flow, deadlines, request values |
| go-concurrency | 🚦 | writing goroutines, channels, select, mutexes, errgroup |
| Skill | Emoji | Triggers when… |
|---|---|---|
| go-clean-architecture | 🏛️ | scaffolding a service into Domain/Usecase/Repository/Delivery |
| go-grpc | 📡 | implementing or reviewing gRPC servers/clients |
| go-graphql | 🌐 | building a GraphQL API (gqlgen or graph-gophers) |
| go-swagger | 📋 | adding OpenAPI/Swagger annotations with swaggo/swag |
| Skill | Emoji | Triggers when… |
|---|---|---|
| go-database | 🗄️ | writing SQL access code — sqlx/sqlc/pgx/GORM trade-offs |
| go-logging | 📝 | choosing a logger, configuring slog, request-scoped fields |
| go-observability | 📈 | instrumenting metrics, traces, exemplars, correlation |
| go-performance | ⚡ | profiling, benchmarking, optimising — pprof decision tree |
| Skill | Emoji | Triggers when… |
|---|---|---|
| go-testing | 🧪 | writing tests — table-driven, subtests, fuzz, synctest, goleak |
| go-linting | 🧹 | setting up golangci-lint, suppressing findings, CI gates |
| go-documentation | 📚 | writing godoc comments, Example tests, README/CHANGELOG |
| go-code-review | 👀 | user-invokable — /go-code-review walks a diff topic by topic |
Each skill is a single markdown file (SKILL.md) with structured frontmatter and a strict body shape:
---
name: go-interfaces
description: Use when defining or implementing Go interfaces... # ← trigger
user-invocable: false # auto-fires
license: MIT
metadata:
openclaw:
emoji: "🔌"
requires: { bins: [go] }
allowed-tools: Read Edit Write Glob Grep Bash(go:*)
---
# Title
1-2 sentence philosophy.
## Core Rules ← 5-7 numbered, non-negotiable invariants
## Decision Table ← when to apply / when not to
## Body sections ← code examples, contrasts (Good / Bad)
## Anti-Patterns ← table of common mistakes + fixes
## Verification Checklist← AI self-grades before claiming done
## References ← links to deeper references/*.md
When Claude (or Gemini / opencode) reads code that matches the trigger, the skill is injected into context — opinionated rules + code examples + a verification checklist. Your AI assistant goes from "knows Go" to "writes Go like a stdlib author".
type UserManagerInterface interface {
GetUser(id string) (*User, error)
SetUser(u *User) error
DeleteUser(id string) error
ListUsers() ([]*User, error)
CountUsers() (int, error)
}
func GetUser(id string) (*User, error) {
user, err := db.QueryUser(id)
if err != nil {
return nil, fmt.Errorf("db error: " + err.Error())
}
return user, nil
}
go-interfaces + go-error-handling + go-naming fire)// Reader fetches a User by ID. Returns ErrNotFound when absent.
type Reader interface {
User(ctx context.Context, id string) (*User, error)
}
func (s *Store) User(ctx context.Context, id string) (*User, error) {
u, err := s.db.User(ctx, id)
if err != nil {
return nil, fmt.Errorf("store: user %s: %w", id, err)
}
return u, nil
}
What changed:
UserManagerInterface → 1-method Reader (small interfaces compose)GetUser → User (Go style: no Get prefix)"db error: " + err.Error() → %w (preserves errors.Is / errors.As)context.Context first param (cancellation propagates)| Tenet | What it means in practice |
|---|---|
| Errors are values | No panic-as-exception, no swallowed errors, wrap with %w |
| Accept interfaces, return concrete types | Consumers state needs; producers expose what they have |
| The framework is a detail | Gin/Echo/Fiber lives in internal/delivery/, nothing else |
| The database is a detail | SQL lives in internal/repository/, nothing else |
| Tests fail usefully | Function(input) = got, want want — always |
| Documentation is part of the API | godoc renders in IDE tooltips; signature noise is wasted ink |
| Measure before optimising | pprof first, intuition last |
| Don't design with interfaces — discover them | Wait for the second implementation |
gophers/
├── .claude-plugin/
│ ├── plugin.json # Claude Code plugin manifest
│ └── marketplace.json # Claude Code marketplace listing
├── gemini-extension.json # Gemini CLI extension manifest
├── opencode.json # opencode plugin manifest
├── skills/ # 26 skills, each a folder
│ └── go-<name>/
│ ├── SKILL.md # ≤ 200 lines, opinionated rules
│ └── references/ # Deep dives, examples, cheat-sheets
├── agents/ # Subagent prompts (extensible)
├── scripts/ # Validation & packaging
├── CLAUDE.md # Project context for AI assistants
└── README.md # You are here
No. Each skill activates independently based on its trigger description. If you never write GraphQL, go-graphql never fires. The cost of an unused skill is zero tokens.
Yes. The skills are plain markdown — usable as system prompts for any LLM. The plugin manifests just automate discovery for Claude Code, Gemini CLI, and opencode.
Token budget. A 5,000-line style guide poisons context. 26 focused skills with explicit triggers load only what's relevant to the current diff.
Yes — go-linting ships an opinionated .golangci.yml and the other skills cite the same checks. No conflicts.
Go 1.21+ baseline. A few skills reference Go 1.24+ (b.Loop) and Go 1.25+ (testing/synctest) — they call out the version explicitly.
Open an issue with the skill name, the trigger conditions, and 2-3 concrete rules it would enforce. We reject vague "best practices" skills — every skill must have a verifiable checklist.
PRs welcome — but the skill bar is high:
SKILL.md ≤ 200 lines. Deep content goes in references/.go vet flag, an errors.Is call, a grep pattern).emoji: field is the only exception.See CLAUDE.md for the full authoring checklist.
MIT © muratmirgun
Influenced by:
⬆ back to top
Built with Claude Code. Reviewed by Claude Code. Used by Claude Code.
.claude-plugin/
marketplace.json
plugin.json
.gitignore
agents/
go-arch-auditor.md
go-pr-reviewer.md
go-skill-extractor.md
go-test-generator.md
README.md
CHANGELOG.md
CLAUDE.md
CONTRIBUTING.md
gemini-extension.json
LICENSE
opencode.json
README.md
scripts/
validate.sh
skills/
go-clean-architecture/
references/
anti-patterns.md
delivery.md
domain.md
repository.md
usecase.md
SKILL.md
go-code-review/
references/
integrative-example.md
review-template.md
severity-rubric.md
SKILL.md
go-code-style/
references/
control-flow.md
formatting-and-layout.md
function-and-data-init.md
SKILL.md
go-concurrency/
references/
channels-and-select.md
errgroup-and-pools.md
leaks-and-synctest.md
sync-primitives.md
SKILL.md
go-context/
references/
cancellation-and-deadlines.md
http-and-db.md
values-and-keys.md
SKILL.md
go-control-flow/
references/
blank-identifier.md
switch-patterns.md
SKILL.md
go-data-structures/
references/
containers-and-pointers.md
slices-and-maps.md
strings-bytes-builder.md
SKILL.md
go-database/
references/
anti-patterns.md
library-tradeoffs.md
scanning.md
transactions.md
SKILL.md
go-declarations/
references/
iota-and-literals.md
scope-and-shadowing.md
structs-and-tags.md
SKILL.md
go-defensive/
references/
boundary-copying.md
must-and-panic.md
time-and-enums.md
SKILL.md
go-documentation/
references/
examples-and-readme.md
godoc-grammar.md
library-vs-application.md
SKILL.md
go-error-handling/
references/
strategy-decision.md
typed-nil-trap.md
wrapping-vs-shadowing.md
SKILL.md
go-functional-options/
references/
option-evolution.md
options-vs-struct.md
SKILL.md
go-functions/
references/
printf-and-stringer.md
signatures.md
SKILL.md
go-generics/
references/
constraints.md
generics-vs-interfaces.md
SKILL.md
go-graphql/
references/
anti-patterns.md
dataloaders.md
gqlgen.md
graph-gophers.md
SKILL.md
go-grpc/
references/
anti-patterns.md
proto-and-codegen.md
status-and-errors.md
testing.md
SKILL.md
go-interfaces/
references/
consumer-owned-interfaces.md
embedding-and-receivers.md
std-interfaces-cheatsheet.md
SKILL.md
go-linting/
assets/
.golangci.yml
references/
ci-integration.md
linter-catalog.md
nolint-directives.md
SKILL.md
go-logging/
references/
levels-and-context.md
request-scope-and-middleware.md
slog-handler-ecosystem.md
SKILL.md
go-naming/
references/
functions-and-options.md
identifiers-and-scope.md
types-errors-constants.md
SKILL.md
go-observability/
references/
anti-patterns.md
correlation.md
metrics.md
tracing.md
SKILL.md
go-packages/
references/
imports-and-main.md
init-and-globals.md
package-layout.md
SKILL.md
go-performance/
references/
allocation-and-memory.md
benchmarking-and-pprof.md
concrete-patterns.md
SKILL.md
go-swagger/
references/
annotations.md
anti-patterns.md
struct-tags.md
swag-cli.md
SKILL.md
go-testing/
references/
assertions-and-helpers.md
fuzz-synctest-bench.md
goleak-and-flakes.md
http-and-fakes.md
SKILL.md© 2026 Flowy · Free and open source
Built for Claude Code · Not affiliated with Anthropic
| 🛡️ |
| hardening API boundaries — copy, defer, time, panic discipline |
| go-code-style | ✨ | writing/reviewing for clarity, formatting, design priority |