---
title: Project Structure
description: A tour of the folders and files in a CamelMind site — what each one does and which ones you'll actually edit.
---
Every CamelMind project follows the same directory structure. Most of your work will happen in just a few folders, while the rest powers the framework behind the scenes.
This guide explains what each folder is for and when you'll need to edit it.
```text
my-docs/
├── app/ # Next.js routes and rendering
├── components/ # UI and MDX components
├── content/ # Documentation pages
├── lib/ # Internal utilities
├── nav/
│ └── nav.yml # Sidebar navigation
├── public/ # Images and downloads
├── scripts/ # Build utilities
├── camelmind.config.ts # Site configuration
├── versions.yml # Documentation versions
├── next.config.ts # Next.js configuration
├── .env.example # Configuration template; duplicate to .env.local before running
├── package.json
└── tsconfig.json
```
Most documentation work only involves these folders:
| Want to... | Edit |
|------------|------|
| Write documentation | `content/` |
| Organize the sidebar | `nav/nav.yml` |
| Add images or assets | `public/` |
| Change the site title | `camelmind.config.ts` |
For other advanced configurations, we will cover in [Advanced Configurations](/guide/advanced-config).
---
## The content/ folder
Every documentation page is an MDX file stored under `content/`. Every page is a `.mdx` file — Markdown with optional JSX components — with YAML frontmatter at the top for `title` and `description`.
```text
content/
├── getting-started/
│ └── overview.mdx
├── guides/
│ └── writing-docs.mdx
└── reference/
└── configuration.mdx
```
Unlike many documentation frameworks, CamelMind does not derive URLs from your folder structure. URLs are defined in `nav.yml`, giving you complete control over your site's navigation.
---
## The nav/nav.yml file
`nav.yml` is the single source of truth for what appears in the sidebar and which URL each page is served at. Every entry maps a `slug` (the public URL) to a `file` (the MDX source):
```yaml
nav:
- label: "Getting Started"
dropdown: false
noDropdown: true
items:
- label: "Project Structure"
slug: /getting-started/project-structure
file: content/getting-started/project-structure.mdx
roles: []
```
A page in `content/` that isn't registered here won't be reachable — and a page can be registered at multiple slugs with different labels or `roles`. See [Navigation](/guides/navigation) and the [Nav Schema](/reference/nav-schema) reference for every field.
---
## The versions.yml file
`versions.yml` defines the documentation versions your site publishes, such as `latest`, `v1`, or `v2`.
```yaml
versions:
- id: "latest"
label: "Latest"
stable: true
nav: nav/nav.yml
```
A fresh scaffold ships with a single `latest` version. Add entries here when you're ready to publish multiple versions side by side — see [Versioning](/guides/versioning).
---
## The camelmind.config.ts configuration file
The root config file for site-wide behavior such as title, tagline, auth settings, GitHub link, API reference, and `llms.txt` output.
```typescript
const config: CamelMindConfig = {
title: "My Docs",
tagline: "Documentation made simple.",
url: process.env.CAMELMIND_URL ?? "http://localhost:3000",
contentDir: "content",
navFile: "nav/nav.yml",
versionsFile: "versions.yml",
auth: { enabled: false, requireLogin: false, provider: "dev-mock", /* ... */ },
links: { github: "https://github.com/you/your-repo" },
ai: { llmsTxt: { enabled: false, directive: "" } },
}
```
Most secrets and environment-specific values (auth toggles, the site URL) are read from environment variables defined in `.env.example` / `.env.local`, rather than hardcoded here. See the [Configuration Reference](/reference/configuration) for every field.
---
## The app/ folder
The app directory contains the Next.js application that powers your documentation site.
| Path | Purpose |
|---|---|
| `app/[...slug]/page.tsx` | The catch-all route that renders every doc page — resolves the slug against `nav.yml`, loads the MDX file, and applies auth checks |
| `app/api-reference/` | Route for the OpenAPI-powered API reference |
| `app/api/auth/` | Login, logout, and OIDC callback route handlers |
| `app/api/search/` | Full-text search endpoint |
| `app/api/llms/`, `app/llms.txt/` | AI-readable documentation output (`/llms.txt` and `/api/llms`) |
| `app/home/page.tsx` | The homepage |
| `app/layout.tsx` | Root layout — theming, fonts, global providers |
| `app/globals.css` | Global styles (Tailwind) |
Customizing files in `app/` is an advanced use case. Changes here can be overwritten or need manual reconciliation when you run `camelmind update` — see the [CLI Reference](/reference/cli) for the `--ignore-file` flag if you need to protect a customized file.
---
## The components/ folder
React components split into two groups:
- **Site chrome** — `Nav/`, `Sidebar/`, `Toc/`, `Breadcrumbs/`, `PageNav/`, `Search/`, `SectionCards/`, `ApiReference/`, and similar folders render the surrounding site UI (top nav, sidebar, table of contents, search modal, and so on).
- **`components/mdx/`** — the components available directly inside your `.mdx` content: `Callout`, `Steps`, `Tabs`, `Details`, `Icon`, `LLMOnly`, and `LLMIgnore`.
See [MDX Components](/guides/mdx-components) for how to use each one in your content.
---
## The lib/ folder
The engine room: plain TypeScript modules that load and resolve content, with no JSX. You generally won't need to edit these, but they're the layer to look at if you're extending CamelMind's behavior.
| File | Responsibility |
|---|---|
| `lib/mdx.ts` | Reads an MDX file, parses frontmatter, extracts the table of contents |
| `lib/nav.ts`, `lib/nav-types.ts` | Parses `nav.yml`, resolves slugs to entries, builds breadcrumbs |
| `lib/versions.ts` | Resolves which version's nav applies to a given URL |
| `lib/config.ts`, `lib/config-types.ts` | Loads and types `camelmind.config.ts` |
| `lib/auth.ts`, `lib/auth-roles.ts`, `lib/auth-providers/` | Session handling and role-based access control |
| `lib/api-reference.ts`, `lib/api-types.ts`, `lib/api-utils.ts` | OpenAPI spec parsing for the API reference |
---
## The scripts/ folder
Standalone automation tooling for producing specialized release artifacts outside of the normal web deployment pipeline:
| Script | Purpose |
|---|---|
| `scripts/build-offline.sh` | Builds a static, ZIP-packaged offline version of the site |
| `scripts/build-search-index.ts` | Pre-generates the search index used by offline builds |
| `scripts/generate-pdfs.ts`, `scripts/generate-master-pdf.ts` | Generate per-page and combined PDF exports |
| `scripts/build-pdf.sh` | Wraps the PDF generation scripts into a single build step |
See [Offline Export](/guides/offline-export) for how these fit into a release workflow.
---
## Root config files
| File | Purpose |
|---|---|
| `package.json` | Project dependencies and CLI script runners (`dev`, `build`, `start`, `lint`). |
| `next.config.ts` | Next.js compilation options, security headers, and static export toggles. |
| `tsconfig.json` | Global TypeScript compiler settings. |
| `eslint.config.mjs` | Project code quality and linting rules. |
| `.env.example` | Local environment configuration blueprint. Dplicate to `.env.local` to start. |
| `vercel.json` | Optimized deployment configurations specific to Vercel. |
After running `camelmind update`, you may see a `.camelmind-update-backup/` folder appear — it holds a timestamped copy of any files the updater overwrote. It's safe to delete once you've confirmed the update looks correct.
---
## Next steps
| Goal | Where to go |
|---|---|
| Write and organize pages | [Writing Content](/getting-started/writing-content) |
| Use Callout, Steps, Tabs, and more | [MDX Components](/getting-started/mdx-components) |
| Change the sidebar and URLs | [Navigation](/getting-started/navigation) |
| Publish multiple doc versions | [Versioning](/guides/versioning) |
| Gate pages by user role | [Authentication & RBAC](/guides/auth-rbac) |
| Every config option in detail | [Configuration Reference](/reference/configuration) |