Skip to content

Latest commit

 

History

218 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Praça Araguaia 🌾

Fonte diária de informação do produtor rural da região do Araguaia (sul do PA / nordeste do MT): cotações que importam, o preço da praça na voz de quem está na lida, chuva e boletim — tudo grátis, atualizado todo dia.

Next.js TypeScript Tailwind CSS Supabase Vercel Testes

Plataforma de informação agropecuária da região do Araguaia. No ar em agroapp-bay.vercel.app com 12 cotações (gado, grão, câmbio, ouro, bolsa e cripto), boletim diário, previsão de chuva e o Termômetro da Praça — construída em fatias verticais finas, cada uma com spec, plano, testes e deploy verificado.


Prévia

A praça hoje — painel de cotações da Praça Araguaia

Na porteira — o preço de cada praça, nunca uma média

Cards da porteira: boi gordo, vaca gorda, novilha, bezerro, soja e milho

Seis categorias — boi gordo, vaca gorda, novilha, bezerro (arroba; o bezerro por cabeça) e soja, milho (saca de 60 kg) — em cards de mesmo tamanho, lado a lado: preços em cima, Termômetro embaixo. Boi e vaca trazem as três cidades do Pará (Marabá, Paragominas, Redenção) e uma linha por estado (Mato Grosso, Tocantins, Goiás, Bahia, Maranhão), com o valor da praça de referência da Scot mais próxima do Araguaia. Cada card credita quem apurou e quando: a CONAB fecha a semana, a Scot fecha o dia. O Termômetro traz o que os produtores reportaram nas cidades, com o convite a reportar já no produto certo.

Mercado — câmbio, ouro, bolsa e cripto

Tabela de mercado: dólar, euro, ouro, Ibovespa, bitcoin e ethereum

O Ouro aparece em R$ por grama (metal fino, 999) — a cotação de mercado. O Ibovespa aparece em pontos, sem R$ na frente: índice não é dinheiro. Cada linha traz a mini-tendência de 30 dias.

Previsão de chuva da região
Chuva — a sua região primeiro e depois os municípios da praça, 7 dias. Ícone por dia, volume em água e um traço no dia seco: o olho vai direto no que chove.
Termômetro da Praça
Termômetro — o preço na voz de quem está na lida: mediana dos reportes de produtores.
Gráfico de tendência do boi gordo
Tendência — gráfico de cada cotação, com toggle de 7 / 30 / 90 dias.
Calculadora do produtor
Calculadora — gado na balança, lote de bezerro, colheita e mercado (ouro, câmbio, cripto), com o preço da praça já preenchido.

Boletim do dia e o celular

Boletim do dia em PNG, enviado no Telegram
Boletim — PNG gerado no servidor (Satori) e disparado todo dia no Telegram: gado à esquerda, lavoura e mercado à direita. A URL da foto muda a cada envio, senão o Telegram reentrega o card que já tem em cache.
Painel no celular
Mobile — do celular à mesa.
Menu hambúrguer no celular
Menu — hambúrguer e gaveta lateral abaixo de 900px.

O que já está no ar

