प्रोडक्ट — FluxFiles

फ़ीचर्स

एक आधुनिक फ़ाइल मैनेजर के लिए सब कुछ

लचीलापन चाहने वाले डेवलपर्स के लिए बनाया गया।

मल्टी-स्टोरेज

Local, AWS S3, Cloudflare R2, SFTP — Flysystem v3 के ज़रिए। कॉन्फ़िग से बदलें।

कहीं भी एम्बेड करें

iframe + postMessage SDK। स्टैंडअलोन UI Alpine.js (बिना बिल्ड)। किसी भी फ्रेमवर्क के साथ।

JWT ऑथ + स्कोपिंग

प्रति-यूज़र पाथ प्रीफ़िक्स, अनुमतियाँ, डिस्क व्हाइटलिस्ट, owner-only मोड — या viewer/editor/admin रोल प्रीसेट से शुरू करें।

ACL रोल प्रीसेट

viewer/editor/admin/superadmin प्रीसेट से टोकन जारी करें — एक पैरामीटर सही permission, disk और scope claims खुद सेट कर देता है, हाथ से जोड़ने की ज़रूरत नहीं।

AI ऑटो-टैग

Claude / OpenAI vision — ऑटो alt टेक्स्ट, टाइटल, टैग्स।

इमेज क्रॉप

आस्पेक्ट रेशियो प्रीसेट के साथ इनलाइन क्रॉप टूल।

इमेज ऑप्टिमाइज़ेशन

ऑटो WebP वेरिएंट — thumb, medium, large।

प्रीसाइन्ड अपलोड

ब्राउज़र सीधे S3/R2 पर अपलोड करता है — आपके सर्वर पर ज़ीरो बैंडविड्थ।

चंक अपलोड

10MB से बड़ी फ़ाइलों के लिए S3 मल्टीपार्ट।

फुल-टेक्स्ट सर्च

नाम, टाइटल, टैग्स में इंडेक्स्ड सर्च — डिफ़ॉल्ट रूप से फ़ाइल-आधारित, या अपना खुद का SQL डेटाबेस वैकल्पिक बैकएंड के तौर पर।

DB-आधारित मेटाडेटा

वैकल्पिक FLUXFILES_STORAGE_BACKEND=db मोड — मेटाडेटा, सर्च/फ़ोल्डर इंडेक्स और ऑडिट लॉग आपके अपने MySQL/PostgreSQL/SQLite में रहते हैं, JSON साइडकार की जगह। फ़ाइल के बाइट्स दोनों ही स्थिति में स्टोरेज में रहते हैं।

बल्क ऑपरेशंस

मल्टी-सेलेक्ट मूव, कॉपी, डिलीट, डाउनलोड।

क्रॉस-डिस्क ट्रांसफर

Local ↔ S3 ↔ R2 के बीच कॉपी/मूव।

ट्रैश

रिकवर करने योग्य डिलीट, ऑटो-पर्ज।

SEO मेटाडेटा

शीर्षक, alt, कैप्शन, टैग — क्लाउड पर S3 ऑब्जेक्ट मेटाडेटा, लोकल पर sidecar JSON। फुल-टेक्स्ट सर्च।

डार्क मोड

UI और SDK में लाइट / डार्क / ऑटो।

16 भाषाएँ

डिफ़ॉल्ट अंग्रेज़ी। SDK, URL (?locale=), या FLUXFILES_LOCALE से सेट करें। अरबी के लिए RTL।

ऑडिट लॉग

सभी राइट एक्शन लॉग।

रेट लिमिटिंग

प्रति-यूज़र टोकन बकेट API सुरक्षा।

स्टोरेज कोटा

JWT claims द्वारा प्रति-यूज़र सीमा।

BYOB बकेट

यूज़र अपना S3/R2 जोड़ते हैं — JWT में क्रेडेंशियल एन्क्रिप्ट (AES-256-GCM)।

डुप्लिकेट पहचान

SHA-256 मैच पर अतिरिक्त अपलोड स्किप, जब तक फोर्स ओवरराइट न हो।

