Primeira versão estável. A partir daqui, dentro da 1.x, atualizar não quebra o que você personalizou nem os seus dados: campos novos no banco são sempre opcionais, e mudanças que exijam migração só entram numa versão major nova, com guia.
Vindo da 0.x:
- Atualize com
npx create-rubrica@latest update. Projetos criados com o CLI até a v0.3.18 informam a versão de origem com --from (veja Atualizando o seu Rubrica); projetos de fork usam git merge v1.0.0.
- Pagamentos agora são reais: configure
ASAAS_API_KEY e cadastre o webhook do Asaas (README → "Configurando os pagamentos"). A integração com o Stripe foi removida.
- O script do Umami passa a usar
VITE_UMAMI_SCRIPT_URL e VITE_UMAMI_WEBSITE_ID (as variáveis antigas continuam aceitas).
Atualizar sem perder personalizações
create-rubrica update foi reescrito. Antes, ele extraía a versão nova por cima do projeto (perdendo qualquer arquivo editado à mão) e zerava a identidade do rubrica.config.ts. Agora ele mescla, arquivo por arquivo, as mudanças do Rubrica com as suas; quando os dois mexeram no mesmo trecho, o seu arquivo fica intacto e a versão nova vai para <arquivo>.rubrica-new. Novas opções: --dry-run, --from, --to, --yes.
- O
create passa a gravar no rubrica.json a versão realmente baixada (antes gravava sempre 0.1.0). Projetos antigos informam a versão de origem com --from ou respondendo à pergunta do update.
Pagamentos de verdade (Asaas)
- O checkout passa a criar cobranças reais no Asaas: PIX (QR code e copia-e-cola), boleto (linha digitável e PDF) e cartão em até 12x, pela página segura do Asaas. O site nunca recebe dados de cartão.
- Correção grave: o pagamento com cartão era marcado como confirmado sem nenhuma cobrança. Agora o checkout só vira pago quando o webhook do Asaas confirma.
- O valor com juros do parcelamento é calculado no servidor; antes vinha do navegador e podia ser alterado.
- Trocar de forma de pagamento cancela a cobrança anterior (antes ficavam duas cobranças abertas), inclusive todas as parcelas de um parcelamento. Links vencidos ou apagados cancelam a cobrança de PIX/cartão.
- Boleto já gerado não pode ser trocado por outra forma: ele pode ter sido pago e ainda estar compensando.
- Proteções contra pagamento em dobro e abuso: trava contra dois cliques simultâneos, limite de cobranças por link e QR code PIX vencido regenerável.
- Estornos e chargebacks do Asaas marcam o checkout como estornado e avisam no Telegram; pagamento de cobrança diferente da atual, em link apagado ou com valor menor também gera aviso.
- Mensagens de erro do pagamento chegam ao cliente em produção (antes viravam "Server Error").
- Checkout com valor mínimo de R$ 5, no máximo 2 casas decimais e vencimento válido; parcelas abaixo de R$ 5 não são oferecidas; a forma de pagamento restrita no checkout é respeitada.
- Admin de pagamentos funcionando: clientes, cobranças e notas fiscais do Asaas, com auditoria. Links de checkout gerados com aleatoriedade criptográfica.
- A página de checkout não quebra mais ao abrir (tentava formatar CPF e telefone que o servidor esconde de propósito).
/payment-success mostra "confirmando" até o pagamento ser confirmado.
- Novas variáveis no Convex:
ASAAS_API_KEY (sandbox ou produção, detectado pela chave) e, opcional, ASAAS_ENV. O setup pede a chave, gera o ASAAS_WEBHOOK_TOKEN e mostra como cadastrar o webhook.
- Removido: a integração com o Stripe, que nunca funcionou (eram stubs sem uso na interface), o webhook
/webhooks/stripe e a variável STRIPE_WEBHOOK_SECRET.
Layouts no celular
- Swiss, Magazine, Brutalist e Bento corrigidos em telas de celular: grids que não empilhavam (conteúdo vazando para fora da tela), títulos gigantes cortados, nome quebrado no meio no cabeçalho do Magazine, margens excessivas, depoimentos e mosaicos espremidos, tabela do blog do Brutalist. Verificado em 390, 768 e 1280px nos 5 layouts.
- Novo
src/components/MobileLayoutStyles.tsx: no celular, grids montados com estilo inline viram uma coluna; exceções por atributo (data-m-cols="2", data-m-keep, data-m-hide, data-m-scroll, data-m-bleed).
- Cyberpunk: o topo das páginas não fica mais escondido atrás do cabeçalho fixo do celular.
- Swiss e Bento: post, estudo de caso e depoimentos ganham margem lateral (antes encostavam na borda).
- Datas dos posts formatadas no Bento e no Brutalist (apareciam como
2026-01-15T00:00:00.000Z).
- Posts de exemplo (seed e dados de demonstração) em HTML, como o editor grava; antes apareciam com
# e ** crus. Slug do case de exemplo corrigido para lumen-saude.
Segurança e limpeza
- Login: limite explícito de 5 senhas erradas por conta por hora.
- Umami: o script só entra no site quando
VITE_UMAMI_SCRIPT_URL e VITE_UMAMI_WEBSITE_ID estão definidas (antes carregava uma URL com o placeholder literal); Umami Cloud liberado no CSP. VITE_ANALYTICS_ENDPOINT/VITE_ANALYTICS_WEBSITE_ID continuam aceitas.
.env.example reescrito com as variáveis que o código realmente lê.
- Removidos restos de um setup antigo:
vite-plugin-manus-runtime, ManusDialog, Map.tsx (Google Maps sem uso), aliases @shared/@assets e caminhos de monorepo nos scripts.
Correções
npx create-rubrica <nome> e pnpm create rubrica <nome> voltam a criar o projeto (antes só mostravam a lista de comandos).
config, identidade: não zera mais SEO, RSS e imagem de compartilhamento, atualiza as meta tags do index.html e salva a identidade no rubrica.json.
config, aparência: trocar paleta ou fonte não apaga mais as meta tags do index.html.
config, layout: funciona em projetos criados pelo CLI (baixa os layouts da versão do projeto) e inclui o layout Magazine.
- Build na Vercel: o script
build:i18n, chamado pelo vercel.json, tinha sumido do package.json. Removido o cron diário para /api/cron-deploy, rota que não existe.
- A release volta a incluir
scripts/ e vercel.json: sem eles, pnpm build falhava em projetos criados pelo CLI.
- Atalhos "Nova proposta" e "Novo projeto" do dashboard voltam a abrir o formulário de criação.
- Textos das páginas de login, depoimentos, home, blog e sobre voltam a vir das traduções (i18n) em vez de fixos no código.
Qualidade
- CI no GitHub Actions: tipos, testes e build do template e do CLI em toda PR.
- Testes e typecheck do template e do CLI passando (eram 21 + 8 testes falhando e 9 + 4 erros de tipo).