Skip to content

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.

$ npm i -g tangly
Read the docs
introduction.mdx
rendered with tangly dev
---
title: "Introduction"
description: "What Tangly is"
---
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>
Documentation Introduction
Introduction

What Tangly is

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
npm i -g tangly
2
Init
tangly init
3
Build
tangly build
Status: stable
Components

38 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>
npm i -g tangly
bun add -g tangly
curl tangly.dev/install.sh | sh
<Tab>

Child of <Tabs>. One panel.

<Steps>
  1. Install

    npm i -g tangly
  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>
demo.mp4
<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" }
OpenAPI
4
<OpenApiEndpoint>
GET /v1/domains
Endpoint page, generated from your spec.
Try it
<OpenApiRedoc>
POST Redoc
/v1/orders
<OpenApiScalar>
GET Scalar
/v1/usage
<OpenApiStoplight>
DELETE Stoplight
/v1/keys/{id}
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
Rendering
code · math · diagrams

Not components. Markdown syntax, wired by default. Shiki highlighting with line highlights, diffs, and titles. KaTeX math. Mermaid diagrams. Every page, every theme.

Code · Shiki
search.ts
export async function search(q: string) {
  const index = await load("/pagefind");
  return index.search(q);
}
Diagrams · Mermaid
docs.json tangly build dist/ llms.txt
Math · KaTeX
n=1
1
=
π² 6
Features

The rest is here.

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

Built for agents
Every page, also raw Markdown.

Append .md to any URL or send Accept: text/markdown. About 10× fewer tokens. /llms.txt and /llms-full.txt ship by default.

$ curl docs.tangly.dev/quickstart.md
# Quickstart
↳ raw markdown · ~10× fewer tokens
/llms.txt · /llms-full.txt by default
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
Social cards
Every page unfurls.

A branded 1200×630 Open Graph image per page, generated from its title, theme, and your colors. Links unfurl in Slack, iMessage, and X instead of rendering blank. Previews self-reference and stay out of search.

Tangly Documentation
Streaming responses
docs.tangly.dev
Custom components
Drop an .astro, use it.

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

// components/Pricing.astro
---
const { tiers } = Astro.props;
---
<ul>{tiers.map((t) => <li>{t.name}</li>)}</ul>

// pricing.mdx
<Pricing tiers={tiers} />
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
---
Readable errors
Config errors you can read.

When docs.json is wrong, tangly check names the key, the line, the reason, and the fix. Did-you-mean for typos, rename hints for Mintlify fields.

$ tangly check
✗ docs.json: 2 problems
theme · line 3
"mintlify" is not a known theme
→ did you mean "mint"?
navigation.tabs[1].pages · line 24
expected array, got string
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.
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/
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
Fast dev
Astro 6 + Vite. HMR under 250ms.

Cold start under 2s on a hundred pages. tangly dev boots fast and stays out of the way.

$ tangly dev
↳ Tangly · 58 pages · theme: tang
↳ Local: http://localhost:4321
↳ ready in 1.7s
# edit any .mdx
↳ HMR 187ms
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