Producto — FluxFiles

Características

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.

Instalación rápida

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

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

Integraciones

Adaptadores listos para tu stack

Los adaptadores oficiales integran FluxFiles de forma nativa en los frameworks y editores que ya usas.

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

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.

Por qué FluxFiles

Construido para lo que otros olvidaron

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

Preguntas frecuentes

¿Cómo funciona la autenticación?
JWT sin estado (HS256): emites un token en el servidor con claims granulares (permisos, discos, alcance de ruta, límites), así cada usuario solo ve lo que permites.
¿Mis usuarios necesitan una cuenta de FluxFiles?
No. FluxFiles confía en el JWT que emite tu propia app, así que se conecta a tu autenticación existente — sin un sistema de usuarios aparte.
¿Qué necesito para ejecutarlo?
PHP 8.1+ con algunas extensiones comunes y Composer. Apúntalo a un disco, define un secreto y los orígenes permitidos, y sírvelo — funciona en un VPS pequeño.
¿Pueden distintos usuarios tener permisos diferentes?
Sí. Genera un token con claims detallados (leer/escribir/eliminar, disco, prefijo de ruta, límites de subida, extensiones permitidas, solo-propietario), o usa uno de los cuatro roles predefinidos — viewer, editor, admin, superadmin — para delimitar un token en una sola línea en vez de listar cada claim a mano.
¿Necesito ejecutar una base de datos?
No. Por defecto, todos los metadatos (info de archivos, índice de búsqueda, log de auditoría) viven junto a tus archivos como JSON adjuntos — nada extra que aprovisionar o respaldar. Si prefieres llevar esa contabilidad en tu propia base MySQL, PostgreSQL o SQLite, un modo opcional FLUXFILES_STORAGE_BACKEND=db la traslada allí; los bytes del archivo siempre permanecen en tu almacenamiento.
¿Hay límites de uso?
El core en sí no impone límites artificiales — sin tope de usuarios activos mensuales, sin avisos forzados de actualización. Tú defines tus propios límites vía claims JWT: cuotas de almacenamiento por usuario, restricciones de tamaño/extensión de subida y un limitador de tasa integrado (60 lecturas / 10 escrituras por minuto por defecto, configurable).