Changelog
Release notes for Tangly.
~ 15 min read
Notable changes per release. Each entry is authored as an <Update> block, the same component you can use in your own docs.
v0.2.2
12 Jun 26Highlights
Windows fix for projects that live on a different drive than the installed tangly (issue #6).
- Cross-drive projects render again. With your docs on
E:\and a globaltanglyonC:\, pages rendered blank: Astro stored an absolute drive-letter path for each page, and resolving it read theE:drive as a URL scheme (ERR_INVALID_URL_SCHEME). Those paths are now rewritten tofile://URLs before resolution, so cross-drive builds and dev servers work. Same-drive Windows and macOS/Linux were never affected. (9200ec9)
Changes
Fixes
- fix(plugin): resolve a cross-drive
ERR_INVALID_URL_SCHEMEthat blanked pages when the project and the runtime were on different Windows drives (9200ec9)
Tests
- test(build): add a
windows-latestCI gate thatsubst-maps a virtual drive to reproduce the cross-drive case before every release
v0.2.1
10 Jun 26Highlights
Hardening pass driven by a real-world 275-page Mintlify migration deployed to Cloudflare Workers static assets.
checkpassing now predictsbuildpassing. 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 aReferenceError) is reported at check time asfile:line:colwith a wrap-in-backticks hint. (f78a22c)- 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) dist/no longer ships repo internals..gitgitlink files (submodule checkouts leaked a local path), dotfiles,Makefile,wrangler.*,vercel.json,netlify.toml, and*.bakare excluded by default;.well-known/and.nojekyllstill ship, and a!patternin.tanglyignorere-includes anything overridable. (c5b025c)
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 (curlthe page and grepname="generator"). The version is injected by the Tangly integration asimport.meta.env.TANGLY_VERSION. - feat(cli):
checkparses MDX and flags unbound expression identifiers before they become prerenderReferenceErrors (f78a22c) - feat(cli): build failures report the source
.mdxatfile:line:colinstead of a prerender chunk stack (b0fb2a1) - feat(cli):
migraterewrites Mintlify alias themes totangand prompts forsiteUrlwhen absent (7ff04ca)
Fixes
- fix(build): stop shipping repo internals (
.gitgitlink, dotfiles,Makefile,wrangler.*,*.bak) intodist/(c5b025c) - fix(theme-ui): keep page chrome (contextual menu, breadcrumbs, pagination, TOC) out of the Pagefind search index (
e3723c6)
Docs
- docs(guides): Cloudflare Workers static-assets deploy recipe —
html_handling: "drop-trailing-slash"(output is directory-style but canonicals are no-slash) andnot_found_handling: "404-page"
v0.2.0
8 Jun 26Highlights
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.ymlis now auto-discovered, so pages withopenapi: "METHOD path"frontmatter render the full split-layout playground without anyapi.openapiconfig. (ce13ae4) - Anchors-as-navigation. A top-level
navigation.anchors[]entry that wraps wholetabs/groupsnow resolves. Sites whose entire sidebar lives under an anchor previously rendered with an empty sidebar; now every page is reachable. (652d7fb) - Split your
docs.jsonacross files. JSON$refincludes ({ "$ref": "./redirects.json" }, per-language nav files) resolve before validation, with#/pointerfragments, nested refs, and cycle detection. (0074c72) - Full-bleed landing pages. The
customandframepage modes now drop the sidebar and render edge-to-edge;centerdrops the sidebar too. Default/wide/api pages are unchanged. (969a723) - Real home pages. A root
index.mdxrenders at/(not just a redirect splash), with draft visibility honored and/+/indexcanonicalized so they don’t compete as duplicate content. (738f6b4) - Reusable snippet imports + a
Linkcomponent.importof an/snippets/*Markdown file now resolves against your project root, andLink(withhref) is a built-in. - Live
.jsx/.tsxsnippets, and smarter MDX snippets. A React component snippet imported from/snippets/*.jsxrenders as an interactive Preact island: hooks work as globals the way Mintlify exposes them,client:visibleis auto-attached so it hydrates, andreact/react-domalias topreact/compat. Pages with no JSX snippet ship zero extra client JS. An imported.mdxsnippet now inherits the page’s component set, so a snippet that usesNote/Card(or imports another snippet) renders correctly. (9cbcfbb,2e2ed18) - Comprehensive Font Awesome icons. About 880 Font Awesome names now resolve to Lucide glyphs (FA 6 renames like
magnifying-glass, directionalangle-*/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)
Changes
Features
- feat(manifest): auto-discover root OpenAPI spec (
ce13ae4) - feat(manifest): resolve top-level anchors as navigation containers (
652d7fb) - feat(manifest): resolve
docs.json$refincludes (0074c72) - feat(manifest): render the default version/language nav variant (
b13500c) - feat(theme-ui): full-bleed landing layout for
custom/framemodes (969a723) - feat(theme-ui): add
Linkcomponent (e62d557) - feat(plugin): resolve
/snippets/imports against the project root (8a9d3b7) - feat(theme-ui): comprehensive Font Awesome to Lucide icon coverage (
7684d72) - feat(runtime): render JSX/TSX snippets as preact islands (
9cbcfbb) - feat(runtime): imported MDX snippets inherit the page component set (
2e2ed18)
Fixes
- fix(runtime): render the root index page at the site root (
738f6b4), gate it on draft visibility (fa1eb21), and canonicalize/+/index(5e40d0f) - fix(manifest): exclude project meta files from page discovery (
da213f8), case-insensitively (1e902e5), plus rootpublic/static/assets(fe2f9b4) - fix(manifest): render only one default nav variant (
b2d44be) and error on an unresolved$refpointer (b49fed4) - fix(theme-ui): expand Font Awesome to Lucide icon aliases (
bdfe738,00f653e,866214e,e5f7e22)
Tests
v0.1.7
8 Jun 26Highlights
- Refined code highlighting out of the box. The default Shiki theme is now Vitesse (
vitesse-light/vitesse-dark), replacinggithub-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 still works viacode.theme. - 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, andtanglyship 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) - feat(theme-ui): branded full-page loading splash (
21f5297) - feat(website): robots.txt, OG card, non-redirecting sitemap (
e38ca9f)
Fixes
- fix(theme-ui): raise muted text contrast to WCAG AA (
a7d9cf3) - fix(website): a11y label-in-name + alt text, CSP, video demo (
19ae33b)
Refactors
- refactor(schema): host resolveSite to break the theme-ui / tangly cycle (
6c6945d)
Build
- build(release): publish only changed packages at independent versions (
4ed8f7c)
v0.1.6
8 Jun 26Highlights
- Version provenance in every command.
tangly check,build, andmigratenow 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 onPATH, wherenpm list tanglyreports the new version but the typedtanglycommand still runs the old global. The footer points you straight attangly --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
tanglyis 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 withTANGLY_NO_UPDATE_CHECKorNO_UPDATE_NOTIFIER.
Prompted by @quader864’s follow-up on #6: the reported errors were a stale global binary, not a schema bug. These changes make that obvious next time.
Changes
Features
v0.1.5
7 Jun 26Highlights
- Friendly, key-by-key config errors. When
docs.jsondoes not validate,tangly check,migrate,dev, andbuildnow print an exhaustive, readable report instead of a raw Zod dump. Each problem names the key (with anavigation.tabs[1].groups[0].pagesstyle 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
openapispec and expands into endpoint pages nested under that group ({ source, directory }object refs scope the generated slugs underdirectory). Many more real-worlddocs.jsonshapes parse unmodified: groups withoutpages,bannercriticaltone andcolor,errors.404title/description,icons.library: "tabler",background.imagelight/dark pairs, object-formstyling.codeblocks, bare-font-facefonts,metadata.timestamp, navbar social links andprimaryCTAs,api.auth.default,contextual.display, andthumbnails.appearance/fonts. - Extensive Mintlify backwards-compat CI. Tangly now vendors 24 real published
docs.jsonconfigs 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 for the detailed report in #6 that drove this round of compatibility work.
Changes
Features
- feat(cli): friendly, key-by-key docs.json validation errors (#6,
5be6200) - feat(manifest): expand group-level OpenAPI specs (#6,
5f7ee98) - feat(website): showcase social cards and agent-markdown features (
b73bffc) - feat(website): live GitHub stars + version/release pill in header (
d08ed8a)
Fixes
- fix(cli): surface friendly config errors from dev/build + migrate JSON (
93a2bfd) - fix(schema): accept navbar/api/contextual/thumbnails shapes + 16 configs (#6,
19f72ea) - fix(manifest): scope object-ref openapi pages under directory (#6,
a9880d7) - fix(schema): accept more Mintlify docs.json shapes (#6,
51774e4) - fix(website): show 5 themes with docs.json theme field, starter as scaffold (
141efb8)
Docs
- docs: sync npm/GitHub READMEs, correct theme and component counts (
cfcbf66)
CI
Tests
v0.1.4
5 Jun 26Highlights
- Windows is unblocked.
tangly devandtangly buildcrashed on Windows withTypeError [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 likeE:\projectparses itsE:as a URL scheme. The root is now passed as a properfile:URL, so it resolves on every platform (#6). - Mintlify
api.playground.displayis accepted. Mintlify renamedapi.playground.modetodisplay(interactive/simple/none/auth). Unmodified projects hitUnrecognized key: "display"on parse. The value now normalizes to Tangly’s nativemode(nonemaps tohide,authtointeractive) acrossdev,build,check, andmigrate.
Changes
Fixes
v0.1.3
5 Jun 26Highlights
- 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
colorsandlogo. Cards prerender to/og/<slug>.pngat build and render on demand undertangly dev, so you can preview them live. Per-theme styling (tang,pith,pip,readable,geisteach get their own look). Generation turns on automatically once a site URL resolves. Customize withthumbnailsindocs.json, override one page withseo.ogImagein frontmatter, set a single static image site-wide withthumbnails.image, or turn it off withthumbnails.enabled: false. Drafts andnoindexpages get no card. - Per-environment site URLs. Canonical tags and
og:imagenow resolve per deploy instead of always baking the production host.--site-url/TANGLY_SITE_URLoverride it, Vercel / Netlify / Cloudflare Pages deploy URLs are auto-detected, andtangly devuses the live request origin. Preview and staging deploys pointog:imageat the current deploy (so the image resolves), keepcanonicalon production (so previews never compete in search), and emitrobots: noindex. A new--env production | previewflag drives the posture where a platform exposes no production signal.
Changes
Features
- feat(schema): add thumbnails social-card config to docs.json (
51524ac) - feat(runtime): prerender Open Graph social cards per page (
e7596e0) - feat(theme-ui): shared Seo component, wire generated og:image (
16d64c6) - feat(cli): resolve site URL per environment for canonical + og:image (
5c4eea9) - feat(theme-ui): og:image at deploy host, canonical at prod, noindex previews (
44361f3)
Fixes
v0.1.2
4 Jun 26Highlights
- 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/allOfschemas (with spuriousGET/HEADbodies 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)
Fixes
- fix(theme-ui): force white text on primary navbar button (
4ad013a) - fix(theme-ui): add sidebar bottom padding so the last nav item clears the fold (
9d25f71) - fix(theme-ui): tidy code block chrome (corners, borders, tabs, copy icon) (
169ebe7) - fix(theme-ui): keep sidebar scrolled to active page across navigations (
aacd7ab)
Chore
- chore(tangly): drop unused exports flagged by knip (
e3f49ea)
v0.1.0
12 May 26Highlights
- 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, andx-hidden/x-excludedsupport. TANGLY_OPENAPI_URLenv override plus.env.local/.envloading indev,build, andpreview. Point docs at a dev or staging spec without editingdocs.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
.mdat build time, alongsidellms.txtandllms-full.txt. - SEO + social out of the box from a new
siteUrlfield: canonical,og:url,og:image, fulltwitter:*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 checkpre-commit,bun run cipre-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) - feat(openapi): TANGLY_OPENAPI_URL env override (
3b584c1) - feat(runtime): auto mode=api + thread responseFallback to OpenApiEndpoint (
b5473cb) - feat(theme-ui): mode=api PageShell + sidebar method pills (
4c2ff5d) - feat(theme-ui): split OpenApiEndpoint into openapi/* cluster with right-rail panel (
9e63914) - feat(manifest): parse x-codeSamples, x-hidden, x-excluded; thread methodColor (
c20af78) - feat(schema): codeSamples/params/url/credentials with mintlify aliases (
d6ac2af) - feat(website): SEO + a11y + security audit fixes (
33cb953) - feat(theme-ui): emit canonical, og:url, og:image, twitter:* from siteUrl (
9687e86) - feat(schema): add siteUrl field to docs.json (
63924a4) - feat(release): docs/changelog.mdx as GH release notes source (
7374e7c) - feat(website): add Fast dev server row to features section (
b35049e) - feat(theme-ui): per-page Copy/View Markdown menu (
2717810) - feat(plugin): synthesize sitemap/robots/llms.txt in dev (
5825be4)
Fixes
- fix(cli): stage adjacent to deepest node_modules in workspace mode (
8ffdce6) - fix(website): add missing brand icon assets (
35be6fb) - fix(theme-ui): satisfy listbox/option ARIA contract in SearchModal (
dca8937) - fix(runtime): exclude node_modules + build dirs from content collection (
d95c9ee) - fix(plugin): MDX shims skip code spans + fences (
78cadcf) - fix(theme-ui): keep sticky sidebar pinned at page bottom (
9220a6f) - fix(theme-ui): style Mermaid with Tangly tokens, drop dark code-block bg (
cb06d17) - fix(manifest): strip /index suffix from page slugs (
6954a65) - fix(theme-ui): render empty FileTree directories as leaves (
dca312a) - fix(ci): align coverage gist filename to coverage.json (
010048d)
Refactor
- refactor(skills): rename tanglify to tangly (
fb271bd)
Docs
- docs(openapi): RequestExample, codeSamples, x-extensions (
81ce02d) - docs: drop the cheap mintlify jab from fast-dev-server pitch (
cb38ffe) - docs: demote body H1→H2 across corpus + rewrite broken links (
042c5d5) - docs: lead with fast dev server (Astro+Vite, HMR <250ms) (
657767e) - docs(template+demos): humanize starter scaffold + theme demos (
4d35698) - docs: humanize prose, drop em dashes, sync drift (
5e6fc74) - docs(contextual): document Copy page menu, enable on tangly.dev (
7768c3e) - docs(components): document mermaid + complete components hub (
34948a2) - docs(intro): sync ‘What you get’ with README features, no em dashes (
c7d9ffa) - docs(navbar): keep only the GitHub anchor (with icon), drop duplicates (
066a50d) - docs(deploying): nest FileTree, drop redundant H1 + self-loop redirect (
2929f2a) - docs(readme): wire coverage badge to gist nc9/e57cc6d6 (
a496574) - docs(readme): add npm, build, coverage, downloads, license badges (
c6a6c19)
Build
- build(repo): make link/link-pkgs/link-consumer for cross-repo workspace dev (
7b47927) - build(repo): add local CI gate via .githooks (
9d650d1) - build(docs): siteUrl, redirects, security headers, drop-trailing-slash (
01e8643) - build(deploy): unified Cloudflare Workers deploy via GH Actions (
8cb3085) - build(website): wire Cloudflare Workers Static Assets deploy (
b4ba0c8) - build(test): add @vitest/coverage-v8 + test:coverage script (
c032b7c)
CI
- ci(repo): weekly knip dep-report cron (
b4db8d4) - ci(coverage): emit coverage JSON and publish to gist on main (
d9ca919) - ci: re-run against tangly@0.0.12 (verify installer-smoke green) (
768acb4)
Chore
- chore(repo): adopt knip for dep / dead-code scans (
317ad98) - chore(repo): add oxfmt config (
0c95963) - chore(repo): gitignore .envrc (
48402aa)
Tests
- test(theme-ui): demo-tang openapi fixture for endpoint pages (
d32de44) - test(manifest): bump cold buildManifest test to 30s timeout (
40f1e8e)
Style
- style(repo): apply oxfmt to 4 drifted files (
8d5905b)