{"id":47966991,"url":"https://github.com/felipegcoutinho/openmonetis","last_synced_at":"2026-05-03T00:02:34.601Z","repository":{"id":324472401,"uuid":"1097085383","full_name":"felipegcoutinho/openmonetis","owner":"felipegcoutinho","description":"Controle financeiro self-hosted com captura automática de notificações bancárias. Lançamentos, cartões, faturas e orçamentos — na sua infra, sem dependência de terceiros.","archived":false,"fork":false,"pushed_at":"2026-04-27T00:14:49.000Z","size":37632,"stargazers_count":238,"open_issues_count":1,"forks_count":79,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-04-27T02:34:36.090Z","etag":null,"topics":["better-auth","drizzle-orm","financas-pessoais","finance-tracker","financeiro","nextjs","open-source","postgresql","self-hosted","shadcn-ui","tailwindcss","typescript"],"latest_commit_sha":null,"homepage":"https://openmonetis.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/felipegcoutinho.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-15T14:10:53.000Z","updated_at":"2026-04-27T00:14:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"e1d52690-cf8b-42a0-848e-7170903090d1","html_url":"https://github.com/felipegcoutinho/openmonetis","commit_stats":null,"previous_names":["felipegcoutinho/opensheets-app","felipegcoutinho/openmonetis"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/felipegcoutinho/openmonetis","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipegcoutinho%2Fopenmonetis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipegcoutinho%2Fopenmonetis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipegcoutinho%2Fopenmonetis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipegcoutinho%2Fopenmonetis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/felipegcoutinho","download_url":"https://codeload.github.com/felipegcoutinho/openmonetis/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felipegcoutinho%2Fopenmonetis/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32553690,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-02T22:28:24.418Z","status":"ssl_error","status_checked_at":"2026-05-02T22:28:14.225Z","response_time":132,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["better-auth","drizzle-orm","financas-pessoais","finance-tracker","financeiro","nextjs","open-source","postgresql","self-hosted","shadcn-ui","tailwindcss","typescript"],"created_at":"2026-04-04T10:36:31.302Z","updated_at":"2026-05-03T00:02:34.589Z","avatar_url":"https://github.com/felipegcoutinho.png","language":"TypeScript","funding_links":["https://github.com/sponsors/felipegcoutinho"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./public/images/logo_small.svg\" alt=\"OpenMonetis Logo\" height=\"80\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Projeto pessoal de gestão financeira. Self-hosted, manual e open source.\n\u003c/p\u003e\n\n\u003e **⚠️ Não há versão online hospedada.** Você precisa clonar o repositório e rodar localmente ou no seu próprio servidor.\n\n[![Version](https://img.shields.io/badge/version-2.5.0-blue?style=flat-square)](CHANGELOG.md)\n[![Next.js](https://img.shields.io/badge/Next.js-black?style=flat-square\u0026logo=next.js)](https://nextjs.org/)\n[![TypeScript](https://img.shields.io/badge/TypeScript-blue?style=flat-square\u0026logo=typescript)](https://www.typescriptlang.org/)\n[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-blue?style=flat-square\u0026logo=postgresql)](https://www.postgresql.org/)\n[![Docker](https://img.shields.io/badge/Docker-Ready-blue?style=flat-square\u0026logo=docker)](https://www.docker.com/)\n[![Android Companion](https://img.shields.io/badge/Companion-Android-3DDC84?style=flat-square\u0026logo=android)](https://github.com/felipegcoutinho/openmonetis-companion)\n[![License](https://img.shields.io/badge/License-CC_BY--NC--SA_4.0-orange?style=flat-square\u0026logo=creative-commons)](LICENSE)\n[![Sponsor](https://img.shields.io/badge/Sponsor-❤️-ea4aaa?style=flat-square\u0026logo=github-sponsors)](https://github.com/sponsors/felipegcoutinho)\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./public/images/dashboard-preview-light.png\" alt=\"Dashboard Preview\" width=\"800\" /\u003e\n\u003c/p\u003e\n\n---\n\n## 📖 Índice\n\n- [Sobre o Projeto](#-sobre-o-projeto)\n- [Como rodar o OpenMonetis](#-como-rodar-o-openmonetis)\n  - [Perfil 1 — Usar](#perfil-1--usar-self-hosting)\n  - [Perfil 2 — Desenvolver](#perfil-2--desenvolver)\n- [Scripts Disponíveis](#-scripts-disponíveis)\n- [Docker](#-docker)\n- [Backup](#-backup)\n- [Storage S3 Compatível](#-storage-s3-compatível)\n- [Variáveis de Ambiente](#-variáveis-de-ambiente)\n- [Arquitetura](#-arquitetura)\n- [Contribuindo](#-contribuindo)\n- [Apoie o Projeto](#-apoie-o-projeto)\n- [Licença](#-licença)\n\n---\n\n## 🎯 Sobre o Projeto\n\n**OpenMonetis** é um projeto pessoal de gestão financeira que criei para organizar minhas próprias finanças. Cansei de usar planilhas desorganizadas e aplicativos que não fazem exatamente o que preciso, então decidi construir algo do jeito que funciona pra mim.\n\nA ideia é simples: ter um lugar onde consigo ver todas as minhas contas, cartões, gastos e receitas de forma clara. Se isso for útil pra você também, fique à vontade para usar e contribuir.\n\n\u003e 💡 **Licença Não-Comercial:** Este projeto é gratuito para uso pessoal, mas não pode ser usado comercialmente. Veja mais detalhes na seção [Licença](#-licença).\n\n### ⚠️ Avisos importantes\n\n**1. Não há versão hospedada online** — Este projeto é self-hosted. Você precisa rodar no seu próprio computador ou servidor.\n\n**2. Não há Open Finance** — Não há conexão automática com bancos. Você pode registrar transações manualmente, usar o app companion para capturar notificações bancárias ou importar extratos nos formatos OFX e XLS/XLSX.\n\n**3. Requer disciplina** — O OpenMonetis funciona melhor para quem tem disciplina de registrar os gastos regularmente, quer controle total sobre seus dados e gosta de entender exatamente onde o dinheiro está indo.\n\n### Funcionalidades\n\n💰 **Contas e transações** — Contas bancárias, cartões, dinheiro. Receitas, despesas e transferências. Categorização, extratos detalhados e importação de extratos OFX e XLS/XLSX com detecção automática de categoria.\n\n📊 **Dashboard e relatórios** — Widgets interativos de métricas, gráficos de evolução, comparativos por categoria, tendências, uso de cartões, top estabelecimentos. Exportação em PDF e Excel.\n\n💳 **Faturas de cartão** — Acompanhe faturas por período, controle limites e vencimentos.\n\n🎯 **Orçamentos** — Defina limites por categoria e acompanhe o progresso.\n\n💸 **Parcelamentos avançados** — Séries de parcelas, antecipação com cálculo de desconto, análise consolidada.\n\n🤖 **Insights com IA** — Análises geradas por Claude, GPT, Gemini ou OpenRouter. Insights personalizados e histórico salvo.\n\n👥 **Gestão colaborativa** — Pagadores com permissões (admin/viewer), notificações automáticas por e-mail, códigos de compartilhamento.\n\n📝 **Anotações e tarefas** — Notas de texto, listas com checkboxes, sistema de arquivamento.\n\n📅 **Calendário financeiro** — Visualize todos os lançamentos em um calendário mensal.\n\n📲 **OpenMonetis Companion** — App Android que captura notificações bancárias (Nubank, Itaú, Bradesco, Inter, C6 e outros) e envia automaticamente como pré-lançamentos para revisão — sem digitar nada. [Repositório](https://github.com/felipegcoutinho/openmonetis-companion).\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./public/images/companion-preview-light.webp\" alt=\"OpenMonetis Companion\" width=\"300\" height=\"600\" /\u003e\n\u003c/p\u003e\n\n⚙️ **Personalização** — Tema dark/light e modo privacidade.\n\n### Stack técnica\n\n- **Next.js** (App Router, Turbopack) + **React** + **TypeScript**\n- **PostgreSQL** + **Drizzle ORM**\n- **Better Auth** (email/senha, OAuth, Passkeys/WebAuthn)\n- **shadcn/ui** (Radix UI) + **Tailwind CSS**\n- **Docker** (multi-stage build)\n- **Biome** (linting + formatting)\n- **Vercel AI SDK** (Claude, GPT, Gemini, OpenRouter)\n\n---\n\n## 🚀 Como rodar o OpenMonetis\n\nEscolha o perfil que corresponde ao seu objetivo:\n\n| | Perfil 1 — Usar | Perfil 2 — Desenvolver |\n|---|---|---|\n| **Objetivo** | Rodar o app pronto | Modificar o código |\n| **Clonar repositório** | Não | Sim |\n| **Node.js / pnpm** | Não | Sim (Node 22+) |\n| **Docker** | Sim | Sim |\n| **Como iniciar** | `docker compose up -d` | `pnpm docker:db` + `pnpm dev` |\n| **App roda em** | Container Docker | Host local (hot-reload) |\n| **Banco roda em** | Container Docker | Container Docker |\n| **`DATABASE_URL` (host)** | `db` (automático pelo compose) | `localhost` |\n| **Banco remoto (Supabase, Neon...)** | Sim (`docker compose up -d app`) | Sim (ajustar `DATABASE_URL`) |\n| **Como atualizar** | `pnpm docker:update` | `git pull` + `pnpm install` + `pnpm db:push` |\n| **Indicado para** | Self-hosting, VPS, servidor | Contribuidores, customizações |\n\n---\n\n### Perfil 1 — Usar (self-hosting)\n\nSó quer rodar o OpenMonetis. **Não precisa clonar o repositório nem instalar Node.js** — apenas Docker.\n\n```bash\n# 1. Baixe o compose\ncurl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/docker-compose.yml -o docker-compose.yml\n\n# 2. Suba tudo\ndocker compose up -d\n```\n\nAcesse em: `http://localhost:3000`\n\nO banco sobe com credenciais padrão. Para personalizar (senha, Google OAuth, e-mail, IA...), crie um `.env` na mesma pasta **antes** de subir:\n\n```bash\n# .env mínimo recomendado para produção\nBETTER_AUTH_SECRET=gere-um-valor-com-openssl-rand-base64-32\nBETTER_AUTH_URL=https://seu-dominio.com\n```\n\nVeja todas as variáveis disponíveis em [Variáveis de Ambiente](#-variáveis-de-ambiente).\n\n**Banco remoto (Supabase, Neon, Railway...):** defina `DATABASE_URL` no `.env` e suba só o app:\n\n```bash\ndocker compose up -d app\n```\n\n**Não tem Docker instalado?** Em servidores Ubuntu 24.04 limpos, use o script de instalação:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/scripts/install-deps.sh -o install-deps.sh\nsudo sh install-deps.sh\n```\n\n\u003e Ao final, faça **logout e login** para as permissões do grupo `docker` terem efeito.\n\n#### Atualizando (Perfil 1)\n\n```bash\npnpm docker:update\n# ou equivalente:\ndocker compose pull \u0026\u0026 docker compose up -d\n```\n\nO schema do banco é aplicado automaticamente no startup — nenhum passo extra necessário.\n\n---\n\n### Perfil 2 — Desenvolver\n\nQuer modificar o código com hot-reload. O banco roda no Docker, o app roda direto no seu servidor.\n\n**Requisitos:** Docker + Node.js 22+ + pnpm\n\n```bash\n# 1. Clone o repositório\ngit clone https://github.com/felipegcoutinho/openmonetis.git\ncd openmonetis\n\n# 2. Instale as dependências\npnpm install\n\n# 3. Configure o ambiente\ncp .env.example .env\n# O DATABASE_URL já vem com host \"localhost\" (correto para dev local).\n# Edite o .env com suas configurações (BETTER_AUTH_SECRET, etc.)\n\n# 4. Suba o banco\npnpm docker:db\n\n# 5. Aplique o schema no banco (apenas no primeiro setup)\npnpm db:push\n\n# 6. Inicie o app com hot-reload\npnpm dev\n```\n\nAcesse em: `http://localhost:3000`\n\nToda vez que salvar um arquivo, o app atualiza automaticamente sem precisar reiniciar.\n\n#### Atualizando (Perfil 2)\n\n```bash\ngit pull\npnpm install        # instala dependências novas, se houver\npnpm db:push        # aplica mudanças de schema, se houver\n```\n\nO `pnpm dev` já em execução detecta as mudanças de código automaticamente — não precisa reiniciar.\n\n---\n\n## 📜 Scripts Disponíveis\n\n### Desenvolvimento\n\n```bash\npnpm dev              # Dev server (Turbopack)\npnpm build            # Build de produção\npnpm start            # Servidor de produção\npnpm lint             # Biome check\npnpm lint:fix         # Biome auto-fix\n```\n\n### Banco de Dados\n\n```bash\npnpm db:generate      # Gerar migrations\npnpm db:migrate       # Executar migrations\npnpm db:push          # Push schema direto (dev)\npnpm db:studio        # Drizzle Studio (UI visual)\n```\n\n### Utilitários\n\n```bash\npnpm backup           # Backup completo do banco (ver seção Backup)\n```\n\n### Docker\n\n```bash\npnpm docker:up      # Sobe app (Docker Hub) + banco em background\npnpm docker:db      # Sobe apenas o banco em background (usar com pnpm dev)\npnpm docker:down    # Para e remove os containers\npnpm docker:logs    # Logs em tempo real (todos os containers)\npnpm docker:update  # Atualiza para a imagem mais recente do Hub e reinicia\n```\n\n---\n\n## 🐳 Docker\n\nO `Dockerfile` usa multi-stage build (deps → builder → runner) com imagem final ~200MB rodando como usuário não-root. Health checks configurados para ambos os serviços (PostgreSQL via `pg_isready`, app via `GET /api/health`).\n\n### Self-hosting (recomendado)\n\nBaixe apenas o `docker-compose.yml` e suba tudo — sem clonar o repositório, sem instalar dependências:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/felipegcoutinho/openmonetis/main/docker-compose.yml -o docker-compose.yml\ndocker compose up -d\n```\n\nAs credenciais padrão do banco já estão configuradas. Para personalizar (senhas, opcionais), crie um `.env` na mesma pasta antes de subir — veja [Variáveis de Ambiente](#-variáveis-de-ambiente).\n\n### Banco remoto (Supabase, Neon, Railway...)\n\nSuba apenas o app e aponte para o banco externo via `DATABASE_URL` no `.env`:\n\n```bash\ndocker compose up -d app\n```\n\n### Comandos úteis\n\n```bash\ndocker compose exec app sh                                       # Shell da aplicação\ndocker compose exec db psql -U openmonetis -d openmonetis_db    # Shell do banco\ndocker compose ps                                                # Status\npnpm backup                                                      # Backup (ver seção Backup)\n```\n\n### Customizando portas\n\n```env\nAPP_PORT=3001   # Padrão: 3000\nDB_PORT=5433    # Padrão: 5432\n```\n\n---\n\n## 💾 Backup\n\nO backup é uma rotina de infraestrutura — não é uma tela no app. Ele opera diretamente sobre o banco PostgreSQL e é executado via linha de comando.\n\n```bash\npnpm backup\n```\n\n### O que é salvo\n\nCada execução gera **3 arquivos** em `backup/`:\n\n| Arquivo | Conteúdo | Uso |\n|---|---|---|\n| `openmonetis_YYYY-MM-DD_HH-MM.dump` | Dump custom dos schemas `public` + `drizzle` | Restore completo via `pg_restore` |\n| `openmonetis_YYYY-MM-DD_HH-MM.sql.gz` | Dump SQL compactado dos schemas `public` + `drizzle` | Inspeção manual, portabilidade |\n| `openmonetis_YYYY-MM-DD_HH-MM.data.sql.gz` | Apenas os dados do schema `public` (sem DDL) | Migração parcial, seed de outro ambiente |\n\n### Modos de conexão\n\nConfigure `DB_MODE` no topo de `scripts/backup.sh`:\n\n| Modo | Quando usar | Fonte de dados |\n|---|---|---|\n| `remote` (padrão) | Banco em Supabase, Neon, Railway, etc. | `DATABASE_URL` do `.env` |\n| `docker` | Banco no container local | Container `openmonetis_postgres` |\n\n### Upload para Google Drive (opcional)\n\nSe o [rclone](https://rclone.org/) estiver instalado e configurado com um remote chamado `gdrive`, os arquivos são enviados automaticamente para `gdrive:BACKUP OPENMONETIS`. Sem o rclone, o backup funciona normalmente e fica apenas local.\n\n**Retenção:**\n- Local: 7 dias\n- Google Drive: 30 dias\n\n### Automatizar com cron\n\nPara rodar o backup automaticamente todo dia às 3h:\n\n```bash\ncrontab -e\n```\n\n```cron\n0 3 * * * cd /caminho/para/openmonetis \u0026\u0026 pnpm backup \u003e\u003e /var/log/openmonetis-backup.log 2\u003e\u00261\n```\n\n### Restore\n\n```bash\n# 1. Zerar o banco\ndocker exec \u003ccontainer-db\u003e psql -U openmonetis -d openmonetis_db \\\n  -c \"DROP SCHEMA public CASCADE; CREATE SCHEMA public;\"\n\n# 2. Restaurar schema + dados (um comando)\ndocker exec -i \u003ccontainer-db\u003e pg_restore \\\n  -U openmonetis -d openmonetis_db \\\n  --clean --if-exists --disable-triggers --no-owner --no-privileges \\\n  \u003c backup/openmonetis_YYYY-MM-DD_HH-MM.dump\n```\n\n\u003e `--disable-triggers` é necessário para evitar erros de FK durante o restore (os dados são inseridos fora de ordem). O usuário `openmonetis` tem permissão para isso.\n\n---\n\n## ☁️ Storage S3 Compatível\n\nO suporte a anexos de lançamentos usa upload direto com URL pré-assinada. Essa configuração é opcional, mas passa a ser necessária se você quiser habilitar anexos no app.\n\n### Variáveis\n\n```env\nS3_ENDPOINT=\nS3_REGION=\nS3_ACCESS_KEY_ID=\nS3_SECRET_ACCESS_KEY=\nS3_BUCKET=\n```\n\n### Compatibilidade\n\n- O código atual espera um provider com API compatível com S3 e suporte a `PutObject`, `GetObject`, `HeadObject`, `DeleteObject` e URLs pré-assinadas.\n- A implementação usa `endpoint` customizado e `forcePathStyle: true` em [`src/shared/lib/storage/s3-client.ts`](./src/shared/lib/storage/s3-client.ts).\n- Em geral isso cobre MinIO, Cloudflare R2, Backblaze B2 S3-Compatible, DigitalOcean Spaces e AWS S3. Mas foi testado apenas no Supabase Storage.\n- Se o seu provider exigir `virtual-hosted-style` em vez de `path-style`, você vai precisar ajustar essa configuração antes de usar anexos.\n- Se as variáveis de S3 não forem configuradas, mantenha os anexos desabilitados no seu fluxo de uso.\n\n---\n\n## 🏷️ Logos de Estabelecimentos (Logo.dev)\n\nO app exibe logos automáticos de marcas na coluna de estabelecimentos nos lançamentos. A integração usa a [Logo.dev](https://www.logo.dev) e é opcional — sem ela, o app exibe as iniciais coloridas normalmente.\n\n### Variáveis\n\n```env\nLOGO_DEV_TOKEN=pk_...          # token público (obrigatório para exibir logos)\nLOGO_DEV_SECRET_KEY=sk_...     # chave secreta (obrigatório para o picker de busca)\n```\n\n\u003e **Atualizando da v2.4.1 ou anterior:** a variável foi renomeada de `NEXT_PUBLIC_LOGO_DEV_TOKEN` para `LOGO_DEV_TOKEN`. Renomeie no seu `.env` (ou nas variáveis do Coolify/host) e remova o secret homônimo do GitHub Actions — ele não é mais usado. Não há outra etapa de migração.\n\n### Como configurar\n\nAmbas as variáveis são lidas em **runtime** pelo servidor Next.js. Não há mais nenhuma etapa no CI nem `--build-arg` no Docker.\n\n**Self-hosted via Docker Hub (Coolify, Railway, etc.):**\n\n1. Adicione `LOGO_DEV_TOKEN` e `LOGO_DEV_SECRET_KEY` nas variáveis de ambiente do host\n2. Reinicie o container — pronto\n\n**Desenvolvimento local:**\n\nAdicione as duas no `.env` e rode `pnpm dev`.\n\n### Como usar\n\nApós configurado, passe o mouse sobre o avatar de qualquer estabelecimento nos lançamentos — um ícone de lápis aparece. Clique para abrir o picker, busque pelo nome da marca e selecione o logo desejado. O mapeamento fica salvo por usuário no banco.\n\n### Arquitetura\n\nO token **nunca chega ao cliente**. O servidor constrói a URL `https://img.logo.dev/{domain}?token=...` nos endpoints `/api/logo/mapping` e `/api/logo/search`, e o cliente apenas consome a URL pronta. Um Context Provider (`LogoDevProvider`) propaga a flag `enabled` para os componentes que decidem se renderizam o picker.\n\n---\n\n## 🔐 Variáveis de Ambiente\n\n**Perfil 2 (dev):** copie `.env.example` para `.env` — o `DATABASE_URL` já vem com `localhost`, pronto para uso com `pnpm dev`.\n\n**Perfil 1 (Docker):** não precisa definir `DATABASE_URL` — o compose já configura automaticamente com host `db`. Só defina se usar banco remoto (Supabase, Neon, etc.).\n\n### Obrigatórias\n\n```env\n# Perfil 2 (dev): host \"localhost\" — o banco roda em container, o app no host\n# Perfil 1 (Docker): não precisa definir — o compose usa \"db\" automaticamente\nDATABASE_URL=postgresql://openmonetis:openmonetis_dev_password@localhost:5432/openmonetis_db\nBETTER_AUTH_SECRET=seu-secret-aqui    # openssl rand -base64 32\nBETTER_AUTH_URL=http://localhost:3000\n```\n\n### Opcionais\n\n```env\n# PostgreSQL (Docker local)\nPOSTGRES_USER=openmonetis\nPOSTGRES_PASSWORD=openmonetis_dev_password\nPOSTGRES_DB=openmonetis_db\n\n# S3 Server (opcional, necessario para anexos)\nS3_ENDPOINT=\nS3_REGION=\nS3_ACCESS_KEY_ID=\nS3_SECRET_ACCESS_KEY=\nS3_BUCKET=\n\n# Multi-domínio (landing-only no domínio público)\n# PUBLIC_DOMAIN=openmonetis.com\n\n# OAuth\nGOOGLE_CLIENT_ID=\nGOOGLE_CLIENT_SECRET=\n\n# Email (Resend)\nRESEND_API_KEY=\nRESEND_FROM_EMAIL=\n\n# AI Providers\nANTHROPIC_API_KEY=\nOPENAI_API_KEY=\nGOOGLE_GENERATIVE_AI_API_KEY=\nOPENROUTER_API_KEY=\n\n# Logo.dev (opcional, necessário para logos automáticos de estabelecimentos)\n# Ambas as variáveis são runtime — basta definir no host; nenhum build arg necessário.\nLOGO_DEV_TOKEN=\nLOGO_DEV_SECRET_KEY=\n```\n\n---\n\n## 🏗️ Arquitetura\n\nO projeto segue arquitetura **feature-first** dentro de `src/`:\n\n```\nopenmonetis/\n├── src/\n│   ├── app/                       # Next.js App Router (rotas finas)\n│   │   ├── api/                   # API Routes (auth, health, inbox)\n│   │   ├── (auth)/                # Login e cadastro\n│   │   ├── (dashboard)/           # Rotas protegidas (transactions, cards, accounts, etc.)\n│   │   └── (landing-page)/        # Página inicial pública\n│   │\n│   ├── features/                  # Código de domínio por feature\n│   │   ├── dashboard/             # Widgets, queries e métricas\n│   │   ├── transactions/          # Lançamentos, ações em lote, exportação\n│   │   ├── cards/                 # Cartões de crédito\n│   │   ├── invoices/              # Faturas\n│   │   ├── accounts/              # Contas bancárias\n│   │   ├── categories/            # Categorias e histórico\n│   │   ├── budgets/               # Orçamentos\n│   │   ├── payers/                # Pagadores e compartilhamento\n│   │   ├── inbox/                 # Pré-lançamentos do Companion\n│   │   ├── insights/              # Análises com IA\n│   │   ├── reports/               # Relatórios e exportações\n│   │   ├── notes/                 # Anotações\n│   │   ├── calendar/              # Calendário financeiro\n│   │   ├── settings/              # Ajustes do usuário\n│   │   ├── landing/               # Landing page\n│   │   └── auth/                  # Formulários de autenticação\n│   │\n│   ├── shared/                    # Código reutilizado entre features\n│   │   ├── components/            # UI compartilhada (shadcn/ui, navigation, skeletons...)\n│   │   ├── hooks/                 # React hooks globais\n│   │   ├── lib/                   # Helpers de domínio (auth, db, payers, schemas, email...)\n│   │   └── utils/                 # Utilitários (currency, date, period, math, string...)\n│   │\n│   └── db/\n│       └── schema.ts              # Drizzle schema (fonte única de verdade)\n│\n├── public/                        # Assets estáticos (imagens, logos, fontes)\n├── drizzle/                       # Migrations geradas\n├── scripts/                       # Scripts utilitários (migrations, dev)\n├── Dockerfile                     # Multi-stage build (~200MB, non-root)\n├── docker-compose.yml             # Orquestração app + PostgreSQL\n└── proxy.ts                       # Middleware (auth + multi-domínio)\n```\n\n---\n\n## 🤝 Contribuindo\n\n1. **Fork** o projeto\n2. **Clone** seu fork: `git clone https://github.com/seu-usuario/openmonetis.git`\n3. **Crie uma branch:** `git checkout -b feature/minha-feature`\n4. **Commit:** `git commit -m 'feat: adiciona minha feature'`\n5. **Push:** `git push origin feature/minha-feature`\n6. Abra um **Pull Request**\n\nAntes de começar, leia o [`CLAUDE.md`](CLAUDE.md) — ele documenta a arquitetura, convenções de nomenclatura, regras de queries e o checklist para novas features. Use TypeScript, commits semânticos e mantenha o `CHANGELOG.md` atualizado.\n\n---\n\n## 💖 Apoie o Projeto\n\nSe o **OpenMonetis** está sendo útil, considere se tornar um sponsor!\n\n[![Sponsor no GitHub](https://img.shields.io/badge/Sponsor_no_GitHub-❤️-ea4aaa?style=for-the-badge\u0026logo=github-sponsors)](https://github.com/sponsors/felipegcoutinho)\n\nOutras formas de contribuir: ⭐ estrela no repo, reportar bugs, melhorar docs, submeter PRs.\n\n---\n\n## 📄 Licença\n\n**Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International** (CC BY-NC-SA 4.0).\n\n[![License: CC BY-NC-SA 4.0](https://img.shields.io/badge/License-CC_BY--NC--SA_4.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/)\n\n- ✅ Uso pessoal, modificação, distribuição e fork\n- ❌ Uso comercial, remoção de créditos, mudança de licença\n- 📋 Crédito ao autor, indicar modificações, mesma licença\n\nPara o texto legal completo, consulte o arquivo [LICENSE](LICENSE) ou visite [creativecommons.org](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.pt).\n\n---\n\n## 🙏 Agradecimentos\n\n[Next.js](https://nextjs.org/) · [Better Auth](https://better-auth.com/) · [Drizzle ORM](https://orm.drizzle.team/) · [shadcn/ui](https://ui.shadcn.com/) · [Biome](https://biomejs.dev/) · [Vercel](https://vercel.com/)\n\n---\n\n**Desenvolvido por:** Felipe Coutinho — [@felipegcoutinho](https://github.com/felipegcoutinho)\n\n\u003cdiv align=\"center\"\u003e\n\n**⭐ Se este projeto foi útil pra você:**\n\nDê uma estrela · [Apoie como sponsor](https://github.com/sponsors/felipegcoutinho) · Compartilhe\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffelipegcoutinho%2Fopenmonetis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffelipegcoutinho%2Fopenmonetis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffelipegcoutinho%2Fopenmonetis/lists"}