Producto — FluxFiles
Todo lo que un gestor de archivos moderno necesita
Construido para desarrolladores que necesitan flexibilidad.
Multi-almacenamiento
Local, AWS S3, Cloudflare R2, SFTP vía Flysystem v3 — cambia con config, sin tocar código.
Incrusta en cualquier lugar
iframe + SDK postMessage. La UI standalone usa Alpine.js (sin build). Funciona con cualquier framework.
Auth JWT + alcance
Prefijo de ruta por usuario, permisos, lista blanca de discos, modo solo propietario — o parte de un preset de rol viewer/editor/admin.
Presets de rol ACL
Emite tokens desde presets viewer/editor/admin/superadmin — un solo parámetro expande los claims correctos de permisos, disco y alcance en lugar de armarlos a mano.
AI auto-tag
Claude / OpenAI vision — alt text, título, tags automáticos.
Recorte de imagen
Herramienta de recorte con proporciones predefinidas.
Optimización de imagen
Variantes WebP automáticas — miniatura, mediano, grande.
Subidas presignadas
El navegador sube directamente a S3/R2 — cero ancho de banda en tu servidor.
Subida por partes
S3 multipart para archivos > 10MB.
Búsqueda de texto completo
Búsqueda indexada por nombres, títulos, tags — basada en archivos por defecto, o tu propia base de datos SQL como backend opcional.
Metadatos respaldados por BD
Modo opcional FLUXFILES_STORAGE_BACKEND=db — metadatos, índice de búsqueda/carpetas y log de auditoría viven en tu propia base MySQL/PostgreSQL/SQLite en vez de archivos JSON. Los bytes del archivo siguen residiendo en el almacenamiento en ambos casos.
Operaciones masivas
Selección múltiple: mover, copiar, eliminar, descargar.
Transferencia cross-disk
Copiar/mover entre Local ↔ S3 ↔ R2.
Papelera
Eliminación recuperable con purga automática.
Metadatos SEO
Título, alt, leyenda, tags — metadatos de objeto S3 (nube) o JSON sidecar (local). Búsqueda de texto completo.
Modo oscuro
Claro / oscuro / auto en UI y SDK.
16 idiomas
Inglés por defecto. Establece locale vía SDK, URL (?locale=) o FLUXFILES_LOCALE. RTL para árabe.
Registro de auditoría
Todas las acciones de escritura registradas.
Limitación de velocidad
Token bucket por usuario para protección API.
Cuota de almacenamiento
Límites por usuario vía JWT claims.
Buckets BYOB
Los usuarios traen su propio S3/R2 — credenciales cifradas en JWT (AES-256-GCM).
Detección de duplicados
Coincidencia SHA-256 omite cargas redundantes salvo sobrescritura forzada.
Renovación de token SDK
onTokenRefresh en 401 — refresh coalescido, reintento y updateToken() para rotación proactiva.
Bucket Doctor
Diagnostica cualquier disco S3/R2 — credenciales, lectura/escritura/borrado, presign, CORS, multipart — con correcciones de IAM y CORS listas para pegar. Conecta buckets BYOB en minutos.
Disco SFTP
Un 3.er driver tras S3/R2 — convierte cualquier VPS o hosting en gestor de archivos.
Editor de código / config
Edita archivos de texto y config (wp-config.php, .env) en el navegador, estilo cPanel.
Zip y Extraer
Descarga una selección como zip o extrae un archivo — protegido contra zip-slip y bombas.
Marca de agua
Aplica una marca de agua de texto o logo al vuelo — el archivo original no se toca.
WebP + AVIF bajo demanda
Sirve cualquier tamaño de imagen como AVIF/WebP en caché por una sola URL (negociada por Accept), con srcset responsive listo.
Permisos SFTP
Cambia permisos Unix (chmod) en discos SFTP con un diálogo estilo cPanel.
Terminal SSH
Un terminal de ejecución de comandos sin estado en discos SFTP — herramienta de administración estilo cPanel, integrada y gratuita (o integra tu propio ttyd para un PTY completo).
Despliegue Git con un clic
Haz pull y reset de un repo Git en tu servidor SFTP directamente desde el gestor de archivos — forma fija, sin shell arbitrario, hooks desactivados por defecto.
Panel de uso
Mira el almacenamiento de un vistazo — cuota y desglose por tipo y carpeta.
Vista previa de medios
Vista en línea de imagen, vídeo, audio y PDF; medios locales privados en streaming seguro.
Funcionando en 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= Compatible con
Integraciones
Adaptadores listos para tu stack
Los adaptadores oficiales integran FluxFiles de forma nativa en los frameworks y editores que ya usas.
Integración
Intégralo en pocas líneas
Carga fluxfiles.js, pasa un JWT emitido en el servidor y coloca un gestor de archivos completo — o un modal de selección — en cualquier 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)}
/>
);
} Los tokens se emiten en el servidor — nunca envíes tu secreto al navegador.
Construido para lo que otros olvidaron
| Característica | FluxFiles | elFinder | Laravel-FM | RichFilemanager | Responsive FM |
|---|---|---|---|---|---|
| S3 + R2 + Local + SFTP | ✓ | ⚠ | ⚠ | ⚠ | ✗ |
| Incrustar en cualquier framework | ✓ | ⚠ | ✗ | ⚠ | ✗ |
| Auth JWT + alcance | ✓ | ✗ | ✗ | ✗ | ✗ |
| Metadatos SEO | ✓ | ✗ | ✗ | ✗ | ✗ |
| AI auto-tag | ✓ | ✗ | ✗ | ✗ | ✗ |
| Recorte de imagen | ✓ | ✓ | ✗ | ✗ | ✗ |
| Subida por partes | ✓ | ✗ | ✗ | ✗ | ✗ |
| Búsqueda de texto | ✓ | ✗ | ✗ | ✗ | ✗ |
| Modo oscuro | ✓ | ✗ | ⚠ | ✗ | ✗ |
| 16 idiomas | ✓ | ✓ | ✗ | ✗ | ✗ |
| PHP ≥ 8.1 | ✓ | ✓ | ✗ | ✓ | ✓ |
| Mantenimiento activo | ✓ | ✓ | ⚠ | ✗ | ✗ |
| UI moderna | ✓ | ✗ | ⚠ | ✗ | ✗ |
| Capacidad | FluxFiles | Filestack | Uploadcare | Cloudinary | Supabase Storage |
|---|---|---|---|---|---|
| Autoalojado (corre en tu infraestructura) | ✓ | ✗ | ✗ | ✗ | ⚠ |
| BYOB — el bucket propio de cada cliente | ✓ | ⚠ | ⚠ | ✗ | ✗ |
| UI de gestor de archivos embebible | ✓ | ✓ | ✓ | ⚠ | ✗ |
| Código abierto (MIT) | ✓ | ✗ | ✗ | ✗ | ✓ |
| Sin tarifas SaaS por almacenamiento / subida | ✓ | ✗ | ✗ | ✗ | ⚠ |
| Multi-almacenamiento (S3 / R2 / local) | ✓ | ⚠ | ✗ | ✗ | ✗ |
| Alcance de token por inquilino integrado | ✓ | ⚠ | ⚠ | ⚠ | ⚠ |
La comparación refleja las ofertas por defecto habituales; cada producto destaca en lo suyo. El nicho de FluxFiles es la combinación embebible, autoalojado y bring-your-own-bucket.
Comparación al September 2026, independiente — consulta el repositorio de GitHub para señalar una corrección.
Preguntas frecuentes