Open-source
documentation,
self-hosted.

Tangly turns a folder of Markdown into a fast, themed, deployable docs site. No proprietary backend, no monthly bill — just a static binary and your repo.

$ curl tangly.dev/install.sh | sh
Read the docs
introduction.mdx
docs.json
localhost:4322/introduction
---
title: "Introduction"
description: "What Tangly is"
---
# Self-host your docs.
Tangly turns Markdown into a fast,
themed, deployable docs site.
<Note>
Already have Mintlify? `tangly dev`
renders your project as-is.
</Note>
## Components
<Card title="Install"
icon="terminal">
One-line install via curl.
</Card>
<Steps>
<Step title="Install">...</Step>
<Step title="Init">...</Step>
<Step title="Build">...</Step>
</Steps>
Status: <Badge>stable</Badge>
Get started

Self-host your docs.

Tangly turns Markdown into a fast, themed, deployable docs site.

Already have Mintlify? tangly dev renders your project as-is.

Components

Install

One-line install via curl.

1
Install
curl tangly.dev/install.sh | sh
2
Init
tangly init
3
Build
tangly build
Status: stable
Components

34 components, no imports.

Drop a tag in MDX. Every theme ships every component. Render here uses the real @tanglydocs/theme-ui package — not screenshots.

Callouts
7
<Note>
<Tip>
<Warning>
<Danger>
<Info>
<Check>
<Update>

v0.1.0

May 2026
  • feat
Open-source release.
Layout
4
<Columns>
A
B
C
<Frame>
Hero illustration
Navigation
6
<Tabs>
brew install tangly
curl tangly.dev/install.sh | sh
bunx tangly
<Tab>

Child of <Tabs>. One panel.

<Steps>
  1. Install

    curl tangly.dev/install.sh | sh
  2. Init

    tangly init
  3. Build

    tangly build
<Step>

Child of <Steps>. One step.

<Accordion>
Why Tangly?
Self-host. No vendor lock-in.
<AccordionGroup>
Free?
Apache-2.0.
Mintlify compat?
Drop-in.
Code & content
6
<CodeGroup>
bun add tangly
npm i tangly
pnpm add tangly
<FileTree>
  • Directorymy-docs
    • docs.json
    • intro.mdx
    • Directoryapi/
      • openapi.yaml
<Snippet>
$ tangly init my-docs
<Embed>
codepen.io / · 240×80
<Video>
<LightboxImage>
API
4
<ParamField>
q string path required
Search query.
<ResponseField>
id uuid
Domain ID.
<RequestExample>
Request example
curl api.tangly.dev/v1
  -H "Auth: $TOKEN"
<ResponseExample>
Response example
{ "id": "d_47" }
Inline & misc
7
<Badge>

v0.1 new beta

<Icon>

<Kbd>

Press Cmd+K

<Tooltip>

SSE stream Server-sent events

<GlossaryTerm>

An MDX file is markdown plus JSX.

<Expandable>
advanced opts
Three optional fields.
<PackageManager>
npm install tangly
yarn add tangly
pnpm add tangly
bun add tangly
Features

The rest is here.

Every feature you'd reach for. Each does what it says.

Search
Built-in, instant, ⌘K.

Static index built at tangly build. No Algolia key, no third-party request, no per-month cost.

openapi
⌘K
OpenAPI — rendered references, schemas, try-it
/api
Migrating from Mintlify — OpenAPI compat notes
/migrate
docs.json reference — openapi field
/reference/docs-json
Drafts
Frontmatter is the CMS.

Mark a page draft: true. Hidden in production, visible in tangly dev. Ship preview builds with --include-drafts.

---
title: "New billing flow"
description: "Stripe + per-seat metering"
draft: true # hidden in prod
---
Custom components
Drop a .tsx, use it.

Put a component into components/. Use it from MDX. Hot reloads. No registration.

// components/PriceTable.tsx
export default function PriceTable({ tiers }) {
return <table> ... </table>
}
// pricing.mdx
<PriceTable tiers={tiers} />
Subpath hosting
Mount under any path.

Build with --base /docs/. All asset paths rewrite. Works behind Caddy, nginx, or a Cloudflare Worker.

$ tangly build --out ./dist --base /docs/
↳ rewrote 247 asset paths
↳ ./dist/index.html → /docs/
↳ ./dist/api/ → /docs/api/
Migrate
From Mintlify, in a minute.

tangly migrate reads mint.json and emits a Tangly-shaped docs.json. MDX stays untouched.

$ tangly migrate
↳ found mint.json (v2.4)
↳ mapped 14 fields → docs.json
done. 0 MDX files modified.
Eject
Ejects to a raw Astro project.

Outgrown the magic? tangly eject materializes the synthesized Astro project into your repo. astro.config.mjs is yours to edit. One-way, no Tangly required after.

$ tangly eject
↳ wrote .tangly/ (47 files)
↳ rewrote package.json scripts → astro
↳ added astro, @astrojs/mdx, tailwindcss
done. astro.config.mjs is yours.
Deploy from CI
Drop a workflow. Done.

A 14-line GitHub Actions workflow ships your docs to GitHub Pages on every push. Bun caches resolve in seconds. The Tangly monorepo deploys itself this way.

# .github/workflows/pages.yml
name: deploy
on: [push]
permissions: { pages: write, id-token: write }
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
- run: bun install --frozen-lockfile
- run: bunx tangly build --base /$REPO
- uses: actions/upload-pages-artifact@v3
- uses: actions/deploy-pages@v4
Themes

Six themes. Same Markdown.

Swap a one-line value in docs.json. Same content, new register. Each tile is a real Tangly site — click through to examples.tangly.dev.

Browse the gallery
OpenAPI

Point at an OpenAPI spec. Get a real API reference.

Drop a 3.0 or 3.1 spec into docs.json. Tangly generates browseable endpoint pages with schemas, examples, and a try-it panel — no third-party explorer required.

openapi.yaml
v3.1 47 endpoints · 28 schemas
openapi: 3.1.0
info:
  title: Search Stream
  version: 2026.05.01
paths:
  /v1/search-stream:
    get:
      summary: Stream search results
      parameters:
        - in: query
          name: q
          required: true
          schema:
            type: string
      responses:
        '200':
          content:
            text/event-stream: ...
GET
/v1/search-stream

Stream search results

Returns a server-sent event stream of search results as they're resolved.

Query parameters
q string required

Search query. May include wildcards.

limit integer default 50

Maximum results. Capped at 250.

Try it · 200 OK · 412 ms
data: {"id":"d_47","title":"Stream basics","score":0.92}
data: {"id":"d_91","title":"Try-it panels","score":0.81}
data: [stream] 47 results · complete
Deploy

Static output. Ship anywhere.

tangly build emits a folder. Drop it on any host that serves files. No runtime, no Node process.

Read the deploy guide