Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
142 commits
Select commit Hold shift + click to select a range
65b2284
Update to fumadocs
ArkuVonSymfon Feb 18, 2026
32589f9
update next and fumadocs
ArkuVonSymfon Feb 19, 2026
768f9fd
Update mdx-components.tsx
ArkuVonSymfon Feb 19, 2026
4de1a0c
fix render
ArkuVonSymfon Feb 19, 2026
ddd2c3a
Update source.ts
ArkuVonSymfon Feb 19, 2026
5ceb2b5
Update mdx-components.tsx
ArkuVonSymfon Feb 20, 2026
3eafc06
remove theme config
ArkuVonSymfon Feb 20, 2026
5e2d677
fix homepage navigation
ArkuVonSymfon Feb 20, 2026
7a6600b
fix: upgrade Tailwind CSS v3→v4 and resolve fumadocs-ui CSS issues
ArkuVonSymfon Feb 20, 2026
01f8aff
Merge pull request #3 from Altalogy/claude/practical-greider
ArkuVonSymfon Feb 20, 2026
99863a9
fix pattern
ArkuVonSymfon Feb 23, 2026
c506ae1
fix: center navbar and remove hover background from nav links
ArkuVonSymfon Feb 23, 2026
39244df
Merge pull request #4 from Altalogy/claude/great-liskov
ArkuVonSymfon Feb 23, 2026
dafb23c
tweaks layout
ArkuVonSymfon Feb 23, 2026
b781133
fix: replace Nextra getPagesUnderRoute with Fumadocs server-side data…
ArkuVonSymfon Feb 24, 2026
98f4e6c
fix: extend customers frontmatter schema to expose custom fields to c…
ArkuVonSymfon Feb 24, 2026
9c92e14
fix: add ReactNode import and tighten versionLabel null check in Main…
ArkuVonSymfon Feb 24, 2026
a753894
fix: use .nullish() in customer schema to accept empty YAML frontmatt…
ArkuVonSymfon Feb 24, 2026
a8b0bef
fix: restore Changelog entries and ScrollingDiscussions animation
ArkuVonSymfon Feb 24, 2026
959ea50
fix: handle YAML Date objects in schema and restore shimmer button an…
ArkuVonSymfon Feb 24, 2026
2e1f1e4
fix: resolve animation failures caused by nested CSS var() chain in T…
ArkuVonSymfon Feb 24, 2026
f13cd1c
fix: restore styled details/summary accordion for FAQ sections in MDX
ArkuVonSymfon Feb 24, 2026
1fb7247
fix: ensure summary is a direct child of details in MDX-rendered acco…
ArkuVonSymfon Feb 24, 2026
3ff7b0a
fix: remove underline from testimonial card anchor links
ArkuVonSymfon Feb 24, 2026
4aa34d0
fix: platform badge explicit sizing and remove testimonial link under…
ArkuVonSymfon Feb 24, 2026
5d1da5a
fix: vercel build errors
ArkuVonSymfon Feb 24, 2026
ec0dd76
fix section layout
ArkuVonSymfon Feb 24, 2026
244e578
fix: build config
ArkuVonSymfon Feb 24, 2026
45d0aed
fix: blog render
ArkuVonSymfon Feb 24, 2026
1c83153
fix: changelog render
ArkuVonSymfon Feb 24, 2026
6368dbd
fix: resolve remaining Vercel build errors
ArkuVonSymfon Feb 24, 2026
93d17ab
fix: resolve remaining Vercel build errors
ArkuVonSymfon Feb 24, 2026
cb2fc61
fix: switch build from webpack to Turbopack
ArkuVonSymfon Feb 24, 2026
570065c
fix: switch build from webpack to Turbopack
ArkuVonSymfon Feb 24, 2026
9f15dfc
feat: wider layout for marketing pages and flex row chapter index
ArkuVonSymfon Feb 25, 2026
d499402
feat: wider layout for marketing pages and flex row chapter index
ArkuVonSymfon Feb 25, 2026
0658351
fix: chapter list single column with inline number and title
ArkuVonSymfon Feb 25, 2026
373796d
fix: chapter list single column with inline number and title
ArkuVonSymfon Feb 25, 2026
2b9525c
fix flux layour
ArkuVonSymfon Feb 25, 2026
9f87bc1
fix: customer carousel avatar size and remove text underline
ArkuVonSymfon Feb 25, 2026
c1ce547
fix: customer carousel avatar size and remove text underline
ArkuVonSymfon Feb 25, 2026
ba29692
fix: restore docs sidebar structure and add mobile nav dropdown
ArkuVonSymfon Feb 26, 2026
1352c04
fix: restore docs sidebar structure and add mobile nav dropdown
ArkuVonSymfon Feb 26, 2026
773a5a2
fix: add missing blank lines before </details> in MDX content
ArkuVonSymfon Feb 26, 2026
acec868
fix: center sticky pricing table header row
ArkuVonSymfon Feb 26, 2026
df2b087
Merge branch 'use-fumadocs' into claude/awesome-gauss
ArkuVonSymfon Feb 26, 2026
2ee9063
fix: resolve merge conflict in section layout — use SectionDocsLayout…
ArkuVonSymfon Feb 26, 2026
355e260
Merge pull request #6 from Altalogy/claude/awesome-gauss
ArkuVonSymfon Feb 26, 2026
92c713d
feat: restore MenuSwitcher section nav in docs sidebar + fix sidebar …
ArkuVonSymfon Feb 26, 2026
007a37e
Merge pull request #7 from Altalogy/claude/awesome-gauss
ArkuVonSymfon Feb 26, 2026
1fdea5d
fix: resolve Fumadocs migration regressions
ArkuVonSymfon Feb 27, 2026
d52f5a5
Merge pull request #8 from Altalogy/claude/awesome-gauss
ArkuVonSymfon Feb 27, 2026
948de71
fix: remove invalid renderNavigationPanel prop from DocsLayout
ArkuVonSymfon Feb 27, 2026
eb13d18
fix: destructure value prop explicitly in FumadocsTabsTrigger to sati…
ArkuVonSymfon Feb 27, 2026
507b303
fix: remove Nextra-era newWindow artifacts from meta.json files
ArkuVonSymfon Mar 2, 2026
98dacfe
chore: update GitHub stars count and tsbuildinfo
ArkuVonSymfon Mar 2, 2026
6d09bc6
Merge pull request #9 from Altalogy/claude/awesome-gauss
ArkuVonSymfon Mar 2, 2026
b5b17cf
changes styles and urls
ArkuVonSymfon Mar 2, 2026
32e651b
change layout of sections
ArkuVonSymfon Mar 2, 2026
38967a3
wip: stash before merge
ArkuVonSymfon Mar 2, 2026
85d45d6
Merge remote-tracking branch 'origin/use-fumadocs' into claude/awesom…
ArkuVonSymfon Mar 2, 2026
8f62577
fix: resolve 500 error on section routes (handbook, faq, security, pr…
ArkuVonSymfon Mar 2, 2026
bd861e3
Merge pull request #11 from Altalogy/claude/awesome-gauss
ArkuVonSymfon Mar 3, 2026
df6be0e
build fix
ArkuVonSymfon Mar 3, 2026
e806afd
fix: support Tabs.Tab compound component in MDX
ArkuVonSymfon Mar 3, 2026
5fde4a6
chore: update launch config and tsbuildinfo
ArkuVonSymfon Mar 3, 2026
c471696
fix: wrap WatchWalkthroughs in Suspense to prevent prerender crash
ArkuVonSymfon Mar 3, 2026
7550f01
Merge pull request #12 from Altalogy/claude/awesome-gauss
ArkuVonSymfon Mar 3, 2026
7c8bab0
fix: bring back prose styles to marketing pages
ArkuVonSymfon Mar 3, 2026
818d234
fix: add missing navigation entries to all meta.json files
ArkuVonSymfon Mar 3, 2026
cdd8f66
Merge pull request #13 from Altalogy/claude/awesome-gauss
ArkuVonSymfon Mar 3, 2026
4788c86
fix: replace top-level await metadata with generateMetadata function
ArkuVonSymfon Mar 3, 2026
8dbf219
fix: sidebar z-index and add Copy page button above doc titles
ArkuVonSymfon Mar 3, 2026
f58e458
fix: restore Contributors section in TOC sidebar
ArkuVonSymfon Mar 3, 2026
5c78057
Merge pull request #14 from Altalogy/claude/awesome-gauss
ArkuVonSymfon Mar 3, 2026
1ae8d3a
rev: navbar
tomaszantas Mar 3, 2026
81fc09c
hamburger menu button position
tomaszantas Mar 3, 2026
7e57755
mobile menu
tomaszantas Mar 4, 2026
5a11f2d
feat: disable left sidebar for blog/changelog posts, narrow content w…
ArkuVonSymfon Mar 4, 2026
42c2319
fix: restore right TOC sidebar for blog/changelog posts
ArkuVonSymfon Mar 4, 2026
2772030
fix: constrain blog/changelog article width to max-w-3xl while keepin…
ArkuVonSymfon Mar 4, 2026
8340bef
nav items spacing on tablet
tomaszantas Mar 4, 2026
1643a92
fix: changelog has no sidebars, blog keeps right TOC
ArkuVonSymfon Mar 4, 2026
3473415
Merge pull request #15 from Altalogy/rev/navbar-review-1
tomaszantas Mar 4, 2026
5b3cb7b
fix: add px-12 padding to carousel wrapper so nav arrows don't clip o…
ArkuVonSymfon Mar 4, 2026
adcf104
fix: remove prose margin from carousel avatar images
ArkuVonSymfon Mar 4, 2026
ed06a99
fix: update title in docs page
ArkuVonSymfon Mar 4, 2026
fd4d274
fix: italic quote with left border, reduce logo-to-quote spacing in c…
ArkuVonSymfon Mar 4, 2026
bc7d493
fix: remove italic and left border from carousel quote
ArkuVonSymfon Mar 4, 2026
e43ce6d
fix: remove prose-injected border and padding from carousel quote
ArkuVonSymfon Mar 4, 2026
e791a9a
rev: layout sizing
tomaszantas Mar 4, 2026
a113660
fix: inject arrow inside asChild link so button classes apply to <a> …
ArkuVonSymfon Mar 4, 2026
6f8bef9
Merge pull request #16 from Altalogy/fix-titles
ArkuVonSymfon Mar 4, 2026
ccddec9
fix: guides underline
ArkuVonSymfon Mar 4, 2026
a1fcd91
Merge pull request #17 from Altalogy/rev/docs-layout
tomaszantas Mar 4, 2026
0be93d1
feat: rename /customers to /users throughout
ArkuVonSymfon Mar 4, 2026
725a0b4
fix: hide left sidebar on /users/* pages (same layout as blog posts)
ArkuVonSymfon Mar 4, 2026
e45e8c5
fix: users index uses full-width no-TOC layout, story pages keep righ…
ArkuVonSymfon Mar 4, 2026
987f338
fix: exclude index page from customer story grid
ArkuVonSymfon Mar 4, 2026
4ddd78b
fix: hide fumadocs sidebar controls on post/marketing pages, remove l…
ArkuVonSymfon Mar 4, 2026
67e6b16
fix: hide fumadocs sidebar controls on blog and changelog index layouts
ArkuVonSymfon Mar 4, 2026
6b1607d
feat: add CustomerStoryCTA to all user story pages
ArkuVonSymfon Mar 4, 2026
9fe5ac9
fix: remove left border from CustomerQuote blockquote
ArkuVonSymfon Mar 4, 2026
331dfbc
fix: reduce customer logo size and add date to story page headers
ArkuVonSymfon Mar 4, 2026
4b58a03
fix: restore customer logo height to 81px
ArkuVonSymfon Mar 4, 2026
bc251f9
fix: set customer logo height to h-10 (40px)
ArkuVonSymfon Mar 4, 2026
f4130cd
fix: remove prose margins from Frame/BlogHeader images and align Impa…
ArkuVonSymfon Mar 4, 2026
43bb4ea
fix: remove my-4 from logo wrapper div in BlogHeader
ArkuVonSymfon Mar 4, 2026
92ef354
fix: add not-prose to logo wrapper to prevent prose margin override
ArkuVonSymfon Mar 4, 2026
c6db1c7
fix: add mt-8 to h1 in BlogHeader for space above title
ArkuVonSymfon Mar 4, 2026
ae87895
fix: reduce space between title and description in BlogHeader
ArkuVonSymfon Mar 4, 2026
018970a
fix navigation in docs content layout
ArkuVonSymfon Mar 4, 2026
b75e99f
Merge pull request #18 from Altalogy/fix-guides-underlines
ArkuVonSymfon Mar 4, 2026
ff46b03
Merge pull request #19 from Altalogy/worktree-claude/awesome-gauss
ArkuVonSymfon Mar 4, 2026
bc744a5
Merge pull request #20 from Altalogy/fix-main-content-wrapper
ArkuVonSymfon Mar 4, 2026
4e6c4f8
fix: build issue with hydration <a>
ArkuVonSymfon Mar 4, 2026
67bbf59
fix sidebar and mobile menu
ArkuVonSymfon Mar 5, 2026
ba59e83
Merge pull request #22 from Altalogy/fix-sidebar
ArkuVonSymfon Mar 5, 2026
78fb715
fix: steps styling
ArkuVonSymfon Mar 5, 2026
a5b69cc
rev: sidebar gh links
tomaszantas Mar 4, 2026
428d1d8
theme switcher to footer
tomaszantas Mar 5, 2026
a9a3a49
fix: hide sidebar modal on blog
ArkuVonSymfon Mar 5, 2026
b7689dd
Merge pull request #23 from Altalogy/steps-styling
ArkuVonSymfon Mar 5, 2026
8809fc8
fix: overview link
tomaszantas Mar 5, 2026
473e992
Merge pull request #21 from Altalogy/rev/sidebar-gh-links
ArkuVonSymfon Mar 5, 2026
b8d78b1
Merge pull request #24 from Altalogy/sidebar-modal
ArkuVonSymfon Mar 5, 2026
0d56af2
Merge pull request #25 from Altalogy/fix/overview-link
ArkuVonSymfon Mar 5, 2026
e40f081
fix: remove search from sidebar
ArkuVonSymfon Mar 5, 2026
6e2d8e9
Merge branch 'use-fumadocs' of https://github.com/Altalogy/langfuse-d…
ArkuVonSymfon Mar 5, 2026
d82863a
fix cookbook categories
ArkuVonSymfon Mar 5, 2026
d6338bb
fix: logo link and remove search from sidebar on other pages
ArkuVonSymfon Mar 5, 2026
bc93c70
Merge pull request #26 from Altalogy/fix-cookbook
ArkuVonSymfon Mar 5, 2026
ecdefa1
Merge pull request #27 from Altalogy/fix/logo-link-and-sidebar-search
ArkuVonSymfon Mar 5, 2026
249ab64
rev: mobile menu (#28)
tomaszantas Mar 5, 2026
6efd32c
Merge branch 'use-fumadocs' into to-fumadocs
ArkuVonSymfon Mar 5, 2026
77957f9
Update cs-fde-super-day.mdx
ArkuVonSymfon Mar 5, 2026
eab49df
chore: after merge clean up
tomaszantas Mar 5, 2026
4a85f39
fix: customer carousel fix
tomaszantas Mar 5, 2026
8a5fb43
chore: add missin pr 2603
tomaszantas Mar 5, 2026
875ddd7
Update package.json
ArkuVonSymfon Mar 5, 2026
f7c44e2
Merge pull request #30 from Altalogy/chore/add-missing-2603-pr
ArkuVonSymfon Mar 5, 2026
56bf7bf
Update package.json
ArkuVonSymfon Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 11 additions & 0 deletions .claude/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "dev",
"runtimeExecutable": "pnpm",
"runtimeArgs": ["dev", "--port", "3333", "--hostname", "0.0.0.0"],
"port": 3333
}
]
}
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -123,4 +123,7 @@ fabric.properties
!.idea/codeStyles
!.idea/runConfigurations

# End of https://www.toptal.com/developers/gitignore/api/intellij+all
# End of https://www.toptal.com/developers/gitignore/api/intellij+all

# fumadocs-mdx generated
.source/
124 changes: 124 additions & 0 deletions .source/source.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
// source.config.ts
import { defineDocs, defineConfig, frontmatterSchema } from "fumadocs-mdx/config";
import remarkGfm from "remark-gfm";
import { mdxJsxToMarkdown } from "mdast-util-mdx-jsx";
import { z } from "zod";
var yamlDateField = z.union([
z.string(),
z.date().transform((d) => d.toISOString().split("T")[0])
]).nullish();
var blogFrontmatterSchema = frontmatterSchema.extend({
date: yamlDateField,
tag: z.string().nullish(),
author: z.string().nullish(),
ogImage: z.string().nullish(),
showInBlogIndex: z.boolean().nullish()
});
var changelogFrontmatterSchema = frontmatterSchema.extend({
date: yamlDateField,
author: z.string().nullish(),
ogImage: z.string().nullish()
});
var customerFrontmatterSchema = frontmatterSchema.extend({
// Use .nullish() so empty YAML values (parsed as null) are accepted too
date: yamlDateField,
ogImage: z.string().nullish(),
tag: z.string().nullish(),
author: z.string().nullish(),
customerLogo: z.string().nullish(),
customerLogoDark: z.string().nullish(),
customerQuote: z.string().nullish(),
quoteAuthor: z.string().nullish(),
quoteRole: z.string().nullish(),
quoteCompany: z.string().nullish(),
quoteAuthorImage: z.string().nullish(),
showInCustomerIndex: z.boolean().nullish()
});
var docs = defineDocs({
dir: "content/docs"
});
var selfHosting = defineDocs({
dir: "content/self-hosting"
});
var blog = defineDocs({
dir: "content/blog",
docs: {
schema: blogFrontmatterSchema
}
});
var changelog = defineDocs({
dir: "content/changelog",
docs: {
schema: changelogFrontmatterSchema
}
});
var guidesFrontmatterSchema = frontmatterSchema.extend({
ogImage: z.string().nullish(),
category: z.string().nullish()
});
var guides = defineDocs({
dir: "content/guides",
docs: {
schema: guidesFrontmatterSchema
}
});
var faq = defineDocs({
dir: "content/faq"
});
var integrations = defineDocs({
dir: "content/integrations"
});
var security = defineDocs({
dir: "content/security"
});
var library = defineDocs({
dir: "content/library"
});
var customers = defineDocs({
dir: "content/customers",
docs: {
schema: customerFrontmatterSchema
}
});
var handbook = defineDocs({
dir: "content/handbook"
});
var marketing = defineDocs({
dir: "content/marketing"
});
var source_config_default = defineConfig({
mdxOptions: {
remarkPlugins: [remarkGfm],
providerImportSource: "@/mdx-components",
// Disable remark-image: many content files reference remote images via https://
// and the plugin tries to fetch dimensions at compile time, causing build failures
remarkImageOptions: false,
// Teach remark-structure's mdast-util-to-markdown serializer how to handle
// MDX JSX nodes (mdxJsxFlowElement / mdxJsxTextElement). Without this, it
// throws "Cannot handle unknown node `mdxJsxFlowElement`" when pages contain
// JSX components like <Callout>, <Tabs>, etc.
remarkStructureOptions: {
// @ts-ignore — extensions is valid in mdast-util-to-markdown but the
// StructureOptions type doesn't expose it directly
stringify: { extensions: [mdxJsxToMarkdown()] }
},
// @ts-ignore — { lazy: false } is valid at runtime; RehypeCodeOptions
// requires themes in its full type but fumadocs applies safe defaults
rehypeCodeOptions: { lazy: false }
}
});
export {
blog,
changelog,
customers,
source_config_default as default,
docs,
faq,
guides,
handbook,
integrations,
library,
marketing,
security,
selfHosting
};
98 changes: 98 additions & 0 deletions MIGRATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# Nextra → Fumadocs + App Router Migration

This document describes the migration from Nextra (Pages Router) to Fumadocs (App Router) and the remaining steps to complete it.

## What’s done

1. **Dependencies**
- Replaced `nextra` and `nextra-theme-docs` with `fumadocs-core`, `fumadocs-mdx`, and `fumadocs-ui`.
- Added `@types/mdx` in devDependencies.

2. **Config**
- **`source.config.ts`** – Fumadocs MDX config: `defineDocs({ dir: 'content/docs' })`, `remarkGfm`, `providerImportSource: '@/mdx-components'`.
- **`lib/source.ts`** – Fumadocs source: `loader()` with `docs.toFumadocsSource()`, `baseUrl: '/docs'`.
- **`next.config.mjs`** – Removed Nextra; wrapped config with `createMDX()` from `fumadocs-mdx/next`. All existing options (headers, redirects, rewrites, images, etc.) are unchanged.
- **`tsconfig.json`** – Added path `"fumadocs-mdx:collections/*": [".source/*"]`.

3. **App Router**
- **`app/layout.tsx`** – Root layout: `RootProvider` (from `fumadocs-ui/provider/next`), Geist fonts, global CSS (`style.css`, overrides, Vidstack).
- **`app/page.tsx`** – Temporary home: title + link to `/docs`. Replace with the real landing (e.g. current `<Home />`) when ready.
- **`app/docs/layout.tsx`** – `DocsLayout` with `source.getPageTree()`, nav title “Langfuse”, GitHub link.
- **`app/docs/[[...slug]]/page.tsx`** – Doc page: `source.getPage(slug)`, `page.data.load()`, `DocsPage` + `DocsBody` with MDX and `getMDXComponents()`; `generateMetadata` and `generateStaticParams`.

4. **MDX**
- **`mdx-components.tsx`** – `getMDXComponents` / `useMDXComponents` using `fumadocs-ui/mdx`.

5. **Content**
- **`content/docs/`** – New Fumadocs content root:
- `meta.json` – root meta with `pages: ["index", "observability"]`.
- `index.mdx` – overview doc.
- `observability/meta.json` and `observability/overview.mdx` – sample observability doc.

## Install and peer deps

- Fumadocs MDX 13 expects **Next 15.3+** and **fumadocs-core 15+**. If you stay on Next 15.2.x, use:
- `pnpm install --legacy-peer-deps` (or `npm install --legacy-peer-deps`).
- Optional: upgrade to Next `^15.3.0` to satisfy peer deps without `--legacy-peer-deps`.

## Remaining steps

### 1. Content migration (docs)

- **Done.** Docs live in `content/docs/` with Fumadocs `meta.json`. The former `pages/docs/` content was migrated; `docs-nextra-backup` was removed after verification.

### 2. Other sections (blog, changelog, guides, etc.) — done

- **Done.** All main sections are on App Router:
- **Fumadocs collections** in `source.config.ts`: `selfHosting`, `blog`, `changelog`, `guides`, `faq`, `integrations`, `security`, `library`, `customers`, `handbook`.
- **Content** in `content/<section>/`.
- **App routes**: `app/docs/` (docs), `app/blog/`, `app/changelog/` (index + layout), and `app/[section]/[[...slug]]` for self-hosting, guides, faq, integrations, security, library, customers, handbook.
- **Client loaders** for section MDX: `lib/section-loaders.generated.ts` (generated in prebuild via `scripts/generate-section-loaders.js`).
- **Index components** (`BlogIndex`, `ChangelogIndex`) use `getPagesUnderRoute` from nextra-shim, which now reads from Fumadocs sources via `getPagesForRoute` in `lib/source.ts`.
- **Static marketing pages** are in `content/marketing/` and served via `app/[section]` (section = about, careers, pricing, etc.).

### 3. Replace Nextra usage in components

These (and any others that import from Nextra) need to be updated or replaced:

| File | Nextra usage | Fumadocs / replacement |
|------|--------------|-------------------------|
| `theme.config.tsx` | Entire file | No longer used. Nav/sidebar/footer are in `app/docs/layout.tsx` and Fumadocs layout props. Replicate any custom nav/links in `DocsLayout` (e.g. `nav`, `sidebar`, `links`). |
| `components/*` using `getPagesUnderRoute`, `Page`, `useConfig`, `useTheme` | `nextra/context`, `nextra-theme-docs` | Use `source` from `@/lib/source`: e.g. `source.getPages()`, filter by path; or build custom indexes from `source.getPageTree()`. For theme, use `next-themes` or Fumadocs theme. |
| `nextra/components`: `Cards`, `Tabs`, `Callout` | Nextra components | Use Fumadocs UI: `fumadocs-ui/components/card`, `fumadocs-ui/components/tabs`, `fumadocs-ui/components/callout`, or keep local wrappers that match Fumadocs props. |

Notable components to refactor:

- `components/home/*` (Changelog, etc.) – replace `getPagesUnderRoute` with `source` + path filter.
- `components/blog/BlogIndex.tsx`, `components/changelog/ChangelogIndex.tsx` – same.
- `components/faq/FaqIndex.tsx`, `components/customers/CustomerIndex.tsx`, `components/CookbookIndex.tsx`, `components/VideoIndex.tsx`, `components/integrations/IntegrationIndex.tsx` – same.
- `components/MainContentWrapper.tsx`, `components/LangTabs.tsx`, etc. – remove `useConfig` / Nextra theme; use Fumadocs layout or local state.
- `components/not-found-animation.tsx`, `components/MetabaseDashboard.tsx`, `components/inkeep/useInkeepSettings.ts` – replace `useTheme` with `next-themes` or Fumadocs theme.

### 4. Home and global providers — done

- **`app/page.tsx`** – Uses real `<Home />` from `@/components/home`.
- **Analytics and scripts** – In `app/layout.tsx`: PostHog (via `@/components/analytics/PostHogProvider`), Hubspot, and Cookieyes scripts (production only).

### 5. Remove Pages Router — done

- **Done.** The `pages/` directory has been removed. The site uses **App Router only**.
- All routes are under `app/`; content lives under `content/`. API routes are under `app/api/`.

### 6. Optional: Fumadocs search

- Configure search (e.g. Fumadocs search or Inkeep) in the root layout or docs layout (e.g. `RootProvider` or `DocsLayout` search options), and remove any Nextra search wiring.

## Running the project

- Generate Fumadocs source (usually automatic with Next):
- `npx fumadocs-mdx` (or add to `postinstall` if you want types on install).
- Dev: `pnpm dev` (or `npm run dev`).
- Build: `pnpm build` (or `npm run build`). If you hit peer dependency errors, use `pnpm install --legacy-peer-deps` or upgrade Next as above.

## Reference

- [Fumadocs – Get started](https://fumadocs.dev/docs)
- [Fumadocs MDX – Next.js](https://fumadocs.dev/docs/mdx/next)
- [Fumadocs UI – Docs layout](https://fumadocs.dev/docs/ui/layouts/docs)
- [Fumadocs navigation / meta](https://fumadocs.dev/docs/navigation)
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ You can easily contribute to the docs using GitHub Codespaces. Just click on the

Pre-requisites: Node.js 22, pnpm v9.5.0

To use Node 22 (e.g. with [nvm](https://github.com/nvm-sh/nvm)): `nvm install 22` then `nvm use` (or `nvm use 22`). The repo includes an `.nvmrc` so `nvm use` picks 22 automatically.

1. Optional: Create env based on [.env.template](./.env.template)
2. Run `pnpm i` to install the dependencies.
3. Run `pnpm dev` to start the development server on localhost:3333
Expand Down Expand Up @@ -57,7 +59,7 @@ Interested in stack of Q&A docs chatbot? Checkout the [blog post](https://langfu

The docs site includes four interconnected features designed to make documentation accessible to LLMs and AI tools:

1. **Markdown URL endpoints** (`.md` suffix): Append `.md` to any URL (e.g., `/docs.md`) to get raw markdown. Built at compile time via `scripts/copy_md_sources.js` which copies all `.mdx` files from `/pages` to `/public/md-src/` as static `.md` files with inlined MDX components.
1. **Markdown URL endpoints** (`.md` suffix): Append `.md` to any URL (e.g., `/docs.md`) to get raw markdown. Built at compile time via `scripts/copy_md_sources.js` which copies all `.mdx`/`.md` files from `content/` to `public/md-src/` as static `.md` files with inlined MDX components.

2. **Copy as Markdown button**: UI button on docs pages that fetches the `.md` endpoint and copies to clipboard for pasting into ChatGPT/Claude/Cursor.

Expand Down
9 changes: 9 additions & 0 deletions app/(home)/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Layout } from "@/components/layout";

export default function HomeLayoutRoute({
children,
}: {
children: React.ReactNode;
}) {
return <Layout>{children}</Layout>;
}
5 changes: 5 additions & 0 deletions app/(home)/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { Home } from "@/components/home";

export default function HomePage() {
return <Home />;
}
31 changes: 31 additions & 0 deletions app/(wide)/WideSectionPage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import type { Metadata } from "next";
import { notFound } from "next/navigation";
import { SECTION_CONFIG, WIDE_SECTIONS } from "@/lib/sections";
import type { WideSectionSlug } from "@/lib/sections";
import { SectionDocBodyClient } from "@/app/[section]/SectionDocBodyClient";

export async function generateWideSectionMetadata(section: WideSectionSlug): Promise<Metadata> {
const config = SECTION_CONFIG[section as keyof typeof SECTION_CONFIG];
const page = config.source.getPage([section]);
if (!page) return { title: "Not Found" };
return {
title: page.data.title,
description: page.data.description ?? undefined,
};
}

type Props = { section: WideSectionSlug };

export default async function WideSectionPage({ section }: Props) {
if (!WIDE_SECTIONS.has(section)) notFound();
const config = SECTION_CONFIG[section as keyof typeof SECTION_CONFIG];
const page = config.source.getPage([section]);
if (!page) notFound();

return (
<SectionDocBodyClient
collection={config.collection}
slugPromise={Promise.resolve({ slug: [section] })}
/>
);
}
20 changes: 20 additions & 0 deletions app/(wide)/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Layout } from "@/components/layout";
import { MainContentWrapper } from "@/components/MainContentWrapper";

/**
* Layout for wide marketing sections (pricing, enterprise, etc.) that have
* their own route folders. No sidebar, no prose, max-w-7xl content.
*/
export default function WideSectionLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<Layout>
<div className="mx-auto w-full max-w-7xl px-4 py-6 sm:px-6 lg:px-8">
<MainContentWrapper>{children}</MainContentWrapper>
</div>
</Layout>
);
}
10 changes: 10 additions & 0 deletions app/(wide)/pricing-self-host/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import WideSectionPage, { generateWideSectionMetadata } from "../WideSectionPage";

