Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
samber avatar

Golang Swagger

  • 31.8k installs
  • 2.8k repo stars
  • Updated July 27, 2026
  • samber/cc-skills-golang

Golang-swagger is a skill for generating OpenAPI/Swagger documentation in Go using swaggo annotations.

About

Skill for generating OpenAPI/Swagger documentation in Go using swaggo/swag. Uses annotation comments on handler functions (@Summary, @Param, @Success, @Router, @Security) and generates interactive Swagger UI. Supports framework-specific integrations (Gin, Echo, Fiber, Chi, net/http) and comprehensive security definitions.

  • Annotation-based documentation (@Summary, @Param, @Success) with swag init codegen
  • Framework integration for Gin, Echo, Fiber, Chi, and net/http
  • Security definitions for Bearer tokens, OAuth2, API keys, and Basic authentication

Golang Swagger by the numbers

  • 31,779 all-time installs (skills.sh)
  • +437 installs in the week ending Jul 28, 2026 (Skillselion tracking)
  • Ranked #29 of 4,386 Backend & APIs skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
At a glance

golang-swagger capabilities & compatibility

Capabilities
api documentation · openapi generation · swagger ui · security definitions
Use cases
documentation
Platforms
macOS · Windows · Linux
IDEs
vscode · jetbrains · intellij
npx skills add https://github.com/samber/cc-skills-golang --skill golang-swagger

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs31.8k
repo stars2.8k
Security audit3 / 3 scanners passed
Last updatedJuly 27, 2026
Repositorysamber/cc-skills-golang

What it does

Generate OpenAPI/Swagger documentation for Go API services using annotation-based code generation.

Who is it for?

Go developers building REST APIs who need interactive API documentation

Skip if: Teams using Echo, Fiber, or non-Gin frameworks, or projects without swag-generated docs/ packages.

When should I use this skill?

The user ran swag init, has a docs/ folder, and needs Gin Swagger UI wiring or OpenAPI schema fixes.

What you get

Swagger documentation serves as the single source of truth for API consumers with interactive Swagger UI

  • Gin main.go with Swagger UI route
  • OpenAPI response schema annotations

By the numbers

  • Eval scenario tests blank import trap after swag init generates docs/ folder

Files

SKILL.mdMarkdownGitHub ↗

Persona: You are a Go API documentation engineer. You treat docs as a contract — accurate, complete annotations prevent integration bugs and make the Swagger UI the source of truth for API consumers.

Modes:

  • Build — adding Swagger to a new or existing Go project: set up the toolchain, annotate handlers, generate docs, wire the UI endpoint.
  • Audit — reviewing existing swagger annotations for completeness, correctness, and security coverage.

Dependencies:

  • swag: go install github.com/swaggo/swag/cmd/swag@latest

Setup

Three steps to get Swagger UI running:

swag init                        # generates docs/ with docs.go, swagger.json, swagger.yaml
swag init -g cmd/api/main.go     # if general info is not in main.go
swag fmt                         # format annotation comments (like go fmt)

Import the docs package to register the spec. Use a blank import when only wiring the UI; use a named import when you also need to override docs.SwaggerInfo at runtime:

import _ "yourmodule/docs"          // blank: registers spec, no identifier
import docs "yourmodule/docs"       // named: use when overriding SwaggerInfo

Wire the UI endpoint — pick your framework:

// Gin
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

// Echo
e.GET("/swagger/*", echoSwagger.WrapHandler)

// Fiber
app.Get("/swagger/*", fiberSwagger.WrapHandler(swaggerFiles.Handler))

// net/http
mux.Handle("/swagger/", httpSwagger.Handler(swaggerFiles.Handler))

// Chi
r.Get("/swagger/*", httpSwagger.Handler(swaggerFiles.Handler))

Access the UI at /swagger/index.html.

For dynamic host/basepath (multi-environment), use a named import and override before serving:

import docs "yourmodule/docs"

docs.SwaggerInfo.Host     = os.Getenv("API_HOST")
docs.SwaggerInfo.BasePath = "/api/v1"

Full CLI reference

General API Info

Place in main.go (or the file passed via -g). These annotations define the top-level spec:

// @title           My API
// @version         1.0
// @description     Short description of the API.
// @host            localhost:8080
// @BasePath        /api/v1
// @schemes         http https

// @contact.name    API Support
// @contact.email   support@example.com
// @license.name    Apache 2.0

// @securityDefinitions.apikey Bearer
// @in header
// @name Authorization
// @description Type "Bearer" followed by a space and the JWT token.

Operation Annotations

