Por projeto: Card no hub = card na página inicial; Acesso às páginas = libera/bloqueia todas as páginas do projeto (bloqueado → 404).
Catálogo público em astrojorn.com/ggpoints. Criar aqui não entrega automaticamente: todo resgate entra como pendente para aprovação.
Encerrar uma temporada grava os seis maiores pontuadores do período. Essa fotografia fica fixa no Hall da Fama público.
Cada data exige o tempo indicado de presença. A missão usa buckets únicos de 10 minutos, então duas plataformas na mesma janela não aceleram a conquista.
Aprovar reserva o pedido; concluir confirma a entrega. Rejeitar ou estornar devolve pontos e estoque.
Use para bônus pontuais e correções positivas. Todo crédito entra no livro-razão com o motivo informado e altera o ranking.
A carteira é o livro-razão: o saldo é a soma de créditos, compras e estornos de cada identidade Discord.
Clique para abrir em uma nova aba.
Hierarquia das páginas do site — gerada automaticamente a partir do registro de páginas. [principal] = página de primeira grandeza com banner personalizado fixo · [secundaria] = subpágina com banner substituível.
Crie links curtos com URL personalizada e acompanhe acessos. Formato: /{slug} (ex: /discord). /l/{slug} continua funcionando.
| Link | Título | Projeto | Destino | Acessos | Criado | Ações |
|---|
Gerencia os carrosséis animados de /gg/setup: Hardware, Periféricos e Outros. Cada um tem sua própria ordem. Loop infinito direita→esquerda, pausa no hover, clique na imagem abre detalhes. Use ⬆ Upload para enviar uma imagem (WebP/JPEG/PNG/GIF/AVIF, máx 2MB) — ela é salva no site e a URL é preenchida sozinha.
| Imagem | Nome | Carrossel | Link | Ordem | Ativo | Ações |
|---|
Substitui a imagem de destaque (wallpaper) do topo de cada página. As páginas principais (hub, /gg, /oldalegoria, /pcismo) têm banner personalizado (HTML próprio) e são fixas — fora deste sistema. Nas subpáginas abaixo o wallpaper é substituível. Páginas de artigo ficam de fora. Use ⬆ Upload para enviar uma imagem (WebP/JPEG/PNG/GIF/AVIF, máx 2MB) — a URL é preenchida sozinha. Salvar grava a troca; ✕ Reset volta ao padrão da página.
| Página | Banner atual | URL da imagem | Ações |
|---|
Emails enviados para contato@astrojorn.com chegam aqui: Cloudflare Email Routing → Worker astrojorn-inbox → banco D1. Uma cópia também é reencaminhada ao Gmail de segurança (variável FORWARD_TO do worker). Clique em um email para ver o conteúdo; as mensagens abrem já marcadas como lidas.
Detecta automaticamente (cron a cada 10min) quando você está ao vivo em Twitch, Kick ou YouTube e exibe a barra AO VIVO no topo de /gg. Use o registro manual abaixo para marcar sua atividade — cada sessão vira um card "últimas lives" no /gg.
Botão único: clique em ▶ Marcar AO VIVO quando começar e em ■ Parar live ao terminar. A sessão aparece no card "últimas lives" (data + barra de horas + jogo). Após 20min ao vivo, o sistema tenta capturar id/jogo do YouTube automaticamente. Lives separadas por menos de 20min se fundem numa sessão.
help — mostra esta ajuda
status — verifica status do pipeline
refresh anytype — força refresh do Anytype Astro
refresh alegoria — força refresh da Anytype Alegoria
refresh all — refresh dos dois ao mesmo tempo
clear — limpa o terminal
whoami — mostra o usuário atual
date — data/hora atual
Acesso
URL:
/carneiroSessão:
sessionStorage + verificação de segurançaPipeline
3 camadas: Cache API (edge) → KV (persistente) → Anytype (fonte)
Requisições condicionais com ETag / SHA-256 hash
Cron: a cada 10 minutos
Dados degradados nunca sobrescrevem o KV
Agrupe tags em categorias para o filtro automático das páginas de artigos. A tag com ★ é a principal — o rótulo dela (ou o nome do grupo) é o que aparece no filtro. Tags iguais ou parecidas entram como aliases do mesmo grupo.
Páginas internas em KV. Os arquivos de referência em docs/ continuam no painel Documentos.
1. Projetos #
O ecossistema Astroverso tem 4 projetos, cada um com tema visual e rota próprios.
| Projeto | Rota | Tema | Descrição |
|---|---|---|---|
| jornn | / | violeta | Página principal (Hub) |
| Astrojorn | /gg | violeta #8b5cf6 | Games, streams, setup |
| Alegoria | /oldalegoria | amber #f9a21e | Portfólio design e vídeo |
| astroPcismo | /pcismo | verde neon #00ffa3 | Hardware e venda de produtos |
| Dashboard | /carneiro | violeta | Admin (esta página) |
jornn (Hub) — /
Página principal do ecossistema. Sem navbar — apenas o título com gradiente animado, cards de navegação para os projetos e um terminal de comandos (!carneiro, !clear). Cursor customizado ativo (tema hub). Neon glow oscilante nos cards ao hover.
Astrojorn — /gg
Página de games e streams. Navbar .site-nav com sombra violeta + links para YouTube, Twitch, Kick, Discord. Hero .ticket animado com gradiente + grid parallax + meteoros. Dados do Anytype principal. Sub-páginas: /jogos (catálogo), /setup (hardware), artigos em /gg/artigos/{slug}. Componentes Astro: CuratorCard, GameCards, SetupCards, Commands, Calendar.
Alegoria Criativa — /oldalegoria
Portfólio de design e vídeo. Navbar .site-nav com sombra amber. Hero com gradiente animado + noise overlay + Three.js shader. Efeito radial reveal nos cards. Cursor customizado ativo (tema alegoria). Dados do Anytype Alegoria. Artigos em /oldalegoria/artigos/{slug}. Componente: AlegoriaPortfolio.
astroPcismo — /pcismo
Hardware e venda de produtos. Tema pcismo (preto, branco e verde neon #00ffa3, contornos totalmente quadrados). Navbar .site-nav com breadcrumbs + seções. Grupos de promoções no topo (botões Telegram, WhatsApp, Discord). Hero "ASTROPCISMO" com subtítulo "vivendo o pcismo ao extremo!". Vitrine de produtos com botão de compra. Sub-páginas: /produtos (catálogo), /artigos + /artigos/{slug}. Dados de produtos em src/data/produtos.js (estático). Artigos: KV tipo pcismo + fallback Content Collection.
Dashboard — /carneiro
Painel administrativo (esta página). Rota privada sem links no site. Autenticação: token + pergunta de segurança. Pipeline status, analytics Cloudflare, publicação de artigos, terminal, wiki, documentação.
2. Design System #
Temas gerenciados por variáveis CSS em src/styles/theme.css conforme atributo data-theme no <html>. Astro gera HTML estático com zero frameworks no frontend.
Design Tokens
Cada tema define variáveis CSS no seletor [data-theme="..."]:
--bg: #080b12; // fundo principal --surface: #131a2b; // superfície de cards --line: #3d4f7a; // bordas --text: #eae8f5; // texto --accent: #8b5cf6; // cor de destaque (violeta) --accent-soft: #a78bfa; --nav-accent: rgb(139,92,246); --radius-s: 8px; --font-display: 'Space Grotesk', ...; --font-mono: 'JetBrains Mono', ...;
Layouts (Astro)
| Layout | Uso | Características |
|---|---|---|
BaseHtml.astro | Shell de todos | HTML base, cursor customizado, footer, scroll progress |
HubLayout.astro | Página / | Sem navbar, gradient text, terminal, project cards |
AstroLayout.astro | /gg/* | Nav completa, hero ticket, meteoros, grid parallax |
AlegoriaLayout.astro | /oldalegoria/* | Nav completa, noise overlay, Three.js, radial reveal |
PcismoLayout.astro | /pcismo/* | Nav completa, preto/branco/verde neon, cantos quadrados, vitrine de produtos |
ArtigoLayout.astro | Artigos | Índice flutuante h2–h4, hero com data/tags, footer nav |
Componentes Astro
| Componente | Descrição |
|---|---|
CuratorCard | Card de curadoria Steam com dados da API |
GameCards | Grid de jogos categorizados por status |
SetupCards | Cards de hardware/periféricos |
Commands | Grid de comandos de chat |
Calendar | Lista de eventos agendados |
AlegoriaPortfolio | Grid de design + vídeo com fallback |
TagPill | Tag estilizada colorida |
HardwareCarousel | Carrossel animado de peças em destaque em /gg/setup (loop infinito, modal) |
LiveAnnouncementBar | Barra "AO VIVO AGORA EM:" com polling adaptativo e efeito ARGB |
ProductCard | Card de produto do astroPcismo (spec mono, botão de compra com glow verde neon) |
Animações
| Animação | Onde | Descrição |
|---|---|---|
fadeInUp | Global (.reveal) | Opacidade 0→1 + translateY 24px na viewport |
gradientJornn | Hub title | Gradiente + hue-rotate infinito no "jornn" |
neonOscillate | Hub cards | Box-shadow neon oscilante ao hover |
textShift | Astro hero | Gradiente + hue-rotate no ticket |
meteor-drop | Astro hero | Meteoros com cauda diagonal |
navSlideIn | Site nav | Slide dos links ao carregar |
carousel-scroll | HardwareCarousel | Loop infinito direita→esquerda do carrossel de hardware |
liveArgbSweep | LiveAnnouncementBar | Sweep arco-íris passando pelo card AO VIVO (mix-blend-mode:screen) |
Inner-Reveal inner-reveal | Cards/listas/containers de dados | Reveal interno em cascata — os itens DENTRO de um card (tags, labels, linhas, badges) fazem fade + slide escalonado quando o container fica visível. Receita completa em docs/DESIGN-SISTEMA.md (base sempre ativa + .revealed + stagger --r-delay) |
Cursor Customizado
Ativo nos temas hub e alegoria. Círculo de 20px com mix-blend-mode: difference que expande para 60px ao hover em elementos interativos. Desativado no tema Astro.
3. Pipeline de Dados #
3 camadas de cache com requisição condicional e proteção contra dados corrompidos. Endpoints SSR em src/pages/api/ (worker/ é referência legada).
Cache
| Camada | Velocidade | Persistência |
|---|---|---|
| Cache API | ms | Efêmera (edge) |
| KV | ~5ms | Persistente |
| Anytype | ~200-500ms | Fonte original |
Requisição Condicional
ETag / Last-Modified → If-None-Match / If-Modified-Since. Se Anytype responder 304, pula tudo. SHA-256 hash como fallback defensivo.
Qualidade de Dados
| Qualidade | Critério | Cache TTL |
|---|---|---|
ok | Tudo funcionando | 10min (SWR 1h) |
lowConfidence | 1 warning | 10min |
degraded | 2+ warnings | 30s (SWR 5min) |
KV nunca sobrescrito com dados degraded. Só persiste ok ou lowConfidence.
Cron
A cada 10 minutos: fetch condicional Anytype principal + Alegoria + tentativa de curadoria Steam. Se 304, apenas atualiza TTL do Cache API.
Refresh Manual
POST /api/anytype/refresh ou POST /api/anytype/alegoria/refresh com header X-Refresh-Token. Força ignorar ETag/hash, baixa HTML completo, parseia e grava KV + Cache API.
APIs (endpoints SSR em src/pages/api/)
| Endpoint | Método | Função |
|---|---|---|
/api/anytype | GET | Dados do Anytype principal (3 camadas de cache) |
/api/anytype/auth | POST | Autenticação do painel |
/api/anytype/refresh | POST | Refresh forçado do Anytype principal |
/api/anytype/alegoria | GET | Dados do Anytype Alegoria |
/api/anytype/alegoria/refresh | POST | Refresh forçado da Alegoria |
/api/curator | GET | Dados da curadoria Steam |
/api/curator/refresh | POST | Refresh da curadoria Steam |
/api/article/publish | POST | Cria/atualiza artigo (dashboard → KV) |
/api/article/[type] | GET | Lista metadados de artigos de um tipo |
/api/article/[type]/[slug] | GET / DELETE | Lê ou exclui um artigo |
/api/links | GET / POST | Lista ou cria links curtos (encurtador) |
/api/links/[slug] | PATCH / DELETE | Atualiza ou exclui um link curto |
/{slug} | GET | Redireciona 302 para o destino (link curto na raiz) + conta acesso |
/l/[slug] | GET | Redireciona 302 (formato legado — continua funcionando) |
/api/carousel/items | GET / POST | Lista (público) ou cria itens do carrossel de hardware (auth) |
/api/carousel/items/[id] | PATCH / DELETE | Atualiza ou exclui um item do carrossel |
/api/carousel/reorder | POST | Reordena itens do carrossel (lista de ids) |
/api/upload | POST | Upload de imagem (magic bytes, máx 2MB) → KV |
/api/image/[name] | GET | Serve imagem enviada (cache imutável 1 ano) |
/api/live-status/current | GET | Status atual da live (polling, refresh on-demand >2min, s-maxage=30) |
/api/live-status/config | GET / PUT / PATCH / DELETE | Configuração de canais/enabled/simulate (auth) |
/api/live-status/simulate | POST | Simula ao vivo em uma ou mais plataformas (auth) |
/api/live-status/refresh | POST | Re-checa canais e grava status no KV (cron + botão) |
/api/analytics | GET | Métricas Cloudflare (requer auth + secrets) |
/api/cron | GET | Status da última execução do cron |
/api/settings/cloudflare | GET / POST | Configuração Cloudflare (token mascarado) |
4. Sistema de Artigos #
Artigos têm duas fontes resolvidas em cascata na rota SSR: KV (publicados por esta página, com Markdown renderizado via marked) e Content Collections (arquivos .md em src/content/) como fallback.
Resolução na rota [...slug]
- KV:
CURATOR_KV.get("article:{type}:{slug}")→ renderiza commarked - Fallback:
getCollection("{type}-artigos")→render(post) - Nada encontrado → 404 com página de diagnóstico
Rotas
/gg/artigos/{slug},/oldalegoria/artigos/{slug}e/pcismo/artigos/{slug}- Rotas antigas
/artigo/{slug}→ redirect 301
Estrutura (fallback Content Collection)
src/content/
├── astro-artigos/ # Artigos do Astrojorn (fallback)
│ ├── meu-primeiro-post.md
│ └── dicas-streaming.md
├── alegoria-artigos/ # Artigos da Alegoria Criativa
│ └── design-identidade-visual.md
└── pcismo-artigos/ # Artigos do astroPcismo (fallback)
└── guia-de-setup.md
Schema (Zod — src/content.config.js)
title: string (obrigatório) date: date (obrigatório) tags: string[] (opcional, padrão []) description: string (opcional)
Fluxo de Publicação
- Pelo dashboard (recomendado): aba Publicação → preencher título, tags e conteúdo em Markdown → "Publicar artigo" → salvo em KV, atualização imediata
- Por arquivo (fallback): criar
.mdemsrc/content/{tipo}-artigos/com frontmatter title/date/tags → Astro gera no build
Layout
Cada artigo usa ArtigoLayout.astro: índice flutuante à direita (headings h2–h4, expande no hover, destaca heading ativo), hero com data publicada/atualizada e tags coloridas, footer com navegação. Colunas lado a lado via <div class="row"><div class="col">.
5. Painel Administrativo #
Esta página. Painel protegido em /carneiro para gerenciar o pipeline de dados e documentos do projeto.
Autenticação
- Login com usuário + token (X-Refresh-Token)
- Pergunta de segurança com resposta hasheada (SHA-256)
- 3 tentativas máximas para a pergunta de segurança
- Sessão em sessionStorage + localStorage opcional
Abas
| Aba | Função |
|---|---|
| Dashboard | Status do pipeline (Anytype, cache, cron) + Analytics Cloudflare |
| Links | Atalhos para páginas do site, sub-páginas e redes sociais |
| Encurtador | Links curtos /{slug} (criar/editar/excluir + acessos, check de disponibilidade ao vivo e slug reservado) |
| Terminal | Console bash com comandos: status, refresh, whoami, date |
| Ações rápidas | Botões para refresh Anytype/Alegoria, verificar status |
| Publicação | Publicar/editar/excluir artigos em Markdown (KV) |
| Wiki | Documentação resumida do projeto |
| Documentos | Arquivos de referência docs/ completos |
| Ajuda | Comandos do terminal e info do pipeline |
Analytics
Requer secrets CLOUDFLARE_API_TOKEN e CLOUDFLARE_ACCOUNT_ID. Mostra requests 24h/7d/30d, erros, países (via GraphQL, requer CLOUDFLARE_ZONE_ID), e pageviews (total, daily, unique visitors) — desde OPT-012 agregados via D1 (pageviews) com fallback do histórico legado no KV.
6. Diretrizes de Desenvolvimento #
Convenções para manter consistência no código. Documento completo em docs/diretrizes_ia.md.
Stack
Astro v7 Zero frameworks no frontend HTML/CSS/JS puro Cloudflare Workers KV
Convenções
| Contexto | Estilo | Exemplo |
|---|---|---|
| Arquivos .astro | PascalCase | AstroLayout.astro |
| Variáveis JS | camelCase | fetchAndCacheAnytype |
| Constantes | UPPER_SNAKE | ANYTYPE_URL |
| CSS classes | kebab-case | .site-nav |
| Chaves KV | snake_case | anytype_main |
| IDs HTML | kebab-case | panel-dashboard |
Regras
- Sempre verificar layouts existentes antes de criar novos — reutilizar
BaseHtml.astro - Não adicionar dependências npm sem justificativa (hoje: astro, wrangler, @astrojs/cloudflare, marked)
- Sempre usar
escapeHtml()em dados de fonte externa - APIs em
src/pages/api/— não editarworker/(referência legada) - Artigos vêm do KV (dashboard) primeiro; Content Collections são fallback
- Headings h2–h4 suportados no índice flutuante e no
renderMarkdown - Colunas lado a lado usam
<div class="row">+<div class="col"> varem vez delet/constem escopo de função no JS do dashboard- Testar com
npm run devpara design,npm run wrangler:devpara teste completo - Animação de itens internos de card = inner-reveal (receita em
docs/DESIGN-SISTEMA.md) — não criar mecanismo novo; container[data-live-fallback]é revelado pelolift()
7. Arquivos de Referência #
Todos os documentos de referência estão em docs/. Veja o conteúdo completo no painel Documentos.
| Arquivo | Descrição |
|---|---|
docs/README.md | Documentação principal — arquitetura, stack, comandos, histórico de bugs |
docs/PROJETOS.md | Catálogo dos 4 projetos com rotas, cores, páginas internas |
docs/DESIGN-SISTEMA.md | Design system completo: layouts, tokens, componentes, animações (inclui o nome/receita do Inner-Reveal) |
docs/ENGENHARIA.md | Engenharia de correção e desenvolvimento: post-mortems de bugs + padrões por projeto |
docs/diretrizes_ia.md | Diretrizes de desenvolvimento para IA: stack, nomenclatura, regras |
docs/ADMIN.md | Documentação do painel administrativo /carneiro |
docs/ARTIGOS.md | Sistema de artigos (KV via dashboard + Content Collections, Markdown) |
src/styles/theme.css | Temas via CSS custom properties (data-theme) |
src/pages/api/ | Endpoints SSR — article, analytics, anytype, curator, cron |
wrangler.toml | Config Cloudflare — KV, cron, assets, compatibility date |
8. Cards / Componentes #
Cada card ou componente que exibe dados dinâmicos no site, com origem do dado, sistema de consulta e namespace KV usado.
Imagens, links e vídeos de todos os projetos.
Índice com filtros de bugs corrigidos, otimizações e falhas identificadas. Fonte da verdade: docs/ENGENHARIA.md e docs/README.md. IDs estáveis {TIPO}-{NNN} (BUG / OPT / FALHA) usados como referência em commits e documentação.
Modelos 3D, mockups e renders dos projetos.
Componentes de UI e animações CSS do design system.
Arquivos em docs/ — documentação completa do projeto.
Carregando documento…
Carregando documento…
Carregando documento…
Carregando documento…
Carregando documento…
Carregando documento…
Carregando documento…
Carregando documento…
Carregando documento…
Carregando documento…
Carregando documento…
Configure as credenciais da API Cloudflare para ativar o Analytics e outras integrações.
Os dados ficam salvos no KV e são usados pelo endpoint /api/analytics.
- API Token — dash.cloudflare.com/profile/api-tokens
Crie um token com permissão Workers Scripts:Edit e Analytics:Read. Copie o token gerado (só aparece uma vez). - Account ID — dash.cloudflare.com → visão geral → Account ID no painel direito. Ou em Workers & Pages → visão geral.
- Zone ID (opcional) — dash.cloudflare.com → clique no domínio → visão geral → Zone ID no painel direito.
Necessário apenas para dados de países/regiões nos analytics.