// por dentro
Como foi construído
Site estático (HTML, CSS e JavaScript puro, sem framework nem etapa de build) servido pela Vercel, com Serverless Functions em Node para a parte dinâmica. Um Vercel Cron roda duas vezes por dia, busca em paralelo notícias (NewsData.io), clima (OpenWeatherMap), câmbio (open.er-api) e terremotos (P2PQuake) e grava um único JSON no Vercel Blob; as rotas de leitura só leem esse JSON, com cache de CDN, e o navegador ainda guarda o resultado em localStorage por janela de atualização. O blog usa o mesmo Blob como armazenamento, com login Google (OAuth) e sessão assinada por HMAC.
- Front-end
- HTML5CSS3 (variáveis, grid, tema claro/escuro) e JavaScript purosem dependências nem build
- Back-end
- Vercel Serverless Functions (Node, ES modules) em /api
- Dados
- Vercel Blob (@vercel/blob 2.x) como cache das APIs externas e armazenamento do blog e das imagens
- Integrações
- NewsData.ioOpenWeatherMapopen.er-api (câmbio)P2PQuake (terremotos)Google OAuthGoogle AdSense
- Infra
- Vercel com Cron Jobs (03:00 e 15:00 UTC)rewrites para URLs limpas e redirecionamento 301 do domínio antigo
Performance
Custo de API fixo, independente do tráfego
Só o endpoint do Cron chama as APIs externas: 10 requisições por execução, 2 execuções por dia. As rotas públicas leem o JSON do Blob com Cache-Control s-maxage=900 e stale-while-revalidate, e o front guarda em localStorage por slot (00h/12h), então um pico de visitas não gasta cota das APIs.
Arquitetura
Agregação tolerante a falhas
As cinco fontes são buscadas em paralelo com Promise.all, e cada chamada passa por um wrapper que devolve null em vez de lançar. Se o serviço de clima ou de câmbio cair, o restante do portal é gravado e exibido normalmente; na primeira visita sem cache, o servidor popula o Blob uma única vez.
Segurança
Chaves só no servidor e Cron protegido
O navegador nunca vê as chaves do NewsData e do OpenWeatherMap: elas ficam em variáveis de ambiente lidas só pelo Cron. O endpoint /api/cron/refresh exige o header Authorization com o CRON_SECRET enviado pela Vercel.
Segurança
Login Google sem biblioteca de auth
Fluxo OAuth 2.0 implementado à mão: cookie de state contra CSRF, troca do code no servidor, checagem de iss, aud e email_verified do id_token e allowlist de e-mails. A sessão é um token assinado com HMAC-SHA256 (crypto nativo) em cookie HttpOnly, Secure e SameSite=Lax, comparado com timingSafeEqual e com validade de 12 horas.
Segurança
Upload validado direto para o Blob
A rota de upload exige sessão, aceita só data URLs de tipo image/*, limita o arquivo a 4 MB (teto do corpo das Functions) e sanitiza o nome antes de gravar no Vercel Blob.
SEO
SEO de um site sem framework
Meta tags, Open Graph e JSON-LD no HTML, canonical, sitemap.xml e robots.txt que bloqueia /api e /admin. Nas páginas geradas no cliente (posts e categorias), o JavaScript atualiza título, Open Graph e injeta JSON-LD de BreadcrumbList; os dados de APIs externas são escapados antes de entrar no DOM.