SDK टोकन रिफ़्रेश

401 पर onTokenRefresh — एकीकृत रिफ़्रेश, रीट्राय, और updateToken()।

Bucket Doctor

किसी भी S3/R2 डिस्क का निदान करें — क्रेडेंशियल, रीड/राइट/डिलीट, presign, CORS, multipart — पेस्ट करने के लिए तैयार IAM और CORS फिक्स के साथ। BYOB बकेट मिनटों में जोड़ें।

SFTP डिस्क

S3/R2 के बाद तीसरा ड्राइवर — किसी भी VPS या होस्ट को फ़ाइल मैनेजर बनाएं।

कोड / config एडिटर

ब्राउज़र में टेक्स्ट व कॉन्फ़िग फ़ाइलें (wp-config.php, .env) संपादित करें, cPanel जैसा।

ज़िप और एक्सट्रैक्ट

चयन को zip में डाउनलोड करें या आर्काइव निकालें — zip-slip व bomb से सुरक्षित।

वॉटरमार्क

प्रीव्यू सुरक्षा हेतु टेक्स्ट या लोगो वॉटरमार्क तुरंत लगाएं — मूल फ़ाइल अछूती।

ऑन-डिमांड WebP + AVIF

किसी भी आकार की छवि को एक URL के ज़रिए कैश्ड AVIF/WebP के रूप में परोसें (Accept-नेगोशिएटेड), तैयार रेस्पॉन्सिव srcset के साथ।

SFTP अनुमतियाँ

cPanel जैसे डायलॉग से SFTP डिस्क पर Unix फ़ाइल अनुमतियाँ (chmod) बदलें।

SSH टर्मिनल

मुफ़्त terminal_pty_url क्लेम के ज़रिए SFTP डिस्क पर अपना ttyd / gotty / wetty इन-ऐप टर्मिनल के रूप में एम्बेड करें — FluxFiles अपना कोई शेल नहीं देता।

वन-क्लिक Git डिप्लॉय

फ़ाइल मैनेजर से सीधे अपने SFTP सर्वर पर Git रिपॉज़िटरी को pull और reset करें — तय आकार, कोई मनमाना शेल नहीं, hooks डिफ़ॉल्ट रूप से बंद।

उपयोग डैशबोर्ड

स्टोरेज एक नज़र में — कोटा के साथ प्रकार व फ़ोल्डर अनुसार विवरण।

मीडिया प्रीव्यू

इनलाइन इमेज, वीडियो, ऑडियो व PDF प्रीव्यू; निजी लोकल मीडिया सुरक्षित स्ट्रीम।

क्विक इंस्टॉल

2 मिनट में चालू करें

composer require fluxfiles/fluxfiles
cp vendor/fluxfiles/fluxfiles/.env.example vendor/fluxfiles/fluxfiles/.env
# vendor/fluxfiles/fluxfiles/.env  (read only from inside the package)
# Real environment variables win over this file and are preferred in production
# (Composer may remove a vendor .env on update).
FLUXFILES_SECRET=<output of: openssl rand -hex 32>
FLUXFILES_ALLOWED_ORIGINS=https://yourapp.com
<?php
require_once 'vendor/autoload.php';
// embed.php is not autoloaded — require it for fluxfiles_token()
require_once 'vendor/fluxfiles/fluxfiles/embed.php';

$token = fluxfiles_token([
    'user'   => 'user-123',
    'perms'  => ['read', 'write', 'delete'],
    'disks'  => ['local'],     // s3 / r2 need their own credentials in .env
    'prefix' => 'user-123/',
    'ttl'    => 3600,
]);
php vendor/bin/fluxfiles serve --port=8080
# then open http://127.0.0.1:8080/public/
composer require fluxfiles/laravel
php artisan vendor:publish --tag=fluxfiles-config
php artisan storage:link
# .env — proxy mode is the default: the API runs through your Laravel routes,
# no separate FluxFiles server is needed.
FLUXFILES_SECRET=<output of: openssl rand -hex 32>

