# Tools

Every Turbo Start Sanity page is also served as clean Markdown. Append .md to any URL or send Accept: text/markdown, and content negotiation handles the rest.

## Developer tooling, already configured

The Sanity CLI scaffolds it, Turborepo orchestrates it, and Biome keeps it tidy. Every command you need day to day is one pnpm script away.

![hero-light.jpg](https://cdn.sanity.io/images/s6kuy1ts/production/529d8acd07ad7194739e314d71f06bd8c95cf503-3408x2160.jpg?w=1600&fm=webp&q=80&auto=format)

- [Get the template](https://robotostudio.com?ref=template-sanity)
- [Browse the scripts](https://github.com/robotostudio/turbo-start-sanity)

- ![GCN](https://cdn.sanity.io/images/s6kuy1ts/production/42ef7d6affff336cd513838ff02c841aad89ea9b-98x28.svg?w=1600&fm=webp&q=80&auto=format)
- ![Session](https://cdn.sanity.io/images/s6kuy1ts/production/879b4e1238fb226a42632f735546711f6aeaf16f-104x22.svg?w=1600&fm=webp&q=80&auto=format)
- ![Tabby](https://cdn.sanity.io/images/s6kuy1ts/production/8756d14ea8771337c1e8e1e8636bbe3b286a515b-84x27.svg?w=1600&fm=webp&q=80&auto=format)
- ![Discovery](https://cdn.sanity.io/images/s6kuy1ts/production/9513f0de80639cee872afa97b66bd66b8299516f-113x24.svg?w=1600&fm=webp&q=80&auto=format)
- ![Helix](https://cdn.sanity.io/images/s6kuy1ts/production/d084be5e8e200d5f3a8d5b4e77be855352450c78-86x24.svg?w=1600&fm=webp&q=80&auto=format)
- ![Serch](https://cdn.sanity.io/images/s6kuy1ts/production/1b041b49b5d9f8f62cffb3f0240de7635f79ace6-102x24.svg?w=1600&fm=webp&q=80&auto=format)
- ![Synacti](https://cdn.sanity.io/images/s6kuy1ts/production/8637af8ce057a4789a97b1dfbb446440e2a472dc-100x24.svg?w=1600&fm=webp&q=80&auto=format)
- ![Teckro](https://cdn.sanity.io/images/s6kuy1ts/production/4a1aeb7e444fc1a0f39c2eb9c7f2104c2e57d4a7-92x28.svg?w=1600&fm=webp&q=80&auto=format)
- ![Topaz Labs](https://cdn.sanity.io/images/s6kuy1ts/production/d66c42e4c03ed4dca9136ec35b67674d3c733579-141x25.svg?w=1600&fm=webp&q=80&auto=format)

**Developer tooling**

## The commands you will actually use

A small set of scripts covers development, type generation, linting and builds across both apps — nothing to memorise.

### Sanity CLI

Scaffold the monorepo, manage datasets and deploy the Studio without leaving the terminal.

### Turborepo tasks

pnpm dev runs the site and the Studio side by side, with cached tasks so repeat builds finish in seconds.

### TypeGen

pnpm type reads your schema and turns every GROQ query into a TypeScript type, so a field rename never slips past review.

### Biome and Ultracite

One fast toolchain lints and formats the whole workspace, replacing the usual ESLint and Prettier pairing.

### Live preview loop

The Presentation tool points at your local dev server, so drafts render in the real layout while you work on them.

### Markdown output

Append .md to any URL to read a page as plain Markdown — useful for agents, diffs and quick content reviews.

**Community**

## Compare workflows

Scripts, editor setups and the small fixes that quietly save an hour a week.

- [GitHub](https://github.com/robotostudio/turbo-start-sanity)
- [X \[Twitter\]](https://x.com/studioroboto)
- [YouTube](https://www.youtube.com/@robotostudio)
- [Reddit](https://www.reddit.com)

**FAQ**

## Tooling questions

Commands, types, and getting a build out of the door.

### How do I update types after a schema change?

Run `pnpm type` from the repo root — it regenerates `packages/sanity/src/sanity.types.ts`. To refresh the schema snapshot first, run `pnpm extract` inside `apps/studio`.

### How do I add a new block?

Add a folder under `packages/sanity-blocks/src/` and export its schema from `blockSchemas` — the Studio picks it up automatically. Run `pnpm type`, add the projection to `pageBuilderFragment`, then register the component in `renderBlockComponent`.

### Can pages be read as Markdown?

Yes. Add `.md` to any URL (like `/about.md`) or send an `Accept: text/markdown` header to get a clean Markdown version, which is handy for LLMs and agents.

### What happens to old URLs when I change a page slug?

When a page's slug changes, the `auto-redirect` Sanity Function creates a `redirect` document pointing the old path at the new one. Next.js reads those in `next.config.ts`, so the redirect goes live on the next build.

### How do I deploy?

Deploy the web app to Vercel with the root directory set to `apps/web`. For the Studio, run `pnpm run deploy` from `apps/studio` — not `pnpm deploy`, which is pnpm's own command.

### What environment variables do I need?

The web app needs your Sanity project ID, dataset, API version, Studio URL, and read/write tokens — all Zod-validated by `@workspace/env` at startup. The Studio reads its own `SANITY_STUDIO_*` values; see the `.env.example` in each app.

### How do I deploy the Studio?

Run `pnpm run deploy` from `apps/studio`. The first deploy has to run locally so Sanity can create the hosted Studio and return an app ID — save it as `SANITY_STUDIO_APP_ID` for later deploys.

### Does it work with Vercel previews?

Yes, as long as the preview URL is added to your Sanity CORS origins under API > CORS origins in Sanity Manage.

[Raise it with Roboto Studio](https://robotostudio.com?ref=template-sanity)

## Tooling notes

Upgrades, new scripts, and the occasional workflow we think is worth stealing.

Around one email a month. Unsubscribe at any time.

**Get set up**

## Everything wired, nothing to configure

Clone the repo and the whole toolchain — CLI, tasks, types and linting — is already pointing in the right direction.

- [Get started now](https://sanity.robotostudio.com/documentation)
- [Work with Roboto](https://robotostudio.com)
