---
title: "Project structure · Sanity × Nuxt UI"
description: "Where everything lives in the two apps."
canonical_url: "https://sanity-nuxtui.vercel.app/id/docs/project-structure"
meta:
  "og:description": "Where everything lives in the two apps."
  "og:image": "https://sanity-nuxtui.vercel.app/_og/d/c_Page%2Ctitle_Project%2Bstructure%2Cdescription_Where%2Beverything%2Blives%2Bin%2Bthe%2Btwo%2Bapps.%2Cheadline_Docs%2CsiteName_~U2FuaXR5IMOXIE51eHQgVUk%2Cp_Ii9pZC9kb2NzL3Byb2plY3Qtc3RydWN0dXJlIg%2Cs_qASa0nboehJA-n0R.png"
  "og:image:height": "630"
  "og:image:type": image/png
  "og:image:width": "1200"
  "og:title": "Project structure · Sanity × Nuxt UI"
  "twitter:image": "https://sanity-nuxtui.vercel.app/_og/d/c_Page%2Ctitle_Project%2Bstructure%2Cdescription_Where%2Beverything%2Blives%2Bin%2Bthe%2Btwo%2Bapps.%2Cheadline_Docs%2CsiteName_~U2FuaXR5IMOXIE51eHQgVUk%2Cp_Ii9pZC9kb2NzL3Byb2plY3Qtc3RydWN0dXJlIg%2Cs_qASa0nboehJA-n0R.png"
---

