-
- )
-}
-
-export default AuthorPage
diff --git a/components/Author/AuthorProfile.tsx b/components/Author/AuthorProfile.tsx
deleted file mode 100644
index 8c5fb3a..0000000
--- a/components/Author/AuthorProfile.tsx
+++ /dev/null
@@ -1,131 +0,0 @@
-import { useEffect, useState } from 'react'
-import { getPagesUnderRoute } from 'nextra/context'
-import { type Page } from 'nextra'
-import { SocialIcon } from 'react-social-icons'
-import BlogCard from '../blog/BlogCard'
-import Image from 'next/image'
-import { Cards } from 'nextra/components'
-import { OurAuthors, Blog } from '@/components/CardIcons'
-
-// Known issues:
-// - Mobile: social icons overflow when author has more than 4 social links
-// - SocialIcon uses the generic "share" icon when the platform is unrecognized
-// - "Recent Posts by" section does not support filtering by tag
-// - Profile image positioning is off when the author has no bio text
-
-interface AuthorMetadata {
- authorid: string
- subtitle: string
- name: string
- bio: string
- ogImage: string
- socials?: Record // Dynamically match social media platforms
- date: string | number | Date
-}
-
-interface AuthorProfileProps {
- authorId: string
-}
-
-const AuthorProfile: React.FC = ({ authorId }) => {
- const authors = getPagesUnderRoute('/authors') as Array
- const author = authors.find((a) => a.frontMatter.authorid === authorId)?.frontMatter
- const blogPosts = getPagesUnderRoute('/blog') as Array
-
- // Filter posts by the current authorId
- const authorPosts = blogPosts.filter((post) => post.frontMatter.authorid === authorId)
- const sortedAuthorPosts = authorPosts.sort(
- (a, b) => new Date(b.frontMatter.date).getTime() - new Date(a.frontMatter.date).getTime(),
- )
-
- // State to track whether the component is rendered on the client side
- const [isClient, setIsClient] = useState(false)
-
- useEffect(() => {
- setIsClient(true)
- }, [])
-
- if (!author) {
- return
- {`Effective Date: ${currentDate}
-
-This Privacy Policy outlines how the LibreChat documentation website (`}{' '}
- https://librechat.ai
- {`) operates with respect to user privacy.
-
-1. No Data Collection
-
-We do not collect, store, or process any personal information when you visit our documentation site. This includes:
-- No collection of names, email addresses, or contact information
-- No use of cookies or tracking technologies
-- No analytics or usage tracking
-- No user accounts or authentication
-
-2. Purpose of This Site
-
-This website serves solely as documentation for the open-source LibreChat project. It provides:
-- Installation guides
-- Configuration documentation
-- API references
-- User guides
-- Contributing guidelines
-
-3. External Links
-
-Our documentation may contain links to external websites, including:
-- The LibreChat GitHub repository
-- Third-party service documentation
-- Community resources
-
-We are not responsible for the privacy practices of these external sites.
-
-4. Changes to This Policy
-
-We may update this privacy policy to reflect changes in our practices or for clarity. Any updates will be posted on this page with an updated effective date.
-
-5. Contact Information
-
-For questions about this privacy policy or the LibreChat project, please visit our GitHub repository at`}{' '}
-
- https://github.com/danny-avila/LibreChat
-
- {`.
-
-By using this documentation site, you acknowledge that no personal data is collected or processed.`}
-
- {`Effective Date: ${currentDate}
-
-Welcome to the LibreChat documentation website, available at `}{' '}
- https://librechat.ai
- {`. These Terms of Service ("Terms") govern your use of our documentation website.
-
-1. Purpose and Scope
-
-This website provides documentation for LibreChat, an open-source AI chat platform. The site is purely informational and includes:
-- Technical documentation
-- Installation and setup guides
-- Configuration references
-- API documentation
-- Contributing guidelines
-- Blog posts related to LibreChat
-
-2. No Commercial Services
-
-This documentation site:
-- Does not sell any products or services
-- Does not require payment for access
-- Does not collect user data or personal information
-- Does not require user registration or accounts
-
-3. Open Source Project
-
-LibreChat is an open-source project licensed under the MIT License. The source code is available at:`}{' '}
-
- https://github.com/danny-avila/LibreChat
-
- {`
-
-4. Use of Documentation
-
-You may freely:
-- Access and read all documentation
-- Share links to the documentation
-- Use the documentation to implement and configure LibreChat
-- Contribute improvements to the documentation via GitHub
-
-5. No Warranty
-
-This documentation is provided "as is" without warranty of any kind. While we strive for accuracy, we make no guarantees about:
-- The completeness or accuracy of the documentation
-- The suitability of LibreChat for any particular purpose
-- The availability of this documentation site
-
-6. External Resources
-
-Our documentation may reference or link to third-party services, tools, or resources. We are not responsible for:
-- The content or practices of external sites
-- The availability of external resources
-- Any issues arising from the use of third-party services
-
-7. Intellectual Property
-
-The documentation content is licensed under the MIT License, consistent with the LibreChat project. You are free to use, modify, and distribute the documentation in accordance with this license.
-
-8. Changes to Terms
-
-We may update these terms to reflect changes in the project or for clarity. Updates will be posted on this page with a new effective date.
-
-9. Contact
-
-For questions about these terms or to contribute to the project, please visit:`}{' '}
-
- https://github.com/danny-avila/LibreChat
-
- {`
-
-By using this documentation site, you agree to these Terms of Service.`}
-
- {`Effective Date: ${currentDate}
-
-1. No Cookies Used
-
-The LibreChat documentation website (`}{' '}
- https://librechat.ai
- {`) does not use cookies or any similar tracking technologies.
-
-2. No Data Collection
-
-We do not:
-- Set or read cookies
-- Use web beacons or tracking pixels
-- Employ analytics or tracking scripts
-- Collect any personal information
-- Track user behavior or preferences
-
-3. Third-Party Services
-
-While our site does not use cookies, please note:
-- External links may lead to sites that use cookies
-- Your browser may have its own cookie settings
-- We are not responsible for cookies set by external sites
-
-4. Browser Storage
-
-This documentation site may use browser features like:
-- Local storage for theme preferences (light/dark mode)
-- Session storage for navigation state
-
-This data is stored only in your browser and is never transmitted to any server.
-
-5. Your Privacy
-
-Since we don't use cookies or collect data:
-- There's nothing to opt out of
-- No personal information is at risk
-- Your browsing is completely private
-
-6. Changes to This Policy
-
-Any updates to this policy will be posted here with a new effective date. However, we do not anticipate adding cookies or tracking to this documentation site.
-
-7. Contact
-
-For questions about this policy or the LibreChat project, visit:`}{' '}
-
- https://github.com/danny-avila/LibreChat
-
- {`
-
-By using this site, you acknowledge that no cookies or tracking technologies are employed.`}
-
-}
-
-function Frame({ children }: ChildrenProps) {
- return
{children}
-}
-
-const components: Record> = {
- Callout,
- Steps,
- Tabs,
- Tab,
- Cards,
- Card,
- FileTree,
- OptionTable,
- Button,
- Carousel,
- Frame,
-}
-
-export function useMDXComponents(existing: Record> = {}) {
- return { ...components, ...existing }
-}
-
-export function MDXProvider({ children }: { children: ReactNode }) {
- return <>{children}>
-}
diff --git a/lib/nextra-shims/meta-loader.cjs b/lib/nextra-shims/meta-loader.cjs
deleted file mode 100644
index 4356a93..0000000
--- a/lib/nextra-shims/meta-loader.cjs
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * Webpack loader that replaces Nextra _meta.ts file content with a
- * dummy React component default export. This prevents Next.js from
- * failing during build optimization when it expects all files in
- * pages/ to export a React component.
- *
- * This shim is temporary and will be removed once all pages/ content
- * is migrated to the Fumadocs app/ directory.
- */
-module.exports = function metaLoader() {
- return `
- export default function MetaPlaceholder() { return null; }
- export const getStaticProps = () => ({ notFound: true });
- `;
-};
diff --git a/lib/nextra-shims/theme-docs.tsx b/lib/nextra-shims/theme-docs.tsx
deleted file mode 100644
index c1fc726..0000000
--- a/lib/nextra-shims/theme-docs.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * Nextra compatibility shim for `nextra-theme-docs`.
- * Provides stub implementations so existing pages/ components
- * can resolve their imports during the migration to Fumadocs.
- */
-import type { ReactNode } from 'react'
-
-interface ChildrenProps {
- children?: ReactNode
- [key: string]: any
-}
-
-export type DocsThemeConfig = Record
-
-export function useConfig(): any {
- return {
- title: '',
- frontMatter: {},
- }
-}
-
-// eslint-disable-next-line @typescript-eslint/no-unused-vars
-export function ThemeSwitch(props: any) {
- return null
-}
-
-export function Link({ children, href, ...props }: ChildrenProps & { href?: string }) {
- return (
-
- {children}
-
- )
-}
diff --git a/next.config.mjs b/next.config.mjs
index 11d8520..d5e7f17 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -59,15 +59,10 @@ const nonPermanentRedirects = [
['/docs/user_guides/plugins', '/docs/features/agents'],
['/docs/features/plugins', '/docs/features/agents'],
['/docs/configuration/librechat_yaml/setup', '/docs/configuration/librechat_yaml'],
+ ['/toolkit/yaml_checker', '/toolkit/yaml-checker'],
+ ['/toolkit/creds_generator', '/toolkit/creds-generator'],
];
-/**
- * Nextra compatibility shims - redirect nextra imports to local stubs
- * so the existing pages/ directory can build during the Fumadocs migration.
- * These will be removed once all pages/ content is migrated to app/.
- */
-const nextraShims = resolve(process.cwd(), 'lib/nextra-shims');
-
/** @type {import('next').NextConfig} */
const config = {
typescript: {
@@ -76,15 +71,6 @@ const config = {
turbopack: {},
pageExtensions: ['mdx', 'md', 'jsx', 'js', 'tsx', 'ts'],
webpack(webpackConfig, options) {
- // Nextra compatibility: redirect nextra imports to local shims
- webpackConfig.resolve.alias = {
- ...webpackConfig.resolve.alias,
- 'nextra/context': resolve(nextraShims, 'context.tsx'),
- 'nextra/components': resolve(nextraShims, 'components.tsx'),
- nextra: resolve(nextraShims, 'index.ts'),
- 'nextra-theme-docs': resolve(nextraShims, 'theme-docs.tsx'),
- };
-
/**
* Fumadocs MDX loader: only applied to content/ directory files.
* These are processed by fumadocs-mdx for the app/ router docs.
@@ -105,37 +91,24 @@ const config = {
});
/**
- * Basic MDX loader for pages/ directory and components/ directory files.
- * Provides minimal MDX compilation so existing pages/ content
- * can compile during the migration period.
- * Uses a custom providerImportSource that provides the same
- * components Nextra used to auto-inject (Callout, Steps, etc.).
+ * MDX loader for components/ directory files.
+ * These are MDX files imported directly as React components
+ * (e.g. changelog content, repeated sections).
*/
webpackConfig.module.rules.push({
test: /\.mdx?$/,
- include: [resolve(process.cwd(), 'pages'), resolve(process.cwd(), 'components')],
+ include: [resolve(process.cwd(), 'components')],
use: [
options.defaultLoaders.babel,
{
loader: '@mdx-js/loader',
options: {
- providerImportSource: resolve(process.cwd(), 'lib/nextra-shims/mdx-components.tsx'),
+ providerImportSource: resolve(process.cwd(), 'lib/mdx-provider.ts'),
},
},
],
});
- /**
- * Replace Nextra _meta files with a dummy React component export
- * so Next.js doesn't fail when encountering them as pages.
- */
- webpackConfig.module.rules.push({
- test: /pages[\\/].*_meta\.(ts|js|tsx|jsx)$/,
- use: {
- loader: resolve(process.cwd(), 'lib/nextra-shims/meta-loader.cjs'),
- },
- });
-
return webpackConfig;
},
transpilePackages: ['react-tweet', 'geist'],
diff --git a/package.json b/package.json
index 55489d0..99a65fb 100644
--- a/package.json
+++ b/package.json
@@ -17,9 +17,9 @@
"homepage": "https://www.librechat.ai",
"dependencies": {
"@glidejs/glide": "^3.6.0",
- "@hookform/resolvers": "^3.3.4",
"@mdx-js/loader": "^3.1.1",
"@mdx-js/react": "^3.1.1",
+ "@hookform/resolvers": "^3.3.4",
"@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-avatar": "^1.0.4",
"@radix-ui/react-dialog": "^1.0.5",
@@ -114,7 +114,7 @@
"lint-staged": {
"*.{ts,tsx,js,jsx}": [
"prettier --write",
- "eslint --fix"
+ "cross-env ESLINT_USE_FLAT_CONFIG=false eslint --fix"
]
}
}
diff --git a/pages/404.mdx b/pages/404.mdx
deleted file mode 100644
index 1a30132..0000000
--- a/pages/404.mdx
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-# 404: Page Not Found
-
-# 🤷
-
-[Submit an issue about broken links ↗](https://github.com/LibreChat-AI/librechat.ai/issues/new?title=Found%20broken%20%60%2Fdocs%60%20link.%20Please%20fix!&labels=bug)
-
-
diff --git a/pages/README.md b/pages/README.md
deleted file mode 100644
index 5c6f91b..0000000
--- a/pages/README.md
+++ /dev/null
@@ -1,26 +0,0 @@
-### Author profiles
-
-- Profiles located in `pages\authors`
- - create a mdx file named with your authorid
- - look at the other profiles for examples
-- Authors Profile pics in: `public\images\people`
-- Supported socials for authors (react-social-icons):
- 
-
-### Changelogs/Blog Headers example
-
-⚠️ Title, Screenshot and author is automatically populated in the changelog/blog
-
-```markdown
----
-date: 2024-04-01
-title: LibreChat v0.7.0
-description: The v0.7.0 release of LibreChat
-authorid: danny
-ogImage: /images/changelog/2024-04-01-v0.7.0.png
----
-
-import { ChangelogHeader } from "@/components/changelog/ChangelogHeader";
-
-
-```
\ No newline at end of file
diff --git a/pages/_app.tsx b/pages/_app.tsx
deleted file mode 100644
index 4fec9c3..0000000
--- a/pages/_app.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import '../style.css'
-import '../src/overrides.css'
-import { useEffect, useRef } from 'react'
-import { useRouter } from 'next/router'
-import { GeistSans } from 'geist/font/sans'
-import { GeistMono } from 'geist/font/mono'
-import { Analytics } from '@vercel/analytics/react'
-import { SpeedInsights } from '@vercel/speed-insights/next'
-import { Hubspot, hsPageView } from '@/components/analytics/hubspot'
-import { CrispWidget } from '@/components/supportChat'
-import { Banner } from '@/components/Banner'
-import type { AppProps } from 'next/app'
-import type PostHogType from 'posthog-js'
-type PostHog = typeof PostHogType
-
-export default function App({ Component, pageProps }: AppProps) {
- const router = useRouter()
- const posthogRef = useRef(null)
-
- useEffect(() => {
- if (typeof window !== 'undefined' && process.env.NEXT_PUBLIC_POSTHOG_KEY) {
- import('posthog-js').then(({ default: ph }) => {
- ph.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
- api_host: process.env.NEXT_PUBLIC_POSTHOG_HOST || 'https://eu.posthog.com',
- loaded: (posthog) => {
- if (process.env.NODE_ENV === 'development') posthog.debug()
- },
- })
- posthogRef.current = ph
- })
- }
- }, [])
-
- useEffect(() => {
- const handleRouteChange = (path: string) => {
- posthogRef.current?.capture('$pageview')
- hsPageView(path)
- }
- router.events.on('routeChangeComplete', handleRouteChange)
- return () => {
- router.events.off('routeChangeComplete', handleRouteChange)
- }
- }, [])
-
- return (
-
-
-import SubscribeForm from '@/components/Newsletter/SubscribeForm'
-
-
-
-
diff --git a/pages/toolkit/_meta.ts b/pages/toolkit/_meta.ts
deleted file mode 100644
index 070f97f..0000000
--- a/pages/toolkit/_meta.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export default {
- index: 'Intro',
- creds_generator: 'Credentials Generator',
- yaml_checker: 'YAML Validator',
-}
diff --git a/pages/toolkit/creds_generator.mdx b/pages/toolkit/creds_generator.mdx
deleted file mode 100644
index 646002f..0000000
--- a/pages/toolkit/creds_generator.mdx
+++ /dev/null
@@ -1,3 +0,0 @@
-import CredsGenerator from '@/components/tools/CredentialsGeneratorBox'
-
-
\ No newline at end of file
diff --git a/pages/toolkit/index.mdx b/pages/toolkit/index.mdx
deleted file mode 100644
index c4f95d8..0000000
--- a/pages/toolkit/index.mdx
+++ /dev/null
@@ -1,18 +0,0 @@
-# ToolKit
-
-## 🔐 Credentials Generator
-First up is the 'Credentials Generator,' a handy tool that effortlessly generates secure crypto keys and JWT secrets.
-These keys are crucial for securing sensitive environment variables like `CREDS_KEY`, `CREDS_IV`, `JWT_SECRET`, and `JWT_REFRESH_SECRET`.
-
-
-
-
-
-
-## 🔍 YAML Validator (beta)
-Additionally, we present the beta version of our YAML Validator, designed to validate both your librechat.yaml and docker-compose.override.yml files, ensuring smooth sailing as you configure your LibreChat environment.
-
-
-
-
-
diff --git a/pages/toolkit/yaml_checker.mdx b/pages/toolkit/yaml_checker.mdx
deleted file mode 100644
index e7f7f3a..0000000
--- a/pages/toolkit/yaml_checker.mdx
+++ /dev/null
@@ -1,7 +0,0 @@
-import YAMLChecker from '@/components/tools/yamlChecker'
-
-This tool is currently in its beta testing phase. If you encounter any issues or have any doubts, please validate your results using https://yamlchecker.com/.
-
----
-
-
\ No newline at end of file
diff --git a/pages/unsubscribe.mdx b/pages/unsubscribe.mdx
deleted file mode 100644
index a19756b..0000000
--- a/pages/unsubscribe.mdx
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-import UnsubscribeForm from '@/components/Newsletter/UnsubscribeForm'
-
-
-
-