This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
---
|
||||
title: Sanity Project Structure
|
||||
description: Project structure patterns for Sanity projects including monorepo and embedded Studio setups.
|
||||
---
|
||||
|
||||
# Sanity Project Structure
|
||||
|
||||
## Standalone Studio
|
||||
|
||||
Best for content-only projects, API-first architectures, or when frontend is managed separately.
|
||||
|
||||
```
|
||||
your-project/
|
||||
├── schemaTypes/
|
||||
│ ├── index.ts
|
||||
│ ├── documents/
|
||||
│ ├── objects/
|
||||
│ └── blocks/
|
||||
├── sanity.config.ts
|
||||
├── sanity.cli.ts
|
||||
└── package.json
|
||||
```
|
||||
|
||||
**Use cases:**
|
||||
- Content modeling with MCP/AI tools (no frontend needed)
|
||||
- Headless CMS with external consumers
|
||||
- Prototyping and content design
|
||||
|
||||
## Embedded Studio (Recommended for Next.js)
|
||||
|
||||
Best for most Next.js projects. Unified deployment, simpler setup.
|
||||
|
||||
```
|
||||
your-project/
|
||||
├── src/
|
||||
│ ├── app/ # Next.js App Router
|
||||
│ │ └── studio/[[...tool]]/ # Embedded Studio route
|
||||
│ └── sanity/
|
||||
│ ├── lib/
|
||||
│ │ ├── client.ts
|
||||
│ │ ├── live.ts # defineLive setup
|
||||
│ │ └── queries.ts
|
||||
│ └── schemaTypes/
|
||||
│ ├── index.ts
|
||||
│ ├── documents/
|
||||
│ ├── objects/
|
||||
│ └── blocks/
|
||||
├── sanity.config.ts
|
||||
├── sanity.cli.ts # CLI + TypeGen configuration
|
||||
└── sanity.types.ts # Generated types (from TypeGen)
|
||||
```
|
||||
|
||||
## Monorepo
|
||||
|
||||
Best when you need separation of concerns, multiple frontends, or strict dependency isolation.
|
||||
|
||||
```
|
||||
your-project/
|
||||
├── apps/
|
||||
│ ├── studio/ # Sanity Studio (standalone)
|
||||
│ │ ├── src/
|
||||
│ │ │ └── schemaTypes/
|
||||
│ │ │ ├── index.ts
|
||||
│ │ │ ├── documents/
|
||||
│ │ │ ├── objects/
|
||||
│ │ │ └── blocks/
|
||||
│ │ ├── sanity.config.ts
|
||||
│ │ ├── sanity.cli.ts
|
||||
│ │ └── package.json
|
||||
│ └── web/ # Next.js (or other framework)
|
||||
│ ├── src/
|
||||
│ │ ├── app/
|
||||
│ │ └── sanity/
|
||||
│ │ ├── client.ts
|
||||
│ │ ├── live.ts
|
||||
│ │ └── queries.ts
|
||||
│ └── package.json
|
||||
├── pnpm-workspace.yaml
|
||||
└── package.json
|
||||
```
|
||||
|
||||
**Setup:**
|
||||
1. Add web app URL to CORS origins in [Sanity Manage](https://www.sanity.io/manage)
|
||||
2. Configure `typegen` in `sanity.cli.ts` to read schema from `apps/studio` and output types to `apps/web`
|
||||
|
||||
## File Naming Conventions
|
||||
|
||||
- **kebab-case** for all files: `user-profile.ts`, `hero-block.ts`
|
||||
- `.ts` for schemas/utilities, `.tsx` for React components
|
||||
- Each schema exports a named const matching filename
|
||||
|
||||
## Schema Directory Structure
|
||||
|
||||
```
|
||||
schemaTypes/
|
||||
├── index.ts # Exports all types
|
||||
├── documents/ # Standalone content types
|
||||
│ ├── post.ts
|
||||
│ └── author.ts
|
||||
├── objects/ # Embeddable/reusable types
|
||||
│ ├── seo.ts
|
||||
│ └── link.ts
|
||||
├── blocks/ # Portable Text blocks
|
||||
│ ├── hero.ts
|
||||
│ └── callout.ts
|
||||
└── shared/ # Shared field definitions
|
||||
└── seoFields.ts
|
||||
```
|
||||
|
||||
## Key Files
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `sanity.config.ts` | Studio configuration (plugins, schema, structure) |
|
||||
| `sanity.cli.ts` | CLI configuration (project ID, dataset, TypeGen config) |
|
||||
| `structure.ts` | Custom desk structure |
|
||||
Reference in New Issue
Block a user