File sharing made easy. — 让文件分发更轻松。
formerly known as DufsHub · 曾用名 DufsHub
A Dufs-based, lightweight cross-platform file distribution GUI optimized for air-gapped LANs and restricted industrial environments. Built on dufs. Zero config, zero barrier — share a folder or a single file from one device, and anyone with a browser can access and transfer it. The other side needs no app.
The other side doesn't need an app. Install FileInfra on ONE device, start the server, and anyone with a browser can upload and download files.
| Feature | |
|---|---|
| 📱 One device is enough | The rest use a browser |
| 📄 Folder or single file | Share a full directory or just one file |
| ⬆️⬇️ Bidirectional | Upload AND download, not just send |
| 🔗 Just open a link | QR code or URL — that's all the other side needs |
| 🔐 Secure | Optional password auth, CORS control |
| 🔀 Fine-grained permissions | Upload, delete, search, archive download — toggle each one |
| 🎨 Customizable | 6 color schemes + custom color wheel + dark / light mode |
| 🌐 Multilingual | 简体中文 · 繁體中文 · English |
| 📦 Zero setup | Self-contained — no external dependencies |
| Scenario | How |
|---|---|
| 🏭 Factory / industrial offline transfer | One PC starts → operators scan → distribute firmware / logs / docs |
| 🏠 Home file sharing | Phone hotspot → browser access → transfer photos / docs |
| 💼 Office quick transfer | One PC starts → colleagues scan → share project files |
| 🎓 Classroom distribution | Teacher starts → students scan → download courseware |
| 🔧 Device debugging | Embedded device → phone hotspot → download logs |
| 📷 Photo dump | Camera/phone starts → PC bulk downloads |
| Platform | File | |
|---|---|---|
| 🪟 Windows | fileinfra-*-windows-x64-setup.exe (installer) or .zip (portable) |
✅ Tested |
| 🤖 Android | fileinfra-*-android-universal.apk (arm64-v8a · armeabi-v7a · x86_64) |
✅ Tested |
| 🐧 Linux x64 | .AppImage (zero deps) or .deb |
✅ Tested |
| 🐧 Linux ARM64 | .AppImage or .deb (Kylin/UOS compatible) |
✅ Tested |
| 🍎 macOS | FileInfra-*-macos-arm64.zip |
🤖 Also available on F-Droid (pending review)
- Pick a folder or a single file
- Tap "Start Server"
- Scan QR code or enter URL in browser (port required)
- Share files — done!
Recent builds also add a smoother start/stop transition state, so slower devices feel less abrupt when the embedded file server is starting or shutting down.
Simplest setup: All devices on the same WiFi or hotspot.
| Environment | |
|---|---|
| 🏠 Same WiFi | Just connect and share |
| 📱 Phone hotspot | One device creates a hotspot, others join — no router needed |
| 🌍 Remote access | Works with ZeroTier, Tailscale, EasyTier, or any VPN |
🔒 All transfers happen directly between your devices. No data passes through third-party servers.
⚠️ FileInfra binds to all network interfaces by default (0.0.0.0)
| Network | Recommendation |
|---|---|
| Home WiFi | ✅ Safe — LAN only |
| Public WiFi | |
| Corporate network | |
| Public internet | ❌ Not recommended — use VPN instead |
Best practices:
- Enable auth in public environments
- Stop the server when done
- Review access logs periodically
Symptom: Can't list files, "Need all files access permission"
Fix: Settings → Apps → FileInfra → Permissions → Allow "All files access"
The notification's "Send clipboard" button reads the system clipboard, which is only readable by the foreground app on Android 10+ (background reads silently return empty). If the Tools page doesn't update after tapping "Send", bring FileInfra to the foreground and retry. "Pull clipboard" (writing to the system clipboard) is not affected (Android 10+ shows a clipboard-access toast).
Symptom: Start fails, "Port XXX already in use"
Fix: Change port (try 8080–9000 range) or kill the occupying process
Symptom: Double-click does nothing
Fix:
chmod +x fileinfra-*.AppImage
./fileinfra-*.AppImageSymptom: "Can't verify developer" on open
Fix:
xattr -d com.apple.quarantine FileInfra.appSymptom: Other devices can't connect
Fix: Allow FileInfra through Windows Firewall (you'll be prompted on first launch)
Q: Does the other side need FileInfra? A: No! Only one device runs FileInfra. Others just open a browser.
Q: Can I share a single file instead of a whole folder? A: Yes. Choose a single file and FileInfra will expose just that file through the browser.
Q: Can I access it remotely? A: LAN by default. For remote access, use ZeroTier / Tailscale / EasyTier.
Q: Is HTTPS supported? A: Not yet. Planned for a future release.
Q: Max file size? A: No hard limit. Tested with a single 70GB+ archive over gigabit LAN — sustained full bandwidth throughout. Large downloads may have a brief delay while loading file info, which is normal. Actual speed depends on filesystem, disk I/O, and Wi-Fi throughput.
Q: How many devices can connect at once? A: No hard limit — depends on bandwidth and device performance.
Q: Are files uploaded to the cloud? A: No! Everything stays local. Transfers are device-to-device.
- Flutter SDK 3.41+
- Windows: VS Build Tools 2022 (C++ workload)
- Android: Android SDK, NDK
- Linux: clang, lld, llvm, libgtk-3-dev
- macOS: Xcode
git clone https://github.com/zocs/fileinfra.git
cd fileinfra
flutter pub get
# Run (debug)
flutter run -d windows
flutter run -d android
# Build
flutter build windows --release
flutter build apk --release# Linux (x64 or ARM64)
bash scripts/build_linux.sh x86_64
bash scripts/build_linux.sh aarch64
# macOS (ARM64)
bash scripts/build_macos.sh aarch64Output: AppImage, deb, rpm, tar.gz (Linux) and zip (macOS).
# Android release APK (optionally pass signing env vars)
bash scripts/docker_build_android.sh
# Linux x64 packages
bash scripts/docker_build_linux.sh x86_64Notes:
- The Docker workflow currently supports Android and Linux x64 only.
- Windows Docker packaging can be explored later.
- macOS and iOS remain GitHub Actions-only because they require native Apple toolchains.
- The Android Docker image generates
android/local.propertiesinside the container so host SDK paths are not required. - Outputs land under
docker_build/:docker_build/android/outputs/apk/(APKs) anddocker_build/linux/x86_64/outputs/packages/(AppImage/deb/tar.gz).
GitHub Actions builds all platforms on tag push (v*) and creates a release automatically.
lib/
├── main.dart # Entry + window init
├── app.dart # MaterialApp + theming
├── constants.dart # Reverse-domain + MethodChannel constants
├── l10n/app_localizations.dart # i18n (zh/en/zhTW)
├── models/
│ ├── server_config.dart # Config model + persistence
│ └── transfer_log.dart # Transfer log parser
├── pages/
│ ├── home_page.dart # Home: dir / perms / start / QR (multi-address default + per-address QR)
│ ├── settings_page.dart # Settings: theme / color (incl. custom picker) / language
│ ├── setup_wizard_page.dart # First-run wizard
│ └── log_page.dart # Transfer log viewer
├── widgets/
│ └── color_picker_dialog.dart # Hand-rolled HSV color wheel (no deps)
└── services/
├── dufs_service.dart # dufs lifecycle (platform dispatch)
└── dufs_ffi.dart # FFI bindings (desktop)
scripts/
├── build_dufs.sh # Cross-compile dufs (7 platforms)
├── build_linux.sh # Linux packaging (AppImage/deb)
├── build_macos.sh # macOS packaging
└── dufs-ffi/lib.rs # Rust FFI wrapper
android/app/src/main/kotlin/.../DufsForegroundService.kt # Android native service
installer/fileinfra.nsi # Windows NSIS installer
Desktop builds embed dufs through Rust FFI; Android uses a foreground native service to survive Activity recreation on lower-memory devices.
FileInfra is built on top of dufs — a brilliant utility file server by sigoden. Without dufs, FileInfra wouldn't exist. Thanks for making file sharing so simple.
FileInfra — file sharing made easy.
