Custom Element for OpenAPI / Swagger Spec Viewing
RapiDoc is a fast, responsive, and customizable Web Component that renders beautiful, interactive API documentation from OpenAPI (Swagger) specifications.
- OpenAPI Support: Full support for OpenAPI 3.0.x, 3.1.x, and Swagger 2.0.
- Framework Agnostic: Works with plain HTML, React, Vue, Angular, Svelte, or Lit.
- Built-in API Console: Call and test APIs directly from the documentation.
- Usability First:
- Models and examples expanded by default — no endless clicking to reveal schemas.
- Pre-populated sample data in request fields.
- Side-by-side request and response view for quick comparison.
- Branding & Theming:
- Dark and Light themes out of the box.
- Easily customizable brand colors, typography, logos, and header styling.
- Customizable Layouts:
- Three distinct rendering styles:
read,view, andfocused. - Inject custom content using web component slots (
fixed-header,overview,servers,auth).
- Three distinct rendering styles:
- Fast & Lightweight: Built using Lit with zero unnecessary overhead.
Include the script in your HTML page and use the <rapi-doc> custom element:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script type="module" src="https://unpkg.com/rapidoc/dist/rapidoc-min.js"></script>
</head>
<body>
<rapi-doc
spec-url="https://petstore.swagger.io/v2/swagger.json"
theme="dark"
render-style="read"
></rapi-doc>
</body>
</html>This repository is structured as a Monorepo using workspaces, compatible with Node/npm, pnpm, and Bun:
astro-rapidoc/
├── packages/
│ ├── rapidoc/ # Core Web Component library (published as "rapidoc")
│ │ ├── src/ # Web component source code (Lit + modern ESM)
│ │ ├── dist/ # Production bundle (rapidoc-min.js)
│ │ ├── package.json # Library package config
│ │ └── vite.config.mjs # Dedicated library build config
│ │
│ ├── rapidoc-cli/ # Command-line utility (lint, preview, bundle)
│ │ ├── src/ # CLI source code
│ │ └── package.json
│ │
│ └── rapidoc-portal/ # PocketBase developer portal to host & secure specs
│ └── package.json
│
├── docs/ # Astro documentation & showcase site (GitHub Pages)
│ ├── src/ # Astro pages, components, and layouts
│ │ ├── pages/examples/ # Public showcase pages (code-highlight, petstore, etc.)
│ │ └── pages/tests/ # Internal test & edge-case pages
│ ├── public/
│ │ ├── specs/ # PUBLIC showcase specs (used by /examples)
│ │ └── specs-test/ # INTERNAL test specs (edge cases & parser fixtures)
│ │ └── parser/ # Malformed & validation test specs
│ ├── astro.config.mjs # Astro site configuration
│ └── package.json # Workspace package "docs"
│
├── tests/
│ └── visual/ # Automated visual regression test suite (Playwright)
│
├── package.json # Monorepo root configuration (workspaces)
└── README.md
- Node.js:
>= 22.12.0(or Bun) - npm (or
bun)
Clone the repository and install dependencies across all workspaces:
git clone https://github.com/rapi-doc/RapiDoc.git
cd RapiDoc
npm installStart the local documentation and interactive examples showcase:
# Start dev server (http://localhost:4321)
npm run dev
# Stop background dev server
npm run stop- Open
http://localhost:4321in your browser. - Live Unminified ES Modules: In development mode (
npm run dev), the Astro dev server bypasses pre-compiled production bundles and serves live ES modules directly frompackages/rapidoc/src/index.js. - Full DevTools & Console Visibility: All
console.log,console.warn,console.error, anddebuggerbreakpoints remain completely intact with original file names and exact line numbers (e.g.,rapidoc.js:516). - Instant Browser Reloading: Component changes in
packages/rapidoc/src/trigger immediate hot reloads without waiting for a full Rollup/Vite compilation cycle.
This monorepo contains multiple packages: the core Web Component library (packages/rapidoc) and the documentation showcase site (docs). The build system coordinates them as follows:
- Workspace:
packages/rapidoc - Output:
packages/rapidoc/dist/rapidoc-min.js - Compiles the RapiDoc custom element in library mode using Vite 6.
- Inlines and bundles runtime dependencies (
lit,@scalar/openapi-parser,marked,microlighter,github-slugger) into a standalone bundle with zero runtime external dependencies. - Minifies Lit templates using
@lit-labs/rollup-plugin-minify-html-literals. - Strips
console.*anddebuggercalls via a custom esbuild transform for optimal performance and clean production distribution. - Injects the license and version header banner.
- Workspace:
packages/rapidoc - Output:
packages/rapidoc/dist/rapidoc-min.js+packages/rapidoc/dist/rapidoc-min.js.map - Compiles the standalone library bundle with
mode: 'development'. - Disables template and esbuild minification, preserves all
consoleanddebuggerstatements, and emits full external source maps. - Useful when you need to test the bundled
<rapi-doc>script tag artifact in external standalone HTML pages or apps with full DevTools logging.
- Scope: Root monorepo
- Sequentially executes
npm run build:rapidocfollowed bynpm run build:docs.
Astro documentation and example pages include the component via <script type="module" src="/rapidoc/rapidoc-min.js"></script>. How this URL is resolved depends on whether you are developing locally or generating a production build:
-
During Local Development (
npm run dev):- The Astro dev server middleware (in
docs/astro.config.mjs) intercepts all requests for/rapidoc/rapidoc-min.js(and/rapidoc/rapidoc.js). - Instead of reading any pre-built static file, it directly imports and serves
packages/rapidoc/src/index.jslive through Vite's module pipeline. - You get instant HMR, unminified source code, active
console.*logging, and sourcemaps with exact line numbers in browser DevTools. Neitherdist/norgenerated-docs/is served during development.
- The Astro dev server middleware (in
-
During Production Site Build (
npm run build:docs/npm run build):- The custom
build-rapidocVite plugin indocs/astro.config.mjsruns during build initialization:- It verifies that
packages/rapidoc/dist/rapidoc-min.jsis compiled (triggering a Vite library build if missing). - It copies
packages/rapidoc/dist/rapidoc-min.jsintodocs/dist/rapidoc/rapidoc-min.js, so that the static site deployed to GitHub Pages serves the production bundle. - If the local
docs/generated-docs/directory exists, it also synchronizesrapidoc-min.jsintodocs/generated-docs/rapidoc/rapidoc-min.jsto keep the static snapshot folder up to date with the newly built component.
- It verifies that
- The custom
All primary commands can be run from the root of the repository:
| Command | Workspace | Description |
|---|---|---|
npm run dev |
docs |
Launches Astro documentation & showcase dev server (http://localhost:4321) with live unminified RapiDoc ESM directly from source. |
npm run stop |
docs |
Terminates background Astro dev server processes. |
npm run preview |
docs |
Previews the production build of the documentation site (docs/dist) locally. |
| Command | Workspace | Description |
|---|---|---|
npm run build |
Monorepo | Sequentially builds production RapiDoc library bundle and the Astro documentation site. |
npm run build:rapidoc |
rapidoc |
Compiles production, minified Web Component bundle to packages/rapidoc/dist/rapidoc-min.js. |
npm run build:rapidoc:dev |
rapidoc |
Compiles unminified Web Component bundle with source maps & console logs to packages/rapidoc/dist/. |
npm run build:docs |
docs |
Builds the production Astro documentation site into docs/dist/ (and syncs bundle to generated-docs/). |
npm run build:size |
rapidoc |
Builds RapiDoc with ANALYZE=true and opens an interactive bundle visualizer (dist/stats.html). |
| Command | Workspace | Description |
|---|---|---|
npm run test:unit |
Monorepo | Runs Node.js native unit tests (tests/unit/*.test.js) for schema parsers and AST converters. |
npm run test:perf |
Monorepo | Runs spec parsing, circular ref, and dereferencing benchmarks (tests/perf/benchmark.js). |
npm run test:render |
Monorepo | Measures headless browser rendering performance across render styles using Puppeteer (tests/perf/render-benchmark.js). |
| Command | Workspace | Description |
|---|---|---|
npm run lint |
rapidoc |
Runs ESLint on packages/rapidoc/src/**/*.js with Lit rules. |
npm run analyze |
rapidoc |
Runs Lit Analyzer to validate custom element templates and bindings. |
npm run format |
Monorepo | Checks code formatting against .prettierrc across packages and docs. |
npm run format-fix |
Monorepo | Automatically formats code using Prettier across packages and docs. |
| Command | Workspace | Description |
|---|---|---|
npm run publish:rapidoc |
rapidoc |
Publishes the rapidoc package to the npm registry. |
The documentation site is built with modern Astro using clean, extensionless URLs (/api, /examples, /list, /quickstart).
When code is pushed to master or main, the deploy-docs.yml GitHub Action automatically:
- Compiles the
rapidoclibrary bundle (packages/rapidoc/dist/rapidoc-min.js). - Builds the Astro documentation site into
docs/dist/(npm run build). - Deploys the static output directory (
docs/dist/) directly to GitHub Pages using@actions/deploy-pages.
Note on GitHub Pages Configuration: In repository settings under Settings → Pages, set Source to GitHub Actions. This keeps the repository clean by eliminating the need to commit compiled static HTML files into git branches.
OpenAPI specs are organized inside docs/public/ based on their visibility and purpose:
docs/public/specs/: Public showcase specs referenced in example-list.yaml and displayed onrapidocweb.com(e.g.,petstore.yaml,code-highlight.yaml,auth.yaml).docs/public/specs-test/: Internal edge-case and boundary specs used for UI verification and regression tests (e.g.,circular-refs.yaml,xxx-of-combinations.yaml).docs/public/specs-test/parser/: Malformed or invalid specs used to test CLI validation and error reporting (e.g.,invalid-syntax.yaml,missing-info.yaml,broken-ref.yaml).
- Modernize project dependencies (Vite + Astro + Node 22+)
- Restructure as a multi-package Monorepo
- Build
rapidoc-clifor OpenAPI linting and local zero-config previews - Build
rapidoc-portalwith PocketBase for developer API portals - Automated visual regression testing suite with Playwright
- Web Content Accessibility Guidelines (WCAG 2.1) compliance enhancements
MIT © Mrinmoy Majumdar
