Produto — FluxFiles

Recursos

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.

Instalação rápida

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

Laravel WordPress React / Next.js Vue / Nuxt CKEditor 4 TinyMCE Summernote Any framework

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.

Laravel
PHP
WordPress
Plugin
React
Component
Vue / Nuxt
Component
CKEditor 4
Plugin
TinyMCE
Plugin
Summernote
Plugin

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.

Por que FluxFiles

Feito para o que os outros esqueceram

Deslize para comparar
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

Perguntas frequentes

Como funciona a autenticação?
JWT sem estado (HS256): você emite um token no servidor com claims granulares (permissões, discos, escopo de caminho, limites), então cada usuário vê apenas o que você permite.
Meus usuários precisam de uma conta no FluxFiles?
Não. O FluxFiles confia no JWT emitido pelo seu próprio app, então se conecta à sua autenticação existente — sem um sistema de usuários separado.
O que preciso para executá-lo?
PHP 8.1+ com algumas extensões comuns e o Composer. Aponte para um disco, defina um segredo e as origens permitidas, e sirva — roda em um VPS pequeno.
Usuários diferentes podem ter permissões diferentes?
Sim. Gere um token com claims granulares (ler/escrever/excluir, disco, prefixo de caminho, limites de upload, extensões permitidas, owner-only), ou use um dos quatro perfis predefinidos — viewer, editor, admin, superadmin — para delimitar um token em uma linha em vez de listar cada claim manualmente.
Preciso rodar um banco de dados?
Não. Por padrão, todos os metadados (info de arquivo, índice de busca, log de auditoria) ficam ao lado dos seus arquivos como JSON auxiliares — nada extra para provisionar ou fazer backup. Se preferir manter esse registro no seu próprio MySQL, PostgreSQL ou SQLite, um modo opcional FLUXFILES_STORAGE_BACKEND=db move isso para lá; os bytes do arquivo sempre permanecem no seu storage.
Há algum limite de uso?
O core em si não impõe limites artificiais — sem teto de usuários ativos mensais, sem incentivo forçado a upgrade. Você define seus próprios limites via claims JWT: cotas de armazenamento por usuário, restrições de tamanho/extensão de upload, e um limitador de taxa embutido (60 leituras / 10 escritas por minuto por padrão, configurável).