Produto — FluxFiles
Tudo que um gerenciador de arquivos moderno precisa
Feito para desenvolvedores que precisam de flexibilidade.
Multi-armazenamento
Local, AWS S3, Cloudflare R2, SFTP via Flysystem v3 — troque na config, sem mudar código.
Incorpore em qualquer lugar
iframe + SDK postMessage. UI standalone usa Alpine.js (sem build). Funciona com qualquer framework.
Auth JWT + escopo
Prefixo de caminho por usuário, permissões, whitelist de discos, modo somente proprietário — ou comece por um preset de papel viewer/editor/admin.
Presets de papel ACL
Emita tokens a partir de presets viewer/editor/admin/superadmin — um único parâmetro expande os claims corretos de permissão, disco e escopo em vez de montá-los manualmente.
AI auto-tag
Claude / OpenAI vision — alt text, título, tags automáticos.
Recorte de imagem
Ferramenta de recorte com proporções predefinidas.
Otimização de imagem
Variantes WebP automáticas — thumb, médio, grande.
Uploads pré-assinados
Navegador faz upload direto para S3/R2 — zero bandwidth no seu servidor.
Upload em partes
S3 multipart para arquivos > 10MB.
Busca em texto completo
Busca indexada por nomes, títulos, tags — baseada em arquivos por padrão, ou seu próprio banco SQL como backend opcional.
Metadados em banco de dados
Modo opcional FLUXFILES_STORAGE_BACKEND=db — metadados, índice de busca/pastas e log de auditoria ficam no seu próprio MySQL/PostgreSQL/SQLite em vez de arquivos JSON. Os bytes do arquivo continuam no armazenamento em ambos os casos.
Operações em massa
Seleção múltipla: mover, copiar, excluir, baixar.
Transferência cross-disk
Copiar/mover entre Local ↔ S3 ↔ R2.
Lixeira
Exclusão recuperável com limpeza automática.
Metadados SEO
Título, alt, legenda, tags — metadados de objeto S3 (nuvem) ou JSON sidecar (local). Busca em texto completo.
Modo escuro
Claro / escuro / auto na UI e SDK.
16 idiomas
Inglês por padrão. Defina locale via SDK, URL (?locale=) ou FLUXFILES_LOCALE. RTL para árabe.
Log de auditoria
Todas as ações de escrita registradas.
Limitação de taxa
Token bucket por usuário para proteção da API.
Cota de armazenamento
Limites por usuário via JWT claims.
Buckets BYOB
Usuários trazem seu próprio S3/R2 — credenciais criptografadas no JWT (AES-256-GCM).
Detecção de duplicatas
Correspondência SHA-256 pula uploads redundantes exceto sobrescrita forçada.
Atualização de token SDK
onTokenRefresh em 401 — refresh coalescido, retry e updateToken() para rotação proativa.
Bucket Doctor
Diagnostica qualquer disco S3/R2 — credenciais, leitura/escrita/exclusão, presign, CORS, multipart — com correções de IAM e CORS prontas para colar. Faça onboarding de buckets BYOB em minutos.
Disco SFTP
Um 3º driver após S3/R2 — transforme qualquer VPS ou hospedagem em gerenciador.
Editor de código / config
Edite arquivos de texto e config (wp-config.php, .env) no navegador, estilo cPanel.
Zip e Extrair
Baixe uma seleção como zip ou extraia um arquivo — protegido contra zip-slip e bombas.
Marca d'água
Aplique marca d'água de texto ou logo on-the-fly — o arquivo original não é alterado.
WebP + AVIF sob demanda
Sirva qualquer tamanho de imagem como AVIF/WebP em cache por uma URL (negociada por Accept), com srcset responsivo pronto.
Permissões SFTP
Altere permissões Unix (chmod) em discos SFTP com um diálogo estilo cPanel.
Terminal SSH
Um terminal de execução de comandos sem estado em discos SFTP — ferramenta de administração estilo cPanel, embutida e gratuita (ou incorpore seu próprio ttyd para um PTY completo).
Deploy Git em um clique
Faça pull e reset de um repositório Git no seu servidor SFTP direto do gerenciador de arquivos — forma fixa, sem shell arbitrário, hooks desativados por padrão.
Painel de uso
Veja o armazenamento num relance — cota e detalhamento por tipo e pasta.
Pré-visualização de mídia
Prévia inline de imagem, vídeo, áudio e PDF; mídia local privada com streaming seguro.
Funcionando em 2 minutos
composer require fluxfiles/fluxfiles
cp .env.example .env
# .env
FLUXFILES_SECRET=your-random-32-char-secret
FLUXFILES_ALLOWED_ORIGINS=https://yourapp.com
require_once 'vendor/autoload.php';
$token = fluxfiles_token(
userId: 'user-123',
perms: ['read', 'write', 'delete'],
disks: ['local', 's3', 'r2'],
prefix: 'user-123/',
maxUploadMb: 10,
allowedExt: null,
ttl: 3600
); composer require fluxfiles/laravel
php artisan vendor:publish --tag=fluxfiles-config
# .env — point the adapter at your FluxFiles server
FLUXFILES_ENDPOINT=https://fm.yourdomain.com
FLUXFILES_SECRET=your-secret-min-32-chars
# Optional: match CORS on the FluxFiles host
# FLUXFILES_ALLOWED_ORIGINS=https://yourapp.com
# Config: config/fluxfiles.php npm install @fluxfiles/node
// Express / Next.js route — mint a token from your JS backend (no PHP)
import { createToken } from '@fluxfiles/node';
app.get('/fluxfiles-token', (req, res) => {
const token = createToken({
secret: process.env.FLUXFILES_SECRET, // >= 32 bytes
userId: req.user.id,
perms: ['read', 'write', 'delete'],
prefix: `users/${req.user.id}`,
ttl: 3600,
});
res.json({ token });
}); pip install fluxfiles-token
# FastAPI / Django / Flask route — mint a token from your Python backend (no PHP)
from fluxfiles_token import create_token
@app.get("/fluxfiles-token")
def fluxfiles_token(user=Depends(current_user)):
token = create_token(
secret=os.environ["FLUXFILES_SECRET"], # >= 32 bytes
user_id=user.id,
perms=["read", "write", "delete"],
prefix=f"users/{user.id}",
ttl=3600,
)
return {"token": token} <!-- Demo: unpkg. In production, serve fluxfiles.js from your FluxFiles host -->
<script src="https://unpkg.com/fluxfiles@latest/fluxfiles.js"></script>
<script>
FluxFiles.open({
endpoint: 'https://your-api.com',
token: 'eyJhbGci...',
disk: 'local',
mode: 'picker',
container: '#file-picker',
onSelect: function(file) {
console.log('Selected:', file.url);
},
async onTokenRefresh() {
const r = await fetch('/api/auth/refresh-fluxfiles-token');
const { token } = await r.json();
return token;
}
});
</script> npm install @fluxfiles/react
import { FluxFilesModal } from '@fluxfiles/react';
<FluxFilesModal
open={open}
endpoint="https://your-api.com"
token={token}
onSelect={(file) => console.log(file)}
onClose={() => setOpen(false)}
/> npm install @fluxfiles/vue
<script setup>
import { FluxFilesModal } from '@fluxfiles/vue';
</script>
<FluxFilesModal
v-model:open="open"
endpoint="https://your-api.com"
:token="token"
@select="onSelect"
@close="open = false"
/> git clone https://github.com/thai-pc/fluxfiles.git
docker build -f fluxfiles/docker/Dockerfile.prod -t fluxfiles fluxfiles
docker run -p 8080:80 \\
-e FLUXFILES_SECRET=your-random-32-char-secret \\
fluxfiles
# UI: http://localhost:8080/public/index.html git clone https://github.com/thai-pc/fluxfiles.git
cd fluxfiles
composer install -d packages/core
cp .env.example .env
cd packages/core
php -S localhost:8080 router.php
# UI: http://localhost:8080/public/index.html
# API: http://localhost:8080/api/fm/list?disk=local&path= Funciona com
Integrações
Adaptadores plug-and-play para a sua stack
Os adaptadores oficiais incorporam o FluxFiles nativamente nos frameworks e editores que você já usa.
Incorporar
Incorpore em poucas linhas
Carregue o fluxfiles.js, passe um JWT emitido no servidor e coloque um gerenciador de arquivos completo — ou um modal de seleção — em qualquer página.
<script src="https://fm.example.com/fluxfiles.js"></script>
FluxFiles.open({
endpoint: 'https://fm.example.com',
token: 'eyJhbGci...', // JWT from your backend
disk: 'local',
mode: 'picker', // select & close
theme: 'auto',
onSelect(file) {
// { url, key, name, size, disk, meta, variants }
document.querySelector("#img").src = file.url;
},
}); <div id="fm" style="height:600px"></div>
FluxFiles.open({
endpoint: 'https://fm.example.com',
token: 'eyJhbGci...',
mode: 'browser', // full manager, stays open
container: '#fm', // omit for a modal overlay
disks: ['local', 's3', 'r2'],
});
FluxFiles.on('FM_EVENT', (e) => console.log(e.event));
FluxFiles.navigate('/photos/2024'); import { FluxFilesModal } from '@fluxfiles/react';
function Picker({ open, setOpen, token }) {
return (
<FluxFilesModal
open={open}
endpoint="https://fm.example.com"
token={token}
onSelect={(file) => console.log(file.url)}
onClose={() => setOpen(false)}
/>
);
} Os tokens são emitidos no servidor — nunca envie seu segredo para o navegador.
Feito para o que os outros esqueceram
| Recurso | FluxFiles | elFinder | Laravel-FM | RichFilemanager | Responsive FM |
|---|---|---|---|---|---|
| S3 + R2 + Local + SFTP | ✓ | ⚠ | ⚠ | ⚠ | ✗ |
| Incorporar em qualquer framework | ✓ | ⚠ | ✗ | ⚠ | ✗ |
| Auth JWT + escopo | ✓ | ✗ | ✗ | ✗ | ✗ |
| Metadados SEO | ✓ | ✗ | ✗ | ✗ | ✗ |
| AI auto-tag | ✓ | ✗ | ✗ | ✗ | ✗ |
| Recorte de imagem | ✓ | ✓ | ✗ | ✗ | ✗ |
| Upload em partes | ✓ | ✗ | ✗ | ✗ | ✗ |
| Busca em texto | ✓ | ✗ | ✗ | ✗ | ✗ |
| Modo escuro | ✓ | ✗ | ⚠ | ✗ | ✗ |
| 16 idiomas | ✓ | ✓ | ✗ | ✗ | ✗ |
| PHP ≥ 8.1 | ✓ | ✓ | ✗ | ✓ | ✓ |
| Mantido ativamente | ✓ | ✓ | ⚠ | ✗ | ✗ |
| UI moderna | ✓ | ✗ | ⚠ | ✗ | ✗ |
| Recurso | FluxFiles | Filestack | Uploadcare | Cloudinary | Supabase Storage |
|---|---|---|---|---|---|
| Auto-hospedado (roda na sua infra) | ✓ | ✗ | ✗ | ✗ | ⚠ |
| BYOB — o bucket próprio de cada cliente | ✓ | ⚠ | ⚠ | ✗ | ✗ |
| UI de gerenciador de arquivos incorporável | ✓ | ✓ | ✓ | ⚠ | ✗ |
| Código aberto (MIT) | ✓ | ✗ | ✗ | ✗ | ✓ |
| Sem taxas de SaaS por armazenamento / upload | ✓ | ✗ | ✗ | ✗ | ⚠ |
| Multi-armazenamento (S3 / R2 / local) | ✓ | ⚠ | ✗ | ✗ | ✗ |
| Escopo de token por inquilino nativo | ✓ | ⚠ | ⚠ | ⚠ | ⚠ |
A comparação reflete as ofertas padrão típicas; cada produto se destaca na sua área. O nicho do FluxFiles é a combinação incorporável, auto-hospedado e bring-your-own-bucket.
Comparação atualizada em September 2026, não afiliada — consulte o repositório do GitHub para sinalizar uma correção.
Perguntas frequentes