Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
462fae5
feat: serve every page as Markdown at its own URL + .md
aquaticcalf Aug 5, 2026
8073156
feat: add Copy Markdown and Open page actions
aquaticcalf Aug 5, 2026
77d8cc5
feat: structural MDX-to-markdown with URL/label surfacing
aquaticcalf Aug 5, 2026
76ccba4
feat: render page title above copy/open actions
aquaticcalf Aug 5, 2026
8822a65
fix: use prompt param for ChatGPT share link
aquaticcalf Aug 5, 2026
874e6c0
refactor: consolidate AI tool links into a data registry
aquaticcalf Aug 5, 2026
f036dc5
feat: add Google (AI Overview) link to AI tools
aquaticcalf Aug 5, 2026
17d21c4
feat: rename AI tool labels to Ask <tool>
aquaticcalf Aug 5, 2026
3df94e2
feat: two-column AI menu, Google/openCode tools, mobile overflow fix
aquaticcalf Aug 5, 2026
c5546f5
feat: copy terminal commands for OpenCode/Claude Code, fix menu layout
aquaticcalf Aug 5, 2026
0743019
feat: copy icon + clearer labels for command tools
aquaticcalf Aug 5, 2026
018db8a
feat: shorten command tool labels
aquaticcalf Aug 5, 2026
2e3f973
fix: give left AI menu column matching gutter off the divider
aquaticcalf Aug 5, 2026
a277e11
feat: add Codex and Antigravity CLI command tools
aquaticcalf Aug 5, 2026
bfba505
feat: monochrome brand icons for AI tools, VS Code MCP fix, icon wiggle
aquaticcalf Aug 8, 2026
62c540b
feat: confetti on copy + copied-state polish
aquaticcalf Aug 8, 2026
070c50d
refactor: code review cleanup
aquaticcalf Aug 8, 2026
bce023c
chore: gitignore log files (dev server output)
aquaticcalf Aug 8, 2026
ce35f12
refactor: dedupe glyphs/clipboard helpers, tokenize confetti colors
aquaticcalf Aug 8, 2026
0ac38eb
fix: cap mobile Open menu width to 80vw
aquaticcalf Aug 8, 2026
a65a28a
fix(security): patch 4 advisories in the lockfile (3 high, 1 moderate)
CharanMN7 Aug 11, 2026
5c18b2d
fix(security): bump archived templates to next 16.2.12 (54 Dependabot…
CharanMN7 Aug 11, 2026
2143b95
docs(archive): record why archived templates don't build, and why the…
CharanMN7 Aug 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public/_pagefind/
# misc
.DS_Store
*.pem
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
Expand Down
45 changes: 45 additions & 0 deletions archive/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Archived templates

The six themes here — `aurora`, `base`, `cedar`, `fern`, `galley`, `mono` —
are the pre-0.4.0 template set, kept as a historical reference. They were
archived in `8245b0a`. The templates the CLI actually scaffolds from live in
`../templates` (`canopy`, `galley`, `shadcn`).

## These do not build as-is

Each of the six depends on `@inkform/framework: ^0.3.0`. On a 0.x version a
caret range cannot cross the minor, so `^0.3.0` resolves to the published
`0.3.0` — while the source in these directories was written against the
newer API that shipped in `0.4.0`. A standalone `npm install && npm run
build` in any of them fails at module resolution:

Module not found: Can't resolve '@inkform/framework/ai'
Module not found: Can't resolve '@inkform/framework/openapi-render'
Module not found: Can't resolve '@inkform/framework/openapi-engine/nav'
Module not found: Can't resolve '@inkform/framework/openapi-engine/parse'

`tsc --noEmit` fails for the same reason, plus two API-shape mismatches: the
templates pass a `contentType` prop to `DocsShell` and read `apiReference`
off `DocsTab`, neither of which exists in 0.3.0.

This is expected for archived code and is **not** a regression. It is
recorded here so the next person to open this directory doesn't spend time
diagnosing it, and so a current-looking dependency version isn't mistaken
for a maintained template.

Reviving one of these means re-pointing it at `@inkform/framework: ^0.4.0`
and reconciling the template source with the 0.4.0 API — see
[`../MIGRATION.md`](../MIGRATION.md) and the 0.4.0 entry in
[`../CHANGELOG.md`](../CHANGELOG.md).

## Why dependency versions here still get bumped

`archive/templates/*` is outside the root `package.json`'s `workspaces`
array, so nothing here is installed, typechecked, or built by `npm ci` or by
CI. But Dependabot reads every `package.json` in the repo regardless, so
these six manifests still raise alerts and still need patching — as of the
Next.js 16.2.12 bump they accounted for 54 of the repo's 60 open alerts.

Bumping a version string here is therefore an alert-hygiene change with no
effect on any build. It does not imply the template was retested; the
breakage described above applies before and after.
2 changes: 1 addition & 1 deletion archive/templates/aurora/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"dependencies": {
"@inkform/framework": "^0.3.0",
"lucide-react": "^0.483.0",
"next": "16.2.10",
"next": "16.2.12",
"react": "19.2.1",
"react-dom": "19.2.1"
},
Expand Down
2 changes: 1 addition & 1 deletion archive/templates/base/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"dependencies": {
"@inkform/framework": "^0.3.0",
"lucide-react": "^0.483.0",
"next": "16.2.10",
"next": "16.2.12",
"react": "19.2.1",
"react-dom": "19.2.1"
},
Expand Down
2 changes: 1 addition & 1 deletion archive/templates/cedar/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"dependencies": {
"@inkform/framework": "^0.3.0",
"lucide-react": "^0.483.0",
"next": "16.2.10",
"next": "16.2.12",
"react": "19.2.1",
"react-dom": "19.2.1"
},
Expand Down
2 changes: 1 addition & 1 deletion archive/templates/fern/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"dependencies": {
"@inkform/framework": "^0.3.0",
"lucide-react": "^0.483.0",
"next": "16.2.10",
"next": "16.2.12",
"react": "19.2.1",
"react-dom": "19.2.1"
},
Expand Down
2 changes: 1 addition & 1 deletion archive/templates/galley/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"dependencies": {
"@inkform/framework": "^0.3.0",
"lucide-react": "^0.483.0",
"next": "16.2.10",
"next": "16.2.12",
"react": "19.2.1",
"react-dom": "19.2.1"
},
Expand Down
2 changes: 1 addition & 1 deletion archive/templates/mono/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"dependencies": {
"@inkform/framework": "^0.3.0",
"lucide-react": "^0.483.0",
"next": "16.2.10",
"next": "16.2.12",
"react": "19.2.1",
"react-dom": "19.2.1"
},
Expand Down
9 changes: 7 additions & 2 deletions examples/inkform-docs/app/[[...slug]]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { notFound } from 'next/navigation';
import { Mdx } from '@inkform/framework/mdx';
import { DocsShell, TocList, Pagination } from '@inkform/framework/docs-shell';
import { PageActions } from '@inkform/framework/page-actions';
import { docNeighbours } from '@inkform/framework';
import { loadDocsConfig, extractHeadings } from '@inkform/framework/content';
import { loadDocsConfig, extractHeadings, stripLeadingH1 } from '@inkform/framework/content';
import { siteMdxComponents } from '@/mdx-components';
import { buildTopBar } from '@/components/top-bar';
import { CollapsibleSidebar } from '@/components/collapsible-sidebar';
Expand Down Expand Up @@ -57,7 +58,11 @@ export default async function Page({ params }: { params: Promise<{ slug?: string
toc={headings.length > 0 ? <TocList headings={headings} /> : undefined}
hideToc={headings.length === 0}
>
<Mdx source={page.content} components={siteMdxComponents} />
<PageActions
title={ref.title}
markdownUrl={ref.slug === '' ? '/index.md' : `/${ref.slug}.md`}
/>
<Mdx source={stripLeadingH1(page.content)} components={siteMdxComponents} />
Comment thread
CharanMN7 marked this conversation as resolved.
<Pagination
prev={prev ? { title: prev.title, href: '/' + prev.slug } : null}
next={next ? { title: next.title, href: '/' + next.slug } : null}
Expand Down
16 changes: 16 additions & 0 deletions examples/inkform-docs/app/markdown/[[...slug]]/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { createMarkdownHandler } from '@inkform/framework/markdown';
import { apiBasePath, loadDocsConfig } from '@/lib/route';

export const runtime = 'nodejs';

/**
* GET <slug>.md — any page as Markdown, served at the page's own URL plus a
* `.md` extension (e.g. /getting-started/quickstart.md). Index = /index.md.
* API operations resolve as /<apiBase>/operations/<operationId>.md; blog and
* changelog entries as /blog/<slug>.md and /changelog/<slug>.md. Unknown
* pages 404.
*/
const config = loadDocsConfig();
const apiBase = config && apiBasePath(config);

export const GET = createMarkdownHandler({ apiBasePath: apiBase ?? undefined });
10 changes: 10 additions & 0 deletions examples/inkform-docs/proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ import slugHistory from './content/docs/slug-history.json';

/** Docs are served at the root, so slug-history redirects use the '/' base. */
export function proxy(req: NextRequest) {
// Any page is also reachable as Markdown by appending `.md` to its own URL
// (e.g. /quickstart.md). Route those to the internal markdown handler; the
// `NextResponse.rewrite` keeps the `.md` URL in the address bar while the
// response comes from app/markdown/[[...slug]]/route.ts.
const { pathname } = req.nextUrl;
if (pathname.endsWith('.md') && pathname !== '/markdown' && !pathname.startsWith('/markdown/')) {
const slug = pathname.slice(1, -3);
return NextResponse.rewrite(new URL(`/markdown/${slug}`, req.url));
}

const target = resolveSlugRedirect(
req.nextUrl.pathname,
slugHistory as Record<string, string>,
Expand Down
9 changes: 7 additions & 2 deletions examples/markdown-docs/app/[[...slug]]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { notFound } from 'next/navigation';
import { Mdx } from '@inkform/framework/mdx';
import { DocsShell, TocList, Pagination } from '@inkform/framework/docs-shell';
import { PageActions } from '@inkform/framework/page-actions';
import { docNeighbours } from '@inkform/framework';
import { loadDocsConfig, extractHeadings } from '@inkform/framework/content';
import { loadDocsConfig, extractHeadings, stripLeadingH1 } from '@inkform/framework/content';
import { siteMdxComponents } from '@/mdx-components';
import { buildTopBar } from '@/components/top-bar';
import { CollapsibleSidebar } from '@/components/collapsible-sidebar';
Expand Down Expand Up @@ -57,7 +58,11 @@ export default async function Page({ params }: { params: Promise<{ slug?: string
toc={headings.length > 0 ? <TocList headings={headings} /> : undefined}
hideToc={headings.length === 0}
>
<Mdx source={page.content} components={siteMdxComponents} />
<PageActions
title={ref.title}
markdownUrl={ref.slug === '' ? '/index.md' : `/${ref.slug}.md`}
/>
<Mdx source={stripLeadingH1(page.content)} components={siteMdxComponents} />
<Pagination
prev={prev ? { title: prev.title, href: '/' + prev.slug } : null}
next={next ? { title: next.title, href: '/' + next.slug } : null}
Expand Down
16 changes: 16 additions & 0 deletions examples/markdown-docs/app/markdown/[[...slug]]/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { createMarkdownHandler } from '@inkform/framework/markdown';
import { apiBasePath, loadDocsConfig } from '@/lib/route';

export const runtime = 'nodejs';

/**
* GET <slug>.md — any page as Markdown, served at the page's own URL plus a
* `.md` extension (e.g. /quickstart.md, /concepts/pagination.md). Index =
* /index.md. API operations resolve as
* /<apiBase>/operations/<operationId>.md; blog and changelog entries as
* /blog/<slug>.md and /changelog/<slug>.md. Unknown pages 404.
*/
const config = loadDocsConfig();
const apiBase = config && apiBasePath(config);

export const GET = createMarkdownHandler({ apiBasePath: apiBase ?? undefined });
10 changes: 10 additions & 0 deletions examples/markdown-docs/proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ import slugHistory from './content/docs/slug-history.json';

/** Docs are served at the root, so slug-history redirects use the '/' base. */
export function proxy(req: NextRequest) {
// Any page is also reachable as Markdown by appending `.md` to its own URL
// (e.g. /quickstart.md). Route those to the internal markdown handler; the
// `NextResponse.rewrite` keeps the `.md` URL in the address bar while the
// response comes from app/markdown/[[...slug]]/route.ts.
const { pathname } = req.nextUrl;
if (pathname.endsWith('.md') && pathname !== '/markdown' && !pathname.startsWith('/markdown/')) {
const slug = pathname.slice(1, -3);
return NextResponse.rewrite(new URL(`/markdown/${slug}`, req.url));
}

const target = resolveSlugRedirect(
req.nextUrl.pathname,
slugHistory as Record<string, string>,
Expand Down
9 changes: 7 additions & 2 deletions examples/pokeapi-docs/app/[[...slug]]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { notFound } from 'next/navigation';
import { Mdx } from '@inkform/framework/mdx';
import { DocsShell, TocList, Pagination } from '@inkform/framework/docs-shell';
import { PageActions } from '@inkform/framework/page-actions';
import { docNeighbours } from '@inkform/framework';
import { loadDocsConfig, extractHeadings } from '@inkform/framework/content';
import { loadDocsConfig, extractHeadings, stripLeadingH1 } from '@inkform/framework/content';
import { siteMdxComponents } from '@/mdx-components';
import { buildTopBar } from '@/components/top-bar';
import { CollapsibleSidebar } from '@/components/collapsible-sidebar';
Expand Down Expand Up @@ -57,7 +58,11 @@ export default async function Page({ params }: { params: Promise<{ slug?: string
toc={headings.length > 0 ? <TocList headings={headings} /> : undefined}
hideToc={headings.length === 0}
>
<Mdx source={page.content} components={siteMdxComponents} />
<PageActions
title={ref.title}
markdownUrl={ref.slug === '' ? '/index.md' : `/${ref.slug}.md`}
/>
<Mdx source={stripLeadingH1(page.content)} components={siteMdxComponents} />
<Pagination
prev={prev ? { title: prev.title, href: '/' + prev.slug } : null}
next={next ? { title: next.title, href: '/' + next.slug } : null}
Expand Down
16 changes: 16 additions & 0 deletions examples/pokeapi-docs/app/markdown/[[...slug]]/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { createMarkdownHandler } from '@inkform/framework/markdown';
import { apiBasePath, loadDocsConfig } from '@/lib/route';

export const runtime = 'nodejs';

/**
* GET <slug>.md — any page as Markdown, served at the page's own URL plus a
* `.md` extension (e.g. /quickstart.md, /concepts/pagination.md). Index =
* /index.md. API operations resolve as
* /<apiBase>/operations/<operationId>.md; blog and changelog entries as
* /blog/<slug>.md and /changelog/<slug>.md. Unknown pages 404.
*/
const config = loadDocsConfig();
const apiBase = config && apiBasePath(config);

export const GET = createMarkdownHandler({ apiBasePath: apiBase ?? undefined });
10 changes: 10 additions & 0 deletions examples/pokeapi-docs/proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ import slugHistory from './content/docs/slug-history.json';

/** Docs are served at the root, so slug-history redirects use the '/' base. */
export function proxy(req: NextRequest) {
// Any page is also reachable as Markdown by appending `.md` to its own URL
// (e.g. /quickstart.md). Route those to the internal markdown handler; the
// `NextResponse.rewrite` keeps the `.md` URL in the address bar while the
// response comes from app/markdown/[[...slug]]/route.ts.
const { pathname } = req.nextUrl;
if (pathname.endsWith('.md') && pathname !== '/markdown' && !pathname.startsWith('/markdown/')) {
const slug = pathname.slice(1, -3);
return NextResponse.rewrite(new URL(`/markdown/${slug}`, req.url));
}

const target = resolveSlugRedirect(
req.nextUrl.pathname,
slugHistory as Record<string, string>,
Expand Down
25 changes: 12 additions & 13 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
"prettier": "^3.5.1"
},
"overrides": {
"js-yaml": "^3.15.0",
"js-yaml": "^3.15.1",
"next": {
"postcss": "8.5.23",
"sharp": "0.35.3"
Expand Down
2 changes: 2 additions & 0 deletions packages/framework/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,15 @@
"./ai": "./src/ai/index.ts",
"./llms-txt": "./src/llms-txt.ts",
"./mdx": "./src/mdx.tsx",
"./markdown": "./src/markdown.ts",
"./components": "./src/components.tsx",
"./docs-shell": "./src/docs-shell.tsx",
"./scalar-theme": "./src/scalar-theme.ts",
"./search-dialog": "./src/search-dialog.tsx",
"./pagefind-highlight": "./src/pagefind-highlight-mount.tsx",
"./ask-ai": "./src/ask-ai.tsx",
"./ai-tool-menu": "./src/ai-tool-menu.tsx",
"./page-actions": "./src/page-actions.tsx",
"./theme-toggle": "./src/theme-toggle.tsx",
"./subscribe-form": "./src/subscribe-form.tsx",
"./analytics-script": "./src/analytics-script.tsx",
Expand Down
Loading
Loading