Descubra onde foi parar o seu espaço em disco — e mande o lixo para um buraco negro.
Mapa visual do disco no estilo DaisyDisk, limpeza de caches no estilo CCleaner e caçador de duplicatas por conteúdo, num app nativo leve feito com Tauri + Rust.
| 🗺️ Mapa do disco | Analise a pasta pessoal, qualquer pasta ou um disco inteiro (C:, D:…) e troque a qualquer momento. Treemap em blocos (estilo disktree) ou anéis concêntricos (estilo DaisyDisk). Cada cor é um tipo: cache, build, git, código, mídia, documentos, compactados, apps. Hachurado = recuperável. |
| 💡 Vale uma olhada | Lista automática do que dá para apagar sem dor: node_modules, target/ de projetos Rust, .next, __pycache__, .venv, caches e arquivos gigantes parados há meses. |
| 🧹 Limpeza rápida | Caches de Windows, navegadores (Chrome, Edge, Brave, Vivaldi, Firefox, Thunderbird), apps (VS Code, Discord, Slack, Spotify), apps da Microsoft Store e ferramentas de dev (npm, Yarn, pnpm, pip, Bun, Cargo, Gradle, Rustup, Maven, go, NuGet). Nunca toca em cookies, senhas ou histórico. |
| 👯 Duplicatas | Comparação por conteúdo em 4 etapas (tamanho → prefixo → sufixo → BLAKE3 completo, com memória mapeada em arquivos grandes). Mantém a cópia mais antiga e nunca deixa você marcar todas as cópias de um arquivo. |
| 🕳️ Buraco negro | Ao excluir, os blocos se desintegram, espiralam para dentro de um buraco negro, que colapsa numa onda de choque com o total liberado. |
| 🔄 Auto-update | O app verifica novas versões no GitHub Releases ao abrir; pacotes são assinados e você decide quando instalar. |
![]() |
![]() |
| Blocos + “Vale uma olhada” | Anéis estilo DaisyDisk |
![]() |
|
Capturas feitas sobre uma pasta de demonstração gerada por scripts/demo-fixture.ts.
Baixe o instalador da última versão:
| Sistema | Arquivo |
|---|---|
| Windows 10/11 | Faxina_x.y.z_x64-setup.exe (ou .msi) |
| macOS Apple Silicon | Faxina_x.y.z_aarch64.dmg |
| macOS Intel | Faxina_x.y.z_x64.dmg |
| Linux | .AppImage, .deb ou .rpm |
Note
Os binários ainda não têm assinatura de código da Microsoft/Apple. No Windows, o SmartScreen pede Mais informações → Executar assim mesmo; no macOS (assinatura ad-hoc), abra com botão direito → Abrir na primeira vez — se aparecer “danificado”, rode xattr -cr /Applications/Faxina.app. As atualizações são assinadas com a chave do updater do Tauri, então o app só aceita pacotes publicados por este repositório.
- Lixeira por padrão. Exclusão permanente é opt-in, com confirmação.
- O Rust não confia na interface. Todo caminho enviado para exclusão passa por um guarda: precisa ser absoluto, sem
.., existir, estar dentro da pasta analisada (nunca a própria raiz) e fora de pastas protegidas (sistema,Arquivos de Programas, sua pasta pessoal e Documentos/Imagens/Downloads inteiros). - Recuperável só por nome, nunca por cor. Uma pasta cheia de
target/é pintada de “Build”, mas só otarget/é sugerido — o código-fonte ao lado fica. - Limpeza rápida por ID. A interface manda o ID do cache (ex.:
chrome), e o backend resolve os caminhos de uma lista fixa. Cada regra mira a pasta inteira ou só arquivos que casam um padrão (ex.:*.log), e pode preservar nomes específicos (exclusões). Apaga o conteúdo da pasta, não a pasta; arquivos em uso são pulados e contados. Em%TEMP%, só o que tem mais de 24 h. - Links simbólicos e junctions são ignorados na análise, então nada é contado duas vezes nem “escapa” da pasta escolhida.
| Tecla | Ação |
|---|---|
Tab |
percorre os blocos do nível atual |
Enter / duplo clique |
abrir pasta |
Espaço / botão direito |
marcar ou desmarcar para excluir |
Backspace / centro dos anéis |
voltar um nível |
[ ] |
menos / mais profundidade |
t |
alternar Blocos ↔ Anéis |
r |
reanalisar |
Tip
O Faxina respeita a configuração “Efeitos de animação” do sistema. Se ela estiver desligada, o buraco negro vira uma versão curta. Para ver a animação completa mesmo assim, clique em ✨ Animações no topo até ficar em sempre.
flowchart LR
UI["React 19 + Tailwind v4<br/>treemap / anéis / canvas"] -- invoke --> CMD["commands.rs"]
CMD --> SCAN["scan.rs<br/>varredura paralela (rayon)"]
SCAN --> CAT["category.rs<br/>tipo + recuperável"]
CMD --> VIEW["view.rs<br/>poda + sugestões"]
CMD --> GUARD{"guard.rs"}
GUARD -- ok --> DEL["Lixeira (trash) ou remoção"]
CMD --> JUNK["junk.rs + junk_defs.rs<br/>regras de cache (globs)"]
CMD --> DUP["dupes.rs<br/>tamanho → prefixo → sufixo → BLAKE3"]
SCAN -. evento scan-progress .-> UI
- A varredura guarda a árvore em memória; arquivos menores que 512 KB viram um bloco “N arquivos pequenos” por pasta, o que mantém milhões de arquivos em algumas centenas de MB.
- A interface recebe só a fatia visível (profundidade + até 60 filhos por pasta) e pede mais ao navegar.
- Excluir atualiza a árvore em memória, sem precisar reanalisar.
Pré-requisitos: Bun ≥ 1.3, Rust estável e os pré-requisitos do Tauri do seu sistema.
bun install
bun tauri dev # app com hot reload
bun run lint # Biome
bun run typecheck # tsc
bun run test # testes do frontend (bun test)
cd src-tauri && cargo test && cargo clippy --all-targets -- -D warnings
bun scripts/demo-fixture.ts ./demo # pasta falsa com caches, builds e duplicatasO versionamento é 100% automático a partir de Conventional Commits:
| Commit | Versão |
|---|---|
fix: ... |
patch — 1.0.0 → 1.0.1 |
feat: ... |
minor — 1.0.0 → 1.1.0 |
feat!: ... ou BREAKING CHANGE: |
major — 1.0.0 → 2.0.0 |
docs:, chore:, refactor:, test:… |
sem release |
flowchart LR
P["push na main"] --> CI["CI verde<br/>lint · tipos · testes · clippy"]
CI --> SR["semantic-release<br/>tag vX.Y.Z + CHANGELOG + draft"]
SR --> B["tauri-action<br/>Windows · macOS arm/x64 · Linux"]
B --> S["bundles assinados + latest.json"]
S --> PUB["release publicada"]
PUB --> APP["app detecta e se atualiza"]
PRs têm os commits validados pelo commitlint. Para publicar, o repositório precisa dos secrets TAURI_SIGNING_PRIVATE_KEY e TAURI_SIGNING_PRIVATE_KEY_PASSWORD (gerados com bun tauri signer generate); a chave pública fica em src-tauri/tauri.conf.json.
- Tamanhos são aparentes (tamanho do arquivo), não espaço alocado — arquivos esparsos ou comprimidos pelo NTFS podem ocupar menos.
- Hard links contam uma vez só (no Windows, via FileId do NTFS; em FAT/exFAT não existem). O espaço fica com o primeiro caminho encontrado, então
WinSxSeSystem32dividem o total de um jeito que pode variar entre análises. - Pastas chamadas só
cache/tmp/tempsó contam como cache dentro de dados de aplicativo (AppData,~/.cache,~/Library…); emDocumentos/Projeto/tmpelas são tratadas como suas. - Arquivos pequenos (< 512 KB) aparecem agrupados e não podem ser marcados individualmente.
- A limpeza rápida só mexe em pastas do usuário; nada que exija administrador (Windows Update,
C:\Windows\Temp). - A caça a duplicatas guarda os hashes em
%LOCALAPPDATA%\faxina\dupes-cache.json; reanalisar a mesma pasta fica bem mais rápido. O hash só é reaproveitado quando tamanho e data de modificação não mudam.
Levantamento feito no GitHub em 27/09/2026:
| Projeto | O que aprendemos |
|---|---|
| BleachBit · Winapp2.ini | Listas declarativas de caches seguros por aplicativo |
| czkawka · fclones | Pipeline de duplicatas: tamanho → hash parcial → hash completo |
| WinDirStat · SquirrelDisk | Treemap como forma principal de enxergar o disco |
| kondo · npkill | Reconhecer artefatos de build pelo tipo de projeto |
| dua-cli · dust · gdu | Varredura paralela rápida e navegação por teclado |
| DaisyDisk · Microsoft PC Manager · CCleaner | Anéis, “coletor” antes de apagar e limpeza em um clique |
MIT © juninmd