# Only for FLUXFILES_MODE=standalone (FluxFiles on its own server):
# FLUXFILES_MODE=standalone
# FLUXFILES_ENDPOINT=https://fm.yourdomain.com
<?php
// app/FluxFiles/TenantClaims.php — REQUIRED: without a claims resolver
// <x-fluxfiles> renders "not available".
namespace App\FluxFiles;

use FluxFiles\Laravel\ClaimsResolver;
use Illuminate\Contracts\Auth\Authenticatable;

class TenantClaims implements ClaimsResolver
{
    public function resolve(Authenticatable $user): array
    {
        return [
            'prefix' => 'users/' . $user->getAuthIdentifier(),
        ];
    }
}
// config/fluxfiles.php
'claims_resolver' => \App\FluxFiles\TenantClaims::class,
// Laravel 11 / 12 — bootstrap/app.php: exclude the proxy routes from CSRF (else 419)
->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(except: ['api/fm/*']);
})

// Laravel 10 — app/Http/Middleware/VerifyCsrfToken.php
// protected $except = ['api/fm/*'];
<x-fluxfiles disk="local" mode="picker" height="600px" />
# Not yet on WordPress.org — install the release zip:
# 1. Download fluxfiles-<version>.zip from https://github.com/thai-pc/fluxfiles/releases
# 2. Plugins -> Add New -> Upload Plugin -> Activate
# 3. Settings -> FluxFiles: set the JWT secret (>= 32 bytes) and storage
# 4. Add the shortcode (or the FluxFiles block) to any page or post:
[fluxfiles]
npm install @fluxfiles/node   # Node >= 16
// 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)
import os

from fastapi import Depends
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}
{
  "mcpServers": {
    "fluxfiles": {
      "command": "npx",
      "args": ["-y", "@fluxfiles/mcp"],
      "env": {
        "FLUXFILES_URL": "<your FluxFiles URL>",
        "FLUXFILES_TOKEN": "<scoped JWT>"
      }
    }
  }
}
# Claude Code (Node >= 18)
claude mcp add fluxfiles -e FLUXFILES_URL=<your FluxFiles URL> -e FLUXFILES_TOKEN=<scoped JWT> -- npx -y @fluxfiles/mcp
# Read-only by default. Opt in to writes:
FLUXFILES_MCP_WRITE=1
# and to move_to_trash:
FLUXFILES_MCP_DELETE=1

एजेंट केवल वही छू सकता है जिसकी उसका JWT अनुमति देता है — उसकी डिस्क, पाथ प्रीफ़िक्स और अनुमतियाँ। उसे एक सीमित, केवल-पढ़ने वाला टोकन दें।

npm install fluxfiles
<!-- or load a pinned CDN build (never @latest) -->
<script src="https://unpkg.com/fluxfiles@1.0.1/fluxfiles.js"></script>
<div id="file-picker" style="height:600px"></div>

