Product — FluxFiles

Functies

Alles wat een moderne bestandsbeheerder nodig heeft

Gebouwd voor ontwikkelaars die flexibiliteit nodig hebben.

Multi-opslag

Lokaal, AWS S3, Cloudflare R2, SFTP via Flysystem v3 — wissel via config, geen codewijziging.

Overal integreren

iframe + postMessage SDK. Standalone UI gebruikt Alpine.js (geen build). Werkt met elk framework.

JWT-auth + scoping

Pad-prefix per gebruiker, rechten, schijf-whitelist, alleen-eigenaar modus — of begin met een viewer/editor/admin rolpreset.

ACL-rolpresets

Geef tokens uit vanuit viewer-/editor-/admin-/superadmin-presets — één parameter zet meteen de juiste rechten-, schijf- en scope-claims, in plaats van ze handmatig samen te stellen.

AI auto-tag

Claude / OpenAI vision — automatisch alt-tekst, titel, tags.

Afbeelding bijsnijden

Inline bijsnijdtool met beeldverhouding-presets.

Afbeelding optimalisatie

Automatische WebP-varianten — thumb, medium, groot.

Vooraf ondertekende uploads

Browser uploadt rechtstreeks naar S3/R2 — nul bandbreedte op uw server.

Chunk upload

S3 multipart voor bestanden > 10MB.

Zoeken in volledige tekst

Geïndexeerde zoekopdracht op namen, titels, tags — standaard bestandsgebaseerd, of je eigen SQL-database als optionele backend.

DB-gebaseerde metadata

Optionele FLUXFILES_STORAGE_BACKEND=db-modus — metadata, zoek-/mapindex en auditlog staan in je eigen MySQL/PostgreSQL/SQLite in plaats van JSON-sidecars. Bestandsbytes blijven in beide gevallen in de storage.

Bulkbewerkingen

Multi-select verplaatsen, kopiëren, verwijderen, downloaden.

Cross-disk overdracht

Kopiëren/verplaatsen tussen Lokaal ↔ S3 ↔ R2.

Prullenbak

Herstelbare verwijderingen met automatische opschoning.

SEO-metadata

Titel, alt, bijschrift, tags — S3-objectmetadata (cloud) of sidecar JSON (lokaal). Zoeken in volledige tekst.

Donkere modus

Licht / donker / auto in UI en SDK.

16 talen

Standaard Engels. Stel taal in via SDK, URL (?locale=) of FLUXFILES_LOCALE. RTL voor Arabisch.

Auditlogboek

Alle schrijfacties gelogd voor compliance.

Snelheidsbeperking

Token bucket per gebruiker voor API-bescherming.

Opslagquota

Limieten per gebruiker via JWT-claims.

BYOB-buckets

Gebruikers koppelen eigen S3/R2 — inloggegevens versleuteld in JWT (AES-256-GCM).

Duplicaatdetectie

SHA-256-match slaat redundante uploads over tenzij geforceerd overschrijven.

SDK-token vernieuwen

onTokenRefresh bij 401 — samengevoegde refresh, opnieuw proberen, updateToken().

Bucket Doctor

Diagnosticeer elke S3/R2-schijf — credentials, lezen/schrijven/verwijderen, presign, CORS, multipart — met kant-en-klare IAM- en CORS-fixes. Onboard BYOB-buckets in minuten.

SFTP-schijf

Een 3e driver na S3/R2 — maak van elke VPS of host een bestandsbeheerder.

Code-/config-editor

Bewerk tekst- en configbestanden (wp-config.php, .env) in de browser, cPanel-stijl.

Zip & Uitpakken

Download een selectie als zip of pak een archief uit — beveiligd tegen zip-slip & bom.

Watermerk

Pas direct een tekst- of logo-watermerk toe ter bescherming — bron blijft ongemoeid.

On-demand WebP + AVIF

Serveer elke afbeeldingsgrootte als gecachte AVIF/WebP via één URL (Accept-onderhandeld), met kant-en-klare responsieve srcset.

SFTP-rechten

Wijzig Unix-bestandsrechten (chmod) op SFTP-schijven met een cPanel-achtig dialoog.

SSH-terminal

Een stateless opdrachtterminal op SFTP-schijven — cPanel-achtige beheertool, ingebouwd en gratis (of embed je eigen ttyd voor een volledige PTY).

