Migrate docs - #11

Open
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron
Open

Migrate docs #11
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron

Conversation

@remorses

@remorsesTommy D. Rossi (remorses) commented Jul 27, 2026

Copy link
Copy Markdown

This migrates the docs site from Mintlify to Holocron, an open-source Mintlify replacement that runs as a Vite plugin.

Preview:https://066d1346-interfere-docs-website.remorses.workers.dev/docs

What changed

  • Replaced mintlify with @holocron.so/vite as a Vite plugin
  • Added vite.config.ts with the holocron plugin
  • Flattened docs.json: inlined the $ref navigation, removed Mintlify-only fields (theme, background, contextual, styling, fonts), updated schema to holocron
  • Added hero section matching the interfere.com homepage layout (side-by-side heading + subtitle)
  • Set InterVariable font globally for body and all headings via style.css
  • Replaced all colored SVG sidebar icons with monochrome lucide icons so they adapt to light/dark mode
  • Added missing icons to pages that didn't have them (quickstart, onboarding, concepts, power-user, home)
  • Moved static assets (icons, images, fonts, sources) into public/

Self-hosted on Cloudflare Workers

The docs are now a worker named interfere-docs-website, served under the /docs base path. No more third-party hosting.

bun install
bunx wrangler login
bun run deploy

No reverse proxy needed

Today interfere.com/docs is reverse-proxied to Mintlify's hosted app (interfere.mintlify.site, confirmed by the x-vercel-project-id and x-matched-path: /_sites/[subdomain]/[[...slug]] response headers). Since interfere.com is already proxied through Cloudflare, that hop can go away entirely: wrangler.jsonc declares a route so the docs are served at the edge.

"routes": [{ "pattern": "interfere.com/docs*", "zone_name": "interfere.com" }]

Routes take precedence over a Custom Domain on the same hostname, so this only affects /docs and leaves the rest of interfere.com alone.

