web

A set of coding rules for a Next.js website, including page routing, multiple languages, reusable components, and Sanity content. It also specifies formatting and server-rendering practices.

In plain words
What is it for?
Use it when building or changing pages, components, translated content, URLs, or Sanity-powered modules in this Next.js app.
Why use it?
It keeps website code consistent and prevents common language, server-rendering, content, and visual-editing mistakes.

Cursor rule for Cursor

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add rules/backendforth/next-sanity-starter/web
Clone the repo
git clone --depth 1 https://github.com/backendforth/next-sanity-starter

Made for: Cursor.

Per session 0 Nothing until a file matches its globs; then the whole rule loads.
When invoked 400 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00000 $0.00400
Opus 5 $0.00000 $0.00200
Sonnet 5 $0.00000 $0.00080
Haiku 4.5 $0.00000 $0.00040

Measured yesterday against content hash e83e5618a5d8, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

web scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

.cursor/rules/web.mdc · 34 lines

What it actually says

Next.js 16 App Router. RSC by default; "use client" only when needed (state, effects, browser APIs). Tailwind v4. Biome: tabs, double quotes. Path alias @/*web/.

Hard rules:

  • Thread { locale, siteLocale } through every render path that touches Sanity content.
  • Resolve translatable fields via pickLocalizedString / parseLocalizedText from web/sanity/utils/sanityLocalizedText.ts. Never index i18n arrays.
  • No locale filtering inside GROQ — projections return full { _key, _type, language, value } arrays.
  • Content blocks are modules (see .cursor/rules/modules.mdc). No ad-hoc <section> in route files.
  • web/sanity/types/* are hand-maintained. Update them in the same commit as the GROQ projection.
  • Set data-sanity attrs on Sanity-rendered roots (copy from ModuleText.tsx / MediaImage.tsx) — Visual Editing depends on it.
  • Never read locale from useRouter(), usePathname(), window.location, or cookies inside a module — breaks SSR + Presentation iframes.
  • No hardcoded locale codes outside web/src/i18n/.

URL/locale helpers live in web/src/i18n/ (paths.ts, siteLocalePathUtils.ts, site-locales.ts, proxyLocaleFetch.ts). Use them; do not concatenate locale prefixes by hand.

After web changes:

pnpm typecheck
pnpm format

NEVER edit:

  • web/.next/
  • Any *.gen.* files
  • Imports from studio/... (use packages/* for shared code).
Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. yesterday First seen · 34 lines · 0 tokens per session scan A e83e5618a5d8

Subscribe to this mod's changes

web is a cursor rule published in the GitHub repository backendforth/next-sanity-starter (4 stars, last pushed 25d ago), licensed ISC. It costs nothing until one of its globs matches a file; then it loads 400 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.