Página O que oferece
/ — Notícias do Mercado Home com as notícias do agro/pecuária/mercado, agregadas de 9 veículos (RSS), com foto e seção por assunto. O ticker de preços fica no topo de todas as páginas.
/cotacoes — a praça hoje Na porteira, 6 categorias: boi e vaca pela Scot (3 cidades do PA + uma praça de referência por estado — MT, TO, GO, BA, MA), novilha e bezerro (Scot, reposição por estado) e soja e milho (CONAB, por estado) — cada card também mostra o que os produtores reportaram nas cidades. No mercado, 6 cotações com mini-tendência de 30 dias: dólar, euro, ouro (R$/g), Ibovespa, bitcoin e ethereum. Topo com ticker e a cidade/UF + temperatura do usuário (geolocalização).
/cotacao/[tipo] Gráfico de tendência de cada cotação, com toggle 7 / 30 / 90 dias.
/boletim Card-resumo do dia em PNG 1080×1960 (via next/og/Satori) pronto para Instagram/WhatsApp, com botão de download. Enviado também no Telegram todo dia.
/chuva Sua região primeiro (previsão da localização do usuário) e depois os 5 municípios da praça — chuva, probabilidade e temperatura de 7 dias (Open-Meteo). O card da sua região é o mesmo componente dos municípios: uma linha de dia lida do mesmo jeito em todos.
/termometro Termômetro da Praça: o "valor típico" (mediana) dos preços reportados por produtores nos últimos 7 dias, nas 6 categorias da porteira, por município, contrastado com a referência oficial.
/termometro/reportar Reporte de preço anônimo (sem cadastro), com faixa de plausibilidade, honeypot e limite por IP. O convite no card já abre no produto certo (?produto=).
/fornecedores Vitrine de fornecedores da praça (contato direto por WhatsApp). Qualquer um se cadastra em /fornecedores/anunciar; só entra no ar depois da moderação.
/calculadora Calculadora do produtor, em quatro contas: gado na balança (boi, vaca ou novilha: peso vivo + rendimento → arrobas), lote de bezerro (por cabeça), colheita de grãos (sacas) e mercado (o que você tem em dólar, euro, ouro ou cripto, em reais). O preço da praça já vem preenchido.
/moderar Moderação pelo celular (senha): abas de preços e fornecedores — aprovar/rejeitar/remover sem abrir o banco.

Tudo apoiado em fontes públicas e gratuitas — sem provedores pagos e sem dados pessoais. Alertas e boletim também chegam pelo bot @pracaaraguaia_bot no Telegram.

De onde vem cada preço

Categoria Fonte Unidade Ritmo
Boi gordo, vaca gorda Scot Consultoria — praça a praça (3 cidades do PA + praça de referência de MT/TO/GO/BA/MA) R$/@ diário
Novilha, bezerro Scot Consultoria — reposição por estado R$/cabeça diário
Soja, milho CONAB (PrecosSemanalUF.txt, arquivo público) saca 60 kg semanal (fecha seg–sex)
Dólar, euro BCB · Frankfurter R$ diário
Ouro gold-api (onça troy) × USD-BRL R$/g diário
Ibovespa B3, via Yahoo Finance (^BVSP) pontos diário
Bitcoin, ethereum CoinGecko R$ diário
Chuva INMET · CEMADEN · Open-Meteo mm diário
Termômetro reportes dos próprios produtores R$/@ contínuo

A CONAB só publica boi/soja/milho por estado (BOI|GORDO, sem vaca/novilha/bezerro), e por estado a granularidade some — o produtor negocia na praça, não no "preço do Pará". Por isso boi e vaca vêm da Scot, praça a praça: as três cidades do Pará e uma linha de referência por estado vizinho. Novilha e bezerro são reposição (também Scot). Cada card diz na cara quem apurou o preço e em que dia.


Identidade visual

Direção "fazenda moderna premium" — editorial, paleta terra, sem cara de dashboard genérico.

