72 KiB
Changelog
Todas as mudanças notáveis deste projeto serão documentadas neste arquivo.
O formato é baseado em Keep a Changelog, e este projeto adere ao Versionamento Semântico.
[2.5.2] - 2026-05-04
Esta versão traz melhorias visuais e de usabilidade em contas, lançamentos, orçamentos, cartões e anotações: novos tipos de conta, ícones no seletor, feedback visual de limite excedido nas progress bars e refinamentos nos ícones de tarefas em anotações.
Adicionado
- Novos tipos de conta
"Dinheiro"e"Outros"na lista padrão do diálogo de contas (issue #50). - Ícones por tipo de conta no seletor (Conta Corrente, Poupança, Carteira Digital, Investimento, Pré-Pago, Dinheiro, Outros).
- Filtro automático: ao selecionar
"Dinheiro"como forma de pagamento em lançamentos, o select de conta exibe apenas contas do tipo"Dinheiro". - Sinal
+no valor de transferências recebidas na tabela de lançamentos (mantém cor azul).
Alterado
- Forma de pagamento de novas transferências entre contas alterada de
"Pix"para"Transferência bancária". - Progress bar de orçamentos excedidos agora exibe indicador e fundo na cor
destructive. - Progress bar de cartões com 100% do limite utilizado agora exibe indicador e fundo na cor
destructive. - Ícone de tarefa não concluída no card e no modal de detalhes de anotações substituído por
RiSubtractLine(locais sem interação de marcação).
[2.5.1] - 2026-05-04
Versão de correção pontual focada na exibição do indicador de anexo nas tabelas de lançamentos da fatura do cartão. Em /cards/[cardId]/invoice, lançamentos com anexos não mostravam o ícone porque o fetcher dedicado da fatura não calculava o flag hasAttachments. A primeira tentativa de adicionar o EXISTS via extras na query relacional gerou SQL inválido (Drizzle re-aliasava transactionAttachments.transactionId para o alias da tabela externa). A correção definitiva troca o fetcher pela função compartilhada fetchTransactionsWithRelations de features/transactions, que já implementa o EXISTS corretamente via select.
Corrigido
- Ícone de anexo voltou a aparecer na tabela de lançamentos da fatura do cartão (
/cards/[cardId]/invoice).fetchCardTransactionsemfeatures/invoices/queries.tsagora delega parafetchTransactionsWithRelations, garantindo que o flaghasAttachmentsseja preenchido com a mesma EXISTS subquery usada no restante do app.
[2.5.0] - 2026-05-01
Esta versão melhora o fechamento de faturas, a correção de lançamentos já registrados e a conferência de saldos contra o extrato do banco. O novo ajuste de fatura fecha a conta entre o total calculado pelo sistema e o valor real cobrado pelo banco, sem exigir que o usuário reabra lançamentos individuais. A mesma ideia foi estendida para contas correntes: na página do extrato, ao lado de "Saldo ao final do período", o usuário informa o saldo real e o sistema cria (ou atualiza) um lançamento de ajuste no período visualizado. Também entra o fluxo de reembolso para despesas à vista: pelo menu de ações do lançamento, o usuário informa a data do reembolso e o sistema cria uma receita espelhada no extrato ou na fatura correta. O widget de boletos do dashboard ganhou paridade com o widget de faturas — confirmação de pagamento agora pede conta de origem e data antes de quitar o boleto. Por fim, o limite do cartão passou a ser obrigatório e o sistema bloqueia despesas em cartão que ultrapassem o limite disponível, retornando uma mensagem com o valor exato disponível. As operações mantêm rastro no lançamento gerado e respeitam a proteção de faturas já pagas.
Adicionado
- Nome do boleto no widget de Boletos agora é um link para
/transactions?q=<nome>, incluindo?periodo=<mes-ano>automaticamente quando o período selecionado não é o atual. ÍconeRiExternalLinkLineao lado do nome, igual ao padrão do widget de Faturas. - Botão "Ajustar fatura" ao lado do valor na página da fatura.
- Dialog
AdjustInvoiceDialogcom input de valor correto e preview da diferença. - Action
adjustInvoiceActionque faz upsert/delete idempotente do lançamento de ajuste. - Botão "Ajustar saldo" ao lado do valor na página do extrato da conta.
- Dialog
AdjustBalanceDialogcom input do saldo correto e preview da diferença que será lançada (receita ou despesa). - Action
adjustAccountBalanceActionque faz upsert/delete idempotente do lançamento de ajuste por(accountId, period). - Opção "Reembolso" no dropdown de ações de despesas à vista, posicionada após "Copiar" e antes de "Remover".
- Dialog
RefundTransactionDialogcom seleção da data do reembolso e indicação do período de destino. - Action
refundTransactionActionque cria uma receita de reembolso vinculada ao lançamento original. - Constantes compartilhadas
INVOICE_ADJUSTMENT_NAME,ACCOUNT_BALANCE_ADJUSTMENT_NAME,REFUND_NOTE_PREFIXebuildRefundNote()emshared/lib/accounts/constants.ts. - Validação de limite de cartão:
validateCardLimit()emtransactions/actions/core.tscalcula o uso atual do cartão (somando lançamentos não quitados, com a mesma regra usada emcards/queries.tspara recorrentes) e bloqueia criação ou edição de despesa em cartão que ultrapasse o disponível, retornando "Lançamento de R$ X excede o limite disponível do cartão (R$ Y)." - Schema reutilizável
requiredDecimalSchema(fieldName)emshared/lib/schemas/common.ts— número/string positiva (> 0) com mensagens parametrizáveis.
Alterado
- Limite do cartão é obrigatório: campo
limiteemcartoesganhouNOT NULL DEFAULT 0no schema, validação Zod comrequiredDecimalSchema("limite"), atributorequiredno input do formulário e checagem client-side antes do submit. TiposCard.limiteCard.limitAvailabledeixam de ser nullable; branch "Ainda não há limite registrado" foi removido decard-item.tsxe a derivação defensiva emcards/[cardId]/invoicefoi simplificada. - Migration
0029_friendly_spitfire: preenche com0registros legados antes doSET NOT NULLpara não quebrar bancos com cartões sem limite. - Métricas principais passam a tratar reembolsos como abatimento de despesa, não como receita comum.
- Cards de receitas/despesas, série histórica do dashboard e resumo do extrato agora preservam o efeito líquido do reembolso no balanço sem inflar entradas e saídas.
- Pagamento de fatura agora abre confirmação com conta de origem selecionável; por padrão vem a conta vinculada ao cartão, mas o usuário pode escolher outra conta antes de confirmar.
- Widget de faturas no dashboard ganhou a mesma confirmação: o modal "Confirmar pagamento" agora pede conta de origem e data antes de marcar a fatura como paga, alinhando o comportamento ao da página de fatura.
- Widget de boletos no dashboard ganhou a mesma paridade: o modal "Confirmar pagamento" passou a oferecer seleção de conta de pagamento e data do pagamento, com mesma estrutura de cards de detalhes, métricas, separator e formulário condicional do widget de faturas.
toggleTransactionSettlementActionagora aceitapaymentAccountIdepaymentDateopcionais para boletos — quando informados, atualiza aaccountIddo lançamento e usa a data escolhida emboletoPaymentDate(em vez da data atual).DashboardBillpassa a exporaccountIdpara que o dialog inicialize a conta com o valor já vinculado ao boleto.- Widget "Lançamentos por Categorias" agora ignora a categoria "Transferência interna" — transferências entre contas próprias deixam de poluir o ranking de categorias.
Corrigido
- Erro de hidratação no widget de Anotações:
Intl.DateTimeFormatsemtimeZoneusava o fuso do servidor (UTC) no SSR e o fuso do browser (BRT) no cliente, resultando em datas divergentes. Ambos os formatters passam a usartimeZone: "America/Sao_Paulo"explicitamente. - Extrato da conta agora contabiliza transferências internas nos cards de Entradas e Saídas: transferência recebida soma em Entradas, transferência enviada soma em Saídas. Antes o saldo final refletia o movimento mas os cards permaneciam zerados, gerando inconsistência visível na tela (issue #47).
Removido
- Seção "Veja o que você pode fazer" (galeria de screenshots com abas) da landing page, junto com o componente
ScreenshotTabs, as 14 imagenspreview-*.webp, o blocoscreenshotsemimages.ts, o link#telasdo nav e o exportpwaCompatListsem uso. - Exports mortos
dateFormatteremonthFormatterdefeatures/transactions/formatting-helpers.ts.
[2.4.4] - 2026-04-27
Esta versão remove a dependência da extensão pgcrypto do PostgreSQL para a geração do share_code em pagadores. O default a nível de banco (gen_random_bytes) foi removido — agora a aplicação gera o código sempre via crypto.randomBytes do Node.js, num utilitário compartilhado. A consequência prática é que o setup inicial fica mais simples: não há mais script de habilitação de extensão, nem etapa extra no primeiro db:push, e bancos restaurados de dumps externos não precisam ter pgcrypto instalada. O script de backup também foi enxugado para gerar dumps focados nos schemas relevantes (public e drizzle), descartando os schemas internos do Supabase e eliminando os ~148 erros de restore em PostgreSQL padrão. Por fim, os logos da marca (ícone laranja e wordmark) foram vetorizados: as PNGs antigas foram substituídas por SVGs inline em componentes próprios e por arquivos .svg no public/, escalando perfeitamente em qualquer tamanho — inclusive nos PDFs exportados, que agora rasterizam o SVG em alta resolução.
Alterado
- Schema: coluna
share_codeempagadoresperdeu o defaultsubstr(encode(gen_random_bytes(24), 'base64'), 1, 24)— campo continuaNOT NULLe a aplicação passa a fornecer o valor explicitamente em todas as inserções - Pagadores: nova função utilitária
generateShareCode()emsrc/shared/lib/payers/share-code.ts(server-only) — usacrypto.randomBytes(18).toString("base64url").slice(0, 24) - Pagadores:
createPayerAction,ensureDefaultPagadorForUser,resetUserAppData(settings) emock-data.tsagora chamamgenerateShareCode()ao inserir um pagador - Backup:
scripts/backup.shagora dumpa apenas os schemaspublicedrizzle— schemas internos do Supabase (auth,realtime,storage,vault,graphql,graphql_public,extensions,pgbouncer) e suas extensions/roles deixam de poluir os dumps. Restaurações em PostgreSQL padrão passam a executar sem os ~148 erros derole/extension does not exist - Logo:
Logofoi quebrado em três arquivos —src/shared/components/logo.tsx(orquestrador),logo-icon.tsx(ícone laranja em SVG inline, viewBox0 0 200 200) elogo-text.tsx(wordmark em SVG inline, viewBox0 0 574.201 89.6). API pública (variant,invertTextOnDark,colorIcon,iconClassName,textClassName) preservada - Assets:
public/images/logo_small.pngelogo_text.pngsubstituídos porlogo_small.svgelogo_text.svg(comwidth/heightexplícitos para compatibilidade com<img>em canvas) - Exports:
loadExportLogoDataUrlagora carrega SVG e rasteriza no canvas a 4× a resolução natural antes de gerar o data URL — mantém nitidez quando o PDF amplia a imagem
Removido
- Pasta
scripts/postgres/(continhainit.sqleenable-extensions.ts) - Script
pnpm db:extensionsnopackage.json - Referências ao
pnpm db:extensionsno README public/images/logo_small.pngepublic/images/logo_text.png(substituídos pelos.svg)
Corrigido
- Migrations: conflito de numeração resolvido —
0027_fancy_reaperrenomeado para0028_fancy_reaper(o número 0027 já estava ocupado pelo arquivo órfão0027_glorious_mindworm); journal e snapshot atualizados - TS: removido
baseUrldotsconfig.jsonpara evitar erroTS5101(deprecação no TS 7) —moduleResolution: bundlerresolve ospathsrelativos ao própriotsconfig, dispensandobaseUrl
Documentação
- README: seção Backup atualizada — arquivos gerados agora especificam que apenas os schemas
publicedrizzlesão dumpados - README: seção Restore reescrita com o fluxo correto para banco Docker (
DROP SCHEMA public CASCADE+pg_restore --clean --if-exists --disable-triggers) - README: comando rápido de Docker Compose de backup/restore substituído por
pnpm backup - README: header passa a apontar para
logo_small.svg
[2.4.3] - 2026-04-25
Esta versão amplia o trabalho com lançamentos divididos: anexos passam a ser visíveis para pessoas com acesso compartilhado, a importação para conta própria copia os arquivos de forma independente e a edição ganha a opção de aplicar a alteração nos dois lados do par. Três caminhos de deleção foram corrigidos para não deixar arquivos órfãos no storage. Também traz refresh visual nos badges de tipo e radio buttons, prefetch server-side de logos para reduzir chamadas de API no dashboard, e ajustes pontuais no healthcheck do container e em rótulos da UI.
Adicionado
- Schema: coluna
split_group_id(uuid, nullable) emlancamentoscom índice(user_id, split_group_id)— liga as shares do mesmo evento de divisão - Split:
buildLancamentoRecordsatribui umsplitGroupIdúnico por cycle (parcelado, recorrente ou único) para ambas as shares - Split: edição cooperativa via
updateTransactionSplitPairAction— ao editar um lançamento dividido, novo dialogSplitPairDialogpermite escolher entre aplicar somente neste lado ou nos dois lados (nome, data, categoria e demais campos compartilhados; valor e payer permanecem por share) - Importação: "Importar para Minha Conta" agora copia os anexos do lançamento-fonte para a conta de quem está importando (novo arquivo, novo
userId, novofileKey— cópia independente via S3 CopyObject).createSchemaganhou campo opcionalimportFromTransactionId; helpercopyAttachmentsForImportvalida acesso à fonte via ownership direto oupayerShares - Importação: dialog "Importar para Minha Conta" exibe seção read-only "Anexos que serão copiados" listando os anexos do lançamento-fonte antes da confirmação
- Filtros: nova chave
isDividedna tabela de lançamentos — toggle "Somente divididos" no drawer de filtros mantém o estado na URL - Performance: prefetch server-side de mapeamentos Logo.dev no
/dashboard,/transactionse/payers/[payerId]— uma única query SQL em batch (fetchEstablishmentLogoMap) semeia o cache do React Query antes do primeiro render, eliminando os N requests para/api/logo/mapping
Alterado
- Anexos:
fetchTransactionAttachmentsefetchTransactionAttachmentsActionpassam a autorizar leitura por acesso à transação (direto ou viapayerShares), permitindo que pessoas com pagador compartilhado visualizem anexos de lançamentos divididos - Anexos: upload (
confirmAttachmentUploadAction) e detach em massa (detachAttachmentBulkAction) agora expandemtransactionIdspara incluir shares irmãs viasplitGroupId— o vínculo emtransaction_attachmentsé replicado para manter simetria - Anexos: delete/detach continuam restritos ao criador (sem alteração de escrita); dashboard (
fetchAttachmentsForPeriod) permanece listando apenas os anexos do próprio usuário - Migração: lançamentos divididos criados antes desta versão ficam com
split_group_idNULL e mantêm o comportamento antigo (anexos não visíveis para a contraparte); apenas splits novos são afetados - Storage:
deleteS3Objectpassa a ignorarNoSuchKeysilenciosamente — providers S3-compatíveis (ex.: Cloudflare R2) lançam esse erro ao deletar objeto inexistente, ao contrário do comportamento idempotente do S3 padrão - UI/Badges:
TransactionTypeBadgeredesenhado — substitui oStatusDotpor ícones direcionais (RiArrowRightDownLinereceita,RiArrowRightUpLinedespesa,RiArrowLeftRightLinetransferência), com borda visível, shadow sutil e variantes dark mode dessaturadas; rótulo "Transferência" abreviado para "Transf." - UI/Forms: indicador do
RadioGrouptrocado de círculo (RiCircleLine) por check (RiCheckLine) com fundo sólidoprimaryno estado selecionado - UI/Antecipação: tabela de seleção de parcelas reduzida de quatro para três colunas (estabelecimento + fatura + valor) — informações de parcela e vencimento absorvidas pela coluna do estabelecimento
- Tipografia: fonte Inter agora carrega explicitamente os pesos 500, 600 e 700 (antes derivava de 400)
- Deps: better-auth 1.6.5 → 1.6.9, @aws-sdk/client-s3 3.1032 → 3.1037, @tanstack/react-query 5.99.2 → 5.100.3, @biomejs/biome 2.4.12 → 2.4.13, tailwindcss 4.2.2 → 4.2.4, resend 6.12.0 → 6.12.2
Corrigido
- Anexos: deleção em massa por série (
deleteTransactionBulkAction) não chamava cleanup de storage — arquivos ficavam órfãos no S3 após apagar "este e futuros" ou "todos" de uma série parcelada/recorrente com anexo - Anexos: deleção múltipla por seleção (
deleteMultipleTransactionsAction) não chamava cleanup de storage — mesmo problema ao selecionar vários lançamentos com anexo e deletar em lote - Anexos: reset de conta em Ajustes (
resetUserAppData) não limpava o storage — todos os arquivos do usuário ficavam órfãos no S3 após a operação de zeragem - Página da pessoa (
/payers/[payerId]):fetchPagadorLancamentosagora calculahasAttachmentsviaEXISTS, fazendo o ícone de clipe aparecer na tabela de lançamentos (antes só aparecia em/transactions) - Categorias: mensagem de sucesso ao atualizar exibia "Category atualizada com sucesso." — corrigido para "Categoria atualizada com sucesso."
- Antecipação: rótulos "Category" e "Período" no dialog corrigidos para "Categoria" e "Fatura"
- Docker: healthcheck do container
appagora usa127.0.0.1:3000em vez delocalhost:3000, evitando connection timeout em hosts com IPv6 (resolvendo #44)
[2.4.2] - 2026-04-20
Esta versão é quase toda sobre organização e polimento. O código interno do Dashboard foi reestruturado — módulos espalhados pela raiz da feature foram agrupados em subdiretórios coesos e a arquitetura de widgets foi renovada com um novo widget-registry. A sidebar lateral foi aposentada em favor de uma navegação concentrada na navbar. A interface passou por um refinamento visual amplo: cards redesenhados, dark mode mais consistente e efeitos decorativos removidos para uma composição mais limpa. As imagens de preview da landing page foram atualizadas. Por fim, a integração com Logo.dev ganhou uma arquitetura mais segura — o token agora é lido apenas no servidor e nunca chega ao cliente. O conceito de "Pagador" foi renomeado para "Pessoa" em toda a interface.
Adicionado
- Dashboard: nova arquitetura de widgets com
widget-registry— módulos reorganizados em subdiretórios (bills/,invoices/,notes/,notifications/,overview/,payments/,goals-progress/,categories/) - Dashboard: novos componentes
category-breakdown-chart,category-breakdown-list,goals-progress-itemepercentage-change-indicator - Logo.dev:
server.tscomisLogoDevEnabled()ebuildLogoDevUrl()server-side;LogoDevProviderpropaga flagenabledpara Client Components - Scripts:
mockupadicionado aopackage.json(tsx scripts/mock-data.ts)
Alterado
- Nav: sidebar lateral removida — navegação unificada na navbar
- UI/Tema: raio de borda global 0.625rem → 0.7rem; ajustes finos em
--carde--border(light e dark) - UI:
DotPatternremovido do layout dashboard, tela de autenticação e landing page - UI: account-card redesenhado com cores de saldo (success/destructive) e tooltip para flags de exclusão
- UI: budget-card, card-item e componentes do calendário (day-cell, event-modal) com layout revisado
- UI: auth-card-shell simplificado (removido glassmorphism e blob animado)
- Landing: imagens de preview atualizadas;
mainFeatures+extraFeaturesunificados em grid único; dark mode nos botões de CTA - Navbar: dark mode corrigido no navbar-shell (
dark:bg-card,dark:border-b-border) - Logo.dev:
NEXT_PUBLIC_LOGO_DEV_TOKENrenomeado paraLOGO_DEV_TOKEN(agora lido em runtime server-side apenas) - UI: conceito "Pagador/Pagadores" renomeado para "Pessoa/Pessoas" em toda a interface — labels, títulos, toasts, mensagens de erro, cabeçalhos de tabela e exportações. Código, rotas (
/payers) e schema do banco (pagadores) permanecem inalterados; a divergência entre UI e código é intencional - Deps: next 16.2.3 → 16.2.4, better-auth 1.6.2 → 1.6.5, ai 6.0.159 → 6.0.168 e outros patches menores
- Notas/Tarefas: ícone de tarefa concluída em visualização (card e detalhes) simplificado para
RiCheckLineverde sem caixa; checkbox no modal de edição usa fundo e bordasuccesscom íconesuccess-foreground(claro no light, escuro no dark) - Notas/Detalhes: botões do footer reordenados ("Cancelar" à esquerda, "Alterar" primário à direita)
Removido
- Nav: componentes sidebar (
app-sidebar,nav-main,nav-secondary,nav-user,nav-link),sidebar.tsxeuse-mobile.ts - Dashboard: ~25 widgets monolíticos obsoletos (
inbox-widget,bills-widget,notes-widget,payers-widget,my-accounts-widgetetc.) - Dashboard: arquivos dispersos na raiz da feature movidos para subdiretórios (arquivos antigos removidos)
- CSS: variáveis
--data-7a--data-10removidas do tema - CI: build arg
NEXT_PUBLIC_LOGO_DEV_TOKENremovido doDockerfilee do workflowdocker-publish.yml— basta configurarLOGO_DEV_TOKENeLOGO_DEV_SECRET_KEYcomo variáveis de runtime no host (Coolify, Railway, etc.)
[2.4.1] - 2026-04-16
Adicionado
- UI/Auth: layout animado nas páginas de login e signup com efeito blob (3 círculos coloridos em movimento) e card com glassmorphism; layout compartilhado extraído para
app/(auth)/layout.tsxeliminando duplicação (PR #42) - DB: 17 índices em foreign keys — evita sequential scans em deletes nas tabelas pai. Impacto maior nas FKs de
lancamentos(conta_id, categoria_id, antecipacao_id), onde deletes emcategoriasantes provocavam full scan na tabela de lançamentos
Alterado
- UI/Navbar: labels capitalizados (Lançamentos, Categorias, Contas) em vez de caixa baixa — melhora legibilidade (PR #42)
Removido
- DB: 7 índices sem uso —
tokens_api_user_id_idx,cartoes_user_id_status_idx,contas_user_id_status_idx,pagadores_user_id_status_idx,pagadores_user_id_role_idx,dashboard_notification_states_user_id_archived_idx,antecipacoes_parcelas_series_id_idx(0 scans em 187 dias de estatísticas) - UI/Settings: tab de Integrações órfã removida (não tinha
TabsContentcorrespondente)
Corrigido
- Docker: container do PostgreSQL falhava ao iniciar em instalações existentes após atualização da imagem
postgres:18-alpine— entrypoint passou a recusar dados no caminho legado/var/lib/postgresql/data. Adicionada variávelPGDATAnodocker-compose.ymlpara fixar o caminho e preservar dados de quem já tinha o volume populado (resolve #41)
[2.4.0] - 2026-04-13
Adicionado
- Estabelecimentos: integração com Logo.dev — logos automáticos de marcas exibidos na coluna de estabelecimentos nos lançamentos
- Estabelecimentos: picker de logo por estabelecimento — clique no avatar para buscar e fixar um domínio Logo.dev específico (salvo por usuário no banco)
- API: rotas
/api/logo/searche/api/logo/mapping— proxy seguro para Logo.dev Brand Search API (secret key server-side) e consulta de mapeamentos salvos - Schema: tabela
establishment_logoscom PK composta(user_id, name_key)para persistir preferências de logo por usuário
Corrigido
- Dev:
.env.exampleusava hostdbnoDATABASE_URL, causando erroEAI_AGAINao rodarpnpm devlocalmente — corrigido paralocalhost
Documentação
- README: tabela comparativa entre Perfil 1 (Usar) e Perfil 2 (Desenvolver) com diferenças de setup,
DATABASE_URLe instruções de atualização - README: seção "Variáveis de Ambiente" esclarecida — distingue contexto Docker (Perfil 1) de desenvolvimento local (Perfil 2)
- Logo.dev: crie uma conta em logo.dev para obter as chaves
NEXT_PUBLIC_LOGO_DEV_TOKENeLOGO_DEV_SECRET_KEY— plano gratuito inclui 500.000 requisições/mês
[2.3.8] - 2026-04-12
Alterado
- Docker:
docker-compose.ymlrefatorado — removidos profiles, build e dependência de arquivo externo; compose agora é standalone (bastacurl+docker compose up -d) - Docker:
docker-entrypoint.shsimplificado — extensãopgcryptocriada via Node.js antes das migrations; loop de retry reescrito; removido hack@localhost → @db - Docker: scripts reduzidos de 10 para 5 —
docker:up,docker:db,docker:down,docker:logs,docker:update - Docs: README reestruturado em dois perfis claros — Usar (só Docker) e Desenvolver (hot-reload)
[2.3.7] - 2026-04-11
Adicionado
- Dashboard: novos widgets configuráveis — Anexos (resumo de arquivos do período), Inbox (snapshot de pré-lançamentos pendentes) e Tendências de Categoria
- Lançamentos: filtro por status de pagamento (somente pagos / somente não pagos) e filtro por presença de anexo
- Lançamentos: indicador visual no status de liquidação para lançamentos de cartão de crédito com fatura paga — exibe ícone verde com tooltip explicativo
- Scripts:
scripts/install-deps.sh— script de preparação para servidores Ubuntu 24.04 limpos (instala Docker, Node.js 22, pnpm via Homebrew) - Docker: variáveis
PUBLIC_DOMAIN,UMAMI_URL,UMAMI_WEBSITE_IDeUMAMI_DOMAINSpassadas ao container da aplicação nodocker-compose.yml
Alterado
- Fonte: substituída fonte local
AmericaporInter(Google Fonts, self-hosted pelo Next.js) — elimina arquivos.woff2do repositório - Tipografia: peso tipográfico padronizado de
font-mediumparafont-semiboldem títulos, rótulos e valores monetários em toda a interface - Parcelas: redesenho do card de grupo de parcelas — expandindo para dialog de detalhes com parcelas pagas/pendentes separadas
- Inbox: redesenho do card de pré-lançamento — logo maior, hierarquia tipográfica melhorada
- Lançamentos: filtros de tipo, condição e forma de pagamento agora usam slugs em URL (ex:
receitaem vez do valor literal com acentos) - Estabelecimento: popover de autocomplete agora respeita a largura do input ao abrir
- CSP: adicionado
frame-srcpara permitir preview de anexos PDF via S3
Corrigido
- Docker: corrigido crash loop no container com mensagem
exec /app/docker-entrypoint.sh: no such file or directorycausado por CRLF nodocker-entrypoint.shem ambientes Windows/WSL2 — adicionadosed -i 's/\r$//'no Dockerfile e.gitattributescomeol=lfpara scripts shell - S3: corrigido
Error: Region is missingao usar o app sem S3 configurado —S3_REGIONvazio (string vazia) não era tratado pelo operador??; substituído por||em todo os3-client.ts - i18n: corrigidas mensagens de erro que exibiam "Payer" em inglês em vez de "Pagador"
- Logos: corrigido modal seletor de logos de cartões e contas para renderizar miniaturas sem avisos de proporção
- Scripts:
install-deps.sh— spinner travava o script porwaitretornar código não-zero comset -eativo; corrigido com|| true - Scripts:
install-deps.sh— prompt interativo do corepack suprimido comCOREPACK_ENABLE_DOWNLOAD_PROMPT=0 - Scripts:
install-deps.sh— PATH do Homebrew não estava configurado na seção de resumo
Removido
- Scripts: removidos arquivos órfãos
scripts/dev.tsescripts/setup-env.sh(substituídos pelosetup.mjs) - Docker:
docker-compose.ymlagora funciona sem arquivo.env—DATABASE_URLtem valor padrão com credenciais de desenvolvimento - Docker:
docker-entrypoint.shconverte automaticamente@localhost:para@db:naDATABASE_URLao iniciar o container, eliminando a necessidade de usar hosts diferentes no.envpara desenvolvimento local e Docker
[2.3.6] - 2026-04-09
Corrigido
- Docker: adicionado
NODE_PATH=/app/migrate/node_modulesno entrypoint para que odrizzle-kitconsiga resolverdrizzle-ormao executar as migrations no container
[2.3.5] - 2026-04-07
Corrigido
- CSP: movido
Content-Security-Policydonext.config.ts(build time) paraproxy.ts(runtime), corrigindo bloqueio de upload de anexos quandoS3_ENDPOINTnão estava disponível durante o build do Docker
[2.3.4] - 2026-04-05
Corrigido
- Anexos: corrigido upload que falhava com
NetworkError— CSPconnect-srcbloqueava fetch para o Storage
[2.3.3] - 2026-04-05
Corrigido
- Tokens: corrigido
/api/auth/device/verifyque rejeitava tokens criados via Settings (revertido de JWT para hash lookup)
Alterado
- Tokens: prefixo renomeado de
os_paraopm_(OpenMonetis); tokens existentes precisam ser recriados - Tokens: removidas rotas JWT não utilizadas (
/api/auth/device/tokene/api/auth/device/refresh) - Tokens:
api-token.tssimplificado para conter apenashashTokeneextractBearerToken
[2.3.2] - 2026-04-04
Segurança
- Tokens: removido aceite de tokens sem expiração (
expiresAt NULL); tokens criados via settings agora expiram em 1 ano - Tokens: corrigido refresh que sobrescrevia hash e invalidava access token anterior; verify agora valida JWT por assinatura
- xlsx: desabilitado parsing de fórmulas (
cellFormula: false) para mitigar CVE-2024-44294 - CSP: expandida Content-Security-Policy com
default-src,script-src,style-src,img-src,font-srceconnect-src - Headers: adicionados
Referrer-PolicyeX-Permitted-Cross-Domain-Policies - API: rotas autenticadas agora retornam
401 JSONem vez de redirect302para clientes não autenticados - Health: removido campo
versionda resposta do/api/health - robots.txt: simplificado para não expor mapa de rotas internas
- Sitemap: corrigida URL com protocolo duplicado (
https://https://) - Criado
security.txt(RFC 9116)
[2.3.1] - 2026-04-03
Corrigido
- Infraestrutura: deps do drizzle-kit agora são instaladas em
/app/migrate/separado donode_modulesdo standalone, corrigindo erroCannot find module 'next'no startup do container
[2.3.0] - 2026-04-03
Adicionado
- Dependências: adiciona
@tanstack/react-querye um provider global para padronizar cache, deduplicação e invalidação de leituras client-side - Dashboard: widget "Minhas Contas" ganha preferência persistida para mostrar ou ocultar contas marcadas como não consideradas no saldo total
- Dashboard: cards de métricas ganham botão de ajuda com explicação do cálculo exibido no app
- Versionamento: menu do usuário na navbar passa a avisar quando existe release mais recente publicada no GitHub
- Qualidade: adiciona
knipao projeto com o scriptpnpm run lint:deadcodepara auditar arquivos, exports e tipos sem uso - Infraestrutura: imagem Docker passa a rodar migrations automaticamente via
docker-entrypoint.shantes de iniciar a aplicação
Alterado
- Anexos: listagem no modal de edição/detalhes, URLs temporárias da galeria e preview deixam de depender de
useEffectpara data fetching direto no componente e passam a usar React Query sobre rotas GET dedicadas - Insights: carregamento de análises salvas passa a usar React Query com cache por período, mantendo estado draft local apenas para análises recém-geradas ou removidas
- Parcelamentos: histórico de antecipações no diálogo passa a usar React Query com invalidação automática após cancelamento
- Dashboard, insights e relatórios passam a excluir movimentações de contas marcadas como não consideradas no saldo total; balanço e previsto também passam a considerar ajustes de transferências entre contas consideradas e não consideradas
- UX: boletos e faturas passam a exibir labels relativas como "vence hoje", "vence amanhã" e "pago ontem", com tooltip para a data completa
- Lançamentos: diálogo foi reorganizado em blocos mais claros; a criação passa a aceitar múltiplos anexos e a edição em lote preserva
purchaseDateeperiodao propagar alterações por série - Inbox e tabela de lançamentos foram componentizados em partes menores, mantendo paginação e ações em lote mais simples de evoluir
- Infraestrutura: workflow de publish ganha etapa obrigatória de qualidade;
docker-composepassa a suportar perfil local ou banco remoto; build fixapnpm@10.33.0; projeto atualizado paraNext.js 16.2.2,Biome 2.4.10e dependências correlatas - Qualidade:
knipganha configuração inicial para reduzir falsos positivos, ignorandosrc/shared/components/ui/**, o worker público de PDF,setup.mjse o falso positivo depostcss
Corrigido
- Segurança: criação de antecipações agora valida se
payerIdecategoryIdinformados pertencem ao usuário autenticado antes de persistir referências cruzadas - Segurança: histórico de antecipações endurece os joins de
transactions,payersecategoriescom filtro poruserId, evitando exposição de nomes relacionados caso exista referência inconsistente no banco - Segurança: domínio público deixa de responder rotas
/api/*, e o Better Auth passa a aplicar rate limits explícitos para login e cadastro por e-mail - APIs privadas: rotas de anexos, insights salvos, histórico de antecipações e presign de download passam a responder com
Cache-Control: private, no-store; a rota de antecipações também deixa de devolver mensagens internas de erro ao cliente - Build: rotas web de tokens do Companion passam a ser explicitamente dinâmicas, removendo o warning de prerender no
next build - Lançamentos: edição em série de compras parceladas volta a persistir
purchaseDateeperiod, permitindo mover parcelas para a fatura ou competência correta conforme o escopo escolhido - Lançamentos: edições que tentam mover compras de cartão para faturas já pagas agora são bloqueadas com mensagem clara também no fluxo de atualização e propagação em lote
- Imagens: logos institucionais, avatares padrão e componentes com
next/imageem modofillpassam a usar containers fixos comsizes, removendo avisos de proporção e performance - Gráficos:
ChartContainerpassa a definirinitialDimensionnoResponsiveContainerdo Recharts, evitando avisoswidth(-1)eheight(-1)durante a medição inicial em widgets e relatórios
[2.2.1] - 2026-04-01
Corrigido
- Docker: imagem de produção deixa de executar
chown -R /appno stage final; as permissões passam a ser definidas nosCOPY --chown, reduzindo o risco de travamento e lentidão excessiva no build/push da GitHub Action
[2.2.0] - 2026-04-01
Adicionado
- Anexos: nova página de galeria em
/attachmentscom miniaturas, visualização inline de imagem e PDF, download direto e acesso a partir do lançamento - Anexos: suporte a visualização de PDF diretamente no app via
pdfjs-dist - Autenticação: sidebar redesenhado com mockup de faturas e três itens de funcionalidade; páginas de login e cadastro ganham gradiente decorativo e logo visível no mobile
- Notificações: alertas de vencimento para boletos e faturas do período seguinte exibidos quando o vencimento está dentro de 5 dias
- Documentação: novo arquivo público
public/llms.txtcom resumo do projeto e links curados para documentação, setup e arquitetura
Alterado
- Performance: queries de cache do dashboard migradas de
unstable_cachepara a diretivause cachecomcacheTagecacheLife; todas as páginas do dashboard passam a chamarconnection()para renderização dinâmica;next.config.tsadotacacheComponents: true - Tipografia: adicionada fonte America Medium (weight 500); pesos tipográficos padronizados para
font-mediumem títulos, valores e rótulos em todos os componentes - Anexos:
AttachmentPreviewfoi simplificado para exibir apenas nome da transação, nome do arquivo, navegação entre anexos e ações de download, abrir em nova aba e fechar com íconeX
Corrigido
- Lançamentos: uploads e remoções de anexo agora funcionam para todos os lançamentos, não apenas os pertencentes a séries
[2.1.2] - 2026-03-30
Adicionado
- Preferências: nova configuração de tamanho máximo por arquivo de anexo (5, 10, 25, 50 ou 100 MB), persistida no banco e respeitada em todos os pontos de upload
- Lançamentos: novo escopo
"period"na ação em lote, que aplica a alteração a todos os lançamentos do período sem sobrescrever o pagador individual de cada um
Corrigido
- Lançamentos: ao editar um lançamento de série, uploads e remoções de anexo agora aguardam a escolha de escopo da ação em lote antes de serem executados, evitando que o anexo fosse aplicado no lançamento errado
- Lançamentos: ação em lote com escopo
"period"não sobrescreve mais opayerIdindividual de cada lançamento ao alterar o pagador
Alterado
- Configurações: redesign visual da página com separadores entre seções e títulos maiores
- Configurações: seção "Extrato e lançamentos" renomeada para "Lançamentos"
[2.1.1] - 2026-03-29
Adicionado
- Navbar: novo componente
NavbarShellque unifica a estrutura da barra de navegação entre o app e a landing page - UI: nova variante
navbarno componenteButton, centralizando os estilos de botões usados dentro da navbar - Analytics: integração com Umami self-hosted via script tag no layout raiz
Alterado
- Navbar:
AnimatedThemeTogglereRefreshPageButtonpassam a aceitar propvariantpara adaptar estilos ao contexto (navbar ou sidebar) - Navbar: estilos inline duplicados de
nav-styles.tsmigrados para a variantenavbardo Button - Logo: prop
showVersionremovida; propcolorIconpassa a aplicar filtro de cor também no variantcompact - Scripts:
mockuprenomeado paradb:seed;db:enableExtensionsrenomeado paradb:extensions; scriptdev-envremovido - Landing:
MobileNavsimplificado com a remoção da proptriggerClassName
Removido
- Navbar: arquivo
nav-styles.tsremovido após migração dos estilos para a variantenavbar - Dependências:
@vercel/analyticse@vercel/speed-insightsremovidos (substituídos pelo Umami self-hosted)
[2.1.0] - 2026-03-28
Adicionado
- Lançamentos: suporte a anexos em transações com upload direto para storage compatível com S3, persistência em tabelas dedicadas (
anexoselancamento_anexos) e ações de visualizar/remover no detalhe do lançamento - Infraestrutura: novo workflow
.github/workflows/release.ymlpara criar tag e GitHub Release automaticamente a partir da versão dopackage.jsone da entrada correspondente noCHANGELOG.md
Alterado
- Anexos: upload agora exige token assinado por arquivo, valida propriedade da transação também na leitura/remoção e confere tamanho/tipo do objeto no storage antes de persistir o vínculo no banco
Corrigido
- Lançamentos: criação de transações no cartão de crédito agora bloqueia períodos cujas faturas já estão pagas, evitando divergência no relatório de análise de parcelas
[2.0.3] - 2026-03-26
Corrigido
- Lançamentos:
/transactionsdeixa de depender decrypto.randomUUID()no carregamento inicial, corrigindo a falha em ambientes self-hosted sem HTTPS ao abrir a página
[2.0.2] - 2026-03-25
Adicionado
- Scripts: novo comando
mockupnopackage.jsonpara executarscripts/mock-data.ts - Navbar: novo estado persistido para notificações do sino, permitindo marcar alertas de fatura, boleto e orçamento como lidos ou arquivados por usuário
Alterado
- Navbar: o snapshot global de notificações deixa de depender do
periododa URL atual e passa a usar o período corrente do negócio; itens lidos saem do badge e itens arquivados somem da lista padrão do sino - Navbar: dropdown de notificações agora permite mostrar itens arquivados e reverter ações de leitura e arquivamento diretamente em cada item
- Navbar: filtro da lista de notificações no sino foi refinado para um seletor explícito entre
AtivaseArquivadas, com destaque visual mais forte para a aba ativa - Navbar: componente
notification-bellfoi desmembrado em hook e componentes locais menores, reduzindo acoplamento e facilitando manutenção - Dashboard: detalhamento por categoria agora oculta categorias sem movimentação no período, reduzindo ruído visual no card
- UI: arte decorativa do topo da dashboard foi restrita à faixa do cabeçalho de boas-vindas, evitando que o
dot patterne o gradiente claro alterem a leitura visual do month picker - Lançamentos em série: a edição em lote agora também permite propagar o status de pagamento (
isSettled) para transações não feitas no cartão de crédito - Seed de conta vazia:
scripts/mock-data.tsagora processa--helpantes de exigirDATABASE_URLe só cria categorias/pagador admin depois de validar que a conta está financeiramente vazia
Corrigido
- Navbar: ao desarquivar a última notificação no modo de arquivadas, o dropdown volta automaticamente para a listagem padrão e o toggle deixa de ficar travado
- Filtros financeiros: transações de conta com observação nula, como compras parceladas no Pix, deixam de ser ocultadas indevidamente em
/transactions, dashboard e relatórios quando a conta está configurada para desconsiderar o saldo inicial - Backup: geração do arquivo
*.data.sql.gzvolta a usar a saída correta dopg_restore
Removido
- DB: colunas
system_fontemoney_fontda tabelapreferencias_usuario, que não são mais utilizadas no código
[2.0.1] - 2026-03-21
Corrigido
- Inbox: filtro por app em
/inboxagora monta a lista completa de apps da aba a partir de todos os itens do status atual, sem depender apenas da página carregada, e o SSR deixa de quebrar quandosourceAppsvier inconsistente - Inbox: notificações de cartões/apps sem logo cadastrado agora exibem
default_icon.pngcomo fallback visual nos cards - Inbox: select de apps em
/inboxagora exibe os logos dos apps/cartões, com fallback paradefault_icon.pngquando não houver logo mapeado - Inbox: cabeçalhos de data entre grupos de cards agora exibem ícone e tipografia um pouco maior para melhorar a leitura
- Versionamento:
/api/healthpassa a reportar a versão atual dopackage.json, evitando divergência entre healthcheck, UI e release publicada
[2.0.0] - 2026-03-21
Adicionado
- Infraestrutura: script
scripts/backup.shpara backup automático do banco PostgreSQL; configuração de destino (rclone, cron, retenção) feita separadamente; passa a gerar também*.data.sql.gzcom dados puros de todas as tabelas públicas (--data-only --schema=public) - Importação de extratos OFX e XLS/XLSX com tela de revisão, detecção automática de categoria por histórico de uso, deduplicação por FITID e acesso direto pela tabela de transações
Alterado
- Ajustes: aba de exclusão da conta passa a oferecer opção de zerar dados financeiros (preferências, tokens do Companion, compartilhamentos) sem excluir o usuário; categorias e pagador admin são recriados em seguida.
- Performance: paginação server-side real com
count,limiteoffsetem transações, extrato e inbox, com sincronização depage,pageSizeestatusna URL;fetchInboxDialogData()restrito ao fluxo de processamento. - Performance: dashboard reduzido de 19 fetchers para 7 blocos com agregações compartilhadas; snapshots dedicados para navbar (avatar do pagador admin, notificações, inbox) e quick actions, ambos com cache por usuário.
- Performance: exportações de lançamentos e relatório por categoria carregam
xlsx,jspdfejspdf-autotablesob demanda, apenas no clique. - Performance: agregação de insights busca o pagador admin uma vez por request, remove joins repetidos com
pagadorese paraleliza consultas independentes do período. - Cache: invalidação do dashboard segmentada por
userIdnas server actions;revalidateForEntity()agora exigeuserId, sem fallback global para dashboard. - Cache: agregação de insights com cache por usuário e período, reaproveitando a invalidação financeira segmentada.
- Arquitetura:
getAdminPayerIdadotado em contas, orçamentos, calendário, detalhe de categoria, extrato e actions, eliminando JOINs repetidos compayers.role. - Banco: unique constraints compostas em
faturaseorcamentos, com migration que aborta em caso de duplicatas históricas; actions tratam conflitos de concorrência comupsertpara status de fatura eonConflictDoNothingpara orçamentos. - Qualidade:
pnpm run lintenext buildpassam sem erros de TypeScript; validação de tipos ativa no build. - Refatoração: identificadores internos migrados de PT-BR para inglês (
lancamento→transaction,pagador→payer,conta→account,cartao→card,categoria→category,orcamento→budget); strings de UI permanecem em português. Search params de lançamentos também migrados (type,condition,payment,payer,category,accountCard). - Lançamentos recorrentes: criação de todos os meses diretamente no fluxo do lançamento, com seleção explícita da quantidade de meses no formulário.
- UI:
type-badgerenomeado paratransaction-type-badgecom mapeamento centralizado por tipo financeiro; visual unificado em tabela, detalhe de transação e cabeçalho de categoria. - UI: navbar com
dot patternSVG sutil sobre a cor primária, máscara horizontal e camada de luz suave; cards de login/cadastro reaproveitam a mesma linguagem visual comdot patterne brilho emprimary. - UI: login e cadastro reequilibrados com espaçamentos mais consistentes, largura útil fixa e cabeçalhos com descrição.
- UI: labels padronizados em formulários, tabelas, relatórios e estados vazios; skeletons com cantos menos arredondados; loading da home espelha estrutura atual (boas-vindas, navegação mensal, cards de métricas e toolbar de widgets).
- Faturas: card de resumo refinado com hierarquia clara para valor, vencimento e status; metadados em blocos discretos e faixa de ação contextual para pagamento e edição de data.
- Tipografia: aplicação carrega apenas a família
America(regular,mediumebold) como fonte global, removendo personalização por usuário e distinção de fonte para valores monetários. - Pagadores: a tela de detalhe agora mantém o card principal do pagador visível durante a navegação entre abas, sem repetir o bloco completo dentro de cada seção.
- Pagadores: detalhes sensíveis como envio automático, último envio e observações agora ficam ocultos quando o acesso ao pagador é somente leitura.
- Pagadores: o e-mail do pagador agora aparece apenas no cabeçalho fixo, evitando repetição dentro do card de detalhes.
- Relatório de tendências: a tabela e os cards mobile agora exibem a média mensal do período filtrado ao lado do total, com destaque visual em azul; a coluna de categoria também ficou mais compacta com truncamento para nomes longos.
- Dashboard: o welcome banner deixou de ser um bloco colorido para virar apenas texto destacado.
- UI base: o
Cardcompartilhado agora mantém a borda neutra no estado padrão e aplica um gradiente entrebordereprimaryno hover. - Assets: imagens que estavam soltas na raiz de
public/foram movidas parapublic/imagens/, com atualização dos caminhos usados por landing page, logos, exports e manifesto do app. - Dashboard:
section-cardsfoi renomeado paradashboard-metrics-cards;boletos-widgetrenomeado parabill-widget; widgets componentizados internamente por domínio (invoices/,bills/,notes/,goals-progress/,payment-overview/,installment-expenses/). - Widgets:
widget-cardfoi separado entre um card base e uma versão expansível, isolando a lógica de overflow sem alterar o visual atual dos widgets. - Datas: helpers de
YYYY-MM-DD, labels de vencimento/pagamento e o relógio de negócio foram centralizados emlib/utils/date.ts, reduzindo drift de timezone em dashboard, pagadores, calendário, exports e actions. - Lançamentos: a tabela deixou de quebrar ao formatar datas inválidas ou serializadas como ISO completo, normalizando
purchaseDateparaYYYY-MM-DDcom fallback seguro. - Logos e cartões: resolução de logos e brand assets foi consolidada em
lib/logo/index.tselib/cartoes/brand-assets.ts, com adoção em cartões, contas, notificações, inbox, relatórios e seletores.
Corrigido
- Relatório de tendências: a coluna Média agora considera apenas os meses com gastos registrados (valores > 0), ignorando meses sem movimentação no cálculo
- Dashboard: ícones de seta nos cards de métricas (receita/despesa) estavam invertidos; cor do card de saldo ajustada para
cyan-600 - Landing page: gradiente sobreposto removido da hero section
- Lançamentos: o schema compartilhado de observação voltou a aceitar
null, corrigindo o erroInvalid input: expected string, received nullao salvar novos lançamentos sem anotação. - Cartões/Faturas: o pagamento da fatura passou a usar o valor líquido do período no cartão, evitando que o extrato da conta registre o total bruto das despesas quando houver receitas como estornos ou créditos na mesma fatura.
- Hooks e sincronização: o provider de privacidade voltou a reagir corretamente às mudanças do modo privado, e o resumo de fatura agora reseta a data de pagamento quando a prop inicial deixa de existir.
- Compatibilidade da refatoração de hooks e relatórios:
useMobile/useIsMobilevoltaram a ter exports compatíveis, o shim decomponents/ui/use-mobile.tsfoi restaurado para o sidebar elib/relatorios/types.tsvoltou a reexportar os tipos usados pelos fetchers legados. - Widgets expansíveis: o shell compartilhado voltou a aplicar
relativeeoverflow-hidden, mantendo o gradiente e o botão "Ver tudo" presos ao card. - Dashboard: o widget "Lançamentos por categoria" deixou de ler a categoria salva no
sessionStoragedurante a renderização inicial, evitando mismatch de hidratação entre servidor e cliente.
Removido
- Dashboard/Ajustes: toda a implementação legada de
magnet-linesfoi removida, incluindo componente órfão, preferência de usuário e a colunadisable_magnetlinesdo schema com migration dedicada.
[1.7.7] - 2026-03-05
Alterado
- Períodos e navegação mensal:
useMonthPeriodpassou a usar os helpers centrais de período (YYYY-MM), o month-picker foi simplificado e o rótulo visual agora segue o formatoMarço 2026. - Hooks e organização: hooks locais de calculadora, month-picker, logo picker e sidebar foram movidos para perto das respectivas features, deixando
/hooksfocado nos hooks realmente compartilhados. - Estado de formulários e responsividade:
useFormStateganhou APIs explícitas de reset/substituição no lugar do setter cru, euseIsMobilefoi atualizado para assinatura estável comuseSyncExternalStore, reduzindo a troca estrutural inicial no sidebar entre mobile e desktop. - Navegação e estrutura compartilhada:
components/navbarecomponents/sidebarforam consolidados emcomponents/navigation/*, componentes globais migraram paracomponents/shared/*e os imports foram padronizados no projeto. - Dashboard e relatórios: a análise de parcelas foi movida para
/relatorios/analise-parcelas, ações rápidas e widgets do dashboard foram refinados, e os cards de relatórios ganharam ajustes para evitar overflow no mobile. - Pré-lançamentos e lançamentos: tabs e cards da inbox ficaram mais consistentes no mobile, itens descartados podem voltar para
Pendentee compras feitas no dia do fechamento do cartão agora entram na próxima fatura. - Tipografia e exportações: suporte a
SF Profoi removido, a validação de fontes ficou centralizada empublic/fonts/font_index.tse as exportações em PDF/CSV/Excel receberam melhor branding e apresentação. - Calculadora e diálogos: o arraste ficou mais estável, os bloqueios de fechamento externo foram reforçados e o display interno foi reorganizado para uso mais consistente.
- Também houve ajustes menores de responsividade, espaçamento e acabamento visual em telas mobile, modais e detalhes de interface.
[1.7.6] - 2026-03-02
Adicionado
- Suporte completo a Passkeys (WebAuthn) com plugin
@better-auth/passkeyno servidor epasskeyClientno cliente de autenticação - Tabela
passkeyno banco de dados para persistência de credenciais WebAuthn vinculadas ao usuário - Nova aba Passkeys em
/ajustescom gerenciamento de credenciais: listar, adicionar, renomear e remover passkeys - Ação de login com passkey na tela de autenticação (
/login) - Dashboard: botões rápidos na toolbar de widgets para
Nova receita,Nova despesaeNova anotaçãocom abertura direta dos diálogos correspondentes - Widget de Anotações no dashboard com listagem das anotações ativas, ações discretas de editar e ver detalhes, e atalho para
/anotacoes
Alterado
PasskeysFormrefatorado para melhor experiência com React 19/Next 16: detecção de suporte do navegador, bloqueio de ações simultâneas e atualização da lista sem loader global após operações- Widget de pagadores no dashboard agora exibe variação percentual em relação ao mês anterior (seta + cor semântica), seguindo o padrão visual dos widgets de categorias
- Dashboard: widgets
Condições de Pagamentos+Formas de Pagamentounificados em um único widget com abas;Top Estabelecimentos+Maiores Gastos do Mêstambém unificados em widget com abas - Relatórios: rota de Top Estabelecimentos consolidada em
/relatorios/estabelecimentos - Dashboard: widget
Lançamentos recentesremovido e substituído porProgresso de metascom lista de orçamentos do período (gasto, limite configurado e percentual de uso por categoria) - Dashboard:
fetchDashboardDatadeixou de carregarnotificationsSnapshot(notificações continuam sendo carregadas no layout), reduzindo uma query no carregamento da página inicial
Corrigido
- Login com passkey na tela de autenticação agora fica disponível em navegadores com WebAuthn, mesmo sem suporte a Conditional UI
- Listagem de passkeys em Ajustes agora trata
createdAtausente sem gerar data inválida na interface - Migração
0017_previous_warstartornou-se idempotente para colunas depreferencias_usuariocomIF NOT EXISTS, evitando falha em bancos já migrados
Removido
- Código legado não utilizado no dashboard: widget e fetcher de
Lançamentos Recentes - Componente legado
CategoryCardem categorias (substituído pelo layout atual em tabela) - Componente
AuthFooternão utilizado na autenticação - Barrel files sem consumo em
components/relatorios,components/lancamentosecomponents/lancamentos/shared - Rota legada
/top-estabelecimentose arquivos auxiliares (layout.tsxeloading.tsx) removidos
[1.7.5] - 2026-02-28
Adicionado
- Inbox de pré-lançamentos: ações para excluir item individual (processado/descartado) e limpar itens em lote por status
Alterado
- Página de categorias: layout migrado de cards para tabela com link direto para detalhe, ícone da categoria e ações inline de editar/remover
- Widgets de boletos e faturas no dashboard: cards e diálogos redesenhados, com destaque visual para status e valores
- Estados de vencimento em boletos e faturas: quando vencidos e não pagos, exibem indicação "Atrasado / Pagar"
- Notificações de faturas: exibição de logo do cartão (quando disponível) e atualização dos ícones da listagem
Corrigido
parseDueDateno widget de faturas agora retorna também a data parseada com fallback seguro (date: null) para evitar comparações inválidas- Formatação do
components/dashboard/invoices-widget.tsxajustada para passar no lint
[1.7.4] - 2026-02-28
Alterado
- Card de análise de parcelas (
/dashboard/analise-parcelas): layout empilhado no mobile — nome/cartão e valores Total/Pendente em linhas separadas ao invés de lado-a-lado, evitando truncamento - Página de top estabelecimentos (
/top-estabelecimentos): cards "Top Estabelecimentos por Frequência" e "Principais Categorias" empilhados verticalmente no mobile (grid-cols-1 lg:grid-cols-2) - Padding da lista de parcelas expandida reduzido no mobile (
px-2 sm:px-8) - Ajustes gerais de responsividade em navbar, filtros, skeletons, widgets e dialogs (26 componentes)
- Remover selecionados: quando todos os itens selecionados pertencem à mesma série (parcelado ou recorrente), abre dialog de escopo com 3 opções ao invés de confirmação simples (parcial da PR #18)
- Despesa recorrente no cartão de crédito: só consome o limite do cartão quando a data da ocorrência já passou; mesma regra no relatório de cartões (parcial da PR #18)
[1.7.3] - 2026-02-27
Adicionado
- Prop
compactno DatePicker para formato abreviado "28 fev" (sem "de" e sem ano)
Alterado
- Modal de múltiplos lançamentos reformulado: selects de conta e cartão separados por forma de pagamento, InlinePeriodPicker ao selecionar cartão de crédito, grid full-width, DatePicker compacto
- Opção "Boleto" removida das formas de pagamento no modal de múltiplos lançamentos
[1.7.2] - 2026-02-26
Alterado
- Dialogs padronizados: padding maior (p-10), largura max-w-xl, botões do footer com largura igual (flex-1)
- Lançamento dialog simplificado: período da fatura calculado automaticamente a partir da data de compra + dia de fechamento do cartão via
deriveCreditCardPeriod() - Seção "Condições e anotações" colapsável no lançamento dialog
- Mass-add dialog: campo unificado conta/cartão com parsing por prefixo, period picker apenas para cartão de crédito
- PeriodPicker removido dos campos básicos; substituído por InlinePeriodPicker inline no cartão de crédito
Corrigido
- Non-null assertions (!) substituídas por type assertions ou optional chaining com guards em 15+ arquivos
anysubstituído porunknownou tipos explícitos (use-form-state, pagadores/data, ajustes/actions, insights/actions)- Hooks com dependências exaustivas: magnet-lines (useEffect antes de early return), lancamentos-filters (useCallback), inbox-page (useCallback + deps)
Errorcomponent renomeado paraErrorComponentevitando shadowing do global
Removido
- 6 componentes não utilizados: dashboard-grid, expenses/income-by-category widgets, installment analysis panels, fatura-warning-dialog
- 20+ funções/tipos não utilizados: successResult, generateApiToken, validateApiToken, getTodayUTC/Local, calculatePercentage, roundToDecimals, safeParseInt/Float, isPeriodValid, getLastPeriods, entre outros
- FaturaWarningDialog e checkFaturaStatusAction (substituídos por derivação automática de período)
[1.7.1] - 2026-02-24
Adicionado
- Topbar de navegação substituindo o header fixo: backdrop blur, links agrupados em 5 seções (Dashboard, Lançamentos, Cartões, Relatórios, Ferramentas)
- Dropdown Ferramentas na topbar consolidando calculadora e modo privacidade
- Sino de notificações expandido: exibe orçamentos estourados e pré-lançamentos pendentes com seções separadas e contagem agregada
- Página dedicada de changelog em
/changelog - Link para o changelog no menu do usuário com versão exibida ao lado
Alterado
- Logo refatorado com variante compacta para uso na topbar
- Menu do usuário incorpora o botão de logout e link para ajustes
- Links da topbar em lowercase; layout centralizado em max-w-8xl
- Data no changelog exibida no formato dd/mm/aaaa
Removido
- Header lateral substituído pela topbar
- Aba Changelog removida de Ajustes (agora é página própria)
- Componentes separados de logout e modo privacidade (incorporados à topbar)
[1.6.3] - 2026-02-19
Corrigido
- E-mail Resend: variável
RESEND_FROM_EMAILnão era lida do.env(valores com espaço precisam estar entre aspas). Leitura centralizada emlib/email/resend.tscomgetResendFromEmail()e carregamento explícito do.envno contexto de Server Actions
Alterado
.env.example:RESEND_FROM_EMAILcom valor entre aspas e comentário para uso em Docker/produçãodocker-compose.yml: env do app passaRESEND_FROM_EMAIL(em vez deEMAIL_FROM) para o container, alinhado ao nome usado pela aplicação
[1.6.2] - 2026-02-19
Corrigido
- Bug no mobile onde, ao selecionar um logo no diálogo de criação de conta/cartão, o diálogo principal fechava inesperadamente: adicionado
stopPropagationnos eventos de click/touch dos botões de logo e delay comrequestAnimationFrameantes de fechar o seletor de logo
[1.6.1] - 2026-02-18
Alterado
- Transferências entre contas: nome do estabelecimento passa a ser "Saída - Transf. entre contas" na saída e "Entrada - Transf. entre contas" na entrada e adicionando em anotação no formato "de {conta origem} -> {conta destino}"
- ChartContainer (Recharts): renderização do gráfico apenas após montagem no cliente e uso de
minWidth/minHeightno ResponsiveContainer para evitar aviso "width(-1) and height(-1)" no console
[1.6.0] - 2026-02-18
Adicionado
- Preferência "Anotações em coluna" em Ajustes > Extrato e lançamentos: quando ativa, a anotação dos lançamentos aparece em coluna na tabela; quando inativa, permanece no balão (tooltip) no ícone
- Preferência "Ordem das colunas" em Ajustes > Extrato e lançamentos: lista ordenável por arraste para definir a ordem das colunas na tabela do extrato e dos lançamentos (Estabelecimento, Transação, Valor, etc.); a linha inteira é arrastável
- Coluna
extrato_note_as_columnelancamentos_column_orderna tabelapreferencias_usuario(migrations 0017 e 0018) - Constantes e labels das colunas reordenáveis em
lib/lancamentos/column-order.ts
Alterado
- Header do dashboard fixo apenas no mobile (
fixed top-0commd:static); conteúdo compt-12 md:pt-0para não ficar sob o header - Abas da página Ajustes (Preferências, Companion, etc.): no mobile, rolagem horizontal com seta indicando mais opções à direita; scrollbar oculta
- Botões "Novo orçamento" e "Copiar orçamentos do último mês": no mobile, rolagem horizontal (
h-8,text-xs) - Botões "Nova Receita", "Nova Despesa" e ícone de múltiplos lançamentos: no mobile, mesma rolagem horizontal + botões menores
- Tabela de lançamentos aplica a ordem de colunas salva nas preferências (extrato, lançamentos, categoria, fatura, pagador)
- Adicionado variavel no docker compose para manter o caminho do volume no compose up/down
Contribuições: Guilherme Bano
[1.5.3] - 2026-02-21
Adicionado
- Painel do pagador: card "Status de Pagamento" com totais pagos/pendentes e listagem individual de boletos com data de vencimento, data de pagamento e status
- Funções
fetchPagadorBoletoItemsefetchPagadorPaymentStatusemlib/pagadores/details.ts - SEO completo na landing page: metadata Open Graph, Twitter Card, JSON-LD Schema.org, sitemap.xml (
/app/sitemap.ts) e robots.txt (/app/robots.ts) - Layout específico da landing page (
app/(landing-page)/layout.tsx) com metadados ricos
Corrigido
- Validação obrigatória de categoria, conta e cartão no dialog de lançamento — agora validada no cliente (antes do submit) e no servidor via Zod
- Atributo
langdo HTML corrigido deenparapt-BR
Alterado
- Painel do pagador reorganizado em grid de 3 colunas com cards de Faturas, Boletos e Status de Pagamento
PagadorBoletoCardrefatorado para exibir lista de boletos individuais em vez de resumo agregado- Imagens da landing page convertidas de PNG para WebP (melhora de performance)
- Template de título dinâmico no layout raiz (
%s | OpenMonetis)
[1.5.2] - 2026-02-16
Alterado
- Landing page reformulada: visual modernizado, melhor experiência mobile e novas seções
- Hero section com gradient sutil e tipografia responsiva
- Dashboard preview sem bordas para visual mais limpo
- Seção "Funcionalidades" reorganizada em 2 blocos: 6 cards principais + 6 extras compactos
- Seção "Como usar" com tabs Docker (Recomendado) vs Manual
- Footer simplificado com 3 colunas (Projeto, Companion, descrição)
- Métricas de destaque (widgets, self-hosted, stars, forks) entre hero e dashboard preview
- Espaçamento e padding otimizados para mobile em todas as seções
Adicionado
- Menu hamburger mobile com Sheet drawer (
components/landing/mobile-nav.tsx) - Animações de fade-in no scroll via Intersection Observer (
components/landing/animate-on-scroll.tsx) - Seção dedicada ao OpenMonetis Companion com screenshot do app, fluxo de captura e bancos suportados
- Galeria "Conheça as telas" com screenshots de Lançamentos, Calendário e Cartões
- Link "Conheça as telas" na navegação (desktop e mobile)
- Componente de tabs para setup (
components/landing/setup-tabs.tsx)
[1.5.1] - 2026-02-16
Alterado
- Projeto renomeado de OpenSheets para OpenMonetis em todo o codebase (~40 arquivos): package.json, manifests, layouts, componentes, server actions, emails, Docker, docs e landing page
- URLs do repositório atualizados de
opensheets-appparaopenmonetis - Docker image renomeada para
felipegcoutinho/openmonetis - Logo textual atualizado (
logo_text.png)
Adicionado
- Suporte a multi-domínio via
PUBLIC_DOMAIN: domínio público serve apenas a landing page (sem botões de login/cadastro, rotas do app bloqueadas pelo middleware) - Variável de ambiente
PUBLIC_DOMAINno.env.examplecom documentação
[1.5.0] - 2026-02-15
Adicionado
- Customização de fontes nas preferências — fonte da interface e fonte de valores monetários configuráveis por usuário
- 13 fontes disponíveis: AI Sans, Anthropic Sans, SF Pro Display, SF Pro Rounded, Inter, Geist Sans, Roboto, Reddit Sans, Fira Sans, Ubuntu, JetBrains Mono, Fira Code, IBM Plex Mono
- FontProvider com preview ao vivo — troca de fonte aplica instantaneamente via CSS variables, sem necessidade de reload
- Fontes Apple SF Pro (Display e Rounded) carregadas localmente com 4 pesos (Regular, Medium, Semibold, Bold)
- Colunas
system_fontemoney_fontna tabelapreferencias_usuario
Corrigido
- Cores de variação invertidas na tabela de receitas em
/relatorios/tendencias— aumento agora é verde (bom) e diminuição é vermelho (ruim), consistente com a semântica de receita
Alterado
- Sistema de fontes migrado de className direto para CSS custom properties (
--font-app,--font-money) via@theme inline - MoneyValues usa
var(--font-money)em vez de classe fixa, permitindo customização
[1.4.1] - 2026-02-15
Adicionado
- Abas "Pendentes", "Processados" e "Descartados" na página de pré-lançamentos (antes exibia apenas pendentes)
- Logo do cartão/conta exibido automaticamente nos cards de pré-lançamento via matching por nome do app
- Pre-fill automático do cartão de crédito ao processar pré-lançamento (match pelo nome do app)
- Badge de status e data nos cards de itens já processados/descartados (modo readonly)
Corrigido
revalidateTag("dashboard", "max")para invalidar todas as entradas de cache da tag (antes invalidava apenas a mais recente)- Cor
--warningajustada para melhor contraste (mais alaranjada) EstabelecimentoLogonão precisava de"use client"— removido- Fallback no cálculo de
fontSizeemEstabelecimentoLogo
Alterado
- Nome do estabelecimento formatado em Title Case ao processar pré-lançamento
- Subtítulo da página de pré-lançamentos atualizado
[1.4.0] - 2026-02-07
Corrigido
- Widgets de boleto/fatura não atualizavam após pagamento: actions de fatura (
updateInvoicePaymentStatusAction,updatePaymentDateAction) e antecipação de parcelas não invalidavam o cache do dashboard - Substituídos
revalidatePath()manuais porrevalidateForEntity()nas actions de fatura e antecipação - Expandido
revalidateConfig.cartoespara incluir/contase/lancamentos(afetados por pagamento de fatura) - Scroll não funcionava em listas Popover+Command (estabelecimento, categorias, filtros): adicionado
modalao Popover nos 4 componentes afetados
Adicionado
- Link "detalhes" no card de orçamento para navegar diretamente à página da categoria
- Indicadores de tendência coloridos nos cards de métricas do dashboard (receitas, despesas, balanço, previsto) com cores semânticas sutis
- Tokens semânticos de estado no design system:
--success,--warning,--info(com foregrounds) para light e dark mode - Cores de chart estendidas de 6 para 10 (
--chart-7a--chart-10: teal, violet, cyan, lime) - Variantes
successeinfono componente Badge
Alterado
- Migrados ~60+ componentes de cores hardcoded do Tailwind (
green-500,red-600,amber-500,blue-500, etc.) para tokens semânticos (success,destructive,warning,info) - Unificados 3 arrays duplicados de cores de categorias (em
category-report-chart.tsx,category-history.ts,category-history-widget.tsx) para importação única decategory-colors.ts - Month picker migrado de tokens customizados (
--month-picker) para tokens padrão (--card) - Dark mode normalizado: hues consistentes (~70 warm family) em vez de valores dispersos
- Token
--accentajustado para ser visualmente distinto de--background - Token
--cardcorrigido para branco limpo (oklch(100% 0 0))
Removido
- Tokens não utilizados:
--dark,--dark-foreground,--month-picker,--month-picker-foreground
[1.3.1] - 2026-02-06
Adicionado
- Calculadora arrastável via drag handle no header do dialog
- Callback
onSelectValuena calculadora para inserir valor diretamente no campo de lançamento - Aba "Changelog" em Ajustes com histórico de versões parseado do CHANGELOG.md
Alterado
- Unificadas páginas de itens ativos e arquivados em Cartões, Contas e Anotações com sistema de tabs (padrão Categorias)
- Removidas rotas separadas
/cartoes/inativos,/contas/inativose/anotacoes/arquivadas - Removidos sub-links de inativos/arquivados da sidebar
- Padronizada nomenclatura para "Arquivados"/"Arquivadas" em todas as entidades
[1.3.0] - 2026-02-06
Adicionado
- Indexes compostos em
lancamentos:(userId, period, transactionType)e(pagadorId, period) - Cache cross-request no dashboard via
unstable_cachecom tag"dashboard"e TTL de 120s - Invalidação automática do cache do dashboard via
revalidateTag("dashboard")em mutations financeiras - Helper
getAdminPagadorId()comReact.cache()para lookup cacheado do admin pagador
Alterado
- Eliminados ~20 JOINs com tabela
pagadoresnos fetchers do dashboard (substituídos por filtro direto compagadorId) - Consolidadas queries de income-expense-balance: 12 queries → 1 (GROUP BY period + transactionType)
- Consolidadas queries de payment-status: 2 queries → 1 (GROUP BY transactionType)
- Consolidadas queries de expenses/income-by-category: 4 queries → 2 (GROUP BY categoriaId + period)
- Scan de métricas limitado a 24 meses ao invés de histórico completo
- Auth session deduplicada por request via
React.cache() - Widgets de dashboard ajustados para aceitar
Date | string(compatibilidade com serialização dounstable_cache) CLAUDE.mdotimizado de ~1339 linhas para ~140 linhas
[1.2.6] - 2025-02-04
Alterado
- Refatoração para otimização do React 19 compiler
- Removidos
useCallbackeuseMemodesnecessários (~60 instâncias) - Removidos
React.memowrappers desnecessários - Simplificados padrões de hidratação com
useSyncExternalStore
Arquivos modificados
hooks/use-calculator-state.tshooks/use-form-state.tshooks/use-month-period.tscomponents/auth/signup-form.tsxcomponents/contas/accounts-page.tsxcomponents/contas/transfer-dialog.tsxcomponents/lancamentos/table/lancamentos-filters.tsxcomponents/sidebar/nav-main.tsxcomponents/month-picker/nav-button.tsxcomponents/month-picker/return-button.tsxcomponents/privacy-provider.tsxcomponents/dashboard/category-history-widget.tsxcomponents/anotacoes/note-dialog.tsxcomponents/categorias/category-dialog.tsxcomponents/confirm-action-dialog.tsxcomponents/orcamentos/budget-dialog.tsx
[1.2.5] - 2025-02-01
Adicionado
- Widget de pagadores no dashboard
- Avatares atualizados para pagadores
[1.2.4] - 2025-01-22
Corrigido
- Preservar formatação nas anotações
- Layout do card de anotações
[1.2.3] - 2025-01-22
Adicionado
- Versão exibida na sidebar
- Documentação atualizada
[1.2.2] - 2025-01-22
Alterado
- Atualização de dependências
- Aplicada formatação no código