Skip to content

πŸš€ Go library providing multiple OpenAPI documentation UIs - Swagger UI, Stoplight Elements, ReDoc, Scalar & RapiDoc with simple HTTP handler integration

License

Notifications You must be signed in to change notification settings

oaswrap/spec-ui

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

12 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Spec UI

Go Reference codecov Go Report Card MIT License

A Go library that provides multiple OpenAPI documentation UIs. Serve beautiful, interactive API documentation for your OpenAPI specifications.

Features

  • πŸš€ Multiple UI Options: Support for Swagger UI, Stoplight Elements, ReDoc, Scalar and RapiDoc
  • ⚑ Easy Integration: Simple HTTP handler integration with Go's standard library
  • 🎨 Customizable: Configure titles, base paths, and OpenAPI spec locations
  • πŸ”§ Flexible: Works with any Go HTTP router or framework

Installation

go get github.com/oaswrap/spec-ui

Quick Start

package main

import (
	"log"
	"net/http"

	"github.com/go-chi/chi/v5"
	specui "github.com/oaswrap/spec-ui"
	"github.com/oaswrap/spec-ui/config"
)

func main() {
	r := chi.NewRouter()

	// Stoplight Elements
	handler := specui.NewHandler(
		specui.WithTitle("Pet Store API"),
		specui.WithDocsPath("/docs"),
		specui.WithSpecPath("/docs/openapi.yaml"),
		specui.WithSpecFile("openapi.yaml"),
		specui.WithStoplightElements(),
	)

	r.Get(handler.DocsPath(), handler.DocsFunc())
	r.Get(handler.SpecPath(), handler.SpecFunc())

	log.Printf("OpenAPI Documentation available at http://localhost:3000/docs")
	log.Printf("OpenAPI YAML available at http://localhost:3000/docs/openapi.yaml")

	http.ListenAndServe(":3000", r)
}

UI Options

Stoplight Elements

Beautiful Three-Column Design - Modern API documentation with a "Stripe-esque" three-column layout, powered by OpenAPI and Markdown for an elegant developer experience.
View Demo

handler := specui.NewHandler(
	specui.WithTitle("My API"),
	specui.WithSpecFile("openapi.yaml"),
	specui.WithStoplightElements(config.StoplightElements{
		HideExport:  false,
		HideSchemas: false,
		HideTryIt:   false,
		Layout:      "sidebar",
		Logo:        "/assets/logo.png",
		Router:      "hash",
	}),
)

Swagger UI

Interactive API Explorer - Your interactive coding buddy for AI-driven API testing workflows, widely used by developers with extensive framework integrations.
View Demo

handler := specui.NewHandler(
	specui.WithTitle("My API"),
	specui.WithSpecFile("openapi.yaml"),
	specui.WithSwaggerUI(),
)

ReDoc

Modern Three-Column Layout - Similar to Swagger UI but renders documentation in a modern three-column format, perfect for polished executive summaries and presenting API schemas.
View Demo

handler := specui.NewHandler(
	specui.WithTitle("My API"),
	specui.WithSpecFile("openapi.yaml"),
	specui.WithReDoc(),
)

Scalar

Feature-Rich Modern Interface - Provides the most feature-rich interface compared to Swagger UI and ReDoc, with built-in themes, search function, and code examples.
View Demo

handler := specui.NewHandler(
	specui.WithTitle("My API"),
	specui.WithSpecFile("openapi.yaml"),
	specui.WithScalar(),
)

RapiDoc

Flexible Rendering Styles - Web component-based viewer with multiple themes, styling options, and distinctive tabular/tree model representations perfect for large schemas.
View Demo

handler := specui.NewHandler(
	specui.WithTitle("My API"),
	specui.WithSpecFile("openapi.yaml"),
	specui.WithRapiDoc(),
)

Handler Methods

The handler provides convenient methods for integration:

  • handler.Docs() - Returns HTTP handler for the documentation UI
  • handler.DocsFunc() - Returns the HTTP handler function for the documentation UI
  • handler.DocsPath() - Returns the documentation path (e.g., /docs)
  • handler.Spec() - Returns HTTP handler for the OpenAPI specification
  • handler.SpecFunc() - Returns the HTTP handler function for serving the OpenAPI specification
  • handler.SpecPath() - Returns the OpenAPI spec path (e.g., /docs/openapi.yaml)

Basic Usage

The API uses a builder pattern with functional options for flexible configuration:

// Complete example with all available options
handler := specui.NewHandler(
	specui.WithTitle("My API"),                    // Set documentation title
	specui.WithDocsPath("/docs"),                  // Set docs URL path
	specui.WithSpecPath("/docs/openapi.yaml"),     // Set spec URL path
	specui.WithSpecFile("openapi.yaml"),           // Set the spec file location
	specui.WithStoplightElements(config.StoplightElements{  // Choose UI with config
		HideExport: false,
		HideTryIt:  false,
	}),
)

// Minimal setup (uses sensible defaults)
handler := specui.NewHandler(
	specui.WithSpecFile("openapi.yaml"),
	specui.WithSwaggerUI(), // No config needed, uses defaults
)

