OpenChart
Free Desktop charting with Claude or Codex. Describe alerts, research chart moves, and choose your data providers.
PWA para controlar os gastos do mês por categoria e cartão de crédito
Translation pending
FinanceHTML · JavaScriptGitHub @mmagcOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗PWA (Progressive Web App) simples para controlar os gastos do mês, separados por categoria e por cartão de crédito / conta. O número principal da tela mostra o total a pagar somando todos os cartões e contas, e logo abaixo um gráfico mostra onde e como o dinheiro foi gasto.
🔗 Acesse: https://mmagc.github.io/gastos-do-mes/
| Recurso | Descrição |
|---|---|
| Saldo total | Mostra quanto você tem a pagar no mês, somando todos os cartões/contas. |
| Saldo por cartão | Logo abaixo do total, um "chip" para cada cartão/conta com o valor dele no mês. |
| Gastos (+) | Cada gasto é somado ao total. Ex.: comprou uma camiseta de R$ 100 no cartão X → o saldo vai de R$ 0 para R$ 100. |
| Pagamentos / estornos (−) | São subtraídos do total (ex.: um estorno, ou um pagamento parcial da fatura). |
| Compras parceladas | Ao lançar um gasto, escolha de 1x a 48x. O app cria uma parcela em cada mês (mesmo dia; se o mês for mais curto, usa o último dia) e mostra a prévia antes de salvar, ex.: "10x de R$ 350,00". Dá para digitar o total da compra ou o valor de cada parcela. |
| Assinaturas | Cadastre cobranças mensais (streaming, academia, celular…) com valor, dia, cartão e categoria. O app lança sozinho a cobrança de cada mês, e dá para pausar, editar ou excluir. |
| Fechamento da fatura | Cada cartão pode ter um dia de fechamento. Cada compra entra automaticamente na fatura certa (parcelas e assinaturas também), e a tela de cartões mostra o período da fatura atual. |
| Gráfico | Gráfico de rosca + barras com a divisão dos gastos por categoria ou por cartão (alternável), com valor e porcentagem. |
| Navegação por mês | Setas no topo para ver meses anteriores/futuros; cada mês tem seu próprio total. |
| Editar / excluir | Cada lançamento tem um botão de lápis (editar) e de lixeira (excluir). Na tela de edição também há o botão Excluir. |
| Lista com "Mostrar mais" | A lista mostra os 5 lançamentos mais recentes do mês. Mostrar mais expande e abre um filtro de período (de um mês até outro, ou atalhos: este mês, últimos 3 ou 6 meses, este ano), com os lançamentos agrupados por mês e o total do período. |
| Cartões e categorias personalizáveis | Adicione, remova, renomeie e troque a cor de cada cartão/conta e categoria a qualquer momento. |
| Extrato em PDF | Exportar gera um extrato em PDF (do mês ou de todos os meses, de todas as categorias ou de uma categoria só) com resumo por cartão, por categoria e a lista de lançamentos. Importar lê esse PDF de volta e restaura os lançamentos. |
| Funciona offline | Graças ao service worker, o app abre mesmo sem internet. |
| Instalável | Pode ser instalado na tela inicial do celular ou no computador como um app. |
| Tema claro/escuro | Em Configurações → Tema: Automático (segue o sistema), Claro ou Escuro. A escolha fica salva no aparelho. |
Clique no ícone de instalação que aparece na barra de endereço (à direita) ou no menu → Instalar Gastos do Mês.
100, 100,50 ou 1.250,90), a data, o cartão/conta e a categoria.PDFs normais não guardam os dados de forma estruturada. Por isso, ao gerar o extrato, o app também embute os lançamentos nos metadados do próprio PDF (campo Keywords, no formato GASTOS1:<dados em base64>). Esses dados não aparecem na página, mas viajam junto com o arquivo — e é isso que o Importar lê.
Consequências:
.json também continuam sendo aceitos no Importar.10x).10x de R$ 350,00 = R$ 3.500,00 · de out/2026 a jul/2027) e salve.Em Configurações → Assinaturas → + Nova assinatura, informe nome, valor por mês, dia da cobrança, cartão, categoria e o mês em que começou.
Em Configurações → Cartões, cada cartão tem um campo Fecha dia N (ou Sem fechamento para conta corrente/débito). Também dá para escolher ao adicionar um cartão novo.
Compras feitas no dia do fechamento ou depois entram na próxima fatura.
A fatura leva o nome do mês em que fica a maior parte do período de compras dela:
| Fechamento | Período de compras | Fatura de |
|---|---|---|
| Dia 22 (fecha 22/10) | 22/09 a 21/10 | outubro (mês do fechamento) |
| Dia 3 (fecha 03/11) | 03/10 a 02/11 | outubro (mês anterior ao fechamento) |
Regra: fechamento até o dia 15 → a fatura conta como do mês anterior ao fechamento; do dia 16 em diante → do próprio mês do fechamento.
Exemplo: comprando em 24/10, no cartão que fecha dia 22 a compra vai para novembro; no cartão que fecha dia 3 ela fica em outubro.
Na tela de cartões, abaixo de cada um aparece o período da fatura atual (ex.: "Fatura atual (outubro): compras de 03/10 a 02/11"). Se no seu banco a compra do próprio dia de fechamento ainda entra na fatura atual, escolha o dia seguinte como fechamento.
Ao lançar, o app avisa: "Entra na fatura de outubro do Cartão 2 (compras de 03/10 a 02/11)", e depois de salvar já mostra aquele mês.
O "mês" do app, para cartões com fechamento, é o mês da fatura — o total do topo é o valor daquela fatura. A lista continua mostrando a data real da compra.
Ao configurar ou mudar o fechamento de um cartão, as compras dele do mês passado em diante são recalculadas; faturas mais antigas ficam como estão.
Se o fechamento for num dia que o mês não tem (ex.: 30 em fevereiro), vale o último dia do mês.
Total do mês = soma dos gastos − soma dos pagamentos/estornos
O gráfico considera apenas os gastos (o que entrou na fatura), para mostrar a distribuição real do consumo.
Todos os dados ficam salvos apenas no seu navegador/aparelho (localStorage). Nada é enviado para servidor nenhum.
Consequências importantes:
gastos-do-mes/
├── index.html # O app inteiro: HTML, CSS e JavaScript (sem dependências)
├── manifest.json # Manifesto do PWA (nome, ícones, cores, modo standalone)
├── sw.js # Service worker: cache para funcionar offline
└── icons/
├── icon.svg # Ícone vetorial (favicon)
├── icon-192.png # Ícone para Android/iOS
└── icon-512.png # Ícone grande / maskable
Não há build nem framework. O gráfico é desenhado em SVG puro. A única dependência externa é o jsPDF 2.5.1 + jsPDF-AutoTable 3.8.2 (via cdnjs), carregados só quando você toca em Exportar. Depois do primeiro uso ficam em cache e funcionam offline.
localStorage, chave gastos-mes-v1){
"cards": [{ "id": "abc123", "name": "Nubank", "color": "#8b5cf6" }],
"cats": [{ "id": "def456", "name": "Roupas", "color": "#f59e0b" }],
"tx": [
{
"id": "x1y2z3",
"created": 1761273600000,
"desc": "Camiseta",
"amount": 100,
"date": "2026-10-23",
"type": "gasto",
"card": "abc123",
"cat": "def456"
}
],
"lastCard": "abc123"
}
type: "gasto" (soma) ou "pagamento" (subtrai).bill: mês da fatura (AAAA-MM) em que o lançamento entra, calculado pelo dia de fechamento do cartão. Lançamentos antigos sem bill usam o mês da data.sub (só em cobranças de assinatura): id da assinatura que gerou o lançamento.inst (só em parcelas): { "id": "<id da compra>", "n": 2, "of": 10 } — parcela 2 de 10. Cada parcela é um lançamento próprio, no seu mês.date: formato AAAA-MM-DD; é usada para separar os lançamentos por mês.Service workers só funcionam em https:// ou em localhost, então abra via um servidor local (abrir o index.html direto pelo explorador de arquivos não ativa o modo offline).
Com Node.js:
npx http-server -p 5173 -c-1
Ou com Python:
python -m http.server 5173
Depois acesse http://localhost:5173.
O site é publicado pelo GitHub Pages a partir da branch main (pasta raiz). Qualquer push para a main atualiza o site em cerca de 1 minuto.
Importante ao atualizar o app: o service worker usa a estratégia rede primeiro, então os usuários recebem a versão nova assim que abrem o app com internet. Mesmo assim, ao mudar a lista de arquivos ou fazer mudanças grandes, aumente a versão em
sw.js(const CACHE = 'gastos-v2') para descartar o cache antigo.
Projeto pessoal, livre para uso e modificação.