The file manager that embeds anywhere
PHP ≥ 8.1 + Flysystem 3. Alpine.js UI. Local, S3, Cloudflare R2. Embed with a few lines of JavaScript.
See it in action
Everything a modern file manager needs
Built for developers who need flexibility.
Multi-storage
Local, AWS S3, Cloudflare R2 via Flysystem v3 — swap with config, no code change.
Embed anywhere
iframe + postMessage SDK. Standalone UI is Alpine.js (zero build). Works with any framework.
JWT auth + scoping
Per-user path prefix, permission claims, disk whitelist, owner-only mode.
AI auto-tag
Claude / OpenAI vision — auto alt text, title, tags.
Image crop
Inline crop tool with aspect ratio presets.
Image optimization
Auto WebP variants — thumb, medium, large.
Presigned uploads
Browser uploads directly to S3/R2 — zero bandwidth on your server.
Chunk upload
S3 multipart for files > 10MB.
Full-text search
SQLite FTS5 across names, titles, tags.
Bulk operations
Multi-select move, copy, delete, download.
Cross-disk transfer
Copy/move between Local ↔ S3 ↔ R2.
Trash / soft delete
Recoverable deletes with auto-purge.
SEO metadata
Title, alt, caption, tags — S3 object metadata (cloud) or sidecar JSON (local). Full-text search.
Dark mode
Light / dark / auto in UI and SDK.
16 languages
Default English. Set locale via SDK, URL (?locale=), or FLUXFILES_LOCALE. RTL for Arabic.
Audit log
All write actions logged for compliance.
Rate limiting
Token bucket per user for API protection.
Storage quota
Per-user storage limits via JWT claims.
BYOB buckets
Users bring their own S3/R2 — credentials encrypted in JWT (AES-256-GCM).
Duplicate detection
SHA-256 match skips redundant uploads unless you force overwrite.
SDK token refresh
onTokenRefresh on 401 — coalesced refresh, retry, and updateToken() for proactive rotation.
Up and running in 2 minutes
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 <!-- Demo: unpkg. In production, serve fluxfiles.js from your FluxFiles host -->
<script src="https://unpkg.com/fluxfiles@1.22.0/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
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= Works with
Built for what others forgot
| Feature | FluxFiles | elFinder | Laravel-FM | RichFilemanager | Responsive FM |
|---|---|---|---|---|---|
| S3 + R2 + Local | ✓ | ⚠ | ⚠ | ⚠ | ✗ |
| Embed any framework | ✓ | ⚠ | ✗ | ⚠ | ✗ |
| JWT auth + scoping | ✓ | ✗ | ✗ | ✗ | ✗ |
| SEO metadata | ✓ | ✗ | ✗ | ✗ | ✗ |
| AI auto-tag | ✓ | ✗ | ✗ | ✗ | ✗ |
| Image crop | ✓ | ✓ | ✗ | ✗ | ✗ |
| Chunk upload | ✓ | ✗ | ✗ | ✗ | ✗ |
| Full-text search | ✓ | ✗ | ✗ | ✗ | ✗ |
| Dark mode | ✓ | ✗ | ⚠ | ✗ | ✗ |
| 16 languages | ✓ | ✓ | ✗ | ✗ | ✗ |
| PHP ≥ 8.1 | ✓ | ✓ | ✗ | ✓ | ✓ |
| Actively maintained | ✓ | ✓ | ⚠ | ✗ | ✗ |
| Modern UI | ✓ | ✗ | ⚠ | ✗ | ✗ |