dashboard management ✦ jornn

painel de controle

dashboard management ✦ jornn

[clique para exibir]
offline
Status do pipeline
Anytype Astro
carregando...
Anytype Alegoria
carregando...
Cache API
Cron
a cada 10min
Cards do hub (página inicial)

Por projeto: Card no hub = card na página inicial; Acesso às páginas = libera/bloqueia todas as páginas do projeto (bloqueado → 404).

📋 Dados AnyType
🎮 Jogando agora
carregando...
📅 Calendário
carregando...
Analytics Cloudflare
Requests (24h)
últimas 24 horas
Requests (7d)
últimos 7 dias
Requests (30d)
total mensal
Erros (30d)
total de erros no worker
Acessos (páginas e visitantes)
Total de acessos
desde o início do rastreamento
Acessos hoje
páginas visitadas hoje
Visitantes únicos
visitantes diferentes hoje
Países / Regiões
Carregando dados de localização...
KV Usage (CURATOR_KV)
Contagens de hoje (limites gratuitos: 100k leituras · 1k escritas · 1k deleções · 1k listagens por dia). Histórico de 7 dias abaixo.
Leituras (reads)
0 / 100.000
Escritas (writes)
0 / 1.000
Deleções (deletes)
0 / 1.000
Listagens (lists)
0 / 1.000
GG Points · prêmios da comunidade

Catálogo público em astrojorn.com/ggpoints. Criar aqui não entrega automaticamente: todo resgate entra como pendente para aprovação.

Temporadas e Hall da Fama

Encerrar uma temporada grava os seis maiores pontuadores do período. Essa fotografia fica fixa no Hall da Fama público.

Missões e insígnias

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.

Resgates pendentes

Aprovar reserva o pedido; concluir confirma a entrega. Rejeitar ou estornar devolve pontos e estoque.

Crédito manual

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.

Nenhum membro selecionado.
Últimos créditos manuais
Membros e saldos

A carteira é o livro-razão: o saldo é a soma de créditos, compras e estornos de cada identidade Discord.

Encurtador de Links

Crie links curtos com URL personalizada e acompanhe acessos. Formato: /{slug} (ex: /discord). /l/{slug} continua funcionando.

dica: o prefixo do slug vira o projeto — gg- astrojorn, alegoria- alegoria, pcismo- astropcismo
Link Título Projeto Destino Acessos Criado Ações
Editar link
Banners das páginas

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áginas principais — banner fixo (personalizado)
Subpáginas — banner substituível
Página Banner atual URL da imagem Ações
Caixa de entrada — contato@astrojorn.com

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.

Live Status — registro de atividade de livestream

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.

verificando…
Canais
Registrar AO VIVO (manual)

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.

Últimas lives
— carregando —
+ Nova live (manual)
Ações rápidas
Última ação
Nenhuma ação executada ainda.
⏱ Último cron
carregando...
Console
admin@jornn — bash
admin@jornn:~$ Bem-vindo ao painel. Digite help para comandos.
$
Comandos disponíveis
Terminal
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: /carneiro
Sessão: sessionStorage + verificação de segurança

Pipeline
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
Publicação de artigos
Nenhum artigo publicado ainda.
Nenhum artigo publicado ainda.
Nenhum artigo publicado ainda.
Nenhum artigo publicado ainda.
Nenhum artigo publicado ainda.
Prévia do artigo
Categorias de tags

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.

Tags não agrupadas
Clique para adicionar a um grupo (seleciona o grupo em edição). Se não houver grupo, o botão "Adicionar grupo" abaixo cria um.
Wiki — Documentação do Projeto

Páginas internas em KV. Os arquivos de referência em docs/ continuam no painel Documentos.

Nova página

1. Projetos #

O ecossistema Astroverso tem 4 projetos, cada um com tema visual e rota próprios.

ProjetoRotaTemaDescriçã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)

LayoutUsoCaracterísticas
BaseHtml.astroShell de todosHTML base, cursor customizado, footer, scroll progress
HubLayout.astroPá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.astroArtigosÍndice flutuante h2–h4, hero com data/tags, footer nav

Componentes Astro

ComponenteDescrição
CuratorCardCard de curadoria Steam com dados da API
GameCardsGrid de jogos categorizados por status
SetupCardsCards de hardware/periféricos
CommandsGrid de comandos de chat
CalendarLista de eventos agendados
AlegoriaPortfolioGrid de design + vídeo com fallback
TagPillTag estilizada colorida
HardwareCarouselCarrossel animado de peças em destaque em /gg/setup (loop infinito, modal)
LiveAnnouncementBarBarra "AO VIVO AGORA EM:" com polling adaptativo e efeito ARGB
ProductCardCard de produto do astroPcismo (spec mono, botão de compra com glow verde neon)

Animações

AnimaçãoOndeDescrição
fadeInUpGlobal (.reveal)Opacidade 0→1 + translateY 24px na viewport
gradientJornnHub titleGradiente + hue-rotate infinito no "jornn"
neonOscillateHub cardsBox-shadow neon oscilante ao hover
textShiftAstro heroGradiente + hue-rotate no ticket
meteor-dropAstro heroMeteoros com cauda diagonal
navSlideInSite navSlide dos links ao carregar
carousel-scrollHardwareCarouselLoop infinito direita→esquerda do carrossel de hardware
liveArgbSweepLiveAnnouncementBarSweep arco-íris passando pelo card AO VIVO (mix-blend-mode:screen)
Inner-Reveal inner-revealCards/listas/containers de dadosReveal 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

CamadaVelocidadePersistência
Cache APImsEfêmera (edge)
KV~5msPersistente
Anytype~200-500msFonte 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

