# What Is Editable In Sanity

## What Is Editable In Sanity

**Files:** `sanity.config.ts`, `sanity/`, `src/config/config.toml` · **Skill level:** Beginner

Run `npm run dev:all`, open the Studio at `http://localhost:3333`, and log in with your Sanity account. **Content** has one entry per language (En, Fr, العربية), then **Site settings**. [Sanity](../sanity/) has the full guide, including `npm run setup` for your first project. Everything below exists in English, French, and Arabic, and each language has its own documents.

### Where Each Page Is Edited
All locations are under Content, then your language. Most sections have one version for all pages, under **Sections**. Only two documents have **Sections on this page** rows.

| Address | Studio location | Sections on this page |
| ------- | --------------- | --------------------- |
| `/` | **Homepages > Home** | Yes. A row sets the FAQ layout here |
| `/features/` | No document of its own. It shows **Features section two**, **Features section**, **Why us section (features page)**, and **Call to action section**, and its browser title is the **Features section** title | No |
| `/pricing/` | **Main pages > Pricing page**. The plans and comparison are in **Pricing section** | No |
| `/faq/` | **Main pages > FAQ page**, which also holds the questions and answers | No |
| `/changelog/` | **Main pages > Changelog page**. The entries are in **Changelog section** | No |
| `/contact/` | **Main pages > Contact page**. The details and form fields are in **Contact section** | No |
| `/integration/` | **Main pages > Integrations page**, which sets the categories it lists. The cards come from **Integrations** | No |
| `/integration/{slug}/` | **Integrations**, one document per entry | Yes. A row sets its button |
| `/blog/` | **Main pages > Blog page**, and **Blog section** | No |
| `/blog/{slug}/` | **Blog posts**, one document per post | No |
| `/blog/page/...` | **Main pages > Blog page**, and **Blog posts**. The page size is **Pagination** in **Site settings** | No |
| `/elements/`, `/privacy-policy/`, `/terms-conditions/` | **Other pages** | No |
| 404 | **Interface labels**, under **Not Found** | No |

**Page options:** Upstart has no **Page options** panel in the Studio. Each document holds its own fields, such as **Title**, **Meta Description**, and **Draft**, and not every document has all three. There are no per-page fields for an SEO title, keywords, robots, the sitemap, or the AI files.

### New Entries
Use the **+** button in **Authors**, **Blog posts**, **Integrations**, or **Other pages**. **File name** is required: use lowercase letters, numbers, and hyphens, because it becomes part of the address. A new entry exists only in that language, so create it in the other languages too. A post's **Author** is the author's name, and it finds the **Authors** document whose file name matches: `Allium Johnson` finds `allium-johnson`.

A new entry with only a title won't break the site, and it builds. Its card or page shows what you filled in, and images and other fields stay empty until you add them, so fill them in before you publish. We tested this in the bundled demo content, not on a real project. An integration needs a category to appear in the lists on `/integration/`.

### Sections
Each section is one document per language, under **Sections**. A change applies on every page that uses the section.

| Section | Where it appears |
| ------- | ---------------- |
| **Home banner** | `/`. Its own **Customers** field holds the text for the logo row |
| **Features section** | `/`, `/features/` |
| **Features section two** | `/features/` |
| **Why us section** | `/` |
| **Why us section (features page)** | `/features/` |
| **Pricing section** | `/`, `/pricing/` |
| **Testimonial** | `/` |
| **Customers** | `/pricing/`, and the logo row in the home banner |
| **Integration section** | `/`, `/integration/` |
| **Blog section** | `/blog/`, `/blog/page/...` |
| **Changelog section** | `/changelog/` |
| **Contact section** | `/contact/` |
| **Call to action section** | Every page except the 404, above the footer |

To hide a section on every page that uses it, turn off **Enable**. **Home banner** and **Integration section** have no working switch, so take the line out of the page file.

The two "Why us" sections have two layouts: type `creative` or `modern` in **Layout Type**. In the pricing table, the **Included** field takes one entry per pricing tier, in the order of the tiers under **List**: type the word `true` for a tick, `false` for a cross, or any other text to show it.