// Register with any HTTP router
r.Get(handler.DocsPath(), handler.DocsFunc())   // Documentation UI
r.Get(handler.SpecPath(), handler.SpecFunc())   // OpenAPI spec file

Configuration Options

The library uses functional options for flexible configuration:

Core Options

Option Description Example
WithTitle Set documentation title specui.WithTitle("My API")
WithDocsPath Set documentation URL path specui.WithDocsPath("/docs")
WithSpecPath Set OpenAPI spec URL path specui.WithSpecPath("/docs/openapi.yaml")
WithSpecFile Set the spec file location specui.WithSpecFile("openapi.yaml")
WithSpecEmbedFS Set spec file location with embedded filesystem specui.WithSpecEmbedFS("openapi.yaml", embedFS)
WithSpecIOFS Set spec file location with OS filesystem specui.WithSpecIOFS("openapi.yaml", os.DirFS("docs"))
WithCacheAge Set cache age for the documentation specui.WithCacheAge(3600)

UI Selection with Configuration

Stoplight Elements Configuration

Field Type Default Description
HideExport bool false Hide the "Export" button
HideSchemas bool false Hide schemas in the Table of Contents
HideTryIt bool false Hide the "Try it" interactive feature
HideTryItPanel bool false Hide the "Try it" panel
Layout string "sidebar" Layout: "sidebar" or "responsive"
Logo string "" URL to logo image
Router string "hash" Router type: "history", "hash", "memory", or "static"

Usage:

specui.WithStoplightElements(config.StoplightElements{
	HideExport:		false,
	HideSchemas:	false,
	HideTryIt:		false,
	HideTryItPanel:	false,
	Layout:			"sidebar",
	Logo:			"/assets/logo.png",
	Router:			"hash",
})

Swagger UI Configuration

Field Type Default Description
HideCurl bool false Hide curl code snippets
JsonEditor bool false Enable visual JSON editor (experimental)
Layout string "StandaloneLayout" Layout type: "StandaloneLayout" or "BaseLayout"
DefaultModelsExpandDepth int 1 Default depth for model expansion in the UI

Usage:

specui.WithSwaggerUI(config.SwaggerUI{
	HideCurl:   				false,
	JsonEditor: 				true,
	Layout:     				"StandaloneLayout",
	DefaultModelsExpandDepth:	1,
})

ReDoc Configuration

Field Type Default Description
DisableSearch bool false Disable search functionality
HideDownloadButtons bool false Hide the "Download" button for saving the API definition source file
HideSchemaTitles bool false Hide the schema titles in the documentation

Usage:

specui.WithReDoc(config.ReDoc{
	DisableSearch:       true,
	HideDownloadButtons: true,
	HideSchemaTitles:    true,
})

Scalar Configuration

Field Type Default Description
ProxyURL string "" Set Proxy URL for making API requests
HideSidebar bool false Hide sidebar navigation
HideModels bool false Hide models in the sidebar
DocumentDownloadType string "both" Document download type: "json", "yaml", "both", or "none"
HideTestRequestButton bool false Hide the "Test Request" button
HideSearch bool false Hide search bar
DarkMode bool false Enable dark mode
Layout string "modern" Layout type: "modern" or "classic"
Theme string "default" Theme name, see Scalar themes for available options

Usage:

specui.WithScalar(config.Scalar{
	ProxyURL:                "https://proxy.scalar.com",
	HideSidebar:             false,
	HideModels:              false,
	DocumentDownloadType:    "both",
	HideTestRequestButton:   false,
	HideSearch:              false,
	DarkMode:                true,
	Layout:                  "modern",
	Theme:                   "moon",
})

RapiDoc Configuration

Field Type Default Description
Theme string "light" Theme style: "light" or "dark"
Layout string "row" Layout type: "row" or "column"
RenderStyle string "read" Render style: "read", "view", or "focused"
SchemaStyle string "table" Schema style: "table" or "tree"
BgColor string "#fff" Background color
TextColor string "#444" Text color
HeaderColor string "#444444" Header color
PrimaryColor string "#FF791A" Primary color
HideInfo bool false Hide the info section
HideHeader bool false Hide the header section
HideSearch bool false Hide the search bar
HideAdvancedSearch bool false Hide the advanced search bar
HideTryIt bool false Hide the "Try" feature
Logo string "" Logo URL

Usage:

specui.WithRapiDoc(config.RapiDoc{
	Theme:               "light",
	Layout:              "row",
	RenderStyle:         "read",
	SchemaStyle:         "table",
	BgColor:             "#fff",
	TextColor:           "#444",
	HeaderColor:         "#444444",
	PrimaryColor:        "#FF791A",
	HideInfo:            false,
	HideHeader:          false,
	HideSearch:          false,
	HideAdvancedSearch:  false,
	HideTryIt:           false,
	Logo:                "/assets/logo.png",
})

Examples

Check out the examples directory for more examples.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

License

This project is licensed under the MIT Licenseβ€”see the LICENSE file for details.

Made with ❀️ for the Go community

About

πŸš€ Go library providing multiple OpenAPI documentation UIs - Swagger UI, Stoplight Elements, ReDoc, Scalar & RapiDoc with simple HTTP handler integration

Topics

Resources

License

Stars

Watchers

Forks