Guia oficial para manter e evoluir o SEO do Instituto Venditti com máxima performance.
O site usa TanStack Start (React 19 + Vite 7) com SSR no edge (Cloudflare Workers). Cada rota é um arquivo em src/routes/ e possui seu próprio head().
/sitemap.xml (gerado em src/routes/sitemap[.]xml.ts)public/robots.txtsrc/routes/__root.tsxToda rota pública DEVE definir, no head():
title único (<60 caracteres, com palavra-chave)description única (<160 caracteres)og:title, og:description, og:urlcanonical — APENAS na rota leaf, NUNCA no __root.tsxog:image absoluto (URL https://...) quando houver imagem relevanteexport const Route = createFileRoute("/exemplo")({
head: () => ({
meta: [
{ title: "Título Único — Instituto Venditti" },
{ name: "description", content: "Descrição única de até 160 caracteres." },
{ property: "og:title", content: "Título Único" },
{ property: "og:description", content: "Descrição para redes sociais." },
{ property: "og:url", content: "https://institutovenditti.lovable.app/exemplo" },
{ property: "og:image", content: "https://institutovenditti.lovable.app/og-exemplo.jpg" },
],
links: [
{ rel: "canonical", href: "https://institutovenditti.lovable.app/exemplo" },
],
}),
component: Pagina,
});Ao criar uma nova rota pública, adicione uma entrada em src/routes/sitemap[.]xml.ts dentro do array entries. Rotas administrativas, /lovable e páginas com noindex NÃO entram no sitemap.
{ path: "/nova-rota", changefreq: "monthly", priority: "0.7" },Após publicar, envie o sitemap no Google Search Console: /sitemap.xml.
O schema Organization global vive em __root.tsx. Para páginas específicas, adicione schemas no head().scripts:
ArticleCourseEventFAQPageBreadcrumbListscripts: [{
type: "application/ld+json",
children: JSON.stringify({
"@context": "https://schema.org",
"@type": "Course",
name: "Nome do Curso",
provider: { "@type": "Organization", name: "Instituto Venditti" },
}),
}]width, height e fetchpriority="high". Pré-carregar via head().links.<img> e iframes.useTransition em filtros e debounce em buscas.vite-imagetools (?format=webp).loading="lazy" em tudo abaixo do fold.font-display: swap e preconnect ao provedor.// Preload do LCP na rota dona da imagem
head: () => ({
links: [
{ rel: "preload", as: "image", href: "/hero.webp", fetchpriority: "high" },
],
})<h1> por página, hierarquia de headings sem pular níveis.alt descritivo em todas as imagens (vazio só em decorativas).<header>, <nav>, <main>, <footer>.public/robots.txt libera todo o site e aponta para o sitemap. Para bloquear uma página da indexação, use noindex no head() da rota:
meta: [{ name: "robots", content: "noindex, follow" }]Páginas atualmente com noindex: /manual-seo.
src/routes/nome-da-rota.tsx com head() completo.sitemap[.]xml.ts.canonical e og:url com URL absoluta.og:image (1200×630) se houver imagem hero.Dúvidas sobre esta documentação devem ser direcionadas ao responsável técnico do projeto via canal interno. Mantenha este manual atualizado a cada alteração estrutural de SEO.
Última atualização: Maio de 2026