<script>
FluxFiles.open({
    endpoint: 'https://your-fluxfiles-host',
    token: 'eyJhbGci...',   // JWT minted by your backend
    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"
/>
docker run -p 8080:80 \
  -e FLUXFILES_SECRET="$(openssl rand -hex 32)" \
  -e FLUXFILES_ALLOWED_ORIGINS=https://yourapp.com \
  -v fluxfiles-data:/app/packages/core/storage \
  ghcr.io/thai-pc/fluxfiles:1.1
# UI: http://localhost:8080/public/
git clone https://github.com/thai-pc/fluxfiles.git
cd fluxfiles/packages/core
composer install
cp .env.example .env
# packages/core/.env — the placeholder secret is rejected, set a real one
FLUXFILES_SECRET=<output of: openssl rand -hex 32>
FLUXFILES_ALLOWED_ORIGINS=http://localhost:8080
# print dev tokens (run from the repo root)
php packages/core/tests/generate-token.php
php -S localhost:8080 router.php

# UI: http://localhost:8080/public/index.html?token=<token>
# ?token= is dev-only — it is stripped from the URL on boot.
# Real apps pass the JWT via the SDK / postMessage, never in a URL.

प्रोडक्शन में जाते समय: कम से कम 32 बाइट का FLUXFILES_SECRET और FLUXFILES_ALLOWED_ORIGINS (या FLUXFILES_FRAME_ANCESTORS) सेट करें। पैकेज रूट को ही वेब डॉक्यूमेंट रूट बनाएँ और nginx में /_fluxfiles/ व .env को deny करें। मुख्य JWT को कभी URL में न रखें — अडैप्टर उसे postMessage से भेजते हैं। DEPLOYMENT.md

इनके साथ काम करता है

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

इंटीग्रेशन

आपके स्टैक के लिए ड्रॉप-इन एडाप्टर

आधिकारिक एडाप्टर FluxFiles को उन्हीं फ्रेमवर्क और एडिटर में नेटिव रूप से एम्बेड करते हैं जिन्हें आप पहले से उपयोग करते हैं।

CKEditor या TinyMCE को अपने स्टोरेज के साथ इस्तेमाल करें — CKBox या Tiny Drive की सदस्यता की ज़रूरत नहीं। FluxFiles फ़ाइलें ब्राउज़ करने और जोड़ने के लिए एक टूलबार बटन जोड़ता है; यह उन उत्पादों का फ़ीचर-दर-फ़ीचर विकल्प नहीं है।

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

एम्बेड

कुछ ही लाइनों में एम्बेड करें

fluxfiles.js लोड करें, सर्वर पर बना JWT पास करें, और किसी भी पेज में पूरा फ़ाइल मैनेजर — या फ़ाइल-पिकर मोडल — जोड़ दें।

<!-- npm install fluxfiles, or a pinned CDN build -->
<script src="https://unpkg.com/fluxfiles@1.0.1/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)}
    />
  );
}

टोकन सर्वर पर बनते हैं — अपना सीक्रेट कभी ब्राउज़र को न भेजें।

FluxFiles क्यों

जो दूसरे भूल गए, उसके लिए बनाया गया

तुलना के लिए स्वाइप करें
फ़ीचर FluxFiles elFinder Laravel-FM RichFilemanager Responsive FM
S3 + R2 + लोकल + SFTP ✓ ⚠ ⚠ ⚠ ✗
किसी भी फ्रेमवर्क में एम्बेड ✓ ⚠ ✗ ⚠ ✗
JWT ऑथ + स्कोपिंग ✓ ✗ ✗ ✗ ✗
SEO मेटाडेटा ✓ ✗ ✗ ✗ ✗
AI ऑटो-टैग ✓ ✗ ✗ ✗ ✗
इमेज क्रॉप ✓ ✓ ✗ ✗ ✗
चंक अपलोड ✓ ✗ ✗ ✗ ✗
फुल-टेक्स्ट सर्च ✓ ✗ ✗ ✗ ✗
डार्क मोड ✓ ✗ ⚠ ✗ ✗
16 भाषाएँ ✓ ✓ ✗ ✗ ✗
PHP ≥ 8.1 ✓ ✓ ✗ ✓ ✓
सक्रिय रूप से मेंटेन ✓ ✓ ⚠ ✗ ✗
मॉडर्न UI ✓ ✗ ⚠ ✗ ✗
क्षमता FluxFiles Filestack Uploadcare Cloudinary Supabase Storage
सेल्फ-होस्टेड (आपके इन्फ्रा में चलता है) ✓ ✗ ✗ ✗ ⚠
BYOB — हर ग्राहक का अपना बकेट ✓ ⚠ ⚠ ✗ ✗
एम्बेड-योग्य फ़ाइल-मैनेजर UI ✓ ✓ ✓ ⚠ ✗
ओपन सोर्स (MIT) ✓ ✗ ✗ ✗ ✓
कोई प्रति-स्टोरेज / प्रति-अपलोड SaaS शुल्क नहीं ✓ ✗ ✗ ✗ ⚠
मल्टी-स्टोरेज (S3 / R2 / लोकल) ✓ ⚠ ✗ ✗ ✗
प्रति-टेनेंट टोकन स्कोपिंग अंतर्निहित ✓ ⚠ ⚠ ⚠ ⚠

