Float is a self-hosted shared transfer room built around one giant animated bubble. You unlock it with a shared password, drop files or paste text into the bubble, and those items float live across devices until the room policy removes them or someone clears them.
- Full-screen bubble room with dark, light, and auto theme support
- Desktop drag and drop plus direct paste for copied text
- Mobile-friendly tap flow for file upload or text paste
- Password-gated room entry with password-confirmed settings modal
- Persistent disk-backed storage for files and pasted text
- Live cross-device sync with WebSockets
- Lifetime modes for keep until deleted, delete on first download, or timed expiry
- Share link and QR card in settings
- Linux
systemdinstaller with custom port prompt
-
Install dependencies:
npm install
-
Create a runtime config:
FLOAT_PASSWORD="your-password" npm run init-config -- \ --bind-host 0.0.0.0 \ --port 3000 \ --public-base-url http://localhost:3000 \ --storage-path ./storage -
Start the server:
npm start
-
Open the app in your browser and enter the shared password.
Run the guided installer on Linux:
chmod +x install.sh
./install.shIt prompts for:
- bind host
- port
- public base URL
- storage path
- shared password
systemdservice user
The installer writes config/runtime.json, installs dependencies, creates a float.service unit, and starts it when systemd is available.
npm startstarts the Float servernpm testruns the automated server testsnpm run init-config -- ...writes a hashed runtime configFLOAT_PASSWORD="new-password" npm run set-password -- --config /path/to/runtime.jsonupdates the stored password hash./update-after-pull.shrefreshes dependencies, reruns tests, and restartsfloat.servicewhen present
- Runtime config is intentionally not committed and lives at
config/runtime.json - For public internet use, put Float behind HTTPS with a reverse proxy
- If you use a reverse proxy, forward the original
HostandX-Forwarded-Protoheaders when possible - Origin enforcement is relaxed by default to avoid blocking common proxy setups. If you want strict origin checking, add
"strictOriginCheck": truetoconfig/runtime.json - The server targets Node.js 18 or newer