Git-deploy met één klik

Pull en reset een Git-repo op je SFTP-server rechtstreeks vanuit de bestandsbeheerder — vaste vorm, geen willekeurige shell, hooks standaard uit.

Gebruiksdashboard

Opslag in één oogopslag — quota plus uitsplitsing per type en map.

Mediavoorbeeld

Inline voorbeeld van beeld, video, audio & PDF; privé lokale media veilig gestreamd.

Snel installeren

Klaar in 2 minuten

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=

Werkt met

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

Integraties

Kant-en-klare adapters voor jouw stack

Officiële adapters bouwen FluxFiles native in de frameworks en editors die je al gebruikt.

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

Insluiten

Sluit het in een paar regels in

Laad fluxfiles.js, geef een server-uitgegeven JWT mee en plaats een volledige bestandsbeheerder — of een bestandskiezer-modal — op elke pagina.

<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)}
    />
  );
}

Tokens worden serverzijdig uitgegeven — stuur je secret nooit naar de browser.

Waarom FluxFiles

Gebouwd voor wat anderen vergaten

Veeg om te vergelijken
Functie FluxFiles elFinder Laravel-FM RichFilemanager Responsive FM
S3 + R2 + Lokaal + SFTP
Integreren in elk framework
JWT-auth + scoping
SEO-metadata
AI auto-tag
Afbeelding bijsnijden
Chunk upload
Zoeken in volledige tekst
Donkere modus
16 talen
PHP ≥ 8.1
Actief onderhouden
Moderne UI
Mogelijkheid FluxFiles Filestack Uploadcare Cloudinary Supabase Storage
Self-hosted (draait in je eigen infra)
BYOB — eigen bucket per klant
Insluitbare bestandsmanager-UI
Open source (MIT)
Geen SaaS-kosten per opslag / per upload
Multi-storage (S3 / R2 / lokaal)
Token-scoping per tenant ingebouwd

De vergelijking weerspiegelt typische standaardaanbiedingen; elk product blinkt uit in zijn eigen domein. De niche van FluxFiles is de insluitbare, self-hosted, bring-your-own-bucket-combinatie.

Vergelijking actueel per September 2026, onafhankelijk opgesteld — zie de GitHub-repository om een correctie te melden.

FAQ

Veelgestelde vragen

Hoe werkt authenticatie?
Stateless JWT (HS256): je geeft serverzijdig een token uit met fijnmazige claims (rechten, disks, padbereik, limieten), zodat elke gebruiker alleen ziet wat jij toestaat.
Hebben mijn gebruikers een FluxFiles-account nodig?
Nee. FluxFiles vertrouwt op de JWT die je eigen app uitgeeft, dus het sluit aan op je bestaande authenticatie — geen apart gebruikerssysteem.
Wat heb ik nodig om het te draaien?
PHP 8.1+ met enkele gangbare extensies en Composer. Richt het op een schijf, stel een secret en toegestane origins in, en serveer — het draait op een kleine VPS.
Kunnen verschillende gebruikers verschillende rechten hebben?
Ja. Genereer een token met fijnmazige claims (lezen/schrijven/verwijderen, disk, padprefix, uploadlimieten, toegestane extensies, owner-only), of gebruik een van de vier ingebouwde rolpresets — viewer, editor, admin, superadmin — om een token in één regel te begrenzen in plaats van elke claim los op te schrijven.
Moet ik een database draaien?
Nee. Standaard staat alle metadata (bestandsinfo, zoekindex, auditlog) naast je bestanden als JSON-sidecars — niets extra's om te provisionen of te back-uppen. Wil je die administratie liever in je eigen MySQL, PostgreSQL of SQLite bewaren, dan verplaatst een optionele FLUXFILES_STORAGE_BACKEND=db-modus dit ernaartoe; de bestandsbytes blijven hoe dan ook altijd in je storage.
Zijn er gebruikslimieten?
De core zelf legt geen kunstmatige limieten op — geen cap op maandelijks actieve gebruikers, geen gedwongen upgrade-meldingen. Je stelt je eigen limieten in via JWT-claims: opslagquota per gebruiker, upload-grootte-/extensiebeperkingen, en een ingebouwde rate limiter (standaard 60 reads / 10 writes per minuut, configureerbaar).