FileSwift é um servidor de arquivos para a sua rede local: acesse, organize e compartilhe fotos, vídeos e documentos pelo navegador, de qualquer dispositivo conectado ao mesmo Wi-Fi — sem depender de nuvem, sem instalar app nenhum no celular. Vem também com Textos Rápidos, um bloco de notas com suporte a anexar PDFs (etiquetas dos Correios, notas fiscais, etc.), pensado pra quem cola confirmações de pedido o dia inteiro.
- 📁 Galeria de arquivos — navegação por pastas, com miniaturas de imagens e vídeos, separados de documentos
- 📤 Upload por clique ou arrastar-e-soltar, múltiplos arquivos de uma vez
- 📝 Textos Rápidos — notas com destaque automático de e-mail/CPF/CEP/valores em R$, com anexo de PDFs (várias por texto)
- 🔄 Atualização automática — a galeria e as listas de textos se atualizam sozinhas quando outro dispositivo envia ou apaga algo, sem precisar recarregar a página
- 📱 QR Code + mDNS (
fs.localpor padrão, nome configurável por instância) — acesso rápido de qualquer celular na rede, sem digitar IP - 🔍 Busca global entre pastas e arquivos
- 📋 Copiar, mover, apagar (individual ou em lote), criar pastas
- 🔒 Acesso por senha — protegido por padrão; ninguém na rede acessa sem a senha que você define na primeira execução
- ⚙️ Configurações — troque o nome mDNS a qualquer momento (útil se você roda o FileSwift em mais de um PC na mesma rede)
- 📲 Interface adaptada pra celular (menu lateral, drag-and-drop tocável)
O FileSwift pede uma senha única (tipo senha de Wi-Fi, não é login por usuário) antes de liberar qualquer acesso — isso é obrigatório, não dá pra pular. Na primeira vez que abrir, você vai cair direto numa tela pra definir essa senha.
Pontos importantes sobre o modelo de segurança atual:
- Pensado pra uso doméstico, numa rede Wi-Fi que você já confia — não há HTTPS (o cookie de sessão trafega sem criptografia dentro da sua rede local).
- Sessão dura 30 dias por dispositivo (prioriza não pedir senha toda hora).
- 5 tentativas erradas de senha bloqueiam temporariamente o IP por alguns minutos.
- Esqueceu a senha? Apague o arquivo
config.jsonda pasta de dados (veja "Onde ficam os dados" abaixo) e reinicie — o app volta a pedir pra definir uma senha nova. - Não tem proteção contra CSRF nem é recomendado expor esse servidor diretamente pra internet (fora da sua rede local).
Escolha o método pro seu sistema:
git clone https://github.com/brunomint/fileswift.git
cd fileswift
./install.shCria um atalho no menu de aplicativos e um comando fileswift no terminal. Pra desinstalar: ./uninstall.sh (mantém seus dados — use --purge pra apagar tudo).
Baixe o .deb mais recente (ou gere o seu: ./build-deb.sh) e instale com:
sudo apt install ./fileswift_<versão>_all.debO apt resolve as dependências de sistema sozinho (Python, venv, tkinter).
Instalador gerado automaticamente via GitHub Actions a cada release — veja a aba Actions do repositório pra baixar o .exe mais recente (procure pelo artefato FileSwiftSetup-*). Instalação por usuário, sem precisar de administrador.
Ainda não suportado.
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python3 main.py --consoleO FileSwift também pode ser executado utilizando Docker, facilitando a instalação e o isolamento das dependências.
- Docker
- Docker Compose (v2 ou superior)
Clone o repositório e acesse a pasta do projeto:
git clone https://github.com/brunomint/fileswift.git
cd fileswiftInicie a aplicação:
docker compose up -d --buildApós a inicialização, o FileSwift estará disponível em:
http://localhost:5678
Todos os dados do FileSwift são armazenados no diretório data/, montado automaticamente como volume pelo docker-compose.yml.
Isso inclui:
config.jsonfileswift.db- Uploads de arquivos
- Anexos dos Textos Rápidos
- Demais dados persistentes da aplicação
Dessa forma, atualizar ou recriar o container não remove seus arquivos nem suas configurações.
Após atualizar o código-fonte do projeto, execute:
docker compose up -d --buildO Docker reconstruirá a imagem e iniciará a versão mais recente, preservando todos os dados armazenados no diretório data/.
docker compose downDepois de iniciado, o servidor fica disponível em:
- Nesta máquina:
http://localhost:5678 - De outros dispositivos na mesma rede:
http://<IP-da-máquina>:5678ouhttp://fs.local:5678 - Pelo celular: escaneie o QR Code exibido na página inicial
Rodando o FileSwift em mais de uma máquina na mesma rede? Cada uma precisa de um nome próprio (mDNS não permite duas máquinas anunciando fs.local ao mesmo tempo — a segunda simplesmente não registra). Troque em Configurações na barra lateral da galeria.
Nada é gravado dentro da pasta de instalação. Tudo fica numa pasta própria, separada por dispositivo:
| Instalação | Pasta de dados |
|---|---|
install.sh / .deb (Linux) |
~/.local/share/fileswift/ |
| Windows | %LOCALAPPDATA%\FileSwift\ |
| Rodando do código-fonte | a própria pasta do projeto |
Lá dentro: fileswift.db (textos rápidos), static/download/ (seus arquivos), textos_anexos/ (PDFs anexados), config.json (senha e configuração — nunca é versionado no Git) e fileswift.log (log rotativo, até 4 arquivos de 1 MB — útil pra mandar pra quem for te ajudar com um problema).
Imagens: PNG, JPG, JPEG, GIF, WebP, HEIC/HEVC Vídeos: MP4, WebM, OGG, MOV, HEIF Anexos de Textos Rápidos: PDF Demais arquivos: qualquer tipo é aceito no upload e listado como documento (sem restrição de extensão)
Esqueci a senha — apague config.json na pasta de dados (veja tabela acima) e reinicie o app.
"Porta 5678 em uso" — outra instância do FileSwift já está rodando (nesta máquina ou em segundo plano); feche-a antes de abrir de novo.
Python sem venv/tkinter (Ubuntu 23.04+ / Debian recente) — o install.sh detecta isso e mostra o comando certo pra instalar (sudo apt install python3-venv python3-tk); com o .deb, isso já é resolvido automaticamente pelo apt.
Quer contribuir? Veja o CONTRIBUTING.md (setup, convenções, o que esperar de review) e o CHANGELOG.md (histórico de mudanças).
main.py— servidor Flask (toda a lógica de rotas, banco SQLite, autenticação)gui_launcher.py— janela tkinter opcional (o app funciona igual sem ela, abrindo direto no navegador)gui_logica.py— lógica da janela sem dependência de widget (checagem de porta, leitura de estatísticas, encerramento do servidor), testável sem construir a GUItemplates/— HTML (Jinja2), um arquivo por telatests/: suíte de testes (pytest)install.sh,build-deb.sh,fileswift.spec+.github/workflows/build-windows.yml— empacotamento por plataforma
Com Docker, sem instalar nada na máquina:
docker compose run --rm testO serviço test fica num profile separado, então não sobe junto no docker compose up. O código é montado como volume para que editar um teste não exija rebuild. O /data do container é tmpfs, existe só na memória e é descartado no fim, então nenhum teste alcança dados reais.
Direto na máquina, num virtualenv:
pip install -r requirements.txt -r requirements.dev.txt
pytestUm detalhe importante do tests/conftest.py: importar o main.py sozinho não faz mais nada — pastas, config.json, banco e Zeroconf só são criados por main.init_app(), chamada explicitamente. O conftest.py aponta FILESWIFT_DATA_DIR para uma pasta temporária antes do import, e chama init_app() logo em seguida. Se você escrever um teste novo que importe o main por fora desse caminho (sem passar por conftest.py), ele vai mexer nos dados reais de quem está rodando.
No CI, o workflow Testes roda a suíte em todo push e pull request, em três combinações: Linux e Windows no Python 3.11, mais o piso 3.8 que o install.sh aceita. O build do instalador Windows depende desse workflow: se a suíte quebrar, nenhum instalador é publicado.
MIT — veja o arquivo LICENSE.
Se o FileSwift foi útil pra você, considere apoiar em ko-fi.com/brunofragosodealmeida.