Seu projeto. Só o que importa.
ProjectZipper

Seu projeto prontopara compartilhar.

Empacotamento seletivo de código e assets, pronto para enviar ou guardar.

Um app de Windows que empacota seus projetos: o código vai, o pesado fica de fora, e o relatório diz o quê.Empacota seus projetos: o código vai, o pesado fica de fora.

App de desktopBackup de projetosFerramenta própria

  • Tauri 2
  • Rust
  • React 18.3
  • TypeScript 5.9
  • Vite 5.4
  • Tailwind CSS 3.4
  • Framer Motion 11
  • Crates zip 2 · walkdir 2
Seu projeto. Só o que importa.
ProjectZipper

Seu projeto prontopara compartilhar.

Empacotamento seletivo de código e assets, pronto para enviar ou guardar.

Um app de Windows que empacota seus projetos: o código vai, o pesado fica de fora, e o relatório diz o quê.Empacota seus projetos: o código vai, o pesado fica de fora.

App de desktopBackup de projetosFerramenta própria

  • Tauri 2
  • Rust
  • React 18.3
  • TypeScript 5.9
  • Vite 5.4
  • Tailwind CSS 3.4
  • Framer Motion 11
  • Crates zip 2 · walkdir 2

O peso

O pesado fica de fora. O código vai.

Antes de compactar, o app mostra o projeto como ele pesa no disco: cada pasta com o tamanho e a contagem de arquivos. Aqui, as maiores pastas de um projeto Tauri real, como a prévia do app mostrou.

Um projeto Tauri realMarcados: 682 de 750 arquivosFora do pacote: 55 itens

src-tauri/56,26 MB · 108 arquivos
7-noites-na-cabana/55,6 MB · 67 arquivosDesmarcada pelo dono: fica de fora
src/11,12 MB · 432 arquivos
src-tauri/target/Não percorridaRegenerável, não precisa no backup. O app nem entra na pasta; o tamanho só é medido se você pedir.
  • Marcada
  • Desmarcada
  • Não percorrida
  1. 01A árvore inteira, com o tamanho de cada pasta.
  2. 02A target/ nem é percorrida: está entre as 35 pastas pesadas que o app conhece.
  3. 03A pasta desmarcada fecha o zíper e fica de fora.
  4. 04O que segue marcado é o que vai para o pacote.

As pastas de saída da própria ferramenta também ficam de fora: num projeto, 57.162 de 57.790 caminhos (98,91%) eram backups antigos. O projeto de verdade tinha 628.

A prévia

Marque, desmarque. O peso aparece antes.

Cada pasta e cada arquivo têm a sua caixa. A pasta-mãe fica parcial (—) quando só parte dos filhos vai, e a estimativa do pacote se refaz a cada clique. Clique para testar.

Estimativa do pacote

14,98 MB491 arquivos

De 65,94 MB · 508 arquivos

Com as pastas da prévia do app. No app, a conta percorre o projeto inteiro, sem compactar nada.

  • Três estadosMarcado, desmarcado ou parcial: a pasta mostra o que os filhos decidiram.
  • Estimativa sem compactarO app percorre o projeto com os mesmos filtros do backup e devolve tamanho e contagem, sem gravar nada.
  • Sem atropeloA conta sai 700 ms depois do último clique, e a resposta antiga é descartada.
  • O que é novo apareceO que não existia na última configuração salva ganha o selo NOVO na árvore.
O ProjectZipper com a janela de progresso do backup aberta e o console listando os arquivos

Você decide o que entra no ZIP.

Código, assets e arquivos pesados, organizados com critério.

Seleção por arquivo e pastaResumo de pastas regeneráveisAssets em pacotes separadosAlertas para arquivos sensíveis.

Para mandar um projeto grande, o app divide: o código num ZIP e os assets em pacotes do tamanho que você escolher (de 1 a 500 MB; o padrão é 29), ou o projeto inteiro em partes. A divisão é um First-Fit-Decreasing: ordena do maior para o menor e põe cada arquivo na primeira caixa em que ele cabe.

O código vai para o -code.zip; os assets da public/ vão para -assets-01.zip, -assets-02.zip… guardados sem compressão, porque imagem e vídeo já vêm comprimidos.