> Index of every page on this site: [llms.txt](https://sanity-nuxtui.vercel.app/llms.txt)

Halaman ini belum tersedia dalam bahasa Indonesia.

[Docs](https://sanity-nuxtui.vercel.app/id/docs)

# **Project structure**

Where everything lives in the two apps.

```
apps/├─ studio/      Sanity Studio└─ web/         Nuxt sitedocs/           these guides, imported into the Docs collection
```

## Studio (`apps/studio`)

```
schemaTypes/├─ documents/   page, collection, entry, author, settings├─ objects/     link, seo, blockContent, table, pageBuilder, codeGroup, featureItem├─ blocks/      one file per page-builder block└─ shared/      field helpers (icon, image, orientation, code, languages)presentation/   where each document appears on the site (Presentation tool)scripts/├─ seed.ts      example content├─ docs.ts      Markdown guides → Docs collection└─ lib/         Markdown → Portable Text converter, docs importerstructure.ts    the Studio menusanity.config.ts
```

## Site (`apps/web`)

```
app/├─ pages/[...slug].vue      resolves every URL: page, collection or entry├─ app.vue                  header, footer, languages, site-wide SEO├─ components/│  ├─ blocks/               Block*.vue, one per block│  ├─ PageBlocks.vue        block registry│  ├─ CollectionView.vue    collection list page│  ├─ EntryList.vue         blog, cards, gallery and docs layouts│  ├─ EntryView.vue         entry page (docs sidebar, TOC, related entries)│  ├─ PortableText.vue      rich text renderer│  ├─ CodeBlock.vue         code blocks with Shiki│  ├─ LanguageSwitcher.vue  Nuxt UI LocaleSelect│  ├─ SiteSearch.vue        search palette│  └─ OgImage/              generated social image├─ composables/             usePageSeo, useSanityImage, useSiteLanguage├─ utils/                   queries.ts (GROQ), language, labels, links, toc└─ assets/css/main.css      theme and motion utilitiesmodules/ui-locales.ts       lazy Nuxt UI localesserver/├─ api/highlight.post.ts    syntax highlighting├─ api/__sitemap__/urls.ts  sitemap entries from Sanity└─ preview/                 preview routes that skip the Vercel cacheprerender-routes.ts         every URL, for hybrid and static buildssanity.types.ts             generated by pnpm typegennuxt.config.ts
```

## How a request is served

1. Every URL hits `app/pages/[...slug].vue`.
2. The language prefix, if any, is taken off the path ( `/id/blog/post` → language `id`, path `blog/post`).
3. `ROUTE_QUERY` looks for a page, a collection and an entry matching the path in one request.
4. The page renders `PageBlocks`, `CollectionView` or `EntryView`; a miss is a 404.

Header, footer and settings come from `SETTINGS_QUERY` in `app.vue`, which runs before the page.

[**Installation** Set up the template locally, connect it to a Sanity project and add the example content.](https://sanity-nuxtui.vercel.app/id/docs/installation) [**Content model** The document types, how URLs map to them, and why entries are generic.](https://sanity-nuxtui.vercel.app/id/docs/content-model)

```json
{"@context":"https://schema.org","@graph":[{"@id":"https://sanity-nuxtui.vercel.app/#website","@type":"WebSite","name":"Sanity × Nuxt UI","url":"https://sanity-nuxtui.vercel.app/","publisher":{"@id":"https://sanity-nuxtui.vercel.app/#identity"}},{"@id":"https://sanity-nuxtui.vercel.app/id/docs/project-structure#webpage","@type":"WebPage","dateModified":"2026-10-16T02:29:18Z","description":"Where everything lives in the two apps.","name":"Project structure","url":"https://sanity-nuxtui.vercel.app/id/docs/project-structure","isPartOf":{"@id":"https://sanity-nuxtui.vercel.app/#website"},"potentialAction":[{"@type":"ReadAction","target":["https://sanity-nuxtui.vercel.app/id/docs/project-structure"]}]},{"@id":"https://sanity-nuxtui.vercel.app/#identity","@type":"Organization","name":"Sanity × Nuxt UI","url":"https://sanity-nuxtui.vercel.app"},{"@id":"https://sanity-nuxtui.vercel.app/id/docs/project-structure#article","@type":"Article","dateModified":"2026-10-16T02:29:18Z","description":"Where everything lives in the two apps.","headline":"Project structure","inLanguage":"en","thumbnailUrl":"https://sanity-nuxtui.vercel.app/_og/d/c_Page%2Ctitle_Project%2Bstructure%2Cdescription_Where%2Beverything%2Blives%2Bin%2Bthe%2Btwo%2Bapps.%2Cheadline_Docs%2CsiteName_~U2FuaXR5IMOXIE51eHQgVUk%2Cp_Ii9pZC9kb2NzL3Byb2plY3Qtc3RydWN0dXJlIg%2Cs_qASa0nboehJA-n0R.png","author":{"@id":"https://sanity-nuxtui.vercel.app/#identity"},"image":{"@id":"https://sanity-nuxtui.vercel.app/#/schema/image/1"},"isPartOf":{"@id":"https://sanity-nuxtui.vercel.app/id/docs/project-structure#webpage"},"mainEntityOfPage":{"@id":"https://sanity-nuxtui.vercel.app/id/docs/project-structure#webpage"},"publisher":{"@id":"https://sanity-nuxtui.vercel.app/#identity"}},{"@id":"https://sanity-nuxtui.vercel.app/#/schema/image/1","@type":"ImageObject","contentUrl":"https://sanity-nuxtui.vercel.app/_og/d/c_Page%2Ctitle_Project%2Bstructure%2Cdescription_Where%2Beverything%2Blives%2Bin%2Bthe%2Btwo%2Bapps.%2Cheadline_Docs%2CsiteName_~U2FuaXR5IMOXIE51eHQgVUk%2Cp_Ii9pZC9kb2NzL3Byb2plY3Qtc3RydWN0dXJlIg%2Cs_qASa0nboehJA-n0R.png","inLanguage":"en","url":"https://sanity-nuxtui.vercel.app/_og/d/c_Page%2Ctitle_Project%2Bstructure%2Cdescription_Where%2Beverything%2Blives%2Bin%2Bthe%2Btwo%2Bapps.%2Cheadline_Docs%2CsiteName_~U2FuaXR5IMOXIE51eHQgVUk%2Cp_Ii9pZC9kb2NzL3Byb2plY3Qtc3RydWN0dXJlIg%2Cs_qASa0nboehJA-n0R.png"}]}
```

## Sitemap

See the full [sitemap](https://sanity-nuxtui.vercel.app/sitemap.md) for all pages.