QualidadeCritérioCache TTL
okTudo funcionando10min (SWR 1h)
lowConfidence1 warning10min
degraded2+ warnings30s (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/)

EndpointMétodoFunção
/api/anytypeGETDados do Anytype principal (3 camadas de cache)
/api/anytype/authPOSTAutenticação do painel
/api/anytype/refreshPOSTRefresh forçado do Anytype principal
/api/anytype/alegoriaGETDados do Anytype Alegoria
/api/anytype/alegoria/refreshPOSTRefresh forçado da Alegoria
/api/curatorGETDados da curadoria Steam
/api/curator/refreshPOSTRefresh da curadoria Steam
/api/article/publishPOSTCria/atualiza artigo (dashboard → KV)
/api/article/[type]GETLista metadados de artigos de um tipo
/api/article/[type]/[slug]GET / DELETELê ou exclui um artigo
/api/linksGET / POSTLista ou cria links curtos (encurtador)
/api/links/[slug]PATCH / DELETEAtualiza ou exclui um link curto
/{slug}GETRedireciona 302 para o destino (link curto na raiz) + conta acesso
/l/[slug]GETRedireciona 302 (formato legado — continua funcionando)
/api/carousel/itemsGET / POSTLista (público) ou cria itens do carrossel de hardware (auth)
/api/carousel/items/[id]PATCH / DELETEAtualiza ou exclui um item do carrossel
/api/carousel/reorderPOSTReordena itens do carrossel (lista de ids)
/api/uploadPOSTUpload de imagem (magic bytes, máx 2MB) → KV
/api/image/[name]GETServe imagem enviada (cache imutável 1 ano)
/api/live-status/currentGETStatus atual da live (polling, refresh on-demand >2min, s-maxage=30)
/api/live-status/configGET / PUT / PATCH / DELETEConfiguração de canais/enabled/simulate (auth)
/api/live-status/simulatePOSTSimula ao vivo em uma ou mais plataformas (auth)
/api/live-status/refreshPOSTRe-checa canais e grava status no KV (cron + botão)
/api/analyticsGETMétricas Cloudflare (requer auth + secrets)
/api/cronGETStatus da última execução do cron
/api/settings/cloudflareGET / POSTConfiguraçã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]

  1. KV: CURATOR_KV.get("article:{type}:{slug}") → renderiza com marked
  2. Fallback: getCollection("{type}-artigos")render(post)
  3. 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

  1. Pelo dashboard (recomendado): aba Publicação → preencher título, tags e conteúdo em Markdown → "Publicar artigo" → salvo em KV, atualização imediata
  2. Por arquivo (fallback): criar .md em src/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

  1. Login com usuário + token (X-Refresh-Token)
  2. Pergunta de segurança com resposta hasheada (SHA-256)
  3. 3 tentativas máximas para a pergunta de segurança
  4. Sessão em sessionStorage + localStorage opcional

Abas

AbaFunção
DashboardStatus do pipeline (Anytype, cache, cron) + Analytics Cloudflare
LinksAtalhos para páginas do site, sub-páginas e redes sociais
EncurtadorLinks curtos /{slug} (criar/editar/excluir + acessos, check de disponibilidade ao vivo e slug reservado)
TerminalConsole bash com comandos: status, refresh, whoami, date
Ações rápidasBotões para refresh Anytype/Alegoria, verificar status
PublicaçãoPublicar/editar/excluir artigos em Markdown (KV)
WikiDocumentação resumida do projeto
DocumentosArquivos de referência docs/ completos
AjudaComandos 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

ContextoEstiloExemplo
Arquivos .astroPascalCaseAstroLayout.astro
Variáveis JScamelCasefetchAndCacheAnytype
ConstantesUPPER_SNAKEANYTYPE_URL
CSS classeskebab-case.site-nav
Chaves KVsnake_caseanytype_main
IDs HTMLkebab-casepanel-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 editar worker/ (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">
  • var em vez de let/const em escopo de função no JS do dashboard
  • Testar com npm run dev para design, npm run wrangler:dev para 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 pelo lift()

7. Arquivos de Referência #

Todos os documentos de referência estão em docs/. Veja o conteúdo completo no painel Documentos.

ArquivoDescrição
docs/README.mdDocumentação principal — arquitetura, stack, comandos, histórico de bugs
docs/PROJETOS.mdCatálogo dos 4 projetos com rotas, cores, páginas internas
docs/DESIGN-SISTEMA.mdDesign system completo: layouts, tokens, componentes, animações (inclui o nome/receita do Inner-Reveal)
docs/ENGENHARIA.mdEngenharia de correção e desenvolvimento: post-mortems de bugs + padrões por projeto
docs/diretrizes_ia.mdDiretrizes de desenvolvimento para IA: stack, nomenclatura, regras
docs/ADMIN.mdDocumentação do painel administrativo /carneiro
docs/ARTIGOS.mdSistema de artigos (KV via dashboard + Content Collections, Markdown)
src/styles/theme.cssTemas via CSS custom properties (data-theme)
src/pages/api/Endpoints SSR — article, analytics, anytype, curator, cron
wrangler.tomlConfig 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.

Gerenciador de Assets

Imagens, links e vídeos de todos os projetos.

Buglog — Bugs, Otimizações e Falhas

Í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.

Visualizador de Modelos

Modelos 3D, mockups e renders dos projetos.

Componentes & Animações

Componentes de UI e animações CSS do design system.

Documentos de Referência

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…

Cloudflare — Configuração da API

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.

Onde encontrar cada item:
  • API Tokendash.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 IDdash.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.