Fila ordenada, do maior ao menor

    1. { }
      projeto-code.zip
    2. Limite − 1%
      .mp4
      projeto-assets-01.zipMaior que o limite: vai sozinho, com aviso
    3. Limite − 1%
      .mp4.psd
      projeto-assets-02.zip
    4. Limite − 1%
      .png.glb.png
      projeto-assets-03.zip
    5. Limite − 1%
      .jpg.webp.svg
      projeto-assets-04.zip
    • A caixa enche até 99% do limite: 1% fica de folga.
    • Arquivo maior que o limite ganha um pacote só para ele, com aviso.
    • Cada parte abre sozinha: são ZIPs independentes, não um ZIP fatiado (.z01, .z02).

    Os sensíveis

    Chaves, .env, credenciais: o app aponta cada um.

    Antes de o ZIP sair da máquina, a regra passa por todos os nomes. O que parece credencial é listado no fim do backup e contado no relatório, e levar ou não é decisão sua, numa chave.

    • package.json
    • src/App.tsx
    • .env.localVai no pacote
    • tailwind.config.js
    • id_rsaVai no pacote
    • README.md
    • vite.config.ts
    • credentials.jsonVai no pacote
    • Cargo.toml
    • src-tauri/tauri.conf.json
    • certificado.pemVai no pacote
    • index.html
    • .npmrcVai no pacote
    • public/logo.png
    • .aws/configVai no pacote
    • src-tauri/src/main.rs
    • .env.productionVai no pacote
    • tsconfig.json
    • 17Nomes exatos.npmrc · .netrc · id_rsa · credentials.json · secrets.json · terraform.tfvars…
    • 9Extensões.pem · .key · .p12 · .pfx · .jks · .keystore · .ppk · .asc · .gpg
    • 5Pastas de credencial.aws · .ssh · .gnupg · .docker · .kube
    • .env*Todo nome que começa com .env.env · .env.local · .env.production…
      Sensíveis .....: 7 arquivo(s) (.env, chaves, credenciais), ESTÃO no backup

    A comparação ignora maiúsculas e olha o caminho inteiro: um arquivo dentro de .ssh/ conta, qualquer que seja o nome.

    O relatório

    Dentro de cada ZIP, o mapa do que ficou.

    Todo backup leva um ESTRUTURA.txt na raiz: a árvore inteira do projeto, com tamanho e data em cada linha, e a marca do que ficou de fora e por quê. Quem abre o pacote sabe o que falta antes de procurar.

    ROBLOX-APP-ASSETS-ESTRUTURA.txt
    ══════════════════════════════════════════════════════════
    ESTRUTURA COMPLETA · ROBLOX-APP-ASSETS
    ══════════════════════════════════════════════════════════
    Caminho .......: D:\Projetos\ROBLOX-APP-ASSETS
    Gerado em .....: 19/09/2026 às 12:58
    Arquivos ......: …
    Modo ..........: pastas regeneráveis RESUMIDAS
    Fora do pacote : … item(ns), marcados com [FORA] abaixo
    ══════════════════════════════════════════════════════════
    POR EXTENSÃO (as 20 que mais pesam)
    …
    ══════════════════════════════════════════════════════════
    LEGENDA
    [FORA: motivo] o arquivo existe no disco mas não entrou no backup
    [RESUMIDA] pasta regenerável mostrada só com o total
    ══════════════════════════════════════════════════════════
     
    ROBLOX-APP-ASSETS/
    ├── src-tauri/ 56.26 MB 03/09/2026 12:16
    │ ├── binaries/ 50.96 MB 08/07/2026 15:37
    │ ├── icons/ 2.44 MB 03/09/2026 12:16
    │ ├── target/ … arq · … [RESUMIDA]
    │ └── Cargo.lock 142 KB 03/09/2026 12:16
    ├── 7-noites-na-cabana/ 55.6 MB 03/06/2026 09:44
    │ └── BIBLIA_VISUAL/ 55.6 MB 02/06/2026 23:22
    └── src/ 11.12 MB 19/09/2026 11:06
    ├── data/ 6.14 MB 18/09/2026 20:20
    └── components/ 2.62 MB 19/09/2026 12:35
    1. 1O cabeçalhoCaminho, data, quantos arquivos, o modo e quantos itens ficaram de fora: o resumo antes da árvore.
    2. 2Por extensãoAs 20 extensões que mais pesam, com contagem e tamanho. Todo .env.local ou .env.production conta como .env, para ver de bate-pronto quantos existem.
    3. 3A legendaDuas marcas: [FORA: motivo], para o que existe no disco e não entrou, e [RESUMIDA], para a pasta regenerável.
    4. 4Tamanho e data em cada linhaA coluna tem largura fixa: a pasta resumida, que traz a contagem junto, não empurra a data para o lado.
    5. 5Regenerável numa linha sóAs pastas target, node_modules, .venv e mais 17 nomes viram uma linha com o total de arquivos e de bytes.

    O mesmo arquivo também é salvo na raiz do projeto a cada backup, e o botão Exportar Estrutura gera só ele. Trecho no formato do app, com as pastas da prévia; as reticências marcam o que foi cortado.

    Por dentro

    Rust onde pesa, medido onde importa.

    O trabalho pesado roda em Rust, fora da linha da interface; a interface em React só pede e mostra. As medidas abaixo estão nos comentários do código, ao lado da mudança que cada uma justificou.

    A decisão

    Uma regra só, para os três caminhos

    119 MBEstimados na tela

    500 MBNo ZIP de verdade

    A regra do que entra no pacote vivia em três cópias: no backup inteiro, no backup em partes e na estimativa. As cópias divergiram. Hoje as três chamam as mesmas duas funções, e quem muda um filtro muda nos três.

    passa_pre_filtros() · motivo_para_ficar_de_fora()

    12comandos

    Entre a interface e o Rust

    Os 7 mais pesados rodam numa linha à parte (spawn_blocking): a janela não congela.

    64KiB

    De bloco em bloco

    Cada arquivo vai para o ZIP em blocos de 64 KiB, sem subir inteiro para a memória. Deflate nível 3; 30 formatos já comprimidos entram sem recompressão.

    868.500consultas

    Ao disco, poupadas

    Numa árvore de 6.081 pastas: ordenar pelo tipo que o sistema já entrega, em vez de perguntar ao disco a cada comparação.

    127ms

    Para escrever a estrutura

    Eram 1.208 ms na mesma árvore (51.709 arquivos): a saída da própria ferramenta passou a ser resumida, com a mesma contagem.

    As tecnologias

    Do que é feito, peça por peça

    Um programa de Windows que escolhe o que entra no pacote e o que fica de fora. A janela é feita como um site; o Rust percorre as pastas e monta o .zip. Escolha uma peça para ver o que ela faz aqui e em que arquivo está.

    14tecnologias, em 3 camadas

    Tela

    Núcleo

    Windows

    As telas

    O app, do projeto ao pacote.

    Da lista de projetos ao backup pronto, com a configuração salva no próprio projeto.