Elemento Escolha
Tipografia Playfair Display (display serifada, títulos) · Archivo (UI e números) · JetBrains Mono (dados, ticker, timestamps) — via next/font
Paleta Areia (bone #F1EBDE), papel (#FBF8F1), oliva (#3F4A24), couro (#6E3E1E), ocre (#B4863B); alta em musgo (#6B8339), baixa em tijolo (#A63A26) e chuva em água (#45707C) — nunca neon
Marca "Broto no sulco" — a folha nascendo da terra lavrada, num selo de osso com o anel oliva. Ela balança de leve no vento (some em prefers-reduced-motion) e fica parada no favicon, no card do bot e no OG. Desenho único em lib/marca.ts, consumido pelos quatro.
Navegação Menu inline no desktop; abaixo de 900px, hambúrguer + gaveta lateral (fecha no Esc, no fundo e ao navegar; trava o scroll enquanto aberta)
Assinatura Cards que abrem com a foto do produto (escurece e revela os dados), grão de papel sutil, filetes finos, ticker de pregão rolante e o hero com um touro nelore no pasto

Os tokens vivem no @theme do Tailwind v4 (app/globals.css); cada componente mora à distância de quem o usa (ver AGENTS.md).


Arquitetura

Duas trilhas de dados: a coleta agendada das cotações (cron diário) e o fluxo de reportes do Termômetro (anônimo, moderado). Ambas convergem no Supabase, e as páginas leem com a chave anon sob RLS.

flowchart TD
    subgraph Fontes["Fontes públicas gratuitas"]
        CONAB["CONAB<br/>soja · milho"]
        GADO["Scot Consultoria<br/>boi · vaca · novilha · bezerro"]
        CAMBIO["BCB · Frankfurter · gold-api · CoinGecko<br/>dólar · euro · ouro · cripto"]
        METEO["Open-Meteo<br/>chuva"]
    end

    subgraph Coleta["Coleta agendada"]
        CRON["Vercel Cron 1×/dia"] -->|Bearer CRON_SECRET| COLETAR["GET /api/coletar"]
        CONAB --> COLETAR
        GADO --> COLETAR
        CAMBIO --> COLETAR
    end

    subgraph Reportes["Termômetro da Praça"]
        PROD["Produtor"] -->|preço anônimo| REPORTAR["POST /api/reportar<br/>honeypot · faixa · rate-limit"]
        MOD["Moderador"] -->|senha + cookie HMAC| DECIDIR["POST /api/moderar/decidir"]
    end

    COLETAR -->|service role| DB[("Supabase / PostgreSQL<br/>RLS: leitura pública<br/>escrita só service role")]
    REPORTAR -->|service role| DB
    DECIDIR -->|service role| DB

    DB -->|anon key| PAGES["Páginas Next.js<br/>painel · gráficos · boletim · termômetro"]
    METEO -->|ISR/dynamic| PAGES
Loading

Princípio de design: cada fonte de cotação é desacoplada da orquestração (lib/fontes/*lib/coleta.ts via a porta CotacaoRepo), então adicionar uma cotação é registrar uma função — sem tocar no resto. A lógica de negócio (mediana, faixa, agregação, validação, sessão de moderação) vive em módulos puros e testados em lib/, separada da apresentação.


Como foi construído

Cada funcionalidade é uma fatia vertical fina que percorre o ciclo completo antes da próxima começar: brainstorming → spec → plano → implementação (TDD) → review → deploy verificado.

timeline
    title Fatias entregues e no ar
    Fatias 1–3 : Painel + dólar (AwesomeAPI→BCB) : Gráfico 7/30/90d + backfill : Euro e ouro + registry de fontes
    Fatia 4 : Commodities CONAB (boi, soja, milho)
    Fatia 5 : Boletim diário em PNG
    Fatia 6 : Previsão de chuva
    Fatia 7 : Redesign visual (identidade própria)
    Fatias 8–9 : Termômetro T1 (reporte + RLS) : Termômetro T2 (moderação pelo celular)
    Fatias 10–11 : Mediana + faixa (robustez) : Histórico do Termômetro
Loading

Stack

Camada Tecnologia
Front + back Next.js 15 (App Router), TypeScript (strict), Tailwind CSS v4
Tipografia Playfair Display · Archivo · JetBrains Mono (via next/font)
Banco / Auth Supabase (PostgreSQL + Row Level Security)
Gráficos Sparklines em SVG puro · Recharts (detalhe)
Imagem do boletim / OG next/og (Satori) — PNG gerado no servidor
Geolocalização Vercel Edge Geo (IP) + Open-Meteo (temperatura)
Coleta / envio agendados Route Handlers + Vercel Cron (coleta · boletim · alertas)
Bot Telegram Bot API (inscrição, boletim, alertas)
Testes Vitest + Testing Library (578 testes)
Deploy Vercel (auto-deploy no push, ISR, cron)

Estrutura

agro_app/
├─ app/                            # Pasta com _ não vira rota (private folder do Next)
│  ├─ layout.tsx                   # Casca, metadata padrão e cromo — nada mais
│  ├─ _chrome/                     # Masthead, ticker, rodapé, busca: só o layout usa
│  ├─ page.tsx · _home/            # Home (notícias) e o que só ela usa
│  ├─ cotacao/[tipo]/page.tsx      # Detalhe + gráfico de tendência
│  ├─ boletim/page.tsx             # Card do dia + download
│  ├─ chuva/                       # Previsão de 7 dias + _components/
│  ├─ termometro/
│  │  ├─ page.tsx                  # Valor típico (mediana) por produto
│  │  ├─ _components/              # Usado pela subárvore do termômetro
│  │  ├─ reportar/page.tsx         # Reporte anônimo
│  │  └─ [produto]/page.tsx        # Histórico (gráfico) do produto
│  ├─ moderar/page.tsx             # Moderação protegida por senha
│  └─ api/
│     ├─ coletar · backfill        # Coleta/backfill (Cron/segredo)
│     ├─ boletim                   # PNG 1080×1080
│     ├─ reportar                  # Recebe reporte anônimo
│     └─ moderar/{login,decidir}   # Sessão + decisão da moderação
├─ lib/
│  ├─ fontes/*                     # Uma fonte por arquivo + registry
│  │  ├─ conab.ts                  #   soja, milho (arquivo semanal por UF)
│  │  ├─ scot.ts                   #   boi, vaca (praça a praça: cidades do PA + estados)
│  │  ├─ pecuaria.ts               #   novilha, bezerro (reposição por UF)
│  │  └─ ouro.ts                   #   ouro fino em R$/g (onça troy × USD-BRL)
│  ├─ marca.ts · autor.ts          # Marca e assinatura (site, favicon, card, OG)
│  ├─ coleta.ts · backfill.ts      # Orquestração pura
│  ├─ termometro.ts                # Produtos, validação, mediana, faixa
│  ├─ termometro-historico.ts      # Mediana diária para o gráfico
│  ├─ moderacao.ts                 # Token HMAC, sessão, validação
│  ├─ boletim.ts · grafico.ts      # View-models puros
│  ├─ formato.ts                   # Número e data em pt-BR (nunca `new Intl` na página)
│  └─ supabase/{server,public,repo}.ts
├─ components/                     # Só o compartilhado por 2+ rotas (+ ui/ do shadcn)
├─ supabase/migrations/            # DDL + RLS versionado
├─ tests/                          # 578 testes unitários e de componente
├─ vercel.json                     # Cron diário → /api/coletar
└─ docs/superpowers/{specs,plans}/ # Spec e plano de cada fatia

Começando

1. Pré-requisitos

  • Node.js 18.18+ (recomendado 20+)
  • Uma conta Supabase

2. Instalar

npm install

3. Banco de dados (Supabase)

Crie um projeto e aplique as migrations de supabase/migrations/ em ordem (SQL Editor do Supabase Studio, ou supabase db push com o projeto vinculado):

  • 0001_cotacoes.sql — tabelas cotacoes e cotacoes_historico + RLS
  • 0002_* — constraint única (tipo, data_referencia)
  • 0003_reportes.sql — tabela reportes do Termômetro + RLS

4. Variáveis de ambiente

cp .env.local.example .env.local
NEXT_PUBLIC_SUPABASE_URL=https://SEU-PROJETO.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=...        # anon / publishable key
SUPABASE_SERVICE_ROLE_KEY=...            # service role — NUNCA expor no client
CRON_SECRET=...                          # segredo forte para a coleta agendada
MODERACAO_SENHA=...                      # senha da moderação em /moderar

⚠️ SUPABASE_SERVICE_ROLE_KEY e MODERACAO_SENHA são usadas apenas no servidor. Nunca as coloque numa variável NEXT_PUBLIC_*.

5. Rodar

npm run dev          # http://localhost:3000

A primeira coleta popula o painel (a tela começa vazia):

curl -H "authorization: Bearer SEU_CRON_SECRET" http://localhost:3000/api/coletar

Scripts

Comando O que faz
npm run dev Servidor de desenvolvimento
npm run build Build de produção
npm start Sobe o build
npm test Roda os testes (Vitest)
npm run test:watch Testes em watch mode
npm run lint ESLint

Deploy (Vercel)

  1. Conecte o repositório à Vercel — cada git push na master dispara o deploy.
  2. Defina as 5 variáveis de ambiente (as mesmas do .env.local) no projeto, marcadas para Production.
  3. O agendamento em vercel.json chama /api/coletar 1×/dia; a Vercel injeta Authorization: Bearer ${CRON_SECRET} automaticamente.

Modelo de dados

cotacoes              -- último valor "vivo" por tipo (1 linha por tipo)
  tipo, valor, unidade, variacao_pct, fonte, data_referencia, atualizado_em

cotacoes_uf           -- o preço por estado (soja/milho/novilha/bezerro), 1 linha por (tipo, uf)
  tipo, uf, valor, unidade, variacao_pct, data_referencia, atualizado_em

cotacoes_praca        -- boi e vaca da Scot, praça a praça, 1 linha por (tipo, praca, uf)
  tipo, praca, uf, valor, unidade, valor_prazo, variacao_pct, data_referencia, atualizado_em

cotacoes_historico    -- série temporal append-only (alimenta os gráficos)
  tipo, valor, fonte, data_referencia, created_at

reportes              -- Termômetro da Praça: preços reportados, moderados
  produto, municipio, valor, status (pendente/aprovado/rejeitado), ip_hash, criado_em

RLS desde o início: SELECT público (em reportes, só linhas aprovado); INSERT/UPDATE/DELETE revogados de anon/authenticated — toda escrita passa pelo service role no servidor.


Roadmap

  • Painel de cotações + coleta diária do dólar
  • Gráfico de tendência (toggle 7/30/90) + backfill
  • Euro e ouro — coleta/backfill multi-fonte resiliente
  • Commodities via CONAB: boi gordo, soja, milho
  • Boletim diário em card PNG (Satori)
  • Previsão de chuva por município
  • Redesign com identidade visual própria
  • Termômetro da Praça: reporte anônimo + moderação pelo celular
  • Mediana + faixa (robustez) e histórico do Termômetro
  • Calculadora do produtor (lote de boi + colheita)
  • Bot de Telegram: inscrição, boletim diário e alertas de movimento (gratuito)
  • Vitrine de fornecedores com submissão pública + moderação
  • Redesign "fazenda moderna premium" + geolocalização do usuário
  • Menu hambúrguer no celular + marca nova ("broto no sulco") em site, favicon, card e OG
  • Porteira completa: vaca gorda, novilha e bezerro (Scot), além do boi
  • Boi e vaca praça a praça (Scot): cidades do PA + uma praça de referência por estado
  • Notícias do Mercado como home (9 veículos, RSS) + busca funcional
  • Ouro (R$/g) e Ibovespa no mercado
  • Termômetro nas 6 categorias da porteira (antes só o boi)
  • Calculadora com gado, bezerro, colheita e mercado (ouro, câmbio, cripto)
  • Verificação do produtor (OTP) e reputação — dependem de provedor pago; em avaliação

Cada fatia segue o ciclo spec → plano → implementação, documentado em docs/superpowers/.


Licença

Projeto privado. Todos os direitos reservados.

About

Cotacoes agropecuarias diarias da regiao do Araguaia (PA/MT) - dolar, boi e graos. Next.js 15 + Supabase, coleta automatizada e Termometro da Praca.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages