Análise da Stack

Card Tracker

Um pequeno dashboard financeiro full-stack construído com Next.js. Ele lê faturas de cartão de crédito em arquivos CSV, classifica estabelecimentos em categorias, expõe rotas de API no servidor e renderiza gráficos e tabelas em um cliente React.

Stack principal

O que é usado neste projeto e qual papel cada peça desempenha.

Framework

Next.js 15 com App Router

Next.js é o framework principal. Ele cuida de rotas, renderização no servidor, endpoints de API e do processo de build. O projeto usa a pasta app/ , ou seja, segue o modelo mais novo de App Router em vez do router legado baseado em pages/ .

Camada de UI

React 19

React sustenta o dashboard interativo. O painel principal é um componente cliente, então gráficos, filtros, atribuição de categoria, estado local e chamadas de busca rodam no navegador depois que a aplicação carrega.

Linguagem

JavaScript puro

O código é escrito em JavaScript, não em TypeScript. Não existem arquivos de tipos nem configuração de TS, então o projeto fica mais leve, mas abre mão de checagem estática.

Gráficos

Recharts

Recharts é usado para a camada visual de relatórios. Ele dirige os gráficos de pizza e linha do dashboard e se encaixa naturalmente na árvore de componentes React.

Persistência

CSV, JSON e Upstash Redis opcional

Os dados de transação vêm de arquivos CSV mensais. As regras de categorização são semeadas em arquivos JSON. Em desenvolvimento local, as alterações podem ser persistidas em JSON; em deploy, o projeto pode usar Upstash Redis.

Runtime

Runtime Node.js no servidor

O código do servidor usa APIs do Node como node:fs, node:path, e node:crypto. Isso significa que não é um site puramente estático: ele precisa de um runtime Node para ler arquivos, processar dados e atender requisições autenticadas.

Como roda

A história de runtime, da requisição no navegador ao dashboard renderizado.

1

Next.js inicia a aplicação

O projeto roda com next dev localmente e next build mais next start em produção. A rota principal vive em app/page.js.

2

O servidor valida a autenticação

Antes de mostrar o dashboard, o servidor verifica cookies e senhas baseadas em ambiente em lib/auth.js. Se o usuário não estiver autenticado, a aplicação renderiza uma tela de senha no lugar do painel.

3

O dashboard no navegador busca dados nas rotas de API

Depois do login, o componente de dashboard no navegador chama /api/months, /api/data/[month]e /api/categories. Esses handlers rodam no servidor e retornam JSON.

4

O servidor lê CSVs e regras de categoria

O servidor carrega arquivos de fatura da pasta do perfil selecionado, parseia as linhas CSV, normaliza nomes de estabelecimentos, aplica regras de categorização e devolve os dados preparados para a interface.

5

React renderiza gráficos e visões de transações

O componente cliente mantém meses carregados em estado local, calcula totais, filtra categorias, ordena transações e alimenta visualizações do Recharts e tabelas customizadas.

Mapa da arquitetura

O projeto é compacto, mas ainda assim possui uma divisão de responsabilidades bastante clara.

Pastas principais
app/Pontos de entrada de rotas, layout, CSS global e route handlers de API.
components/Componentes de UI em React, incluindo o dashboard interativo e a tela de senha.
lib/Lógica central de auth, perfis, parsing de CSV, normalização e armazenamento de regras.
statements/Arquivos CSV mensais de fatura do perfil principal.
statements-demo/Dataset demo usado para exibir a aplicação sem expor dados reais.
Análise da Arquitetura
package.json
next.config.mjs

app/page.js
app/api/months/route.js
app/api/data/[month]/route.js
app/api/categories/route.js

components/dashboard-client.js

lib/auth.js
lib/profiles.js
lib/statements.js
lib/rules-store.js
lib/normalize.js

Esta é uma estrutura típica de Next.js full-stack pequeno: rotas em app/, UI em components/, e lógica de servidor reaproveitável em lib/.

Dados e armazenamento

Este app é orientado por arquivos, com Redis como ajudante opcional de deploy.

Modelo principal

Arquivos locais são a fonte de verdade

Transações vivem em arquivos CSV mensais como 2026-04.csv.

Regras de categoria ficam em arquivos JSON como categories.json.

O servidor lê esses arquivos diretamente usando as APIs de filesystem do Node.

Isso deixa o projeto simples de entender e fácil de rodar localmente.

Camada cloud opcional

Upstash Redis só é usado para regras persistidas

O projeto inclui @upstash/redis como dependência.

Se as credenciais Redis existirem, regras salvas vão para um hash no Redis.

Sem Redis, o desenvolvimento local volta para arquivos JSON.

Os extratos em si continuam baseados em arquivo, não em banco de dados.

Autenticação e perfis

Um sistema de autenticação leve e próprio, em vez de um provider externo.

Autenticação

Senha + cookies

O app gera um hash da senha específica do perfil e o grava em um cookie HTTP-only. A cada requisição, o servidor verifica se esse cookie bate com a senha configurada nas variáveis de ambiente. É muito mais simples que OAuth ou um banco de usuários, e cabe bem em uma ferramenta pessoal.

Perfis

Múltiplos perfis de dados embutidos

lib/profiles.js define perfis separados para a conta principal, uma conta secundária e um modo demo. Cada perfil tem seu próprio diretório de extratos, arquivo de categorias, chave Redis e variável de ambiente para senha.

Comandos para rodar

Os comandos práticos que fazem o projeto rodar.

Scripts do package.json
npm install
npm run dev

npm run build
npm start

O script dev limpa a pasta .next e inicia o servidor de desenvolvimento. Build e start são os comandos normais de produção em Next.js.

Ambiente esperado

O que o app precisa

DASHBOARD_PASSWORD_[NOMEDOPERFIL] para perfis protegidos.

UPSTASH_REDIS_REST_URL e UPSTASH_REDIS_REST_TOKEN apenas se a persistência com Redis for desejada.

Arquivos CSV de extrato disponíveis nos diretórios de perfil esperados.

Resumo final

Card Tracker é uma pequena aplicação full-stack em Next.js, não apenas um site frontend. Ela usa React para a UI, Node.js no servidor, JavaScript em vez de TypeScript, arquivos CSV e JSON como camada de dados principal e Upstash Redis apenas como camada opcional de persistência para regras. A arquitetura é simples e prática: dados em arquivo, autenticação própria, rotas de API e um dashboard no navegador com gráficos.