प्रोडक्ट — 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 टर्मिनल

SFTP डिस्क पर स्टेटलेस कमांड-रनर टर्मिनल — cPanel जैसा एडमिन टूल, बिल्ट-इन और मुफ़्त (या पूरे PTY के लिए अपना ttyd एम्बेड करें)।

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

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

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

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

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

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

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

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

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=

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

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

इंटीग्रेशन

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

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

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

एम्बेड

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

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

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

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

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 एम्बेड-योग्य, सेल्फ-होस्टेड, ब्रिंग-योर-ओन-बकेट संयोजन है।

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

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

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

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