First stable version. From here on, within 1.x, updating doesn't break your customizations or your data: new database fields are always optional, and changes that need a migration only come in a new major version, with a guide.
Coming from 0.x:
- Update with
npx create-rubrica@latest update. Projects created with the CLI up to v0.3.18 pass their starting version with --from (see Atualizando o seu Rubrica, in Portuguese); fork projects use git merge v1.0.0.
- Payments are now real: set
ASAAS_API_KEY and register the Asaas webhook (README → "Configurando os pagamentos"). The Stripe integration was removed.
- The Umami script now uses
VITE_UMAMI_SCRIPT_URL and VITE_UMAMI_WEBSITE_ID (the old variables are still accepted).
Update without losing customizations
create-rubrica update was rewritten. Before, it extracted the new version over the project (losing any hand-edited file) and reset the identity in rubrica.config.ts. Now it merges Rubrica's changes with yours, file by file; when both changed the same part, your file stays intact and the new version goes to <arquivo>.rubrica-new. New options: --dry-run, --from, --to, --yes.
create now saves the version actually downloaded in rubrica.json (before, it always saved 0.1.0). Older projects pass their starting version with --from or by answering update's question.
Real payments (Asaas)
- Checkout now creates real charges on Asaas: PIX (QR code and copy-and-paste code), boleto (bank slip with line code and PDF) and card in up to 12 installments, through Asaas's secure page. The site never receives card data.
- Serious fix: card payments were marked as confirmed without any charge. Now a checkout only becomes paid when the Asaas webhook confirms it.
- The installment price with interest is calculated on the server; before, it came from the browser and could be tampered with.
- Switching payment method cancels the previous charge (before, two open charges were left), including every installment of an installment plan. Expired or deleted links cancel the PIX/card charge.
- A boleto that was already generated can't be switched to another method: it may have been paid and still be clearing.
- Protection against double payment and abuse: a lock against two simultaneous clicks, a limit of charges per link, and an expired PIX QR code that can be regenerated.
- Asaas refunds and chargebacks mark the checkout as refunded and send a Telegram alert; payment of a charge other than the current one, on a deleted link or for a lower amount also triggers an alert.
- Payment error messages reach the customer in production (before, they became "Server Error").
- Checkout with a minimum of R$ 5, at most 2 decimal places and a valid due date; installments under R$ 5 aren't offered; the payment method restricted on the checkout is respected.
- Payments admin working: Asaas customers, charges and invoices, with audit log. Checkout links generated with cryptographic randomness.
- The checkout page no longer breaks on open (it tried to format the CPF and phone number that the server hides on purpose).
/payment-success shows "confirming" ("confirmando") until the payment is confirmed.
- New Convex variables:
ASAAS_API_KEY (sandbox or production, detected from the key) and, optionally, ASAAS_ENV. setup asks for the key, generates ASAAS_WEBHOOK_TOKEN and shows how to register the webhook.
- Removed: the Stripe integration, which never worked (unused stubs in the interface), the
/webhooks/stripe webhook and the STRIPE_WEBHOOK_SECRET variable.
Layouts on mobile
- Swiss, Magazine, Brutalist and Bento fixed on phone screens: grids that didn't stack (content overflowing the screen), giant titles cut off, name broken in the middle in the Magazine header, excessive margins, squeezed testimonials and mosaics, the Brutalist blog table. Checked at 390, 768 and 1280px in all 5 layouts.
- New
src/components/MobileLayoutStyles.tsx: on mobile, grids built with inline styles become a single column; exceptions by attribute (data-m-cols="2", data-m-keep, data-m-hide, data-m-scroll, data-m-bleed).
- Cyberpunk: the top of the pages is no longer hidden behind the fixed mobile header.
- Swiss and Bento: post, case study and testimonials get side margins (before, they touched the edge).
- Post dates formatted in Bento and Brutalist (they showed as
2026-01-15T00:00:00.000Z).
- Sample posts (seed and demo data) in HTML, the way the editor saves them; before, they showed raw
# and **. Sample case slug fixed to lumen-saude.
Security and cleanup
- Login: explicit limit of 5 wrong passwords per account per hour.
- Umami: the script is only added to the site when
VITE_UMAMI_SCRIPT_URL and VITE_UMAMI_WEBSITE_ID are set (before, it loaded a URL with the literal placeholder); Umami Cloud allowed in the CSP. VITE_ANALYTICS_ENDPOINT/VITE_ANALYTICS_WEBSITE_ID are still accepted.
.env.example rewritten with the variables the code actually reads.
- Removed leftovers from an old setup:
vite-plugin-manus-runtime, ManusDialog, Map.tsx (unused Google Maps), @shared/@assets aliases and monorepo paths in the scripts.
Fixes
npx create-rubrica <nome> and pnpm create rubrica <nome> create the project again (before, they only showed the list of commands).
config, identity: no longer resets SEO, RSS and the share image, updates the meta tags in index.html and saves the identity in rubrica.json.
config, appearance: changing palette or font no longer deletes the meta tags in index.html.
config, layout: works in projects created by the CLI (downloads the layouts for the project's version) and includes the Magazine layout.
- Vercel build: the
build:i18n script, called by vercel.json, had gone missing from package.json. Removed the daily cron for /api/cron-deploy, a route that doesn't exist.
- The release includes
scripts/ and vercel.json again: without them, pnpm build failed in projects created by the CLI.
- The dashboard's "New proposal" ("Nova proposta") and "New project" ("Novo projeto") shortcuts open the creation form again.
- Texts on the login, testimonials, home, blog and about pages come from the translations (i18n) again instead of being hardcoded.
Quality
- CI on GitHub Actions: types, tests and build for the template and the CLI on every PR.
- Template and CLI tests and typecheck passing (there were 21 + 8 failing tests and 9 + 4 type errors).