# Playbook Completo — Blog do site Seu Resultado

Guia prático de ponta a ponta para usar o blog de `seuresultado.com`: como logar, criar, revisar, publicar, agendar, otimizar SEO, compartilhar, corrigir URLs, integrar com automação (n8n) e resolver problemas.

> Público: quem vai operar o blog no dia a dia (editor, marketing, automação).
> Site: https://seuresultado.com
> Painel: https://seuresultado.com/admin

---

## Índice

1. [Visão geral em 1 minuto](#1-visão-geral-em-1-minuto)
2. [Estrutura de URLs do blog](#2-estrutura-de-urls-do-blog)
3. [Acesso ao painel administrativo](#3-acesso-ao-painel-administrativo)
4. [Mapa das telas do admin](#4-mapa-das-telas-do-admin)
5. [Fluxo de vida de um artigo (status)](#5-fluxo-de-vida-de-um-artigo-status)
6. [Playbook: criar um artigo do zero](#6-playbook-criar-um-artigo-do-zero)
7. [Playbook: editar um artigo já existente](#7-playbook-editar-um-artigo-já-existente)
8. [Playbook: preview antes de publicar](#8-playbook-preview-antes-de-publicar)
9. [Playbook: publicar agora / agendar / despublicar / excluir](#9-playbook-publicar-agora--agendar--despublicar--excluir)
10. [Playbook: mudar o slug sem quebrar SEO (redirects)](#10-playbook-mudar-o-slug-sem-quebrar-seo-redirects)
11. [Guia dos campos de SEO no editor](#11-guia-dos-campos-de-seo-no-editor)
12. [Open Graph e cards em WhatsApp/LinkedIn (limitação importante)](#12-open-graph-e-cards-em-whatsapplinkedin-limitação-importante)
13. [Imagens: upload, tamanhos, alt-text, boas práticas](#13-imagens-upload-tamanhos-alt-text-boas-práticas)
14. [Autores, categorias, tags e taxonomia](#14-autores-categorias-tags-e-taxonomia)
15. [Sitemap, RSS, robots.txt e Google Search Console](#15-sitemap-rss-robotstxt-e-google-search-console)
16. [API Keys e auditoria](#16-api-keys-e-auditoria)
17. [Playbook: usar a Blog API (n8n / integrações)](#17-playbook-usar-a-blog-api-n8n--integrações)
18. [Fluxo n8n + WhatsApp de aprovação](#18-fluxo-n8n--whatsapp-de-aprovação)
19. [Troubleshooting](#19-troubleshooting)
20. [Checklists rápidos](#20-checklists-rápidos)

---

## 1. Visão geral em 1 minuto

- O blog é uma seção do site React hospedado no Lovable, alimentado pelo banco Supabase.
- Você opera **tudo pelo painel `/admin`** (sem tocar em código).
- Publicar um artigo **não republica o site**: o site lê o banco em tempo real, então o artigo entra no ar assim que salvo como `published`.
- Existe também uma **API HTTP** (`blog-api`) para o n8n criar/publicar posts automaticamente.
- SEO técnico (sitemap, meta tags, JSON‑LD, canonical, redirect de slug) já está pronto — você só preenche os campos.

---

## 2. Estrutura de URLs do blog

| Página | URL | Quem vê |
|---|---|---|
| Home do blog (listagem) | `/blog` | Público |
| Artigo publicado | `/blog/{slug}` | Público |
| Página de categoria | `/blog/categoria/{slug-da-categoria}` | Público |
| Página de tag | `/blog/tag/{slug-da-tag}` | Público |
| Preview de rascunho | `/blog/preview/{preview_token}` | Quem tiver o link |
| Admin | `/admin/*` | Só admin logado |

Regras:
- Só entra em `/blog` e no sitemap quem está `published` **e** com `Indexar` marcado.
- Preview é acessado por um **token secreto** (UUID por post), não pelo slug — pode ser enviado no WhatsApp.

---

## 3. Acesso ao painel administrativo

1. Abra `https://seuresultado.com/admin/login`.
2. Informe **e‑mail e senha** do usuário admin.
3. Ao logar você cai em `/admin` (lista de artigos).

Regras de acesso:
- Novos usuários criados sem papel **não conseguem** entrar no admin — precisam ser promovidos a `admin` (feito por outro admin no banco / função `has_role`).
- Sessão expira após 1h, mas é renovada automaticamente enquanto você usa.
- Sem HTTPS/site fora do ar? Peça reset de senha na tela de login (fluxo Supabase Auth).

Boa prática: nunca compartilhe login. Se precisar dar acesso a outra pessoa, crie um novo usuário e promova-o a admin.

---

## 4. Mapa das telas do admin

| Rota | Para quê |
|---|---|
| `/admin` | Lista todos os artigos com filtro por status. Ponto de partida. |
| `/admin/posts/:id` | Editor completo do artigo (abas Conteúdo / SEO / Social / Avançado). |
| `/admin/taxonomy` | Criar/editar Categorias e Tags. |
| `/admin/authors` | Criar/editar Autores; marcar o autor padrão. |
| `/admin/redirects` | Ver e gerenciar redirects de URLs antigas. |
| `/admin/api-keys` | Gerar/revogar chaves para o n8n usar a API. |
| `/admin/audit-logs` | Ver todas as ações feitas via API (quem, o quê, quando). |

---

## 5. Fluxo de vida de um artigo (status)

```
draft ──▶ review ──▶ approved ──▶ published
                                ▲
                     scheduled ─┘   (pg_cron publica no horário)
```

| Status | Significado | Visível ao público? |
|---|---|---|
| `draft` | Rascunho | Não |
| `review` | Enviado para revisão (usado pelo n8n) | Não |
| `approved` | Aprovado, aguardando publicação | Não |
| `scheduled` | Vai publicar automaticamente na data marcada | Não (até a hora) |
| `published` | No ar em `/blog/{slug}` | Sim |

Ações que mudam status:
- **Salvar** — mantém como `draft`.
- **Publicar** — vira `published` e define `published_at = agora`.
- **Agendar** — vira `scheduled`; cron a cada 1 minuto publica quando chega a hora.
- **Despublicar** — volta para `draft` (some do site na hora).
- **Excluir** — remove do banco de forma **definitiva** (sem lixeira).

Regra de ouro: prefira **despublicar** a excluir. Excluir só se for lixo/duplicado real.

---

## 6. Playbook: criar um artigo do zero

Objetivo: publicar um artigo com SEO decente em ~15 min.

**Passo a passo (aba por aba):**

1. Em `/admin`, clique em **Novo artigo**.
2. **Aba Conteúdo**
   - Título (obrigatório).
   - Slug — deixe gerar do título; personalize se quiser algo mais curto/estratégico (ex.: `roi-campanhas-b2b`). Validação de duplicidade é em tempo real.
   - Resumo — 1–2 frases. Vai virar meta description e OG description por padrão.
   - Imagem destacada — clique em **Enviar arquivo**, escolha uma JPG/WEBP ~1200px, ≤500 KB.
   - Alt‑text da imagem — descreva o que aparece na foto (importante para SEO e acessibilidade).
   - Conteúdo — escreva no editor. Use `H2` para seções, `H3` para subseções. Nunca use outro `H1` (o título já é o H1).
3. **Aba SEO**
   - Meta title — por padrão usa o título; personalize para <60 caracteres se quiser algo mais persuasivo/keyword-first.
   - Meta description — 140–160 caracteres, com CTA.
   - Focus keyword — a palavra‑chave principal do artigo (guia interno).
4. **Aba Social**
   - OG title / OG description — só preencha se quiser algo diferente do meta.
   - OG image — só substitua se tiver uma arte 1200×630 pensada para redes.
5. **Aba Avançado**
   - Canonical URL — deixe em branco a menos que o conteúdo seja republicado de outro site (aí aponte para a fonte original).
   - Secondary keywords — 2–5 termos relacionados.
6. **Sidebar direita**
   - Autor (obrigatório — se esquecer, o autor padrão é aplicado).
   - Categoria (recomendado — 1 por post).
   - Tags (opcional — 3–5).
   - `Indexar` marcado (padrão).
7. Clique em **Salvar** → fica como rascunho.
8. Clique em **Ver preview** para conferir visualmente.
9. Quando estiver ok, use **Publicar** (ou **Agendar** para o futuro).

Checklist de qualidade antes de publicar:
- [ ] H1 = título; H2s cobrem as seções principais.
- [ ] 1 imagem destacada + alt‑text.
- [ ] Meta title ≤ 60 chars, meta description 140–160 chars.
- [ ] Slug curto, kebab-case, sem stop-words desnecessárias.
- [ ] Autor + categoria selecionados.
- [ ] Preview aberto e revisto em mobile e desktop.

---

## 7. Playbook: editar um artigo já existente

1. `/admin` → filtre por status → clique no artigo.
2. Faça a edição.
3. **Se mudar o slug de um artigo publicado**: o sistema cria um redirect 301 (via meta refresh) do slug antigo para o novo — automático. Você não precisa fazer nada extra, mas veja a seção 10.
4. Clique em **Salvar** (mantém status atual) ou **Publicar** (se ainda era rascunho).
5. A alteração aparece no site na hora — não precisa republicar o site.

Cuidado: edições **grandes** em artigos já ranqueados podem mexer no SEO. Se possível, avise a equipe e monitore Search Console nos dias seguintes.

---

## 8. Playbook: preview antes de publicar

Todo artigo tem um `preview_token` gerado automaticamente.

1. Abra o artigo no editor.
2. Clique em **Ver preview** (ou copie a URL `/blog/preview/{token}`).
3. Envie o link para quem precisa aprovar (WhatsApp, e‑mail).
4. Quem tem o link vê o artigo, mesmo em rascunho, sem precisar de login.

Segurança:
- O token é secreto por ser aleatório e longo (UUID).
- Se suspeitar de vazamento, reemissão manual **ainda não está na UI** — combine com o time técnico para regenerar.

---

## 9. Playbook: publicar agora / agendar / despublicar / excluir

**Publicar agora**
- Editor → **Publicar** → status vira `published`, `published_at = agora`, entra no `/blog`, no sitemap e no RSS na hora.

**Agendar**
- Editor → preencha **Data de publicação** no futuro → **Agendar** → status vira `scheduled`.
- Um cron do banco roda a cada 1 minuto e publica quando `published_at <= agora`.
- Antes da hora, o artigo não aparece no site nem no sitemap.

**Despublicar**
- Editor de um artigo publicado → botão **Rascunho** → volta para `draft` e some do site imediatamente.

**Excluir (definitivo)**
- Editor → botão vermelho **Excluir artigo** → confirmação → remove do banco.
- **Não há lixeira.** Prefira despublicar.

---

## 10. Playbook: mudar o slug sem quebrar SEO (redirects)

Contexto: se o artigo já era `published` e você muda o slug, quem tinha o link antigo (Google, backlinks, WhatsApp compartilhado) precisa cair no novo.

O que acontece automaticamente:
1. Um trigger no banco (`handle_post_slug_change`) detecta a mudança.
2. Cria um registro em `redirects`: `/blog/{slug-antigo}` → `/blog/{slug-novo}`, `status_code = 301`, `active = true`.
3. Se já existir uma cadeia (A→B, depois B→C), o sistema **achata** para A→C automaticamente.

Como o redirect roda no navegador:
- Ao abrir `/blog/{slug-antigo}`, se não achar artigo, o site consulta `redirects`.
- Aplica `<meta http-equiv="refresh">` + `<link rel="canonical">` para o slug novo + `window.location.replace`.
- Isso é um **301 client‑side** (não header HTTP). O Google entende, mas é ligeiramente mais fraco que um 301 server‑side.

Gerenciamento manual:
- `/admin/redirects` → veja, edite ou desative redirects.
- Regras do banco impedem loops (origem = destino, ou destino já é origem de outro redirect ativo).

Boa prática: **evite** mudar slug de artigos ranqueados sem necessidade. Se mudar, monitore Search Console por 2–4 semanas.

---

## 11. Guia dos campos de SEO no editor

| Campo | O que é | Onde aparece | Auto? | Quando personalizar |
|---|---|---|---|---|
| **Título** | Nome do artigo | Página, listagem, meta/OG por padrão | — | Sempre |
| **Slug** | Parte final da URL | URL pública | Gerado do título | Se quiser algo mais curto/estratégico |
| **Resumo** | Chamada curta | Listagem, meta description por padrão | — | Sempre |
| **Imagem destacada** | Imagem do topo | Página, listagem, OG image | — | Sempre |
| **Alt-text** | Descrição da imagem | HTML/acessibilidade | Sugerido do nome do arquivo | Descrever o conteúdo real |
| **Meta title** | Título no Google | SERP + aba do navegador | Usa o título | Para versão mais persuasiva/keyword-first ≤ 60 chars |
| **Meta description** | Descrição no Google | SERP | Usa o resumo | Para incluir CTA/keyword, 140–160 chars |
| **Canonical URL** | URL "oficial" | `<link rel=canonical>` | `/blog/{slug}` deste site | Só se o conteúdo veio de outro lugar |
| **Focus keyword** | Palavra‑chave principal | Interno | — | Sempre — guia a escrita |
| **Secondary keywords** | Termos de apoio | Interno | — | Opcional |
| **OG title / description / image** | Card social (WhatsApp, LinkedIn, Facebook) | Redes sociais | Copia meta / imagem destacada | Quando quiser algo específico para redes |
| **index_page** | Se aparece no site/sitemap | Meta robots + sitemap | Marcado | Desmarque para páginas ocultas/experimentais |

Exemplo preenchido:
- Título: *Como calcular o ROI de campanhas B2B em 5 passos*
- Slug: `roi-campanhas-b2b`
- Meta title: *ROI em campanhas B2B: como calcular passo a passo* (58 chars)
- Meta description: *Aprenda a medir ROI de campanhas B2B com fórmula prática, benchmarks e planilha gratuita. Guia completo em 5 passos.*
- Focus keyword: `roi campanhas b2b`
- index_page: ✓

---

## 12. Open Graph e cards em WhatsApp/LinkedIn (limitação importante)

**O que funciona**
- Google Search: enxerga meta title, description, canonical, JSON-LD e OG por artigo (executa JS).
- Compartilhamento por link direto do artigo em qualquer canal: o link **funciona** normalmente.

**O que NÃO funciona hoje (limitação de plataforma)**
- WhatsApp, LinkedIn, Facebook, Twitter/X e Slack montam o card do link **sem executar JavaScript**. Eles só leem o `index.html` estático.
- Consequência: o **card social por artigo não é específico** — todo mundo vê o card padrão da Seu Resultado.

**Como resolver no futuro (opcional)**
- Migrar hospedagem para uma que faça SSR (Vercel/Cloudflare Workers), ou
- Colocar um "OG image proxy" na frente do domínio.
- Enquanto isso: aceite a limitação; o SEO no Google não é impactado.

---

## 13. Imagens: upload, tamanhos, alt-text, boas práticas

- **Onde ficam:** bucket privado `blog-images` no Supabase Storage.
- **Upload:** editor → **Enviar arquivo** → o painel gera uma **URL assinada de 10 anos** e salva no artigo.
- **Formatos aceitos:** JPG, PNG, WEBP, AVIF, GIF.
- **Recomendado:** JPG ou WEBP, largura ~1200 px, ≤ 500 KB.
- **OG image recomendada:** 1200×630 px.
- **Alt-text:** sempre preencha — melhora SEO e acessibilidade.
- **Limpeza:** trocar a imagem no artigo **não** apaga a antiga do bucket. Faça limpeza manual periódica em `Cloud → Storage → blog-images`.

---

## 14. Autores, categorias, tags e taxonomia

**Autores** — `/admin/authors`
- CRUD completo. Marque **um autor como padrão** — é aplicado quando a API não informa `author_id`.
- E-mails de autores **não são expostos** publicamente.

**Categorias** — `/admin/taxonomy`
- Cada artigo tem no máximo **uma** categoria.
- Categoria aparece em `/blog/categoria/{slug}` (página listagem própria).

**Tags** — `/admin/taxonomy`
- Um artigo pode ter várias.
- Aparecem em `/blog/tag/{slug}`.

Boa prática: use categorias amplas (3–8 no total) e tags específicas por tópico. Não crie categoria nova para cada post.

---

## 15. Sitemap, RSS, robots.txt e Google Search Console

**Dois sitemaps ativos:**
- Institucional (estático): `https://seuresultado.com/sitemap.xml` — páginas fixas (home, /sobre, /cases, /blog, etc.).
- Dinâmico do blog (via Edge Function): `https://gtmmlnipfxvsktveywmh.supabase.co/functions/v1/sitemap` — só artigos `published` + `index_page=true` + páginas de categoria/tag com conteúdo.

**RSS:** `https://gtmmlnipfxvsktveywmh.supabase.co/functions/v1/rss` — referenciado no `<head>` do site.

**robots.txt (`https://seuresultado.com/robots.txt`)** declara ambos os sitemaps e bloqueia `/admin`, `/login`, `/blog/preview`.

**Google Search Console (passo a passo):**
1. `search.google.com/search-console` → **Adicionar propriedade → Prefixo do URL** → `https://seuresultado.com`.
2. Verifique via **Tag HTML** (peça o snippet para o time técnico colar no `<head>` do `index.html`).
3. Menu **Sitemaps** → enviar `https://seuresultado.com/sitemap.xml`.
4. O sitemap dinâmico é descoberto pelo `robots.txt` — não precisa enviar manualmente.
5. Para forçar indexação de um artigo específico: **Inspeção de URL** → colar `/blog/{slug}` → **Solicitar indexação**.

---

## 16. API Keys e auditoria

**Onde:** `/admin/api-keys`.

**Como criar:**
1. **Nova chave** → nome (ex.: `n8n-writer`) → escolha permissões:
   - `posts:write` — criar, atualizar, submeter, deletar.
   - `posts:publish` — aprovar, publicar, agendar.
2. A chave real (formato `sr_live_...`) é mostrada **UMA ÚNICA VEZ**. Copie e guarde em cofre.
3. No banco fica só o hash SHA-256 e o prefixo (5 primeiros chars).

**Como revogar:** botão **Revogar** na lista → a chave para de funcionar instantaneamente.

**Chaves recomendadas para n8n:**
- `n8n-writer` — apenas `posts:write` (para o workflow que gera conteúdo).
- `n8n-publisher` — `posts:write` + `posts:publish` (só o webhook de aprovação usa).

**Auditoria:** `/admin/audit-logs` → filtra por chave, ação, status, artigo, data. Toda chamada da API cai aqui.

---

## 17. Playbook: usar a Blog API (n8n / integrações)

**Base URL:** `https://gtmmlnipfxvsktveywmh.supabase.co/functions/v1/blog-api`

**Headers obrigatórios:**
```
x-api-key: sr_live_...
Content-Type: application/json
```

**Endpoints principais** (respostas incluem `preview_url` e, quando publicado, `public_url`):

| Método + rota | Permissão | Efeito |
|---|---|---|
| `GET /posts?status=draft&limit=50` | qualquer chave | Listar posts |
| `POST /posts` | `posts:write` | Criar rascunho |
| `GET /posts/:id` (ou `?by=slug`) | qualquer chave | Ler post |
| `PATCH /posts/:id` | `posts:write` | Atualizar |
| `POST /posts/:id/submit` | `posts:write` | `draft → review` |
| `POST /posts/:id/approve` | `posts:publish` | `review → approved` |
| `POST /posts/:id/publish` | `posts:publish` | Publica agora |
| `POST /posts/:id/schedule` | `posts:publish` | body `{ "publish_at": "..." }` → `scheduled` |
| `GET /posts/:id/preview` | qualquer chave | Retorna preview URL |
| `DELETE /posts/:id` | `posts:write` | Deletar (definitivo) |

**Body para criar/atualizar (todos opcionais exceto `title`):**
```json
{
  "title": "Título",
  "slug": "opcional-gerado-do-titulo",
  "excerpt": "...",
  "content": "<p>HTML sanitizado</p>",
  "featured_image": "https://...",
  "featured_image_alt": "...",
  "author_id": "uuid",
  "category_id": "uuid",
  "meta_title": "...",
  "meta_description": "...",
  "canonical_url": "...",
  "focus_keyword": "...",
  "secondary_keywords": ["k1","k2"],
  "og_title": "...", "og_description": "...", "og_image": "...",
  "index_page": true,
  "source": "n8n",
  "automation_meta": { "run_id": "..." }
}
```

**Códigos de erro:**
- `401` — chave ausente/inválida.
- `403` — chave sem a permissão exigida.
- `404` — post não encontrado.
- `400` — validação falhou (a mensagem indica o campo).
- `500` — inclui `request_id` para investigação nos logs.

**Exemplo curl (criar rascunho):**
```bash
curl -X POST "https://gtmmlnipfxvsktveywmh.supabase.co/functions/v1/blog-api/posts" \
  -H "x-api-key: sr_live_XXXX" \
  -H "Content-Type: application/json" \
  -d '{"title":"Teste via API","excerpt":"...", "content":"<p>Olá</p>", "source":"manual"}'
```

---

## 18. Fluxo n8n + WhatsApp de aprovação

Arquitetura sugerida (uma passada completa):

1. **n8n cria rascunho** → `POST /posts` com `source: "n8n"` + `automation_meta.run_id`. Guarda `post.id` e `preview_url`.
2. **n8n envia WhatsApp ao editor** com o `preview_url` + botões:
   - ✅ Aprovar → webhook chama `POST /posts/:id/approve` seguido de `POST /posts/:id/publish`.
   - 📅 Agendar → webhook pede data → `POST /posts/:id/schedule` com `{ "publish_at": "..." }`.
   - ✏️ Ajustar → webhook coleta instruções e chama `PATCH /posts/:id`.
   - ❌ Descartar → `DELETE /posts/:id`.
3. **Chaves separadas por função** (`n8n-writer` só `posts:write`; `n8n-publisher` com `posts:publish` para o webhook de aprovação).
4. **Referências úteis no n8n**:
   ```
   {{$json.post.id}}
   {{$json.post.status}}
   {{$json.post.slug}}
   {{$json.preview_url}}
   {{$json.public_url}}   // depois de /publish
   ```
5. **Auditoria:** cada chamada cai em `/admin/audit-logs`.

---

## 19. Troubleshooting

| Sintoma | Provável causa | O que fazer |
|---|---|---|
| Publiquei mas não aparece em `/blog` | `index_page` desmarcado, ou `published_at` no futuro | Editar o post, marcar Indexar, ajustar data |
| Publiquei mas o card no WhatsApp está genérico | Limitação de SSR (seção 12) | Aceitar limitação; não é bug |
| Google não indexa | Falta submeter sitemap / URL nova; conteúdo raso | Search Console → Inspeção de URL → Solicitar indexação |
| Editor não deixa salvar (slug duplicado) | Já existe post com esse slug | Ajustar slug |
| Mudei o slug e URL antiga dá 404 | Redirect não criado (post não estava `published`) | Criar redirect manual em `/admin/redirects` |
| API retorna 401 | Header `x-api-key` ausente/errado ou chave revogada | Conferir/gerar nova chave |
| API retorna 403 | Chave não tem a permissão do endpoint | Usar chave `n8n-publisher` para publicar/agendar |
| Preview mostra "não encontrado" | Token errado ou post excluído | Reabrir editor e copiar o link novamente |
| Imagem não aparece no artigo publicado | URL assinada expirada (raríssimo) ou arquivo apagado do bucket | Reenviar imagem no editor |
| Agendei e não publicou | Data no passado no momento do agendamento, ou cron atrasado (≤1 min) | Editar data, agendar novamente |

---

## 20. Checklists rápidos

**Antes de clicar em Publicar**
- [ ] Título forte, ≤ 60 chars no meta title
- [ ] Meta description 140–160 chars, com CTA
- [ ] Slug curto, kebab-case
- [ ] Imagem destacada + alt-text
- [ ] Autor e categoria selecionados
- [ ] Preview conferido em mobile e desktop
- [ ] `Indexar` marcado

**Antes de mudar um slug já ranqueado**
- [ ] Necessário mesmo? (evite se possível)
- [ ] Confirme que o post está `published` para o redirect automático rodar
- [ ] Depois: teste URL antiga em aba anônima
- [ ] Monitore Search Console 2–4 semanas

**Antes de ligar o n8n em produção**
- [ ] Chaves `n8n-writer` e `n8n-publisher` criadas
- [ ] 1 fluxo criar → aprovar → publicar testado com post descartável
- [ ] `DELETE` testado com post descartável
- [ ] `/admin/audit-logs` mostra as chamadas
- [ ] Agendamento validado com 1 post real (+2 min no futuro)

**Higiene mensal**
- [ ] Revisar rascunhos antigos em `/admin`
- [ ] Limpar imagens órfãs no bucket `blog-images`
- [ ] Conferir Search Console → Cobertura
- [ ] Revisar logs de auditoria por chamadas suspeitas
- [ ] Fazer export do banco (Lovable → Cloud → Advanced → Export)

---

**Documentos técnicos relacionados no projeto:**
- `DOCUMENTACAO_COMPLETA_SITE_E_BLOG.md` — visão completa da infraestrutura.
- `BLOG_API_DOCUMENTATION.md` — contrato detalhado da API.
- `RESUMO_EXECUTIVO_INFRAESTRUTURA.md` — visão condensada para reunião.