तुलना सामान्य डिफ़ॉल्ट पेशकशों को दर्शाती है; हर उत्पाद अपने क्षेत्र में उत्कृष्ट है। FluxFiles का niche एम्बेड-योग्य, सेल्फ-होस्टेड, ब्रिंग-योर-ओन-बकेट संयोजन है।

तुलना November 2026 तक की है, यह स्वतंत्र रूप से तैयार की गई है — सुधार बताने के लिए GitHub रिपॉज़िटरी देखें।

सामान्य प्रश्न

अक्सर पूछे जाने वाले प्रश्न

प्रमाणीकरण कैसे काम करता है?
स्टेटलेस JWT (HS256): आप सर्वर पर बारीक क्लेम (अनुमतियाँ, डिस्क, पथ-स्कोप, सीमाएँ) के साथ टोकन बनाते हैं, इसलिए हर उपयोगकर्ता केवल वही देखता है जो आप अनुमति देते हैं।
क्या मेरे उपयोगकर्ताओं को FluxFiles खाता चाहिए?
नहीं। FluxFiles आपके अपने ऐप द्वारा जारी JWT पर भरोसा करता है, इसलिए यह आपके मौजूदा ऑथ से सीधे जुड़ जाता है — कोई अलग यूज़र सिस्टम नहीं।
इसे चलाने के लिए क्या चाहिए?
PHP 8.1+ (8.1–8.5 पर टेस्टेड) जिसमें gd, curl, json, openssl, mbstring, fileinfo (Extract के लिए zip) और Composer 2 हों — या ghcr.io/thai-pc/fluxfiles Docker इमेज। इसे किसी डिस्क पर पॉइंट करें, सीक्रेट और अनुमत origins सेट करें, फिर चलाएँ — यह छोटे VPS पर भी चलता है।
क्या अलग-अलग यूज़र्स को अलग-अलग परमिशन दी जा सकती है?
हाँ। बारीक क्लेम्स (read/write/delete, डिस्क, पाथ प्रीफ़िक्स, अपलोड सीमाएँ, अनुमत एक्सटेंशन, owner-only) के साथ टोकन बनाएं, या चार बिल्ट-इन रोल प्रीसेट में से एक इस्तेमाल करें — viewer, editor, admin, superadmin — जिससे हर क्लेम अलग से लिखने के बजाय एक लाइन में टोकन स्कोप हो जाए।
क्या मुझे डेटाबेस चलाना ज़रूरी है?
नहीं। डिफ़ॉल्ट रूप से सभी मेटाडेटा (फ़ाइल जानकारी, सर्च इंडेक्स, ऑडिट लॉग) आपकी फ़ाइलों के साथ JSON साइडकार के रूप में रहता है — कुछ भी अलग से सेट या बैकअप नहीं करना पड़ता। अगर आप यह रिकॉर्ड अपने खुद के MySQL, PostgreSQL या SQLite में रखना चाहें, तो वैकल्पिक FLUXFILES_STORAGE_BACKEND=db मोड इसे वहाँ ले जाता है; फ़ाइल का डेटा हमेशा आपके स्टोरेज में ही रहता है।
क्या कोई उपयोग सीमा है?
कोर में खुद कोई कृत्रिम सीमा नहीं है — न मासिक एक्टिव यूज़र्स की कोई कैप, न ज़बरदस्ती अपग्रेड का दबाव। आप खुद JWT क्लेम्स से अपनी सीमाएँ तय करते हैं: हर यूज़र के लिए स्टोरेज कोटा, अपलोड साइज़/एक्सटेंशन प्रतिबंध, और एक बिल्ट-इन रेट लिमिटर (डिफ़ॉल्ट रूप से प्रति मिनट 60 रीड / 10 राइट, कॉन्फ़िगर करने योग्य)।