URL: /changelog

---
title: Changelog
description: Release notes for Tangly.
---

Notable changes per release. Each entry is authored as an [`<Update>`](/reference/components/callouts#update) block, the same component you can use in your own docs.

<Update label="v0.2.2" description="12 Jun 26" tags={["fix"]}>
  ## Highlights

  Windows fix for projects that live on a different drive than the installed `tangly` (issue [#6](https://github.com/tanglydocs/tangly/issues/6)).

  - **Cross-drive projects render again.** With your docs on `E:\` and a global `tangly` on `C:\`, pages rendered blank: Astro stored an absolute drive-letter path for each page, and resolving it read the `E:` drive as a URL scheme (`ERR_INVALID_URL_SCHEME`). Those paths are now rewritten to `file://` URLs before resolution, so cross-drive builds and dev servers work. Same-drive Windows and macOS/Linux were never affected. ([`9200ec9`](https://github.com/tanglydocs/tangly/commit/9200ec978a66332a78d7b885cca517d1325f8beb))

  ## Changes

  ### Fixes
  - fix(plugin): resolve a cross-drive `ERR_INVALID_URL_SCHEME` that blanked pages when the project and the runtime were on different Windows drives ([`9200ec9`](https://github.com/tanglydocs/tangly/commit/9200ec978a66332a78d7b885cca517d1325f8beb))

  ### Tests
  - test(build): add a `windows-latest` CI gate that `subst`-maps a virtual drive to reproduce the cross-drive case before every release
</Update>

<Update label="v0.2.1" description="10 Jun 26" tags={["feat", "fix"]}>
  ## Highlights

  Hardening pass driven by a real-world 275-page Mintlify migration deployed to Cloudflare Workers static assets.

  - **`check` passing now predicts `build` passing.** Every page is parsed with the build's MDX syntax config, and JSX expressions are scope-checked: a literal `{snake_case}` placeholder in prose (valid MDX, dies at prerender with a `ReferenceError`) is reported at check time as `file:line:col` with a wrap-in-backticks hint. ([`f78a22c`](https://github.com/tanglydocs/tangly/commit/f78a22c9bfe5cee373bfb5196c9b49ce5a2d0bcf))
  - **Build failures point at your source file.** A prerender error used to surface as a 30-line stack into `.prerender/chunks/<page>_<hash>.mjs`; the build now re-runs the MDX scan for an exact source diagnosis and otherwise maps the chunk name back to the page. ([`b0fb2a1`](https://github.com/tanglydocs/tangly/commit/b0fb2a149929c0d3fdd9ccaa05df694647e25a74))
  - **`dist/` no longer ships repo internals.** `.git` gitlink files (submodule checkouts leaked a local path), dotfiles, `Makefile`, `wrangler.*`, `vercel.json`, `netlify.toml`, and `*.bak` are excluded by default; `.well-known/` and `.nojekyll` still ship, and a `!pattern` in `.tanglyignore` re-includes anything overridable. ([`c5b025c`](https://github.com/tanglydocs/tangly/commit/c5b025cdd710bbb8021f26dd89135c04c179cadf))

  ## Changes

  ### Features
  - feat(theme-ui): emit a `<meta name="generator" content="Tangly vX.Y.Z">` tag in every page head, so the framework and version of a built site can be identified over plain HTTP (`curl` the page and grep `name="generator"`). The version is injected by the Tangly integration as `import.meta.env.TANGLY_VERSION`.
  - feat(cli): `check` parses MDX and flags unbound expression identifiers before they become prerender `ReferenceError`s ([`f78a22c`](https://github.com/tanglydocs/tangly/commit/f78a22c9bfe5cee373bfb5196c9b49ce5a2d0bcf))
  - feat(cli): build failures report the source `.mdx` at `file:line:col` instead of a prerender chunk stack ([`b0fb2a1`](https://github.com/tanglydocs/tangly/commit/b0fb2a149929c0d3fdd9ccaa05df694647e25a74))
  - feat(cli): `migrate` rewrites Mintlify alias themes to `tang` and prompts for `siteUrl` when absent ([`7ff04ca`](https://github.com/tanglydocs/tangly/commit/7ff04ca7c651ca7d49a8dac80884f839512f1138))

  ### Fixes
  - fix(build): stop shipping repo internals (`.git` gitlink, dotfiles, `Makefile`, `wrangler.*`, `*.bak`) into `dist/` ([`c5b025c`](https://github.com/tanglydocs/tangly/commit/c5b025cdd710bbb8021f26dd89135c04c179cadf))
  - fix(theme-ui): keep page chrome (contextual menu, breadcrumbs, pagination, TOC) out of the Pagefind search index ([`e3723c6`](https://github.com/tanglydocs/tangly/commit/e3723c6a65616f9550b1db8eb6374781d94694e2))

  ### Docs
  - docs(guides): Cloudflare Workers static-assets deploy recipe — `html_handling: "drop-trailing-slash"` (output is directory-style but canonicals are no-slash) and `not_found_handling: "404-page"`
</Update>

<Update label="v0.2.0" description="8 Jun 26" tags={["feat","fix","test"]}>
  ## Highlights

  This release is a broad compatibility-hardening pass: we ported six real-world Mintlify documentation sites (an OpenAPI reference, a legacy `mint.json` project, a multi-tab developer portal, a Mermaid/snippets-heavy site, and the official Mintlify docs) and closed every parity gap they surfaced.

  - **OpenAPI with zero wiring.** A root `openapi.json` / `openapi.yaml` / `openapi.yml` is now auto-discovered, so pages with `openapi: "METHOD path"` frontmatter render the full split-layout playground without any `api.openapi` config. ([`ce13ae4`](https://github.com/tanglydocs/tangly/commit/ce13ae445138be88ac957132a4ce9d3cb58b53d3))
  - **Anchors-as-navigation.** A top-level `navigation.anchors[]` entry that wraps whole `tabs`/`groups` now resolves. Sites whose entire sidebar lives under an anchor previously rendered with an empty sidebar; now every page is reachable. ([`652d7fb`](https://github.com/tanglydocs/tangly/commit/652d7fbbde2d0340b2ea537f63c2b2794ede9aec))
  - **Split your `docs.json` across files.** JSON `$ref` includes (`{ "$ref": "./redirects.json" }`, per-language nav files) resolve before validation, with `#/pointer` fragments, nested refs, and cycle detection. ([`0074c72`](https://github.com/tanglydocs/tangly/commit/0074c72ceb94eef2114f56a82b0383421d35846c))
  - **Full-bleed landing pages.** The `custom` and `frame` page modes now drop the sidebar and render edge-to-edge; `center` drops the sidebar too. Default/wide/api pages are unchanged. ([`969a723`](https://github.com/tanglydocs/tangly/commit/969a723c51b351d57b167ec8c50110cc908d0332))
  - **Real home pages.** A root `index.mdx` renders at `/` (not just a redirect splash), with draft visibility honored and `/` + `/index` canonicalized so they don't compete as duplicate content. ([`738f6b4`](https://github.com/tanglydocs/tangly/commit/738f6b49a535c05d4378aa78f3b34f3582023f60))
  - **Reusable snippet imports + a `Link` component.** `import` of an `/snippets/*` Markdown file now resolves against your project root, and `Link` (with `href`) is a built-in.
  - **Live `.jsx`/`.tsx` snippets, and smarter MDX snippets.** A React component snippet imported from `/snippets/*.jsx` renders as an interactive [Preact](https://preactjs.com) island: hooks work as globals the way Mintlify exposes them, `client:visible` is auto-attached so it hydrates, and `react`/`react-dom` alias to `preact/compat`. Pages with no JSX snippet ship zero extra client JS. An imported `.mdx` snippet now inherits the page's component set, so a snippet that uses `Note`/`Card` (or imports another snippet) renders correctly. ([`9cbcfbb`](https://github.com/tanglydocs/tangly/commit/9cbcfbba7742e5063d4729f78ab6225d8fadafbe), [`2e2ed18`](https://github.com/tanglydocs/tangly/commit/2e2ed18d0511b2916d0ec807d0e6952c6e60afd4))
  - **Comprehensive Font Awesome icons.** About 880 Font Awesome names now resolve to Lucide glyphs (FA 6 renames like `magnifying-glass`, directional `angle-*`/`caret-*` families, and nearest-glyph picks), so icons carried over from Mintlify render unchanged. Names with no Lucide equivalent fall back to a help-circle. ([`7684d72`](https://github.com/tanglydocs/tangly/commit/7684d72631326c389f54914e6c369971624d3837))

  ## Changes

  ### Features
  - feat(manifest): auto-discover root OpenAPI spec ([`ce13ae4`](https://github.com/tanglydocs/tangly/commit/ce13ae445138be88ac957132a4ce9d3cb58b53d3))
  - feat(manifest): resolve top-level anchors as navigation containers ([`652d7fb`](https://github.com/tanglydocs/tangly/commit/652d7fbbde2d0340b2ea537f63c2b2794ede9aec))
  - feat(manifest): resolve `docs.json` `$ref` includes ([`0074c72`](https://github.com/tanglydocs/tangly/commit/0074c72ceb94eef2114f56a82b0383421d35846c))
  - feat(manifest): render the default version/language nav variant ([`b13500c`](https://github.com/tanglydocs/tangly/commit/b13500c436d334024f48dcbbea6a20bfa5c82d0c))
  - feat(theme-ui): full-bleed landing layout for `custom`/`frame` modes ([`969a723`](https://github.com/tanglydocs/tangly/commit/969a723c51b351d57b167ec8c50110cc908d0332))
  - feat(theme-ui): add `Link` component ([`e62d557`](https://github.com/tanglydocs/tangly/commit/e62d557b11e7e78bab5752720812a0851786296f))
  - feat(plugin): resolve `/snippets/` imports against the project root ([`8a9d3b7`](https://github.com/tanglydocs/tangly/commit/8a9d3b702ea407b0da57a6008a5e2b122117e24c))
  - feat(theme-ui): comprehensive Font Awesome to Lucide icon coverage ([`7684d72`](https://github.com/tanglydocs/tangly/commit/7684d72631326c389f54914e6c369971624d3837))
  - feat(runtime): render JSX/TSX snippets as preact islands ([`9cbcfbb`](https://github.com/tanglydocs/tangly/commit/9cbcfbba7742e5063d4729f78ab6225d8fadafbe))
  - feat(runtime): imported MDX snippets inherit the page component set ([`2e2ed18`](https://github.com/tanglydocs/tangly/commit/2e2ed18d0511b2916d0ec807d0e6952c6e60afd4))

  ### Fixes
  - fix(runtime): render the root index page at the site root ([`738f6b4`](https://github.com/tanglydocs/tangly/commit/738f6b49a535c05d4378aa78f3b34f3582023f60)), gate it on draft visibility ([`fa1eb21`](https://github.com/tanglydocs/tangly/commit/fa1eb213798cd0638388b07ce7e4eded5ef182e4)), and canonicalize `/` + `/index` ([`5e40d0f`](https://github.com/tanglydocs/tangly/commit/5e40d0fa0bc28a01b7254092c935a941cbbf8fb9))
  - fix(manifest): exclude project meta files from page discovery ([`da213f8`](https://github.com/tanglydocs/tangly/commit/da213f8e374b646363793d83d6d939ced66d6f11)), case-insensitively ([`1e902e5`](https://github.com/tanglydocs/tangly/commit/1e902e5f68d95f81809a5d67262930274def26f1)), plus root `public`/`static`/`assets` ([`fe2f9b4`](https://github.com/tanglydocs/tangly/commit/fe2f9b497be6e6191b8b176abf49129bfc563345))
  - fix(manifest): render only one default nav variant ([`b2d44be`](https://github.com/tanglydocs/tangly/commit/b2d44be1e5ff48b5eefe5541e439a3e5a28e64d2)) and error on an unresolved `$ref` pointer ([`b49fed4`](https://github.com/tanglydocs/tangly/commit/b49fed498e7a88efe5ff21ce184c0a1ca6c01bd5))
  - fix(theme-ui): expand Font Awesome to Lucide icon aliases ([`bdfe738`](https://github.com/tanglydocs/tangly/commit/bdfe7382f7dbff85c74cc3e6f84d0faf852f6b6d), [`00f653e`](https://github.com/tanglydocs/tangly/commit/00f653e6261b65961e39ba3333168e7c953f2893), [`866214e`](https://github.com/tanglydocs/tangly/commit/866214ee8d7a9e8ca9dffc8f62ddfffc41c37c03), [`e5f7e22`](https://github.com/tanglydocs/tangly/commit/e5f7e22546e166bfc74e9d171deef1c44c8a0fb7))

  ### Tests
  - test(manifest): cover meta-file exclusion + OpenAPI auto-discovery ([`4dedaac`](https://github.com/tanglydocs/tangly/commit/4dedaac43903941e7626c22c845db77bcaed650c)), anchors-as-nav ([`504ac69`](https://github.com/tanglydocs/tangly/commit/504ac6999b7b392939015d7af790613b11e983e1)), `$ref` resolution ([`af8e8b2`](https://github.com/tanglydocs/tangly/commit/af8e8b2eab1ed89373b35d4c844e6e85ac5e2607)), and the draft-home invariant ([`1c1a588`](https://github.com/tanglydocs/tangly/commit/1c1a58802dfe892445e3d5ab94b822e7044eb4cf))
  - test(runtime): cover snippet island injection + MDX snippet component threading ([`9cbcfbb`](https://github.com/tanglydocs/tangly/commit/9cbcfbba7742e5063d4729f78ab6225d8fadafbe), [`2e2ed18`](https://github.com/tanglydocs/tangly/commit/2e2ed18d0511b2916d0ec807d0e6952c6e60afd4))

</Update>

<Update label="v0.1.7" description="8 Jun 26" tags={["feat","fix","refactor"]}>
  ## Highlights

  - **Refined code highlighting out of the box.** The default Shiki theme is now Vitesse (`vitesse-light` / `vitesse-dark`), replacing `github-light` / `github-dark`. It reads warmer and more editorial, and the dark background blends with the ink page surface instead of sitting on a mismatched slab. Any [bundled Shiki theme](https://shiki.style/themes) still works via [`code.theme`](/reference/schema#code).
  - **Branded loading splash.** The root route now shows a full-page splash with your logo (or the site name) over an accent-coloured loader, adopting the active theme's colours and fonts, in place of the old bare "Loading..." text. It works across every theme with no per-theme code.
  - **Independent, changed-only releases.** Releases now publish only the packages whose source actually changed, at independent versions. This is the first release cut that way: `schema`, `theme-ui`, and `tangly` ship at 0.1.7 while the five leaf themes stay at 0.1.6 and pick up the new shared code through caret ranges.

  Accessibility: secondary ("muted") text now meets WCAG AA contrast in both light and dark.

  ## Changes

  ### Features
  - feat(runtime): default code highlighting to vitesse ([`a474da0`](https://github.com/tanglydocs/tangly/commit/a474da02ac2d2a0444f6749f56a81ae40bad6ee0))
  - feat(theme-ui): branded full-page loading splash ([`21f5297`](https://github.com/tanglydocs/tangly/commit/21f5297c84fc159d0ac4b2c45ffd639f7cabe697))
  - feat(website): robots.txt, OG card, non-redirecting sitemap ([`e38ca9f`](https://github.com/tanglydocs/tangly/commit/e38ca9f532680fea4a4b28092427a2e0e27277bc))

  ### Fixes
  - fix(theme-ui): raise muted text contrast to WCAG AA ([`a7d9cf3`](https://github.com/tanglydocs/tangly/commit/a7d9cf37794cf2a6df72d9e918502256649c1f1e))
  - fix(website): a11y label-in-name + alt text, CSP, video demo ([`19ae33b`](https://github.com/tanglydocs/tangly/commit/19ae33bd5af55f9fc2e4c0b5634ebaea30f4f4d0))

  ### Refactors
  - refactor(schema): host resolveSite to break the theme-ui / tangly cycle ([`6c6945d`](https://github.com/tanglydocs/tangly/commit/6c6945d900626cece1c957a890dd387245233c94))

  ### Build
  - build(release): publish only changed packages at independent versions ([`4ed8f7c`](https://github.com/tanglydocs/tangly/commit/4ed8f7c0242efbb99df37f760f0d2128570a7827))

</Update>

<Update label="v0.1.6" description="8 Jun 26" tags={["feat","docs"]}>
  ## Highlights

  - **Version provenance in every command.** `tangly check`, `build`, and `migrate` now stamp the running version into their output, and validation errors print a footer naming the version that produced them. This makes the most common upgrade false alarm self-diagnosing: a stale global install (`npm i -g tangly`) shadowing a freshly-updated local one on `PATH`, where `npm list tangly` reports the new version but the typed `tangly` command still runs the old global. The footer points you straight at `tangly --version`.
  - **Update notifier.** In an interactive terminal, the CLI checks npm at most once every 12 hours and prints a one-line notice when a newer `tangly` is published, with the upgrade command. It is fail-silent (offline or slow registry: nothing prints), never runs in CI or piped output, and opts out with `TANGLY_NO_UPDATE_CHECK` or `NO_UPDATE_NOTIFIER`.

  Prompted by [@quader864](https://github.com/quader864)'s follow-up on [#6](https://github.com/tanglydocs/tangly/issues/6): the reported errors were a stale global binary, not a schema bug. These changes make that obvious next time.

  ## Changes

  ### Features
  - feat(cli): stamp running version in output + npm update notifier ([#6](https://github.com/tanglydocs/tangly/issues/6), [`0f437cc`](https://github.com/tanglydocs/tangly/commit/0f437ccc5b3714685bd1d1bf5128c236e1b02d63))

</Update>

<Update label="v0.1.5" description="7 Jun 26" tags={["feat","fix","test"]}>
  ## Highlights

  - **Friendly, key-by-key config errors.** When `docs.json` does not validate, `tangly check`, `migrate`, `dev`, and `build` now print an exhaustive, readable report instead of a raw Zod dump. Each problem names the key (with a `navigation.tabs[1].groups[0].pages` style path), the line number, a plain-English reason, the offending value, and a suggested fix (Mintlify rename hints plus did-you-mean for misspelled enum values). Malformed JSON points a caret at the exact line and column.
  - **Broader Mintlify compatibility.** A group inside a tab can now carry its own `openapi` spec and expands into endpoint pages nested under that group (`{ source, directory }` object refs scope the generated slugs under `directory`). Many more real-world `docs.json` shapes parse unmodified: groups without `pages`, `banner` `critical` tone and `color`, `errors.404` `title`/`description`, `icons.library: "tabler"`, `background.image` light/dark pairs, object-form `styling.codeblocks`, bare-font-face `fonts`, `metadata.timestamp`, navbar social links and `primary` CTAs, `api.auth.default`, `contextual.display`, and `thumbnails.appearance`/`fonts`.
  - **Extensive Mintlify backwards-compat CI.** Tangly now vendors 24 real published `docs.json` configs from across the ecosystem (bun, ngrok, Cobo, Hyperswitch, Upstash, Portkey, and more, spanning six themes and 2KB to 180KB) and parses every one in CI, so a future change that breaks compatibility with a real Mintlify project fails the build.

  Thanks to [@quader864](https://github.com/quader864) for the detailed report in [#6](https://github.com/tanglydocs/tangly/issues/6) that drove this round of compatibility work.

  ## Changes

  ### Features
  - feat(cli): friendly, key-by-key docs.json validation errors ([#6](https://github.com/tanglydocs/tangly/issues/6), [`5be6200`](https://github.com/tanglydocs/tangly/commit/5be62003aacfb01c2b1c0b129d7a6d5d5874e893))
  - feat(manifest): expand group-level OpenAPI specs ([#6](https://github.com/tanglydocs/tangly/issues/6), [`5f7ee98`](https://github.com/tanglydocs/tangly/commit/5f7ee98ab1bd9458e2b45c0503330752eb5079c3))
  - feat(website): showcase social cards and agent-markdown features ([`b73bffc`](https://github.com/tanglydocs/tangly/commit/b73bffc0729574c1de14d6105ad96f116e92ce21))
  - feat(website): live GitHub stars + version/release pill in header ([`d08ed8a`](https://github.com/tanglydocs/tangly/commit/d08ed8a460bc2b8e4a24ebc662f2353aa73773c8))

  ### Fixes
  - fix(cli): surface friendly config errors from dev/build + migrate JSON ([`93a2bfd`](https://github.com/tanglydocs/tangly/commit/93a2bfd2075060361a5be99793a7a3fe85b8ab6a))
  - fix(schema): accept navbar/api/contextual/thumbnails shapes + 16 configs ([#6](https://github.com/tanglydocs/tangly/issues/6), [`19f72ea`](https://github.com/tanglydocs/tangly/commit/19f72ea11e5062e4ecd847603c5fe66dea77aca9))
  - fix(manifest): scope object-ref openapi pages under directory ([#6](https://github.com/tanglydocs/tangly/issues/6), [`a9880d7`](https://github.com/tanglydocs/tangly/commit/a9880d7a98137905de7969f979e54b72748b4d7a))
  - fix(schema): accept more Mintlify docs.json shapes ([#6](https://github.com/tanglydocs/tangly/issues/6), [`51774e4`](https://github.com/tanglydocs/tangly/commit/51774e4d4ca853a0ac0624d9f65d0e20fec03833))
  - fix(website): show 5 themes with docs.json theme field, starter as scaffold ([`141efb8`](https://github.com/tanglydocs/tangly/commit/141efb859dcc95dfbcbe98a5b65d9bd60fda5078))

  ### Docs
  - docs: sync npm/GitHub READMEs, correct theme and component counts ([`cfcbf66`](https://github.com/tanglydocs/tangly/commit/cfcbf66080e954cf81248f4f6c391cd07b82c0fe))

  ### CI
  - ci(smoke): Windows CI leg + parity tests vs real Mintlify configs ([#6](https://github.com/tanglydocs/tangly/issues/6), [`f358fb6`](https://github.com/tanglydocs/tangly/commit/f358fb65449e1bc87a3cfa88584bff9cb30a6118))

  ### Tests
  - test(schema): use Mintlify pages-nesting in #6 nested-group fixture ([#6](https://github.com/tanglydocs/tangly/issues/6), [`2a1b4bb`](https://github.com/tanglydocs/tangly/commit/2a1b4bbe5866c03eec1afaa2d120308f00ddfef2))

</Update>

<Update label="v0.1.4" description="5 Jun 26" tags={["fix"]}>
  ## Highlights

  - **Windows is unblocked.** `tangly dev` and `tangly build` crashed on Windows with `TypeError [ERR_INVALID_URL_SCHEME]: The URL must be of scheme file`. The content loader handed your project root to Astro as a raw path string, and a drive-letter path like `E:\project` parses its `E:` as a URL scheme. The root is now passed as a proper `file:` URL, so it resolves on every platform ([#6](https://github.com/tanglydocs/tangly/issues/6)).
  - **Mintlify `api.playground.display` is accepted.** Mintlify renamed `api.playground.mode` to `display` (`interactive` / `simple` / `none` / `auth`). Unmodified projects hit `Unrecognized key: "display"` on parse. The value now normalizes to Tangly's native `mode` (`none` maps to `hide`, `auth` to `interactive`) across `dev`, `build`, `check`, and `migrate`.

  ## Changes

  ### Fixes
  - fix(schema): alias api.playground.display to native mode ([`666771a`](https://github.com/tanglydocs/tangly/commit/666771a9c92d3a508ffee0dfc1a3e7c993b3de30))
  - fix(runtime): pass file URL as glob base for Windows compat ([`15ad9aa`](https://github.com/tanglydocs/tangly/commit/15ad9aaf67f98a36e31426a180e4dccdc75e1368))

</Update>

<Update label="v0.1.3" description="5 Jun 26" tags={["feat","fix"]}>
  ## Highlights

  - **Social cards, generated per page.** Drop a docs link in Slack, iMessage, or X and it unfurls with a branded 1200x630 Open Graph image instead of rendering blank. Each card is built from the page title, description, owning tab, theme, and your `colors` and `logo`. Cards prerender to `/og/<slug>.png` at build and render on demand under `tangly dev`, so you can preview them live. Per-theme styling (`tang`, `pith`, `pip`, `readable`, `geist` each get their own look). Generation turns on automatically once a site URL resolves. Customize with `thumbnails` in `docs.json`, override one page with `seo.ogImage` in frontmatter, set a single static image site-wide with `thumbnails.image`, or turn it off with `thumbnails.enabled: false`. Drafts and `noindex` pages get no card.
  - **Per-environment site URLs.** Canonical tags and `og:image` now resolve per deploy instead of always baking the production host. `--site-url` / `TANGLY_SITE_URL` override it, Vercel / Netlify / Cloudflare Pages deploy URLs are auto-detected, and `tangly dev` uses the live request origin. Preview and staging deploys point `og:image` at the current deploy (so the image resolves), keep `canonical` on production (so previews never compete in search), and emit `robots: noindex`. A new `--env production | preview` flag drives the posture where a platform exposes no production signal.

  ## Changes

  ### Features
  - feat(schema): add thumbnails social-card config to docs.json ([`51524ac`](https://github.com/tanglydocs/tangly/commit/51524ac5f57b4ce773b9978607863bcf667adb26))
  - feat(runtime): prerender Open Graph social cards per page ([`e7596e0`](https://github.com/tanglydocs/tangly/commit/e7596e0cae173a4fb1359e600ea44f2495d93ba3))
  - feat(theme-ui): shared Seo component, wire generated og:image ([`16d64c6`](https://github.com/tanglydocs/tangly/commit/16d64c6d2246c6eca545e3298edd5faa3308bcfa))
  - feat(cli): resolve site URL per environment for canonical + og:image ([`5c4eea9`](https://github.com/tanglydocs/tangly/commit/5c4eea9b367b1b6d9a88e574c19f31904dc77db1))
  - feat(theme-ui): og:image at deploy host, canonical at prod, noindex previews ([`44361f3`](https://github.com/tanglydocs/tangly/commit/44361f3d20e430e12e39fcf5a809da395bebea45))

  ### Fixes
  - fix(runtime): contain og logo reads to docs root, mirror openapi titles in cards ([`e44de2c`](https://github.com/tanglydocs/tangly/commit/e44de2c4cb1241b237d10e05fe8b7abfeefb6699))
  - fix(cli): reject unknown --env values ([`ef324a4`](https://github.com/tanglydocs/tangly/commit/ef324a476fd49631b55cb7fbd16fee5408edb620))

</Update>

<Update label="v0.1.2" description="4 Jun 26" tags={["feat","fix"]}>
  ## Highlights

  - **OpenAPI endpoint pages, closer to Mintlify.** Endpoint pages now render an Authorizations section derived from the spec's security scheme, a breadcrumb method/path header with an inline Try it button, left-aligned method badges in the sidebar, and request bodies that expand `anyOf`/`oneOf`/`allOf` schemas (with spurious `GET`/`HEAD` bodies suppressed).
  - **Theme polish.** Cleaner code blocks: a single border with square top and rounded bottom corners, readable underline tabs, and a Copy button with a clipboard icon (a check on success). The sidebar keeps your place across navigations and gained bottom padding so the last item is not clipped under the announcement banner.

  ## Changes

  ### Features
  - feat(theme-ui): bring OpenAPI endpoint pages to Mintlify parity ([`eba59d4`](https://github.com/tanglydocs/tangly/commit/eba59d442d27a36b001e4d2f749c1e4d0d2c55a3))

  ### Fixes
  - fix(theme-ui): force white text on primary navbar button ([`4ad013a`](https://github.com/tanglydocs/tangly/commit/4ad013a6619b060024462444459c357011df32e3))
  - fix(theme-ui): add sidebar bottom padding so the last nav item clears the fold ([`9d25f71`](https://github.com/tanglydocs/tangly/commit/9d25f711b0c4c296bf86fce353986f3498687df3))
  - fix(theme-ui): tidy code block chrome (corners, borders, tabs, copy icon) ([`169ebe7`](https://github.com/tanglydocs/tangly/commit/169ebe716c7eadf0ba08627ad36e82b1f85aecf3))
  - fix(theme-ui): keep sidebar scrolled to active page across navigations ([`aacd7ab`](https://github.com/tanglydocs/tangly/commit/aacd7abe92f948514bf10d1871ae75b8e29a55f0))

  ### Chore
  - chore(tangly): drop unused exports flagged by knip ([`e3f49ea`](https://github.com/tanglydocs/tangly/commit/e3f49ea7547c840934ba549fbedd93c1cbfc8c64))

</Update>

<Update label="v0.1.0" description="12 May 26" tags={["docs","feat","fix","refactor"]}>
  ## Highlights

  - **OpenAPI endpoint pages, Mintlify-grade**. Split layout (docs left, sticky playground panel right), language-tabbed code samples (cURL, TypeScript, Python, Go) with auto-generated content plus `x-codeSamples` / `<RequestExample>` overrides, tabbed responses by status code, sectioned Path/Query/Header/Cookie params, method-color sidebar pills, and `x-hidden` / `x-excluded` support.
  - **`TANGLY_OPENAPI_URL` env override** plus `.env.local` / `.env` loading in `dev`, `build`, and `preview`. Point docs at a dev or staging spec without editing `docs.json`; unset = prod fallback. Loaded files are logged on startup.
  - **Per-page Copy / View Markdown menu** in every page header. LLM-friendly raw output is also emitted as a sibling `.md` at build time, alongside `llms.txt` and `llms-full.txt`.
  - **SEO + social out of the box** from a new `siteUrl` field: canonical, `og:url`, `og:image`, full `twitter:*` set, sitemap, robots, redirects, security headers.
  - **Schema additions**: `api.codeSamples.{languages,autogenerate,prefill,defaults}`, `api.params.{expanded,post}`, `api.url: "full"`, `api.playground.credentials`, `siteUrl`. Mintlify aliases (`api.examples.*`) normalize at parse time so existing projects keep working.
  - **Repo hygiene**: local CI gate via `.githooks` (`bun run check` pre-commit, `bun run ci` pre-push), unified Cloudflare Workers deploy, knip for dead-code / dep scans, vitest coverage with a public badge.

  ## Changes

  ### Features
  - feat(cli): load .env.local + .env in dev/build/preview ([`c83c3f5`](https://github.com/tanglydocs/tangly/commit/c83c3f5e157eac816f537ba40f3c0fd99c101be9))
  - feat(openapi): TANGLY_OPENAPI_URL env override ([`3b584c1`](https://github.com/tanglydocs/tangly/commit/3b584c11304ce5156a8093879b5f762a0a66b855))
  - feat(runtime): auto mode=api + thread responseFallback to OpenApiEndpoint ([`b5473cb`](https://github.com/tanglydocs/tangly/commit/b5473cb89ab0be6b4cceb11d1b6e576b9eeeabdd))
  - feat(theme-ui): mode=api PageShell + sidebar method pills ([`4c2ff5d`](https://github.com/tanglydocs/tangly/commit/4c2ff5d45ab8700d3191ac356583591bfbf920da))
  - feat(theme-ui): split OpenApiEndpoint into openapi/* cluster with right-rail panel ([`9e63914`](https://github.com/tanglydocs/tangly/commit/9e639145d8c2d7d483a62cc90aba69f8ebb7ed95))
  - feat(manifest): parse x-codeSamples, x-hidden, x-excluded; thread methodColor ([`c20af78`](https://github.com/tanglydocs/tangly/commit/c20af7875e1ac549acab3f05681ffaf85cf2b547))
  - feat(schema): codeSamples/params/url/credentials with mintlify aliases ([`d6ac2af`](https://github.com/tanglydocs/tangly/commit/d6ac2af3be9d003445ee070075e8adb3242a11e4))
  - feat(website): SEO + a11y + security audit fixes ([`33cb953`](https://github.com/tanglydocs/tangly/commit/33cb95399587051aefcd3ccabe788b5a52319d54))
  - feat(theme-ui): emit canonical, og:url, og:image, twitter:* from siteUrl ([`9687e86`](https://github.com/tanglydocs/tangly/commit/9687e8659bae7bccd0a66a29fe9bca2bc5fb4635))
  - feat(schema): add siteUrl field to docs.json ([`63924a4`](https://github.com/tanglydocs/tangly/commit/63924a4b86126c6b024f8ea9b8e4194f662353ca))
  - feat(release): docs/changelog.mdx as GH release notes source ([`7374e7c`](https://github.com/tanglydocs/tangly/commit/7374e7c8db95d523b6076106fdc1bf3b730a3a19))
  - feat(website): add Fast dev server row to features section ([`b35049e`](https://github.com/tanglydocs/tangly/commit/b35049eaf6be5a07a19b7c93b352f4876b5ccc06))
  - feat(theme-ui): per-page Copy/View Markdown menu ([`2717810`](https://github.com/tanglydocs/tangly/commit/27178104868cc7173b5972880cbe8a2f133b5a7c))
  - feat(plugin): synthesize sitemap/robots/llms.txt in dev ([`5825be4`](https://github.com/tanglydocs/tangly/commit/5825be49caab380f6fb7f332eaca6daacdd0262b))

  ### Fixes
  - fix(cli): stage adjacent to deepest node_modules in workspace mode ([`8ffdce6`](https://github.com/tanglydocs/tangly/commit/8ffdce60d775f717808ba62ac0657fb89089c03f))
  - fix(website): add missing brand icon assets ([`35be6fb`](https://github.com/tanglydocs/tangly/commit/35be6fb108a5679515befd0edc2e09746b217e7b))
  - fix(theme-ui): satisfy listbox/option ARIA contract in SearchModal ([`dca8937`](https://github.com/tanglydocs/tangly/commit/dca8937a4d29195a4b1db2d1c44e135fbe1be000))
  - fix(runtime): exclude node_modules + build dirs from content collection ([`d95c9ee`](https://github.com/tanglydocs/tangly/commit/d95c9eeb653ab46fc567d9119dffe3511bcb8866))
  - fix(plugin): MDX shims skip code spans + fences ([`78cadcf`](https://github.com/tanglydocs/tangly/commit/78cadcff9647bf122aa34fb78c3b2cc084e01460))
  - fix(theme-ui): keep sticky sidebar pinned at page bottom ([`9220a6f`](https://github.com/tanglydocs/tangly/commit/9220a6f92c058350808dbfc51808549c5e42a16f))
  - fix(theme-ui): style Mermaid with Tangly tokens, drop dark code-block bg ([`cb06d17`](https://github.com/tanglydocs/tangly/commit/cb06d17a808fe59ced168a1720fef9d81f43b2de))
  - fix(manifest): strip /index suffix from page slugs ([`6954a65`](https://github.com/tanglydocs/tangly/commit/6954a65a673ba589d7a1b5565a7301a15e4fc075))
  - fix(theme-ui): render empty FileTree directories as leaves ([`dca312a`](https://github.com/tanglydocs/tangly/commit/dca312a8f0e490918cf4a4db36c391b1c598a5a2))
  - fix(ci): align coverage gist filename to coverage.json ([`010048d`](https://github.com/tanglydocs/tangly/commit/010048d099b6194ac02e7a8ae96e21acfbdd0cae))

  ### Refactor
  - refactor(skills): rename tanglify to tangly ([`fb271bd`](https://github.com/tanglydocs/tangly/commit/fb271bd2870bd9403943f82fbc5c37fd4b688e93))

  ### Docs
  - docs(openapi): RequestExample, codeSamples, x-extensions ([`81ce02d`](https://github.com/tanglydocs/tangly/commit/81ce02d4b6d6b9ccaf8ccdce1a8d868bd52df0ad))
  - docs: drop the cheap mintlify jab from fast-dev-server pitch ([`cb38ffe`](https://github.com/tanglydocs/tangly/commit/cb38ffe1ce8f93d5d6ec52d8b78026c088ed4a69))
  - docs: demote body H1→H2 across corpus + rewrite broken links ([`042c5d5`](https://github.com/tanglydocs/tangly/commit/042c5d574a33cfcd08576094332895fd521a551e))
  - docs: lead with fast dev server (Astro+Vite, HMR &lt;250ms) ([`657767e`](https://github.com/tanglydocs/tangly/commit/657767ee15e106b89aa5c26f22641439eb1bdcd9))
  - docs(template+demos): humanize starter scaffold + theme demos ([`4d35698`](https://github.com/tanglydocs/tangly/commit/4d3569841dbd2129a01de67d14daa133a8370161))
  - docs: humanize prose, drop em dashes, sync drift ([`5e6fc74`](https://github.com/tanglydocs/tangly/commit/5e6fc749bb0d860a21e3c9583c2f5749d4de31f5))
  - docs(contextual): document Copy page menu, enable on tangly.dev ([`7768c3e`](https://github.com/tanglydocs/tangly/commit/7768c3ef0431b5d4e02f32307fbb0ab95d090fa9))
  - docs(components): document mermaid + complete components hub ([`34948a2`](https://github.com/tanglydocs/tangly/commit/34948a25e9c3a9beec6f016377bd8712ee6f0b20))
  - docs(intro): sync 'What you get' with README features, no em dashes ([`c7d9ffa`](https://github.com/tanglydocs/tangly/commit/c7d9ffa3e3cc3c91f391a7f8c26240084eb99e72))
  - docs(navbar): keep only the GitHub anchor (with icon), drop duplicates ([`066a50d`](https://github.com/tanglydocs/tangly/commit/066a50dae7401d10108e06d22e79c0e6e476683a))
  - docs(deploying): nest FileTree, drop redundant H1 + self-loop redirect ([`2929f2a`](https://github.com/tanglydocs/tangly/commit/2929f2a64d28be4a461fe8506cfe1101c5d300da))
  - docs(readme): wire coverage badge to gist nc9/e57cc6d6 ([`a496574`](https://github.com/tanglydocs/tangly/commit/a496574596cdcf5460446c514f23d21446c85079))
  - docs(readme): add npm, build, coverage, downloads, license badges ([`c6a6c19`](https://github.com/tanglydocs/tangly/commit/c6a6c191604136c00b4f584b884ccd9c0c189295))

  ### Build
  - build(repo): make link/link-pkgs/link-consumer for cross-repo workspace dev ([`7b47927`](https://github.com/tanglydocs/tangly/commit/7b479270693ebbe4da522461cb61fb5c6090a9e9))
  - build(repo): add local CI gate via .githooks ([`9d650d1`](https://github.com/tanglydocs/tangly/commit/9d650d1b3ee658e64c496efb20703c44d92bd93f))
  - build(docs): siteUrl, redirects, security headers, drop-trailing-slash ([`01e8643`](https://github.com/tanglydocs/tangly/commit/01e86436f733002df11287f346033a4359a07960))
  - build(deploy): unified Cloudflare Workers deploy via GH Actions ([`8cb3085`](https://github.com/tanglydocs/tangly/commit/8cb3085adb58e6b50c3df201333deac624cbf017))
  - build(website): wire Cloudflare Workers Static Assets deploy ([`b4ba0c8`](https://github.com/tanglydocs/tangly/commit/b4ba0c8aabce08ed9ff716d23ffcee95a200f016))
  - build(test): add @vitest/coverage-v8 + test:coverage script ([`c032b7c`](https://github.com/tanglydocs/tangly/commit/c032b7cdba3858298c8c0db43e632d1bbbf1b7de))

  ### CI
  - ci(repo): weekly knip dep-report cron ([`b4db8d4`](https://github.com/tanglydocs/tangly/commit/b4db8d49650094bb2c67ea7de4f2820693c4c05b))
  - ci(coverage): emit coverage JSON and publish to gist on main ([`d9ca919`](https://github.com/tanglydocs/tangly/commit/d9ca919a000af1ee3578d8ab577a109ae6399b99))
  - ci: re-run against tangly@0.0.12 (verify installer-smoke green) ([`768acb4`](https://github.com/tanglydocs/tangly/commit/768acb42e14b2e7c7385186a4f0611fcb708f514))

  ### Chore
  - chore(repo): adopt knip for dep / dead-code scans ([`317ad98`](https://github.com/tanglydocs/tangly/commit/317ad983bd3e556bb9a6df378a8973d8f681bfe1))
  - chore(repo): add oxfmt config ([`0c95963`](https://github.com/tanglydocs/tangly/commit/0c95963303f374a47a0f9e96fd801e9026bf2019))
  - chore(repo): gitignore .envrc ([`48402aa`](https://github.com/tanglydocs/tangly/commit/48402aa5ee0fe7cde096d61c20d1ebd4d4d86932))

  ### Tests
  - test(theme-ui): demo-tang openapi fixture for endpoint pages ([`d32de44`](https://github.com/tanglydocs/tangly/commit/d32de4427a251f1e56004d437854da9bd87d7740))
  - test(manifest): bump cold buildManifest test to 30s timeout ([`40f1e8e`](https://github.com/tanglydocs/tangly/commit/40f1e8ece3a43b6e45d1955bd6ea24c4e5b80d20))

  ### Style
  - style(repo): apply oxfmt to 4 drifted files ([`8d5905b`](https://github.com/tanglydocs/tangly/commit/8d5905b578bd6df4bd8a73dee2e0f186cb40f5e4))

</Update>

