A graphical file sharing tool based on dufs. Zero config, zero barrier — run inout on one device, and anyone with a browser can access and transfer files. The other side needs no app.
The other side doesn't need an app. Install inout 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 |
| ⬆️⬇️ 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 |
| 🎨 Customizable | 6 color schemes + dark / light mode |
| 🌐 Multilingual | 简体中文 · 繁體中文 · English |
| 📦 Zero setup | Self-contained — no external dependencies |
| Scenario | How |
|---|---|
| 🏠 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 | inout-*-windows-x64-setup.exe (installer) or .zip (portable) |
✅ Tested |
| 🤖 Android | inout-*-android-arm64.apk |
✅ Tested |
| 🐧 Linux x64 | .AppImage (zero deps) or .deb |
✅ Tested |
| 🐧 Linux ARM64 | .AppImage or .deb (Kylin/UOS compatible) |
✅ Tested |
| 🍎 macOS | inout-*-macos-arm64.zip |
🤖 Also available on F-Droid (pending review)
- Pick a folder
- Tap "Start Server"
- Scan QR code or enter URL in browser (port required)
- Share files — done!
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.
⚠️ inout 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 → inout → Permissions → Allow "All files access"
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 inout-*.AppImage
./inout-*.AppImageSymptom: "Can't verify developer" on open
Fix:
xattr -d com.apple.quarantine inout.appSymptom: Other devices can't connect
Fix: Allow inout through Windows Firewall (you'll be prompted on first launch)
Q: Does the other side need inout? A: No! Only one device runs inout. Others just open a 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/inout.git
cd inout
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).
GitHub Actions builds all platforms on tag push (v*) and creates a release automatically.
lib/
├── main.dart # Entry + window init
├── app.dart # MaterialApp + theming
├── 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
│ ├── settings_page.dart # Settings: theme / color / language
│ ├── setup_wizard_page.dart # First-run wizard
│ └── log_page.dart # Transfer log viewer
└── 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/inout.nsi # Windows NSIS installer
inout is built on top of dufs — a brilliant utility file server by sigoden. Without dufs, inout wouldn't exist. Thanks for making file sharing so simple.
inout — files in and out, that's all.