export async function generateMetadata(): Promise<Metadata> {
return generateWideSectionMetadata("pricing-self-host");
}

export default function Page() {
return <WideSectionPage section="pricing-self-host" />;
}
10 changes: 10 additions & 0 deletions app/(wide)/pricing/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import WideSectionPage, { generateWideSectionMetadata } from "../WideSectionPage";

export async function generateMetadata(): Promise<Metadata> {
return generateWideSectionMetadata("pricing");
}

export default function Page() {
return <WideSectionPage section="pricing" />;
}
10 changes: 10 additions & 0 deletions app/(wide)/startups/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import WideSectionPage, { generateWideSectionMetadata } from "../WideSectionPage";

export async function generateMetadata(): Promise<Metadata> {
return generateWideSectionMetadata("startups");
}

export default function Page() {
return <WideSectionPage section="startups" />;
}
10 changes: 10 additions & 0 deletions app/(wide)/talk-to-us/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import WideSectionPage, { generateWideSectionMetadata } from "../WideSectionPage";

export async function generateMetadata(): Promise<Metadata> {
return generateWideSectionMetadata("talk-to-us");
}

export default function Page() {
return <WideSectionPage section="talk-to-us" />;
}
10 changes: 10 additions & 0 deletions app/(wide)/watch-demo/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import WideSectionPage, { generateWideSectionMetadata } from "../WideSectionPage";

export async function generateMetadata(): Promise<Metadata> {
return generateWideSectionMetadata("watch-demo");
}

export default function Page() {
return <WideSectionPage section="watch-demo" />;
}
Loading