{
  "markdown": "# BestFin 🏦\n\nUm app de finanças pessoais focado em produtividade e automação, construído com Flutter e Nix.\n\n## Tecnologias\n\n- **Framework:** Flutter (Android, Linux, Web)\n- **Environment:** Nix Flake\n- **State Management:** Riverpod 3\n- **Local Database:** Drift (SQLite) com SQLCipher (criptografia em repouso)\n- **Design:** Material Design 3 Expressive\n- **Sync:** Nostr (NIP-78) — E2E AES-256-GCM, serverless, sem backend próprio\n\n## Sincronização entre Dispositivos\n\nO sync é serverless: os dados são cifrados com AES-256-GCM na chave mestra do usuário antes de serem publicados em relays [Nostr](https://github.com/nostr-protocol) públicos. Nenhum relay vê dados em texto claro.\n\nPara sincronizar em outro dispositivo, basta importar o mesmo mnemônico BIP39 de 24 palavras — não há conta nem servidor de autenticação.\n\n## Notificações de Nova Versão\n\nQuando uma nova versão é publicada, todos os dispositivos com o app instalado recebem uma notificação automática via Nostr. O mecanismo usa um keypair fixo do desenvolvedor (a chave pública está embutida no app); quando o relay entrega o evento, o app exibe um banner no topo da tela.\n\nPara publicar uma notificação de atualização após um release:\n\n```bash\nBESTFIN_DEV_NOSTR_PRIVKEY=<privkey> \\\n  nix develop -c dart run scripts/publish_update.dart \\\n    --version X.Y.Z \\\n    --changelog \"Descrição das mudanças\" \\\n    --download-url \"https://github.com/user/bestfin/releases/tag/vX.Y.Z\"\n```\n\n> A chave privada do desenvolvedor deve ser mantida como secret `BESTFIN_DEV_NOSTR_PRIVKEY` no CI e nunca commitada no repositório. A chave pública correspondente já está embutida em `lib/core/constants/app_info.dart`.\n\n## Pré-requisitos\n\n- [Nix](https://nixos.org/download.html) com flakes habilitados.\n\n## Setup do Ambiente\n\nO projeto utiliza um `flake.nix` que empacota o Flutter SDK, o Android SDK e todas as dependências nativas necessárias (pkg-config, gtk3, libepoxy, etc).\n\nPara entrar no ambiente de desenvolvimento:\n```bash\nnix develop\n```\n\nTodas as dependências e variáveis de ambiente (como `ANDROID_HOME`, `JAVA_HOME`, `PATH`) serão configuradas automaticamente.\n\n### Comandos Básicos\n\nRode dentro do `nix develop`:\n\n- **Baixar pacotes:** `flutter pub get`\n- **Gerar código (Riverpod/Drift):** `flutter pub run build_runner build --delete-conflicting-outputs`\n- **Rodar Linux:** `flutter run -d linux`\n- **Rodar Android:** `flutter run -d emulator-5554` (após iniciar o emulador Android)\n- **Rodar Web:** `flutter run -d chrome`\n\n## Interface de Terminal (TUI)\n\nO mesmo binário `bestfin` também roda inteiro no terminal, sem abrir janela\ngráfica — útil para lançar despesas rápido, consultar relatórios por SSH ou\ngerar backups em script.\n\n```bash\nbestfin tui                 # menu com todas as áreas do app (sync contínuo)\nbestfin tui metas           # abre direto numa área (aceita prefixo e sem acento)\nbestfin add \"mercado 50 no cartão\"   # lançamento por linguagem natural\nbestfin sync                # sincroniza uma vez e sai (para scripts/cron)\nbestfin --help              # lista as áreas e os atalhos\n```\n\nTodas as áreas da interface gráfica estão disponíveis: painel, transações\n(com sugestões do histórico, lote e split), contas (com reconciliação),\ncategorias, cartões, orçamentos, metas, parcelamentos, recorrências,\nfinanciamentos, investimentos, relatórios, projeção de caixa, conquistas,\nchat com o LLM local, importação de PDF, backup, sincronização (com QR de\npareamento no terminal), grupos familiares e configurações. Com a TUI\naberta o sincronismo é contínuo — mudanças dos outros dispositivos chegam\nem segundos e o que você grava é publicado automaticamente.\n\nNavegação: `↑↓`/`j k` movem, `↵` abre, `1`-`9` selecionam direto, `q` volta;\nos atalhos de cada tela aparecem no rodapé. As escritas passam pelos mesmos\nuse cases da GUI, então entram normalmente na fila de sincronização.\n\nOpções úteis: `--db <caminho>` aponta para outro `bestfin.sqlite`;\n`BESTFIN_TUI=0` força o modo não interativo em scripts.\n",
  "bytes": 3996,
  "sha": "54c0eabeca04baa0b7fc0563373ee6e6ab0185b687ee21e791f4531d69fcf9f7",
  "repo_slug": "lluz55/dl_bestfin",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/okf_lluz55_dl_bestfin_docs_okf_index_md_e842bd7f/readme"
}