Releases: valtlfelipe/apoia
Release list
v1.0.6
Imagem Docker: ghcr.io/valtlfelipe/apoia:1.0.6 (linux/amd64, linux/arm64).
docker pull ghcr.io/valtlfelipe/apoia:1.0.6Changelog
Fixed
- O webhook de teste que a Woovi dispara ao cadastrar a URL agora responde
200
em vez de401. Ele chega sem assinatura, e a Woovi só salva a URL se ela
responder200— era isso que impedia o cadastro do webhook. - Webhook recusado agora registra o motivo no log (falta de assinatura, token
divergente, ou assinatura que não confere contra nenhuma chave publicada), em
vez de só devolver um401mudo. WOOVI_WEBHOOK_TOKENcom caractere não-ASCII derrubava a request com500em
vez de401, porque a comparação usava tamanho em caracteres onde o
timingSafeEqualexige tamanho em bytes.
Changed
- A chave pública da Woovi passa a ser buscada em
/webhook/public-keys, com
cache de 1 hora e aceitando todas as chaves da lista durante uma rotação, em
vez de ficar fixa no código. Se o endpoint estiver fora do ar, a chave em
cache continua valendo.
Removed
WOOVI_WEBHOOK_PUBLIC_KEY. A chave agora vem sempre da API; quem ainda tiver
a variável no.envrecebe um aviso no boot dizendo o que a substituiu.
Full Changelog: v1.0.5...v1.0.6
v1.0.5
Imagem Docker: ghcr.io/valtlfelipe/apoia:1.0.5 (linux/amd64, linux/arm64).
docker pull ghcr.io/valtlfelipe/apoia:1.0.5Changelog
Fixed
- Assinatura pública para validação de webhooks da Woovi.
Full Changelog: v1.0.4...v1.0.5
v1.0.4
Imagem Docker: ghcr.io/valtlfelipe/apoia:1.0.4 (linux/amd64, linux/arm64).
docker pull ghcr.io/valtlfelipe/apoia:1.0.4Changelog
Changed
- "Apoiar no GitHub Sponsors" no
/admin/aboutvirou "Apoiar o projeto", apontando para a página de apoio do próprio apoia. O.github/FUNDING.yml(o botão "Sponsor" do repositório) lista os dois: o GitHub Sponsors e essa página.
Added
- Um "feito com apoia" discreto, centralizado no rodapé das páginas públicas, ligando para o repositório.
Full Changelog: v1.0.3...v1.0.4
v1.0.3
Imagem Docker: ghcr.io/valtlfelipe/apoia:1.0.3 (linux/amd64, linux/arm64).
docker pull ghcr.io/valtlfelipe/apoia:1.0.3Changelog
Fixed
- A página não funcionava em produção. A Content-Security-Policy fixava
script-src 'self', o que bloqueia os dois<script>inline que o Next emite em toda página (bootstrap e payload RSC). Sem eles o React não hidratava: formulário de apoio, seletor de valor, botão de tema, "carregar mais" e o modal do Pix ficavam todos mortos no site publicado — só o HTML do servidor aparecia. Em desenvolvimento não dava, porque a política de dev incluía'unsafe-inline'. A CSP agora sai deproxy.tscom um nonce por requisição, que o Next carimba sozinho nos próprios scripts. - O login do admin devolvia o navegador para
https://0.0.0.0:8080/adminatrás de um proxy reverso (Railway, Fly, nginx): três redirects montavam a URL a partir derequest.url, que nesse caso é o endereço em que o container escuta, não o público. Agora saem deAPOIA_SITE_URL, a mesma fonte que oredirectUrido OAuth já usava. O logout tinha o mesmo defeito. interest-cohortsaiu doPermissions-Policy— o FLoC foi removido do Chrome, e a diretiva só rendia um aviso "Unrecognized feature" no console a cada page load.
Full Changelog: v1.0.2...v1.0.3
v1.0.2
Imagem Docker: ghcr.io/valtlfelipe/apoia:1.0.2 (linux/amd64, linux/arm64).
docker pull ghcr.io/valtlfelipe/apoia:1.0.2Changelog
Fixed
- O container não subia quando o volume era montado por bind mount — caso do Railway, do Fly e da maioria das plataformas. O volume chega pertencendo ao root, e o usuário
apoia(sem privilégio) não conseguia criar o arquivo do SQLite:SqliteError: unable to open database file(SQLITE_CANTOPEN) a cada boot, em loop. Volume nomeado do Docker herda a ownership da imagem, então isso não aparecia em teste local. Agora o entrypoint começa como root só para ajustar a pasta montada e cai de volta paraapoia(viasetpriv) antes das migrations e do servidor — a app continua sem rodar como root. Quem sobe com--userexplícito pula esse ajuste, como antes.
Full Changelog: v1.0.1...v1.0.2
v1.0.1
Imagem Docker: ghcr.io/valtlfelipe/apoia:1.0.1 (linux/amd64, linux/arm64).
docker pull ghcr.io/valtlfelipe/apoia:1.0.1Changelog
Added
- Ícone do projeto: um coração branco sobre um quadrado índigo. Vira o favicon (
app/icon.svg), uma versão raster 180×180 em/apple-icon(pra home screen do iOS e pra qualquer lugar que só aceite URL de imagem — o ícone de um template do Railway, por exemplo) e o mark no header do/admine na tela de login. Também vai um PNG 512×512 com fundo transparente emdocs/images/icon.png, pra quando é preciso subir o arquivo em vez de apontar uma URL. O desenho fica emlib/brand.ts, importado por todos os usos menos oicon.svg, que precisa ser arquivo literal pela convenção do Next. - Healthcheck em
/api/health. Além de responder, ele toca o banco (select 1) — o que interessa detectar não é "o processo está de pé", é o container cujo volume/datanão montou, que responde ping feliz e serve 500 em toda página. É o path pra apontar no healthcheck da plataforma (Railway,HEALTHCHECKdo Docker, load balancer).
Full Changelog: v1.0.0...v1.0.1
v1.0.0
Imagem Docker: ghcr.io/valtlfelipe/apoia:1.0.0 (linux/amd64, linux/arm64).
docker pull ghcr.io/valtlfelipe/apoia:1.0.0Changelog
Added
- Painel
/admin, com login via Google usando shoo.dev: cadastro de produtos (criar, editar, ativar/desativar, excluir), configurações de identidade do criador (nome, nome curto, tagline, avatar, links) e do formulário de apoio (valores sugeridos, mínimo/máximo, checkboxes da timeline, estilo do avatar, validade da cobrança), e uma tabela de apoios com nome e mensagem reais — inclusive de quem pediu para ficar anônimo na timeline pública — com um botão para ocultar (ou devolver) alguém da vitrine sem apagar o dado. É a única forma de configurar o site:APOIA_ADMIN_EMAIL+APOIA_ADMIN_SECRETsão obrigatórias. - Apoios agora guardam o end-to-end id (E2E ID) do Pix recebido via webhook — visível na tabela de
/admin/apoios, com botão de copiar. Só o webhook consegue capturá-lo (a Woovi não devolve esse campo na consulta de status usada pelo polling de reforço), então fica em branco pros raros casos confirmados só por polling. - SEO nas páginas públicas:
robots.txtesitemap.xmlgerados em runtime (o sitemap lista os produtos ativos), título e descrição derivados do que está configurado no/admin, URL canônica por página, e imagem Open Graph 1200×630 gerada na hora — com o avatar e o nome do criador, e o nome do produto nas páginas de produto. O avatar é embutido na imagem com timeout e fallback pro avatar gerado, então um host de imagem fora do ar não derruba o card. O/adminfica fora do índice (noindexno HTML eDisallowno robots). - Aba Sobre em
/admin/about: versão instalada (baixada automaticamente na imagem a partir da tag da release — builds locais/manuais mostram "dev"), checagem de nova versão publicada no GitHub, e links para apoiar o projeto, ver o repositório, reportar bug ou sugerir funcionalidade. Templates de issue do GitHub (bug_report.yml,feature_request.yml) criados junto.
Changed
- BREAKING:
APOIA_PRODUCTSfoi removida. Produtos agora são gerenciados pelo/admine vivem no banco (tabelaproducts), não mais no.env. Quem atualiza precisa recadastrar seus produtos pelo admin — a variável antiga é ignorada (com aviso no boot) em vez de causar erro. - BREAKING:
APOIA_CREATOR_NAME,APOIA_CREATOR_SHORT_NAME,APOIA_CREATOR_TAGLINE,APOIA_CREATOR_AVATAR_URLeAPOIA_CREATOR_LINKSforam removidas. A identidade do criador agora é gerenciada pelo/admine vive no banco (tabelasettings), não mais no.env. Antes do primeiro login no admin, a instância roda com os padrões do código (nome "Apoia", sem tagline nem links, avatar gerado). As variáveis antigas são ignoradas (com aviso no boot) em vez de causar erro. - BREAKING:
APOIA_AMOUNT_PRESETS,APOIA_MIN_AMOUNT_CENTS,APOIA_MAX_AMOUNT_CENTS,APOIA_DEFAULT_PUBLIC,APOIA_SHOW_TOTAL_COUNT,APOIA_SHOW_TOTAL_AMOUNT,APOIA_AVATAR_STYLE,APOIA_CHARGE_EXPIRES_INeAPOIA_THANK_YOU_MESSAGEforam removidas. Esse grupo (valores sugeridos, mínimo/máximo, os checkboxes da timeline, estilo do avatar gerado, validade da cobrança Pix, mensagem de agradecimento do modal de sucesso) agora é gerenciado pelo/admine vive no banco (mesma tabelasettings). Antes do primeiro login no admin, a instância roda com os padrões do código (idênticos aos defaults antigos da ENV: presets R$5/15/25, mínimo R$1, máximo R$10.000, timeline pública marcada por padrão, contagem visível e total oculto, avatar "notionists", cobrança válida por 30 minutos, mensagem padrão em pt-BR). As variáveis antigas são ignoradas (com aviso no boot) em vez de causar erro. SóAPOIA_RATE_LIMIT_PER_MINUTEcontinua no.env. - BREAKING:
APOIA_ADMIN_EMAILeAPOIA_ADMIN_SECRETagora são obrigatórias — eram opcionais (o admin ficava desligado, 404 em toda rota, sem elas). Como o/adminpassou a ser a única forma de configurar identidade do criador, produtos e formulário de apoio, deixar essa dupla de fora não faz mais sentido: o boot recusa subir sem as duas. - Identidade visual redesenhada: fundo cinza-neutro, cards brancos, Plus Jakarta Sans como fonte única e um acento índigo, no lugar do tema "papel" (creme, serifa Fraunces, textura pontilhada, botões-pílula). O
/adminganhou barra superior fixa com item ativo e um cabeçalho de página padrão; o campo de valor do formulário público virou um só, com os valores sugeridos como atalhos dentro dele (antes eram dois controles sincronizados por um modo "outro valor"). - O
img-srcdo Content-Security-Policy passou de uma allowlist por origem (derivada deAPOIA_CREATOR_AVATAR_URLno boot) para aceitar qualquer origemhttps:— necessário porque a URL do avatar agora é configurável em runtime pelo/admin, não mais fixada no boot.script-srccontinua travado em'self'; a aplicação não tem superfície de injeção de HTML.
Removed
- BREAKING:
APOIA_DEV_SKIP_WEBHOOK_SIGNATUREfoi removida — não há mais como pular a verificação de assinatura do webhook. Junto foram emborapnpm dev:webhook(simulava uma confirmação de pagamento local, e só existia pra contornar a assinatura) epnpm pix:webhook(registrava o webhook na Woovi via API — específico do provedor). O registro do webhook continua documentado no README, direto viacurl/painel da Woovi.
Full Changelog: https://github.com/valtlfelipe/apoia/commits/v1.0.0