The pattern is /docs*, not /docs/*. Cloudflare route patterns cannot contain query parameters, and the only way to match a URL that has one is to end the pattern with a wildcard:

pattern/docs/docs?utm=x/docs/quickstart/docsearch
interfere.com/docsyesnonono
interfere.com/docs/*nonoyesno
interfere.com/docs*yesyesyesyes

So /docs/* would miss the bare /docs, and a plain /docs would miss any shared or ad-tagged link. The tradeoff is that /docs* also matches a future top-level path starting with "docs"; if that ever comes up, a more specific route with no script attached bypasses Workers for it.

www is intentionally not routed, www.interfere.com already 301s to the apex with the path preserved.

Before merging

  • Deploy must run from the Cloudflare account that owns the interfere.com zone, otherwise the route can't be created
  • Deploying applies the route and cuts /docs over from Mintlify immediately, so the old proxy config (Vercel rewrite, Worker, nginx, or a dashboard Origin Rule) should be removed at the same time

- Replace mintlify with @holocron.so/vite as a Vite plugin
- Add vite.config.ts with holocron() plugin
- Flatten docs.json: inline navigation $ref, remove Mintlify-only fields, update schema to holocron.so
- Add hero section matching interfere.com layout (side-by-side heading + subtitle)
- Set InterVariable font globally for body and all headings via style.css
- Replace all colored SVG sidebar icons with monochrome lucide icons
- Add missing icons to pages without them (quickstart, onboarding, concepts, power-user, home)
- Add public/hero-bg.mp4 for VideoBackgroundShader (currently unused but available)
- Update tsconfig.json for ESM + JSX support
- Switch to pnpm
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@changeset-bot

changeset-botBot commented Jul 27, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: e28d7ec

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Vite only serves static files from public/, not from the project root.
In Mintlify all root files are served as static, so these dirs were at the root.
Moving them into public/ fixes broken images and logos on the deployed site.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The base: /docs config works locally but breaks on holocron.so hosting
because the hosting worker does not strip the base prefix from asset URLs.
A fix is being worked on in a separate session.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The original repo used bun. Remove pnpm-lock.yaml and pnpm-workspace.yaml,
regenerate bun.lock for the Holocron dependencies.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
These are processed image cache files written by the holocron dev server.
They were accidentally committed via git add -A during the initial migration.
Added _holocron to .gitignore to prevent it happening again.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The VideoBackgroundShader was removed from the hero component.
This video file is no longer referenced anywhere.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Points favicon to the same logo files used in the header,
so the browser tab icon matches the site logo.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Added left padding using CSS grid variables (--grid-nav-width + --grid-gap)
so the hero "Ship software that never breaks" heading starts at the same
horizontal position as "How it works" and all other content headings below.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Removed sidebar+gap padding so hero aligns flush with the left edge.
Reduced top padding from pt-8/lg:pt-16 to pt-4/lg:pt-8.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Adds a self-hosted Cloudflare Workers deployment target for the docs site,
served under the `/docs` base path so it can sit behind a route on the main
domain.
Changes:
- `vite.config.ts` — restore `base: '/docs'` and add `@cloudflare/vite-plugin`
with the `rsc` / `ssr` environment mapping holocron expects
- `wrangler.jsonc` — worker `interfere-docs-website`, entry
`spiceflow/cloudflare-entrypoint`, `nodejs_compat`
- `package.json` — `deploy` script (`vite build && wrangler deploy`) plus
`wrangler` and `@cloudflare/vite-plugin` devDependencies
The `base: '/docs'` config was reverted in ab5156c because holocron.so hosting
did not strip the base prefix on asset lookups. Self-hosting on Workers hits a
different variant of the same problem: Cloudflare's Asset Worker resolves a
request against the uploaded directory tree and deliberately does not strip
Vite's `base` (cloudflare/workers-sdk#11857), so the built HTML referenced
`/docs/assets/*` while the store only held `assets/*`.
That is fixed upstream in `@holocron.so/vite`, which now nests the client build
output under a folder matching the base whenever the Cloudflare plugin is in
use — the layout Cloudflare documents for serving a subdirectory:
dist/client/
.assetsignore
docs/assets/app.js <- GET /docs/assets/app.js, served by the CDN
docs/icons/logo.svg
Deployed and verified: 139 referenced URLs on /docs return 200, same for
/docs/quickstart and /docs/sdk/next-js.
NOTE: requires the upstream holocron patch release; `^0.28.0` does not include
the asset nesting fix yet.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Picks up the upstream Cloudflare fix that nests the client build output under
the Vite `base`, so `/docs/assets/*` resolves against the uploaded asset tree
instead of 404ing.
Previously the site only deployed correctly with a locally patched holocron
build; 0.29.0 makes a clean `bun install && bun run deploy` produce a working
Worker.
Rebuilt and redeployed, all referenced URLs on /docs and /docs/quickstart
return 200.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorses
Tommy D. Rossi (remorses) marked this pull request as ready for review July 28, 2026 15:29
interfere.com is proxied through Cloudflare, so the docs can be served by a
Worker route at the edge instead of reverse-proxying /docs to a third party.
Routes take precedence over a Custom Domain on the same hostname, so this wins
over whatever serves the rest of interfere.com without touching it.
Pattern choice, per Cloudflare's route matching rules:
pattern /docs /docs?utm=x /docs/quickstart /docsearch
interfere.com/docs yes no no no
interfere.com/docs/* no no yes no
interfere.com/docs* yes yes yes yes
Route patterns cannot contain query parameters, and the only way to match a URL
that has one is to end the pattern with a wildcard. So `/docs/*` misses the bare
`/docs`, and a plain `/docs` misses `/docs?utm_source=...` — which any shared or
ad-tagged link will have. `/docs*` is the only single pattern that covers all
three.
The tradeoff is that it also matches a future top-level path starting with
"docs" such as /docsearch. Cloudflare's documented escape hatch is a more
specific route with no script attached, which bypasses Workers for that path.
www is intentionally not listed: www.interfere.com already 301s to the apex with
the path preserved (verified on /docs and /docs/quickstart), so adding a www
route would serve the docs on two hostnames.
Note this route only applies when deployed from the Cloudflare account that owns
the interfere.com zone. `wrangler versions upload` is unaffected since triggers
are applied separately.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
/docs* also matches paths like /docsearch, but nothing on interfere.com starts
with "docs" today, so those are 404s either way and only the 404 page changes.
The precise alternative regresses a working URL:
URL today /docs* /docs + /docs/*
/docs 200 200 200
/docs?utm_source=x 200 200 404 <- regression
/docs/quickstart 200 200 200
/docsthing 404 404 404
Also notes Cloudflare route specificity bug: adding /docs/* alongside /docs*
does nothing, the broader pattern wins even for /docs/quickstart.
https://developers.cloudflare.com/workers/platform/known-issues/
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from Mintlify to HolocronMigrate docs from to HolocronJul 28, 2026
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from to HolocronMigrate docs Jul 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@remorses
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Migrate docs - #11

Open
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron
Open

Migrate docs #11
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron

Conversation

@remorses

@remorsesTommy D. Rossi (remorses) commented Jul 27, 2026

Copy link
Copy Markdown

This migrates the docs site from Mintlify to Holocron, an open-source Mintlify replacement that runs as a Vite plugin.

Preview:https://066d1346-interfere-docs-website.remorses.workers.dev/docs

What changed

  • Replaced mintlify with @holocron.so/vite as a Vite plugin
  • Added vite.config.ts with the holocron plugin
  • Flattened docs.json: inlined the $ref navigation, removed Mintlify-only fields (theme, background, contextual, styling, fonts), updated schema to holocron
  • Added hero section matching the interfere.com homepage layout (side-by-side heading + subtitle)
  • Set InterVariable font globally for body and all headings via style.css
  • Replaced all colored SVG sidebar icons with monochrome lucide icons so they adapt to light/dark mode
  • Added missing icons to pages that didn't have them (quickstart, onboarding, concepts, power-user, home)
  • Moved static assets (icons, images, fonts, sources) into public/

Self-hosted on Cloudflare Workers

The docs are now a worker named interfere-docs-website, served under the /docs base path. No more third-party hosting.

bun install
bunx wrangler login
bun run deploy

No reverse proxy needed

Today interfere.com/docs is reverse-proxied to Mintlify's hosted app (interfere.mintlify.site, confirmed by the x-vercel-project-id and x-matched-path: /_sites/[subdomain]/[[...slug]] response headers). Since interfere.com is already proxied through Cloudflare, that hop can go away entirely: wrangler.jsonc declares a route so the docs are served at the edge.

"routes": [{ "pattern": "interfere.com/docs*", "zone_name": "interfere.com" }]

Routes take precedence over a Custom Domain on the same hostname, so this only affects /docs and leaves the rest of interfere.com alone.

The pattern is /docs*, not /docs/*. Cloudflare route patterns cannot contain query parameters, and the only way to match a URL that has one is to end the pattern with a wildcard:

pattern/docs/docs?utm=x/docs/quickstart/docsearch
interfere.com/docsyesnonono
interfere.com/docs/*nonoyesno
interfere.com/docs*yesyesyesyes

So /docs/* would miss the bare /docs, and a plain /docs would miss any shared or ad-tagged link. The tradeoff is that /docs* also matches a future top-level path starting with "docs"; if that ever comes up, a more specific route with no script attached bypasses Workers for it.

www is intentionally not routed, www.interfere.com already 301s to the apex with the path preserved.

Before merging

  • Deploy must run from the Cloudflare account that owns the interfere.com zone, otherwise the route can't be created
  • Deploying applies the route and cuts /docs over from Mintlify immediately, so the old proxy config (Vercel rewrite, Worker, nginx, or a dashboard Origin Rule) should be removed at the same time

- Replace mintlify with @holocron.so/vite as a Vite plugin
- Add vite.config.ts with holocron() plugin
- Flatten docs.json: inline navigation $ref, remove Mintlify-only fields, update schema to holocron.so
- Add hero section matching interfere.com layout (side-by-side heading + subtitle)
- Set InterVariable font globally for body and all headings via style.css
- Replace all colored SVG sidebar icons with monochrome lucide icons
- Add missing icons to pages without them (quickstart, onboarding, concepts, power-user, home)
- Add public/hero-bg.mp4 for VideoBackgroundShader (currently unused but available)
- Update tsconfig.json for ESM + JSX support
- Switch to pnpm
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@changeset-bot

changeset-botBot commented Jul 27, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: e28d7ec

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Vite only serves static files from public/, not from the project root.
In Mintlify all root files are served as static, so these dirs were at the root.
Moving them into public/ fixes broken images and logos on the deployed site.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The base: /docs config works locally but breaks on holocron.so hosting
because the hosting worker does not strip the base prefix from asset URLs.
A fix is being worked on in a separate session.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The original repo used bun. Remove pnpm-lock.yaml and pnpm-workspace.yaml,
regenerate bun.lock for the Holocron dependencies.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
These are processed image cache files written by the holocron dev server.
They were accidentally committed via git add -A during the initial migration.
Added _holocron to .gitignore to prevent it happening again.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The VideoBackgroundShader was removed from the hero component.
This video file is no longer referenced anywhere.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Points favicon to the same logo files used in the header,
so the browser tab icon matches the site logo.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Added left padding using CSS grid variables (--grid-nav-width + --grid-gap)
so the hero "Ship software that never breaks" heading starts at the same
horizontal position as "How it works" and all other content headings below.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Removed sidebar+gap padding so hero aligns flush with the left edge.
Reduced top padding from pt-8/lg:pt-16 to pt-4/lg:pt-8.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Adds a self-hosted Cloudflare Workers deployment target for the docs site,
served under the `/docs` base path so it can sit behind a route on the main
domain.
Changes:
- `vite.config.ts` — restore `base: '/docs'` and add `@cloudflare/vite-plugin`
with the `rsc` / `ssr` environment mapping holocron expects
- `wrangler.jsonc` — worker `interfere-docs-website`, entry
`spiceflow/cloudflare-entrypoint`, `nodejs_compat`
- `package.json` — `deploy` script (`vite build && wrangler deploy`) plus
`wrangler` and `@cloudflare/vite-plugin` devDependencies
The `base: '/docs'` config was reverted in ab5156c because holocron.so hosting
did not strip the base prefix on asset lookups. Self-hosting on Workers hits a
different variant of the same problem: Cloudflare's Asset Worker resolves a
request against the uploaded directory tree and deliberately does not strip
Vite's `base` (cloudflare/workers-sdk#11857), so the built HTML referenced
`/docs/assets/*` while the store only held `assets/*`.
That is fixed upstream in `@holocron.so/vite`, which now nests the client build
output under a folder matching the base whenever the Cloudflare plugin is in
use — the layout Cloudflare documents for serving a subdirectory:
dist/client/
.assetsignore
docs/assets/app.js <- GET /docs/assets/app.js, served by the CDN
docs/icons/logo.svg
Deployed and verified: 139 referenced URLs on /docs return 200, same for
/docs/quickstart and /docs/sdk/next-js.
NOTE: requires the upstream holocron patch release; `^0.28.0` does not include
the asset nesting fix yet.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Picks up the upstream Cloudflare fix that nests the client build output under
the Vite `base`, so `/docs/assets/*` resolves against the uploaded asset tree
instead of 404ing.
Previously the site only deployed correctly with a locally patched holocron
build; 0.29.0 makes a clean `bun install && bun run deploy` produce a working
Worker.
Rebuilt and redeployed, all referenced URLs on /docs and /docs/quickstart
return 200.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorses
Tommy D. Rossi (remorses) marked this pull request as ready for review July 28, 2026 15:29
interfere.com is proxied through Cloudflare, so the docs can be served by a
Worker route at the edge instead of reverse-proxying /docs to a third party.
Routes take precedence over a Custom Domain on the same hostname, so this wins
over whatever serves the rest of interfere.com without touching it.
Pattern choice, per Cloudflare's route matching rules:
pattern /docs /docs?utm=x /docs/quickstart /docsearch
interfere.com/docs yes no no no
interfere.com/docs/* no no yes no
interfere.com/docs* yes yes yes yes
Route patterns cannot contain query parameters, and the only way to match a URL
that has one is to end the pattern with a wildcard. So `/docs/*` misses the bare
`/docs`, and a plain `/docs` misses `/docs?utm_source=...` — which any shared or
ad-tagged link will have. `/docs*` is the only single pattern that covers all
three.
The tradeoff is that it also matches a future top-level path starting with
"docs" such as /docsearch. Cloudflare's documented escape hatch is a more
specific route with no script attached, which bypasses Workers for that path.
www is intentionally not listed: www.interfere.com already 301s to the apex with
the path preserved (verified on /docs and /docs/quickstart), so adding a www
route would serve the docs on two hostnames.
Note this route only applies when deployed from the Cloudflare account that owns
the interfere.com zone. `wrangler versions upload` is unaffected since triggers
are applied separately.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
/docs* also matches paths like /docsearch, but nothing on interfere.com starts
with "docs" today, so those are 404s either way and only the 404 page changes.
The precise alternative regresses a working URL:
URL today /docs* /docs + /docs/*
/docs 200 200 200
/docs?utm_source=x 200 200 404 <- regression
/docs/quickstart 200 200 200
/docsthing 404 404 404
Also notes Cloudflare route specificity bug: adding /docs/* alongside /docs*
does nothing, the broader pattern wins even for /docs/quickstart.
https://developers.cloudflare.com/workers/platform/known-issues/
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from Mintlify to HolocronMigrate docs from to HolocronJul 28, 2026
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from to HolocronMigrate docs Jul 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@remorses
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Migrate docs - #11

Open
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron
Open

Migrate docs #11
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron

Conversation

@remorses

@remorsesTommy D. Rossi (remorses) commented Jul 27, 2026

Copy link
Copy Markdown

This migrates the docs site from Mintlify to Holocron, an open-source Mintlify replacement that runs as a Vite plugin.

Preview:https://066d1346-interfere-docs-website.remorses.workers.dev/docs

What changed

  • Replaced mintlify with @holocron.so/vite as a Vite plugin
  • Added vite.config.ts with the holocron plugin
  • Flattened docs.json: inlined the $ref navigation, removed Mintlify-only fields (theme, background, contextual, styling, fonts), updated schema to holocron
  • Added hero section matching the interfere.com homepage layout (side-by-side heading + subtitle)
  • Set InterVariable font globally for body and all headings via style.css
  • Replaced all colored SVG sidebar icons with monochrome lucide icons so they adapt to light/dark mode
  • Added missing icons to pages that didn't have them (quickstart, onboarding, concepts, power-user, home)
  • Moved static assets (icons, images, fonts, sources) into public/

Self-hosted on Cloudflare Workers

The docs are now a worker named interfere-docs-website, served under the /docs base path. No more third-party hosting.

bun install
bunx wrangler login
bun run deploy

No reverse proxy needed

Today interfere.com/docs is reverse-proxied to Mintlify's hosted app (interfere.mintlify.site, confirmed by the x-vercel-project-id and x-matched-path: /_sites/[subdomain]/[[...slug]] response headers). Since interfere.com is already proxied through Cloudflare, that hop can go away entirely: wrangler.jsonc declares a route so the docs are served at the edge.

"routes": [{ "pattern": "interfere.com/docs*", "zone_name": "interfere.com" }]

Routes take precedence over a Custom Domain on the same hostname, so this only affects /docs and leaves the rest of interfere.com alone.

The pattern is /docs*, not /docs/*. Cloudflare route patterns cannot contain query parameters, and the only way to match a URL that has one is to end the pattern with a wildcard:

pattern/docs/docs?utm=x/docs/quickstart/docsearch
interfere.com/docsyesnonono
interfere.com/docs/*nonoyesno
interfere.com/docs*yesyesyesyes

So /docs/* would miss the bare /docs, and a plain /docs would miss any shared or ad-tagged link. The tradeoff is that /docs* also matches a future top-level path starting with "docs"; if that ever comes up, a more specific route with no script attached bypasses Workers for it.

www is intentionally not routed, www.interfere.com already 301s to the apex with the path preserved.

Before merging

  • Deploy must run from the Cloudflare account that owns the interfere.com zone, otherwise the route can't be created
  • Deploying applies the route and cuts /docs over from Mintlify immediately, so the old proxy config (Vercel rewrite, Worker, nginx, or a dashboard Origin Rule) should be removed at the same time

- Replace mintlify with @holocron.so/vite as a Vite plugin
- Add vite.config.ts with holocron() plugin
- Flatten docs.json: inline navigation $ref, remove Mintlify-only fields, update schema to holocron.so
- Add hero section matching interfere.com layout (side-by-side heading + subtitle)
- Set InterVariable font globally for body and all headings via style.css
- Replace all colored SVG sidebar icons with monochrome lucide icons
- Add missing icons to pages without them (quickstart, onboarding, concepts, power-user, home)
- Add public/hero-bg.mp4 for VideoBackgroundShader (currently unused but available)
- Update tsconfig.json for ESM + JSX support
- Switch to pnpm
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@changeset-bot

changeset-botBot commented Jul 27, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: e28d7ec

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Vite only serves static files from public/, not from the project root.
In Mintlify all root files are served as static, so these dirs were at the root.
Moving them into public/ fixes broken images and logos on the deployed site.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The base: /docs config works locally but breaks on holocron.so hosting
because the hosting worker does not strip the base prefix from asset URLs.
A fix is being worked on in a separate session.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The original repo used bun. Remove pnpm-lock.yaml and pnpm-workspace.yaml,
regenerate bun.lock for the Holocron dependencies.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
These are processed image cache files written by the holocron dev server.
They were accidentally committed via git add -A during the initial migration.
Added _holocron to .gitignore to prevent it happening again.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The VideoBackgroundShader was removed from the hero component.
This video file is no longer referenced anywhere.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Points favicon to the same logo files used in the header,
so the browser tab icon matches the site logo.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Added left padding using CSS grid variables (--grid-nav-width + --grid-gap)
so the hero "Ship software that never breaks" heading starts at the same
horizontal position as "How it works" and all other content headings below.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Removed sidebar+gap padding so hero aligns flush with the left edge.
Reduced top padding from pt-8/lg:pt-16 to pt-4/lg:pt-8.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Adds a self-hosted Cloudflare Workers deployment target for the docs site,
served under the `/docs` base path so it can sit behind a route on the main
domain.
Changes:
- `vite.config.ts` — restore `base: '/docs'` and add `@cloudflare/vite-plugin`
with the `rsc` / `ssr` environment mapping holocron expects
- `wrangler.jsonc` — worker `interfere-docs-website`, entry
`spiceflow/cloudflare-entrypoint`, `nodejs_compat`
- `package.json` — `deploy` script (`vite build && wrangler deploy`) plus
`wrangler` and `@cloudflare/vite-plugin` devDependencies
The `base: '/docs'` config was reverted in ab5156c because holocron.so hosting
did not strip the base prefix on asset lookups. Self-hosting on Workers hits a
different variant of the same problem: Cloudflare's Asset Worker resolves a
request against the uploaded directory tree and deliberately does not strip
Vite's `base` (cloudflare/workers-sdk#11857), so the built HTML referenced
`/docs/assets/*` while the store only held `assets/*`.
That is fixed upstream in `@holocron.so/vite`, which now nests the client build
output under a folder matching the base whenever the Cloudflare plugin is in
use — the layout Cloudflare documents for serving a subdirectory:
dist/client/
.assetsignore
docs/assets/app.js <- GET /docs/assets/app.js, served by the CDN
docs/icons/logo.svg
Deployed and verified: 139 referenced URLs on /docs return 200, same for
/docs/quickstart and /docs/sdk/next-js.
NOTE: requires the upstream holocron patch release; `^0.28.0` does not include
the asset nesting fix yet.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Picks up the upstream Cloudflare fix that nests the client build output under
the Vite `base`, so `/docs/assets/*` resolves against the uploaded asset tree
instead of 404ing.
Previously the site only deployed correctly with a locally patched holocron
build; 0.29.0 makes a clean `bun install && bun run deploy` produce a working
Worker.
Rebuilt and redeployed, all referenced URLs on /docs and /docs/quickstart
return 200.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorses
Tommy D. Rossi (remorses) marked this pull request as ready for review July 28, 2026 15:29
interfere.com is proxied through Cloudflare, so the docs can be served by a
Worker route at the edge instead of reverse-proxying /docs to a third party.
Routes take precedence over a Custom Domain on the same hostname, so this wins
over whatever serves the rest of interfere.com without touching it.
Pattern choice, per Cloudflare's route matching rules:
pattern /docs /docs?utm=x /docs/quickstart /docsearch
interfere.com/docs yes no no no
interfere.com/docs/* no no yes no
interfere.com/docs* yes yes yes yes
Route patterns cannot contain query parameters, and the only way to match a URL
that has one is to end the pattern with a wildcard. So `/docs/*` misses the bare
`/docs`, and a plain `/docs` misses `/docs?utm_source=...` — which any shared or
ad-tagged link will have. `/docs*` is the only single pattern that covers all
three.
The tradeoff is that it also matches a future top-level path starting with
"docs" such as /docsearch. Cloudflare's documented escape hatch is a more
specific route with no script attached, which bypasses Workers for that path.
www is intentionally not listed: www.interfere.com already 301s to the apex with
the path preserved (verified on /docs and /docs/quickstart), so adding a www
route would serve the docs on two hostnames.
Note this route only applies when deployed from the Cloudflare account that owns
the interfere.com zone. `wrangler versions upload` is unaffected since triggers
are applied separately.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
/docs* also matches paths like /docsearch, but nothing on interfere.com starts
with "docs" today, so those are 404s either way and only the 404 page changes.
The precise alternative regresses a working URL:
URL today /docs* /docs + /docs/*
/docs 200 200 200
/docs?utm_source=x 200 200 404 <- regression
/docs/quickstart 200 200 200
/docsthing 404 404 404
Also notes Cloudflare route specificity bug: adding /docs/* alongside /docs*
does nothing, the broader pattern wins even for /docs/quickstart.
https://developers.cloudflare.com/workers/platform/known-issues/
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from Mintlify to HolocronMigrate docs from to HolocronJul 28, 2026
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from to HolocronMigrate docs Jul 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@remorses
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Migrate docs - #11

Open
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron
Open

Migrate docs #11
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron

Conversation

@remorses

@remorsesTommy D. Rossi (remorses) commented Jul 27, 2026

Copy link
Copy Markdown

This migrates the docs site from Mintlify to Holocron, an open-source Mintlify replacement that runs as a Vite plugin.

Preview:https://066d1346-interfere-docs-website.remorses.workers.dev/docs

What changed

  • Replaced mintlify with @holocron.so/vite as a Vite plugin
  • Added vite.config.ts with the holocron plugin
  • Flattened docs.json: inlined the $ref navigation, removed Mintlify-only fields (theme, background, contextual, styling, fonts), updated schema to holocron
  • Added hero section matching the interfere.com homepage layout (side-by-side heading + subtitle)
  • Set InterVariable font globally for body and all headings via style.css
  • Replaced all colored SVG sidebar icons with monochrome lucide icons so they adapt to light/dark mode
  • Added missing icons to pages that didn't have them (quickstart, onboarding, concepts, power-user, home)
  • Moved static assets (icons, images, fonts, sources) into public/

Self-hosted on Cloudflare Workers

The docs are now a worker named interfere-docs-website, served under the /docs base path. No more third-party hosting.

bun install
bunx wrangler login
bun run deploy

No reverse proxy needed

Today interfere.com/docs is reverse-proxied to Mintlify's hosted app (interfere.mintlify.site, confirmed by the x-vercel-project-id and x-matched-path: /_sites/[subdomain]/[[...slug]] response headers). Since interfere.com is already proxied through Cloudflare, that hop can go away entirely: wrangler.jsonc declares a route so the docs are served at the edge.

"routes": [{ "pattern": "interfere.com/docs*", "zone_name": "interfere.com" }]

Routes take precedence over a Custom Domain on the same hostname, so this only affects /docs and leaves the rest of interfere.com alone.

The pattern is /docs*, not /docs/*. Cloudflare route patterns cannot contain query parameters, and the only way to match a URL that has one is to end the pattern with a wildcard:

pattern/docs/docs?utm=x/docs/quickstart/docsearch
interfere.com/docsyesnonono
interfere.com/docs/*nonoyesno
interfere.com/docs*yesyesyesyes

So /docs/* would miss the bare /docs, and a plain /docs would miss any shared or ad-tagged link. The tradeoff is that /docs* also matches a future top-level path starting with "docs"; if that ever comes up, a more specific route with no script attached bypasses Workers for it.

www is intentionally not routed, www.interfere.com already 301s to the apex with the path preserved.

Before merging

  • Deploy must run from the Cloudflare account that owns the interfere.com zone, otherwise the route can't be created
  • Deploying applies the route and cuts /docs over from Mintlify immediately, so the old proxy config (Vercel rewrite, Worker, nginx, or a dashboard Origin Rule) should be removed at the same time

- Replace mintlify with @holocron.so/vite as a Vite plugin
- Add vite.config.ts with holocron() plugin
- Flatten docs.json: inline navigation $ref, remove Mintlify-only fields, update schema to holocron.so
- Add hero section matching interfere.com layout (side-by-side heading + subtitle)
- Set InterVariable font globally for body and all headings via style.css
- Replace all colored SVG sidebar icons with monochrome lucide icons
- Add missing icons to pages without them (quickstart, onboarding, concepts, power-user, home)
- Add public/hero-bg.mp4 for VideoBackgroundShader (currently unused but available)
- Update tsconfig.json for ESM + JSX support
- Switch to pnpm
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@changeset-bot

changeset-botBot commented Jul 27, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: e28d7ec

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Vite only serves static files from public/, not from the project root.
In Mintlify all root files are served as static, so these dirs were at the root.
Moving them into public/ fixes broken images and logos on the deployed site.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The base: /docs config works locally but breaks on holocron.so hosting
because the hosting worker does not strip the base prefix from asset URLs.
A fix is being worked on in a separate session.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The original repo used bun. Remove pnpm-lock.yaml and pnpm-workspace.yaml,
regenerate bun.lock for the Holocron dependencies.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
These are processed image cache files written by the holocron dev server.
They were accidentally committed via git add -A during the initial migration.
Added _holocron to .gitignore to prevent it happening again.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The VideoBackgroundShader was removed from the hero component.
This video file is no longer referenced anywhere.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Points favicon to the same logo files used in the header,
so the browser tab icon matches the site logo.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Added left padding using CSS grid variables (--grid-nav-width + --grid-gap)
so the hero "Ship software that never breaks" heading starts at the same
horizontal position as "How it works" and all other content headings below.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Removed sidebar+gap padding so hero aligns flush with the left edge.
Reduced top padding from pt-8/lg:pt-16 to pt-4/lg:pt-8.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Adds a self-hosted Cloudflare Workers deployment target for the docs site,
served under the `/docs` base path so it can sit behind a route on the main
domain.
Changes:
- `vite.config.ts` — restore `base: '/docs'` and add `@cloudflare/vite-plugin`
with the `rsc` / `ssr` environment mapping holocron expects
- `wrangler.jsonc` — worker `interfere-docs-website`, entry
`spiceflow/cloudflare-entrypoint`, `nodejs_compat`
- `package.json` — `deploy` script (`vite build && wrangler deploy`) plus
`wrangler` and `@cloudflare/vite-plugin` devDependencies
The `base: '/docs'` config was reverted in ab5156c because holocron.so hosting
did not strip the base prefix on asset lookups. Self-hosting on Workers hits a
different variant of the same problem: Cloudflare's Asset Worker resolves a
request against the uploaded directory tree and deliberately does not strip
Vite's `base` (cloudflare/workers-sdk#11857), so the built HTML referenced
`/docs/assets/*` while the store only held `assets/*`.
That is fixed upstream in `@holocron.so/vite`, which now nests the client build
output under a folder matching the base whenever the Cloudflare plugin is in
use — the layout Cloudflare documents for serving a subdirectory:
dist/client/
.assetsignore
docs/assets/app.js <- GET /docs/assets/app.js, served by the CDN
docs/icons/logo.svg
Deployed and verified: 139 referenced URLs on /docs return 200, same for
/docs/quickstart and /docs/sdk/next-js.
NOTE: requires the upstream holocron patch release; `^0.28.0` does not include
the asset nesting fix yet.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Picks up the upstream Cloudflare fix that nests the client build output under
the Vite `base`, so `/docs/assets/*` resolves against the uploaded asset tree
instead of 404ing.
Previously the site only deployed correctly with a locally patched holocron
build; 0.29.0 makes a clean `bun install && bun run deploy` produce a working
Worker.
Rebuilt and redeployed, all referenced URLs on /docs and /docs/quickstart
return 200.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorses
Tommy D. Rossi (remorses) marked this pull request as ready for review July 28, 2026 15:29
interfere.com is proxied through Cloudflare, so the docs can be served by a
Worker route at the edge instead of reverse-proxying /docs to a third party.
Routes take precedence over a Custom Domain on the same hostname, so this wins
over whatever serves the rest of interfere.com without touching it.
Pattern choice, per Cloudflare's route matching rules:
pattern /docs /docs?utm=x /docs/quickstart /docsearch
interfere.com/docs yes no no no
interfere.com/docs/* no no yes no
interfere.com/docs* yes yes yes yes
Route patterns cannot contain query parameters, and the only way to match a URL
that has one is to end the pattern with a wildcard. So `/docs/*` misses the bare
`/docs`, and a plain `/docs` misses `/docs?utm_source=...` — which any shared or
ad-tagged link will have. `/docs*` is the only single pattern that covers all
three.
The tradeoff is that it also matches a future top-level path starting with
"docs" such as /docsearch. Cloudflare's documented escape hatch is a more
specific route with no script attached, which bypasses Workers for that path.
www is intentionally not listed: www.interfere.com already 301s to the apex with
the path preserved (verified on /docs and /docs/quickstart), so adding a www
route would serve the docs on two hostnames.
Note this route only applies when deployed from the Cloudflare account that owns
the interfere.com zone. `wrangler versions upload` is unaffected since triggers
are applied separately.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
/docs* also matches paths like /docsearch, but nothing on interfere.com starts
with "docs" today, so those are 404s either way and only the 404 page changes.
The precise alternative regresses a working URL:
URL today /docs* /docs + /docs/*
/docs 200 200 200
/docs?utm_source=x 200 200 404 <- regression
/docs/quickstart 200 200 200
/docsthing 404 404 404
Also notes Cloudflare route specificity bug: adding /docs/* alongside /docs*
does nothing, the broader pattern wins even for /docs/quickstart.
https://developers.cloudflare.com/workers/platform/known-issues/
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from Mintlify to HolocronMigrate docs from to HolocronJul 28, 2026
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from to HolocronMigrate docs Jul 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@remorses
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Migrate docs - #11

Open
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron
Open

Migrate docs #11
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron

Conversation

@remorses

@remorsesTommy D. Rossi (remorses) commented Jul 27, 2026

Copy link
Copy Markdown

This migrates the docs site from Mintlify to Holocron, an open-source Mintlify replacement that runs as a Vite plugin.

Preview:https://066d1346-interfere-docs-website.remorses.workers.dev/docs

What changed

  • Replaced mintlify with @holocron.so/vite as a Vite plugin
  • Added vite.config.ts with the holocron plugin
  • Flattened docs.json: inlined the $ref navigation, removed Mintlify-only fields (theme, background, contextual, styling, fonts), updated schema to holocron
  • Added hero section matching the interfere.com homepage layout (side-by-side heading + subtitle)
  • Set InterVariable font globally for body and all headings via style.css
  • Replaced all colored SVG sidebar icons with monochrome lucide icons so they adapt to light/dark mode
  • Added missing icons to pages that didn't have them (quickstart, onboarding, concepts, power-user, home)
  • Moved static assets (icons, images, fonts, sources) into public/

Self-hosted on Cloudflare Workers

The docs are now a worker named interfere-docs-website, served under the /docs base path. No more third-party hosting.

bun install
bunx wrangler login
bun run deploy

No reverse proxy needed

Today interfere.com/docs is reverse-proxied to Mintlify's hosted app (interfere.mintlify.site, confirmed by the x-vercel-project-id and x-matched-path: /_sites/[subdomain]/[[...slug]] response headers). Since interfere.com is already proxied through Cloudflare, that hop can go away entirely: wrangler.jsonc declares a route so the docs are served at the edge.

"routes": [{ "pattern": "interfere.com/docs*", "zone_name": "interfere.com" }]

Routes take precedence over a Custom Domain on the same hostname, so this only affects /docs and leaves the rest of interfere.com alone.

The pattern is /docs*, not /docs/*. Cloudflare route patterns cannot contain query parameters, and the only way to match a URL that has one is to end the pattern with a wildcard:

pattern/docs/docs?utm=x/docs/quickstart/docsearch
interfere.com/docsyesnonono
interfere.com/docs/*nonoyesno
interfere.com/docs*yesyesyesyes

So /docs/* would miss the bare /docs, and a plain /docs would miss any shared or ad-tagged link. The tradeoff is that /docs* also matches a future top-level path starting with "docs"; if that ever comes up, a more specific route with no script attached bypasses Workers for it.

www is intentionally not routed, www.interfere.com already 301s to the apex with the path preserved.

Before merging

  • Deploy must run from the Cloudflare account that owns the interfere.com zone, otherwise the route can't be created
  • Deploying applies the route and cuts /docs over from Mintlify immediately, so the old proxy config (Vercel rewrite, Worker, nginx, or a dashboard Origin Rule) should be removed at the same time

- Replace mintlify with @holocron.so/vite as a Vite plugin
- Add vite.config.ts with holocron() plugin
- Flatten docs.json: inline navigation $ref, remove Mintlify-only fields, update schema to holocron.so
- Add hero section matching interfere.com layout (side-by-side heading + subtitle)
- Set InterVariable font globally for body and all headings via style.css
- Replace all colored SVG sidebar icons with monochrome lucide icons
- Add missing icons to pages without them (quickstart, onboarding, concepts, power-user, home)
- Add public/hero-bg.mp4 for VideoBackgroundShader (currently unused but available)
- Update tsconfig.json for ESM + JSX support
- Switch to pnpm
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@changeset-bot

changeset-botBot commented Jul 27, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: e28d7ec

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Vite only serves static files from public/, not from the project root.
In Mintlify all root files are served as static, so these dirs were at the root.
Moving them into public/ fixes broken images and logos on the deployed site.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The base: /docs config works locally but breaks on holocron.so hosting
because the hosting worker does not strip the base prefix from asset URLs.
A fix is being worked on in a separate session.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The original repo used bun. Remove pnpm-lock.yaml and pnpm-workspace.yaml,
regenerate bun.lock for the Holocron dependencies.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
These are processed image cache files written by the holocron dev server.
They were accidentally committed via git add -A during the initial migration.
Added _holocron to .gitignore to prevent it happening again.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The VideoBackgroundShader was removed from the hero component.
This video file is no longer referenced anywhere.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Points favicon to the same logo files used in the header,
so the browser tab icon matches the site logo.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Added left padding using CSS grid variables (--grid-nav-width + --grid-gap)
so the hero "Ship software that never breaks" heading starts at the same
horizontal position as "How it works" and all other content headings below.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Removed sidebar+gap padding so hero aligns flush with the left edge.
Reduced top padding from pt-8/lg:pt-16 to pt-4/lg:pt-8.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Adds a self-hosted Cloudflare Workers deployment target for the docs site,
served under the `/docs` base path so it can sit behind a route on the main
domain.
Changes:
- `vite.config.ts` — restore `base: '/docs'` and add `@cloudflare/vite-plugin`
with the `rsc` / `ssr` environment mapping holocron expects
- `wrangler.jsonc` — worker `interfere-docs-website`, entry
`spiceflow/cloudflare-entrypoint`, `nodejs_compat`
- `package.json` — `deploy` script (`vite build && wrangler deploy`) plus
`wrangler` and `@cloudflare/vite-plugin` devDependencies
The `base: '/docs'` config was reverted in ab5156c because holocron.so hosting
did not strip the base prefix on asset lookups. Self-hosting on Workers hits a
different variant of the same problem: Cloudflare's Asset Worker resolves a
request against the uploaded directory tree and deliberately does not strip
Vite's `base` (cloudflare/workers-sdk#11857), so the built HTML referenced
`/docs/assets/*` while the store only held `assets/*`.
That is fixed upstream in `@holocron.so/vite`, which now nests the client build
output under a folder matching the base whenever the Cloudflare plugin is in
use — the layout Cloudflare documents for serving a subdirectory:
dist/client/
.assetsignore
docs/assets/app.js <- GET /docs/assets/app.js, served by the CDN
docs/icons/logo.svg
Deployed and verified: 139 referenced URLs on /docs return 200, same for
/docs/quickstart and /docs/sdk/next-js.
NOTE: requires the upstream holocron patch release; `^0.28.0` does not include
the asset nesting fix yet.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Picks up the upstream Cloudflare fix that nests the client build output under
the Vite `base`, so `/docs/assets/*` resolves against the uploaded asset tree
instead of 404ing.
Previously the site only deployed correctly with a locally patched holocron
build; 0.29.0 makes a clean `bun install && bun run deploy` produce a working
Worker.
Rebuilt and redeployed, all referenced URLs on /docs and /docs/quickstart
return 200.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorses
Tommy D. Rossi (remorses) marked this pull request as ready for review July 28, 2026 15:29
interfere.com is proxied through Cloudflare, so the docs can be served by a
Worker route at the edge instead of reverse-proxying /docs to a third party.
Routes take precedence over a Custom Domain on the same hostname, so this wins
over whatever serves the rest of interfere.com without touching it.
Pattern choice, per Cloudflare's route matching rules:
pattern /docs /docs?utm=x /docs/quickstart /docsearch
interfere.com/docs yes no no no
interfere.com/docs/* no no yes no
interfere.com/docs* yes yes yes yes
Route patterns cannot contain query parameters, and the only way to match a URL
that has one is to end the pattern with a wildcard. So `/docs/*` misses the bare
`/docs`, and a plain `/docs` misses `/docs?utm_source=...` — which any shared or
ad-tagged link will have. `/docs*` is the only single pattern that covers all
three.
The tradeoff is that it also matches a future top-level path starting with
"docs" such as /docsearch. Cloudflare's documented escape hatch is a more
specific route with no script attached, which bypasses Workers for that path.
www is intentionally not listed: www.interfere.com already 301s to the apex with
the path preserved (verified on /docs and /docs/quickstart), so adding a www
route would serve the docs on two hostnames.
Note this route only applies when deployed from the Cloudflare account that owns
the interfere.com zone. `wrangler versions upload` is unaffected since triggers
are applied separately.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
/docs* also matches paths like /docsearch, but nothing on interfere.com starts
with "docs" today, so those are 404s either way and only the 404 page changes.
The precise alternative regresses a working URL:
URL today /docs* /docs + /docs/*
/docs 200 200 200
/docs?utm_source=x 200 200 404 <- regression
/docs/quickstart 200 200 200
/docsthing 404 404 404
Also notes Cloudflare route specificity bug: adding /docs/* alongside /docs*
does nothing, the broader pattern wins even for /docs/quickstart.
https://developers.cloudflare.com/workers/platform/known-issues/
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from Mintlify to HolocronMigrate docs from to HolocronJul 28, 2026
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from to HolocronMigrate docs Jul 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@remorses
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Migrate docs - #11

Open
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron
Open

Migrate docs #11
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron

Conversation

@remorses

@remorsesTommy D. Rossi (remorses) commented Jul 27, 2026

Copy link
Copy Markdown

This migrates the docs site from Mintlify to Holocron, an open-source Mintlify replacement that runs as a Vite plugin.

Preview:https://066d1346-interfere-docs-website.remorses.workers.dev/docs

What changed

  • Replaced mintlify with @holocron.so/vite as a Vite plugin
  • Added vite.config.ts with the holocron plugin
  • Flattened docs.json: inlined the $ref navigation, removed Mintlify-only fields (theme, background, contextual, styling, fonts), updated schema to holocron
  • Added hero section matching the interfere.com homepage layout (side-by-side heading + subtitle)
  • Set InterVariable font globally for body and all headings via style.css
  • Replaced all colored SVG sidebar icons with monochrome lucide icons so they adapt to light/dark mode
  • Added missing icons to pages that didn't have them (quickstart, onboarding, concepts, power-user, home)
  • Moved static assets (icons, images, fonts, sources) into public/

Self-hosted on Cloudflare Workers

The docs are now a worker named interfere-docs-website, served under the /docs base path. No more third-party hosting.

bun install
bunx wrangler login
bun run deploy

No reverse proxy needed

Today interfere.com/docs is reverse-proxied to Mintlify's hosted app (interfere.mintlify.site, confirmed by the x-vercel-project-id and x-matched-path: /_sites/[subdomain]/[[...slug]] response headers). Since interfere.com is already proxied through Cloudflare, that hop can go away entirely: wrangler.jsonc declares a route so the docs are served at the edge.

"routes": [{ "pattern": "interfere.com/docs*", "zone_name": "interfere.com" }]

Routes take precedence over a Custom Domain on the same hostname, so this only affects /docs and leaves the rest of interfere.com alone.

The pattern is /docs*, not /docs/*. Cloudflare route patterns cannot contain query parameters, and the only way to match a URL that has one is to end the pattern with a wildcard:

pattern/docs/docs?utm=x/docs/quickstart/docsearch
interfere.com/docsyesnonono
interfere.com/docs/*nonoyesno
interfere.com/docs*yesyesyesyes

So /docs/* would miss the bare /docs, and a plain /docs would miss any shared or ad-tagged link. The tradeoff is that /docs* also matches a future top-level path starting with "docs"; if that ever comes up, a more specific route with no script attached bypasses Workers for it.

www is intentionally not routed, www.interfere.com already 301s to the apex with the path preserved.

Before merging

  • Deploy must run from the Cloudflare account that owns the interfere.com zone, otherwise the route can't be created
  • Deploying applies the route and cuts /docs over from Mintlify immediately, so the old proxy config (Vercel rewrite, Worker, nginx, or a dashboard Origin Rule) should be removed at the same time

- Replace mintlify with @holocron.so/vite as a Vite plugin
- Add vite.config.ts with holocron() plugin
- Flatten docs.json: inline navigation $ref, remove Mintlify-only fields, update schema to holocron.so
- Add hero section matching interfere.com layout (side-by-side heading + subtitle)
- Set InterVariable font globally for body and all headings via style.css
- Replace all colored SVG sidebar icons with monochrome lucide icons
- Add missing icons to pages without them (quickstart, onboarding, concepts, power-user, home)
- Add public/hero-bg.mp4 for VideoBackgroundShader (currently unused but available)
- Update tsconfig.json for ESM + JSX support
- Switch to pnpm
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@changeset-bot

changeset-botBot commented Jul 27, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: e28d7ec

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Vite only serves static files from public/, not from the project root.
In Mintlify all root files are served as static, so these dirs were at the root.
Moving them into public/ fixes broken images and logos on the deployed site.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The base: /docs config works locally but breaks on holocron.so hosting
because the hosting worker does not strip the base prefix from asset URLs.
A fix is being worked on in a separate session.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The original repo used bun. Remove pnpm-lock.yaml and pnpm-workspace.yaml,
regenerate bun.lock for the Holocron dependencies.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
These are processed image cache files written by the holocron dev server.
They were accidentally committed via git add -A during the initial migration.
Added _holocron to .gitignore to prevent it happening again.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The VideoBackgroundShader was removed from the hero component.
This video file is no longer referenced anywhere.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Points favicon to the same logo files used in the header,
so the browser tab icon matches the site logo.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Added left padding using CSS grid variables (--grid-nav-width + --grid-gap)
so the hero "Ship software that never breaks" heading starts at the same
horizontal position as "How it works" and all other content headings below.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Removed sidebar+gap padding so hero aligns flush with the left edge.
Reduced top padding from pt-8/lg:pt-16 to pt-4/lg:pt-8.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Adds a self-hosted Cloudflare Workers deployment target for the docs site,
served under the `/docs` base path so it can sit behind a route on the main
domain.
Changes:
- `vite.config.ts` — restore `base: '/docs'` and add `@cloudflare/vite-plugin`
with the `rsc` / `ssr` environment mapping holocron expects
- `wrangler.jsonc` — worker `interfere-docs-website`, entry
`spiceflow/cloudflare-entrypoint`, `nodejs_compat`
- `package.json` — `deploy` script (`vite build && wrangler deploy`) plus
`wrangler` and `@cloudflare/vite-plugin` devDependencies
The `base: '/docs'` config was reverted in ab5156c because holocron.so hosting
did not strip the base prefix on asset lookups. Self-hosting on Workers hits a
different variant of the same problem: Cloudflare's Asset Worker resolves a
request against the uploaded directory tree and deliberately does not strip
Vite's `base` (cloudflare/workers-sdk#11857), so the built HTML referenced
`/docs/assets/*` while the store only held `assets/*`.
That is fixed upstream in `@holocron.so/vite`, which now nests the client build
output under a folder matching the base whenever the Cloudflare plugin is in
use — the layout Cloudflare documents for serving a subdirectory:
dist/client/
.assetsignore
docs/assets/app.js <- GET /docs/assets/app.js, served by the CDN
docs/icons/logo.svg
Deployed and verified: 139 referenced URLs on /docs return 200, same for
/docs/quickstart and /docs/sdk/next-js.
NOTE: requires the upstream holocron patch release; `^0.28.0` does not include
the asset nesting fix yet.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Picks up the upstream Cloudflare fix that nests the client build output under
the Vite `base`, so `/docs/assets/*` resolves against the uploaded asset tree
instead of 404ing.
Previously the site only deployed correctly with a locally patched holocron
build; 0.29.0 makes a clean `bun install && bun run deploy` produce a working
Worker.
Rebuilt and redeployed, all referenced URLs on /docs and /docs/quickstart
return 200.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorses
Tommy D. Rossi (remorses) marked this pull request as ready for review July 28, 2026 15:29
interfere.com is proxied through Cloudflare, so the docs can be served by a
Worker route at the edge instead of reverse-proxying /docs to a third party.
Routes take precedence over a Custom Domain on the same hostname, so this wins
over whatever serves the rest of interfere.com without touching it.
Pattern choice, per Cloudflare's route matching rules:
pattern /docs /docs?utm=x /docs/quickstart /docsearch
interfere.com/docs yes no no no
interfere.com/docs/* no no yes no
interfere.com/docs* yes yes yes yes
Route patterns cannot contain query parameters, and the only way to match a URL
that has one is to end the pattern with a wildcard. So `/docs/*` misses the bare
`/docs`, and a plain `/docs` misses `/docs?utm_source=...` — which any shared or
ad-tagged link will have. `/docs*` is the only single pattern that covers all
three.
The tradeoff is that it also matches a future top-level path starting with
"docs" such as /docsearch. Cloudflare's documented escape hatch is a more
specific route with no script attached, which bypasses Workers for that path.
www is intentionally not listed: www.interfere.com already 301s to the apex with
the path preserved (verified on /docs and /docs/quickstart), so adding a www
route would serve the docs on two hostnames.
Note this route only applies when deployed from the Cloudflare account that owns
the interfere.com zone. `wrangler versions upload` is unaffected since triggers
are applied separately.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
/docs* also matches paths like /docsearch, but nothing on interfere.com starts
with "docs" today, so those are 404s either way and only the 404 page changes.
The precise alternative regresses a working URL:
URL today /docs* /docs + /docs/*
/docs 200 200 200
/docs?utm_source=x 200 200 404 <- regression
/docs/quickstart 200 200 200
/docsthing 404 404 404
Also notes Cloudflare route specificity bug: adding /docs/* alongside /docs*
does nothing, the broader pattern wins even for /docs/quickstart.
https://developers.cloudflare.com/workers/platform/known-issues/
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from Mintlify to HolocronMigrate docs from to HolocronJul 28, 2026
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from to HolocronMigrate docs Jul 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@remorses
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Migrate docs - #11

Open
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron
Open

Migrate docs #11
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron

Conversation

@remorses

@remorsesTommy D. Rossi (remorses) commented Jul 27, 2026

Copy link
Copy Markdown

This migrates the docs site from Mintlify to Holocron, an open-source Mintlify replacement that runs as a Vite plugin.

Preview:https://066d1346-interfere-docs-website.remorses.workers.dev/docs

What changed

  • Replaced mintlify with @holocron.so/vite as a Vite plugin
  • Added vite.config.ts with the holocron plugin
  • Flattened docs.json: inlined the $ref navigation, removed Mintlify-only fields (theme, background, contextual, styling, fonts), updated schema to holocron
  • Added hero section matching the interfere.com homepage layout (side-by-side heading + subtitle)
  • Set InterVariable font globally for body and all headings via style.css
  • Replaced all colored SVG sidebar icons with monochrome lucide icons so they adapt to light/dark mode
  • Added missing icons to pages that didn't have them (quickstart, onboarding, concepts, power-user, home)
  • Moved static assets (icons, images, fonts, sources) into public/

Self-hosted on Cloudflare Workers

The docs are now a worker named interfere-docs-website, served under the /docs base path. No more third-party hosting.

bun install
bunx wrangler login
bun run deploy

No reverse proxy needed

Today interfere.com/docs is reverse-proxied to Mintlify's hosted app (interfere.mintlify.site, confirmed by the x-vercel-project-id and x-matched-path: /_sites/[subdomain]/[[...slug]] response headers). Since interfere.com is already proxied through Cloudflare, that hop can go away entirely: wrangler.jsonc declares a route so the docs are served at the edge.

"routes": [{ "pattern": "interfere.com/docs*", "zone_name": "interfere.com" }]

Routes take precedence over a Custom Domain on the same hostname, so this only affects /docs and leaves the rest of interfere.com alone.

The pattern is /docs*, not /docs/*. Cloudflare route patterns cannot contain query parameters, and the only way to match a URL that has one is to end the pattern with a wildcard:

pattern/docs/docs?utm=x/docs/quickstart/docsearch
interfere.com/docsyesnonono
interfere.com/docs/*nonoyesno
interfere.com/docs*yesyesyesyes

So /docs/* would miss the bare /docs, and a plain /docs would miss any shared or ad-tagged link. The tradeoff is that /docs* also matches a future top-level path starting with "docs"; if that ever comes up, a more specific route with no script attached bypasses Workers for it.

www is intentionally not routed, www.interfere.com already 301s to the apex with the path preserved.

Before merging

  • Deploy must run from the Cloudflare account that owns the interfere.com zone, otherwise the route can't be created
  • Deploying applies the route and cuts /docs over from Mintlify immediately, so the old proxy config (Vercel rewrite, Worker, nginx, or a dashboard Origin Rule) should be removed at the same time

- Replace mintlify with @holocron.so/vite as a Vite plugin
- Add vite.config.ts with holocron() plugin
- Flatten docs.json: inline navigation $ref, remove Mintlify-only fields, update schema to holocron.so
- Add hero section matching interfere.com layout (side-by-side heading + subtitle)
- Set InterVariable font globally for body and all headings via style.css
- Replace all colored SVG sidebar icons with monochrome lucide icons
- Add missing icons to pages without them (quickstart, onboarding, concepts, power-user, home)
- Add public/hero-bg.mp4 for VideoBackgroundShader (currently unused but available)
- Update tsconfig.json for ESM + JSX support
- Switch to pnpm
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@changeset-bot

changeset-botBot commented Jul 27, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: e28d7ec

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Vite only serves static files from public/, not from the project root.
In Mintlify all root files are served as static, so these dirs were at the root.
Moving them into public/ fixes broken images and logos on the deployed site.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The base: /docs config works locally but breaks on holocron.so hosting
because the hosting worker does not strip the base prefix from asset URLs.
A fix is being worked on in a separate session.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The original repo used bun. Remove pnpm-lock.yaml and pnpm-workspace.yaml,
regenerate bun.lock for the Holocron dependencies.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
These are processed image cache files written by the holocron dev server.
They were accidentally committed via git add -A during the initial migration.
Added _holocron to .gitignore to prevent it happening again.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The VideoBackgroundShader was removed from the hero component.
This video file is no longer referenced anywhere.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Points favicon to the same logo files used in the header,
so the browser tab icon matches the site logo.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Added left padding using CSS grid variables (--grid-nav-width + --grid-gap)
so the hero "Ship software that never breaks" heading starts at the same
horizontal position as "How it works" and all other content headings below.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Removed sidebar+gap padding so hero aligns flush with the left edge.
Reduced top padding from pt-8/lg:pt-16 to pt-4/lg:pt-8.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Adds a self-hosted Cloudflare Workers deployment target for the docs site,
served under the `/docs` base path so it can sit behind a route on the main
domain.
Changes:
- `vite.config.ts` — restore `base: '/docs'` and add `@cloudflare/vite-plugin`
with the `rsc` / `ssr` environment mapping holocron expects
- `wrangler.jsonc` — worker `interfere-docs-website`, entry
`spiceflow/cloudflare-entrypoint`, `nodejs_compat`
- `package.json` — `deploy` script (`vite build && wrangler deploy`) plus
`wrangler` and `@cloudflare/vite-plugin` devDependencies
The `base: '/docs'` config was reverted in ab5156c because holocron.so hosting
did not strip the base prefix on asset lookups. Self-hosting on Workers hits a
different variant of the same problem: Cloudflare's Asset Worker resolves a
request against the uploaded directory tree and deliberately does not strip
Vite's `base` (cloudflare/workers-sdk#11857), so the built HTML referenced
`/docs/assets/*` while the store only held `assets/*`.
That is fixed upstream in `@holocron.so/vite`, which now nests the client build
output under a folder matching the base whenever the Cloudflare plugin is in
use — the layout Cloudflare documents for serving a subdirectory:
dist/client/
.assetsignore
docs/assets/app.js <- GET /docs/assets/app.js, served by the CDN
docs/icons/logo.svg
Deployed and verified: 139 referenced URLs on /docs return 200, same for
/docs/quickstart and /docs/sdk/next-js.
NOTE: requires the upstream holocron patch release; `^0.28.0` does not include
the asset nesting fix yet.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Picks up the upstream Cloudflare fix that nests the client build output under
the Vite `base`, so `/docs/assets/*` resolves against the uploaded asset tree
instead of 404ing.
Previously the site only deployed correctly with a locally patched holocron
build; 0.29.0 makes a clean `bun install && bun run deploy` produce a working
Worker.
Rebuilt and redeployed, all referenced URLs on /docs and /docs/quickstart
return 200.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorses
Tommy D. Rossi (remorses) marked this pull request as ready for review July 28, 2026 15:29
interfere.com is proxied through Cloudflare, so the docs can be served by a
Worker route at the edge instead of reverse-proxying /docs to a third party.
Routes take precedence over a Custom Domain on the same hostname, so this wins
over whatever serves the rest of interfere.com without touching it.
Pattern choice, per Cloudflare's route matching rules:
pattern /docs /docs?utm=x /docs/quickstart /docsearch
interfere.com/docs yes no no no
interfere.com/docs/* no no yes no
interfere.com/docs* yes yes yes yes
Route patterns cannot contain query parameters, and the only way to match a URL
that has one is to end the pattern with a wildcard. So `/docs/*` misses the bare
`/docs`, and a plain `/docs` misses `/docs?utm_source=...` — which any shared or
ad-tagged link will have. `/docs*` is the only single pattern that covers all
three.
The tradeoff is that it also matches a future top-level path starting with
"docs" such as /docsearch. Cloudflare's documented escape hatch is a more
specific route with no script attached, which bypasses Workers for that path.
www is intentionally not listed: www.interfere.com already 301s to the apex with
the path preserved (verified on /docs and /docs/quickstart), so adding a www
route would serve the docs on two hostnames.
Note this route only applies when deployed from the Cloudflare account that owns
the interfere.com zone. `wrangler versions upload` is unaffected since triggers
are applied separately.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
/docs* also matches paths like /docsearch, but nothing on interfere.com starts
with "docs" today, so those are 404s either way and only the 404 page changes.
The precise alternative regresses a working URL:
URL today /docs* /docs + /docs/*
/docs 200 200 200
/docs?utm_source=x 200 200 404 <- regression
/docs/quickstart 200 200 200
/docsthing 404 404 404
Also notes Cloudflare route specificity bug: adding /docs/* alongside /docs*
does nothing, the broader pattern wins even for /docs/quickstart.
https://developers.cloudflare.com/workers/platform/known-issues/
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from Mintlify to HolocronMigrate docs from to HolocronJul 28, 2026
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from to HolocronMigrate docs Jul 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@remorses
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Migrate docs - #11

Open
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron
Open

Migrate docs #11
Tommy D. Rossi (remorses) wants to merge 14 commits into
interfere-inc:mainfrom
remorses:migrate-to-holocron

Conversation

@remorses

@remorsesTommy D. Rossi (remorses) commented Jul 27, 2026

Copy link
Copy Markdown

This migrates the docs site from Mintlify to Holocron, an open-source Mintlify replacement that runs as a Vite plugin.

Preview:https://066d1346-interfere-docs-website.remorses.workers.dev/docs

What changed

  • Replaced mintlify with @holocron.so/vite as a Vite plugin
  • Added vite.config.ts with the holocron plugin
  • Flattened docs.json: inlined the $ref navigation, removed Mintlify-only fields (theme, background, contextual, styling, fonts), updated schema to holocron
  • Added hero section matching the interfere.com homepage layout (side-by-side heading + subtitle)
  • Set InterVariable font globally for body and all headings via style.css
  • Replaced all colored SVG sidebar icons with monochrome lucide icons so they adapt to light/dark mode
  • Added missing icons to pages that didn't have them (quickstart, onboarding, concepts, power-user, home)
  • Moved static assets (icons, images, fonts, sources) into public/

Self-hosted on Cloudflare Workers

The docs are now a worker named interfere-docs-website, served under the /docs base path. No more third-party hosting.

bun install
bunx wrangler login
bun run deploy

No reverse proxy needed

Today interfere.com/docs is reverse-proxied to Mintlify's hosted app (interfere.mintlify.site, confirmed by the x-vercel-project-id and x-matched-path: /_sites/[subdomain]/[[...slug]] response headers). Since interfere.com is already proxied through Cloudflare, that hop can go away entirely: wrangler.jsonc declares a route so the docs are served at the edge.

"routes": [{ "pattern": "interfere.com/docs*", "zone_name": "interfere.com" }]

Routes take precedence over a Custom Domain on the same hostname, so this only affects /docs and leaves the rest of interfere.com alone.

The pattern is /docs*, not /docs/*. Cloudflare route patterns cannot contain query parameters, and the only way to match a URL that has one is to end the pattern with a wildcard:

pattern/docs/docs?utm=x/docs/quickstart/docsearch
interfere.com/docsyesnonono
interfere.com/docs/*nonoyesno
interfere.com/docs*yesyesyesyes

So /docs/* would miss the bare /docs, and a plain /docs would miss any shared or ad-tagged link. The tradeoff is that /docs* also matches a future top-level path starting with "docs"; if that ever comes up, a more specific route with no script attached bypasses Workers for it.

www is intentionally not routed, www.interfere.com already 301s to the apex with the path preserved.

Before merging

  • Deploy must run from the Cloudflare account that owns the interfere.com zone, otherwise the route can't be created
  • Deploying applies the route and cuts /docs over from Mintlify immediately, so the old proxy config (Vercel rewrite, Worker, nginx, or a dashboard Origin Rule) should be removed at the same time

- Replace mintlify with @holocron.so/vite as a Vite plugin
- Add vite.config.ts with holocron() plugin
- Flatten docs.json: inline navigation $ref, remove Mintlify-only fields, update schema to holocron.so
- Add hero section matching interfere.com layout (side-by-side heading + subtitle)
- Set InterVariable font globally for body and all headings via style.css
- Replace all colored SVG sidebar icons with monochrome lucide icons
- Add missing icons to pages without them (quickstart, onboarding, concepts, power-user, home)
- Add public/hero-bg.mp4 for VideoBackgroundShader (currently unused but available)
- Update tsconfig.json for ESM + JSX support
- Switch to pnpm
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@changeset-bot

changeset-botBot commented Jul 27, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: e28d7ec

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Vite only serves static files from public/, not from the project root.
In Mintlify all root files are served as static, so these dirs were at the root.
Moving them into public/ fixes broken images and logos on the deployed site.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The base: /docs config works locally but breaks on holocron.so hosting
because the hosting worker does not strip the base prefix from asset URLs.
A fix is being worked on in a separate session.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The original repo used bun. Remove pnpm-lock.yaml and pnpm-workspace.yaml,
regenerate bun.lock for the Holocron dependencies.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
These are processed image cache files written by the holocron dev server.
They were accidentally committed via git add -A during the initial migration.
Added _holocron to .gitignore to prevent it happening again.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
The VideoBackgroundShader was removed from the hero component.
This video file is no longer referenced anywhere.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Points favicon to the same logo files used in the header,
so the browser tab icon matches the site logo.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Added left padding using CSS grid variables (--grid-nav-width + --grid-gap)
so the hero "Ship software that never breaks" heading starts at the same
horizontal position as "How it works" and all other content headings below.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Removed sidebar+gap padding so hero aligns flush with the left edge.
Reduced top padding from pt-8/lg:pt-16 to pt-4/lg:pt-8.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Adds a self-hosted Cloudflare Workers deployment target for the docs site,
served under the `/docs` base path so it can sit behind a route on the main
domain.
Changes:
- `vite.config.ts` — restore `base: '/docs'` and add `@cloudflare/vite-plugin`
with the `rsc` / `ssr` environment mapping holocron expects
- `wrangler.jsonc` — worker `interfere-docs-website`, entry
`spiceflow/cloudflare-entrypoint`, `nodejs_compat`
- `package.json` — `deploy` script (`vite build && wrangler deploy`) plus
`wrangler` and `@cloudflare/vite-plugin` devDependencies
The `base: '/docs'` config was reverted in ab5156c because holocron.so hosting
did not strip the base prefix on asset lookups. Self-hosting on Workers hits a
different variant of the same problem: Cloudflare's Asset Worker resolves a
request against the uploaded directory tree and deliberately does not strip
Vite's `base` (cloudflare/workers-sdk#11857), so the built HTML referenced
`/docs/assets/*` while the store only held `assets/*`.
That is fixed upstream in `@holocron.so/vite`, which now nests the client build
output under a folder matching the base whenever the Cloudflare plugin is in
use — the layout Cloudflare documents for serving a subdirectory:
dist/client/
.assetsignore
docs/assets/app.js <- GET /docs/assets/app.js, served by the CDN
docs/icons/logo.svg
Deployed and verified: 139 referenced URLs on /docs return 200, same for
/docs/quickstart and /docs/sdk/next-js.
NOTE: requires the upstream holocron patch release; `^0.28.0` does not include
the asset nesting fix yet.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
Picks up the upstream Cloudflare fix that nests the client build output under
the Vite `base`, so `/docs/assets/*` resolves against the uploaded asset tree
instead of 404ing.
Previously the site only deployed correctly with a locally patched holocron
build; 0.29.0 makes a clean `bun install && bun run deploy` produce a working
Worker.
Rebuilt and redeployed, all referenced URLs on /docs and /docs/quickstart
return 200.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorses
Tommy D. Rossi (remorses) marked this pull request as ready for review July 28, 2026 15:29
interfere.com is proxied through Cloudflare, so the docs can be served by a
Worker route at the edge instead of reverse-proxying /docs to a third party.
Routes take precedence over a Custom Domain on the same hostname, so this wins
over whatever serves the rest of interfere.com without touching it.
Pattern choice, per Cloudflare's route matching rules:
pattern /docs /docs?utm=x /docs/quickstart /docsearch
interfere.com/docs yes no no no
interfere.com/docs/* no no yes no
interfere.com/docs* yes yes yes yes
Route patterns cannot contain query parameters, and the only way to match a URL
that has one is to end the pattern with a wildcard. So `/docs/*` misses the bare
`/docs`, and a plain `/docs` misses `/docs?utm_source=...` — which any shared or
ad-tagged link will have. `/docs*` is the only single pattern that covers all
three.
The tradeoff is that it also matches a future top-level path starting with
"docs" such as /docsearch. Cloudflare's documented escape hatch is a more
specific route with no script attached, which bypasses Workers for that path.
www is intentionally not listed: www.interfere.com already 301s to the apex with
the path preserved (verified on /docs and /docs/quickstart), so adding a www
route would serve the docs on two hostnames.
Note this route only applies when deployed from the Cloudflare account that owns
the interfere.com zone. `wrangler versions upload` is unaffected since triggers
are applied separately.
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
/docs* also matches paths like /docsearch, but nothing on interfere.com starts
with "docs" today, so those are 404s either way and only the 404 page changes.
The precise alternative regresses a working URL:
URL today /docs* /docs + /docs/*
/docs 200 200 200
/docs?utm_source=x 200 200 404 <- regression
/docs/quickstart 200 200 200
/docsthing 404 404 404
Also notes Cloudflare route specificity bug: adding /docs/* alongside /docs*
does nothing, the broader pattern wins even for /docs/quickstart.
https://developers.cloudflare.com/workers/platform/known-issues/
Session: ses_05fe1bff8ffe9ZwRSAl373wWS3
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from Mintlify to HolocronMigrate docs from to HolocronJul 28, 2026
@remorsesTommy D. Rossi (remorses) changed the title Migrate docs from to HolocronMigrate docs Jul 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@remorses