A Go library that provides multiple OpenAPI documentation UIs. Serve beautiful, interactive API documentation for your OpenAPI specifications.
- π 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
go get github.com/oaswrap/spec-ui
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)
}
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",
}),
)
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(),
)
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(),
)
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(),
)
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(),
)
The handler provides convenient methods for integration:
handler.Docs()
- Returns HTTP handler for the documentation UIhandler.DocsFunc()
- Returns the HTTP handler function for the documentation UIhandler.DocsPath()
- Returns the documentation path (e.g.,/docs
)handler.Spec()
- Returns HTTP handler for the OpenAPI specificationhandler.SpecFunc()
- Returns the HTTP handler function for serving the OpenAPI specificationhandler.SpecPath()
- Returns the OpenAPI spec path (e.g.,/docs/openapi.yaml
)
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
The library uses functional options for flexible configuration:
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) |
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",
})
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,
})
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,
})
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",
})
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",
})
Check out the examples
directory for more examples.
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.
This project is licensed under the MIT Licenseβsee the LICENSE file for details.
Made with β€οΈ for the Go community