Body fields take text, tables, images, code, and the 12 components, from the toolbar and its **...** menu. The **Elements** page shows them all. A body image is an upload, or an **Image address**: a link, or a path such as `/images/og-image.jpg`.

### Site-Wide Content
| Location | What's in it |
| -------- | ------------ |
| **Menus** | **Header menu**, with dropdowns and the mega menu, then **Footer column: Quick links**, **Footer column: Resources**, **Footer column: Legal**, and **Footer bottom row**. Each language has its own. See [Menus](../../customization/menus/) |
| **Interface labels** | Buttons, labels, and form messages, in groups. **Navigation** has the header button's label, and **Footer** has the column headings, description, and copyright. Each language has its own |
| **Site settings** | One for the whole site, below the languages. **Site** (title, Base URL, logo), **SEO** (including robots.txt, AI files, and sitemap), **Settings**, **Opengraph**, **Head** for analytics tags, and **Social** |

**Settings** holds **Sticky Header**, **Navigation Button**, **Footer Description**, **Copyright**, **Subscription**, **Theme Credit**, **Contact Form Action**, **Contact Form Provider**, **Contact Info**, **Smooth Scroll**, and **Page Actions**. Upstart has one header layout and one footer layout, so there are no layout options to pick.

In **Menus**, **Show** hides an item in the header, and **Order** sets its position. The footer shows every link in its list, in the order of the list, so delete a footer link to remove it.

**Site settings** apply when the site builds. While `npm run dev:all` runs, they apply when you publish them, and the page reloads. They don't change as you type, and click-to-edit doesn't reach them, so change them in their form.

### Plans And Attributes
At the time of writing, Sanity's free plan allows 2,000 attributes, one for each distinct field path in your content. The demo content, with its images, measured 718 in our test project, read from Sanity's own count after importing it, editing in Live preview, and publishing, so it fits. Adding entries, pages, and text costs nothing. New field names do, and so does the crop tool on an image: a few attributes each. You can see your own number in Sanity's project settings, under Usage. [Sanity's pricing page](https://www.sanity.io/pricing) has the current limits.

### Online Preview
Click-to-edit and draft preview work out of the box on your own computer, with `npm run dev:all`. To use them online, your editors need a second copy of the site running as a small **Node.js server**, because drafts can't be shown from static files. A static host can't do this. See [Sanity](../sanity/) for the steps. Without a preview server, editors online can still edit in the Studio's forms and publish.

### What We Tested
**On a real test project, in Chromium:** importing the demo content, where all 163 documents matched it, and the attribute count above. A static build from the project: all 123 pages matched the build from the demo content with images masked, and every image answered from Sanity's CDN. Live preview in the Studio, logged in with a test token: click a text or an image on the page to open its field, then type, and the page reloads with your change. In our test that took up to about 16 seconds. A title on the contact page was changed in English and in Arabic, where the field runs right to left, showed as a draft in the preview only, and reached a visitor after **Publish**. The preview server running on `localhost`, with the Studio's Live preview.

**Not tested:**

- Any online host, a deployed Studio, or Netlify or Vercel functions, which the preview server doesn't support.
- A webhook, on any host.

Try these on your own project before you rely on them.

### What Stays In Code
These change how the site is built, not what it says:

- The page routes and the order of sections on a page: `src/pages/[...lang]/`.
- Hiding the home banner or the integration section: take the line out of the page file.
- Which pricing table a page shows: the `layout` setting in `src/pages/[...lang]/pricing.astro`.
- Section and component design, colors, type scale, and fonts.
- The list of languages: `src/config/language.json`.
- Favicons, the language settings, and the blog and integration folder names in `config.toml`.
- SVG icon files and videos. A field holds their path, and the file stays in the project.
- Which sections and fields exist. To add one, see `SKILLS.md`.

### Do It With AI
```text
I use the Sanity edition. Tell me where to edit [TEXT OR SETTING] in the Studio: the language entry,
the document, and the field. If it comes from a section document, say which pages will change.
Don't change any files, and don't print anything from .env.
```