Annotate each handler function. The standard doc comment (// FuncName godoc) must precede swag annotations — it anchors indentation for swag fmt.

// ShowAccount godoc
// @Summary      Get account by ID
// @Description  Returns account details for the given ID.
// @Tags         accounts
// @Accept       json
// @Produce      json
// @Param        id      path  int  true  "Account ID"
// @Param        filter  query string false "Optional search filter"
// @Success      200  {object}  model.Account
// @Success      204  "No content"
// @Failure      400  {object}  api.ErrorResponse
// @Failure      404  {object}  api.ErrorResponse
// @Router       /accounts/{id} [get]
// @Security     Bearer
func ShowAccount(c *gin.Context) {}

@Param format: @Param <name> <in> <type> <required> "<description>" [attributes]

<in>Usage
pathURL path segment (/users/{id})
queryURL query string (?filter=x)
bodyRequest body — type must be a struct
headerHTTP header
formDataMultipart/form field

Optional attributes on @Param: default(v), minimum(n), maximum(n), minLength(n), maxLength(n), Enums(a,b,c), example(v), collectionFormat(multi).

@Success/@Failure format: @Success <code> {<kind>} <type> "<description>"

<kind>When
{object}Single struct
{array}Slice of structs
string / integerPrimitive

Generics (swag v2): @Success 200 {object} api.Response[model.User]

Nested composition: @Success 200 {object} api.Response{data=model.User}

Security Definitions

Define once at the API level (in main.go), apply per endpoint with @Security.

// Bearer / JWT
// @securityDefinitions.apikey Bearer
// @in header
// @name Authorization

// API key in header
// @securityDefinitions.apikey ApiKeyAuth
// @in header
// @name X-API-Key

// Basic auth
// @securityDefinitions.basic BasicAuth

// OAuth2 authorization code
// @securityDefinitions.oauth2.authorizationCode OAuth2
// @authorizationUrl https://example.com/oauth/authorize
// @tokenUrl https://example.com/oauth/token
// @scope.read Read access
// @scope.write Write access

Apply to an endpoint:

// @Security Bearer
// @Security OAuth2[read, write]
// @Security BasicAuth && ApiKeyAuth   // AND — both required

Struct Tags

Enrich models without changing their Go type:

type CreateUserRequest struct {
    Name   string `json:"name" example:"Jane Doe" minLength:"2" maxLength:"100"`
    Role   string `json:"role" enums:"admin,user,guest" example:"user"`
    Age    int    `json:"age" minimum:"18" maximum:"120"`
    Avatar []byte `json:"avatar" swaggertype:"string" format:"base64"`
    Secret string `json:"-" swaggerignore:"true"`  // excluded from docs
}
TagPurpose
exampleExample value shown in Swagger UI
enumsComma-separated allowed values
swaggertypeOverride detected type (e.g., "primitive,integer" for time.Time)
swaggerignore:"true"Exclude field from the generated schema
extensionsAdd OpenAPI extensions: extensions:"x-nullable,x-deprecated=true"

Common Mistakes

MistakeWhy it breaksFix
Missing _ "yourmodule/docs" importSchema not registered; UI loads emptyAdd blank import in main.go or server init
Stale docs/ after code changesDocs diverge from implementation; consumers get wrong schemaRe-run swag init after every annotation change
@Param body with primitive typeswag cannot derive schema from string; generation failsAlways use a named struct for body params
No @Security on protected routesSwagger UI shows no lock icon; testers send unauthenticated requestsApply @Security to every authenticated endpoint
General info annotations in the wrong fileswag silently skips them; spec has no title/hostUse -g <file> flag or move annotations to main.go
Using {object} with a map typeswag cannot generate a schema for map[string]any without helpUse a named struct or annotate with swaggertype
Multi-word @Tags without quotesTags split on spaces, producing malformed groupingQuote tags with spaces: @Tags "user accounts"

Cross-References

  • → See samber/cc-skills-golang@golang-security for securing the Swagger UI endpoint in production (disable or gate with auth middleware).
  • → See samber/cc-skills-golang@golang-grpc for gRPC — use grpc-gateway with its own OpenAPI generator instead of swag.

This skill is not exhaustive. Refer to the swaggo/swag documentation and code examples for up-to-date API signatures and usage patterns. Context7 can help as a discoverability platform.

If you encounter a bug or unexpected behavior in swag, open an issue at <https://github.com/swaggo/swag/issues>.

Related skills

FAQ

Why does Gin Swagger UI load empty after swag init?

Gin Swagger UI loads empty when the blank import `_ "yourmodule/docs"` is missing from main.go. golang-swagger teaches agents to add both that docs package import and the ginSwagger route so generated OpenAPI specs actually render.

What tools does golang-swagger target?

golang-swagger targets Go Gin servers with swag init-generated docs/ packages and gin-swagger middleware, focusing on serving Swagger UI and writing correct OpenAPI response schema annotations for handlers.

Is Golang Swagger safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

Backend & APIsbackenddocs

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.