Skip to content

About

A local-first, cross-device sharing app that allows a phone to become a temporary secure file server on the current Wi-Fi or local hotspot.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Erebrus Drop

Current version: 1.1.0+11

Erebrus Drop is a local-first file and text sharing app for nearby devices. A phone can create a temporary Drop Room on the current Wi-Fi network or hotspot, and other devices can join from the mobile app or a browser without an account or cloud upload.

Get Erebrus Drop on Google Play

What It Does

  • Create a local Drop Room over Wi-Fi or hotspot.
  • Discover nearby Drop Rooms with mDNS on Android and iOS.
  • Share files, folders, text, and streamable media on the local network.
  • Receive Android and iOS share-sheet text and files into Smart Send or a live room.
  • Join from the app, a QR code, a Drop Link, or the bundled browser client.
  • Download selected browser files or folders as ZIP bundles.
  • Connect WebDAV clients to a live Drop Room through the /dav endpoint.
  • Scan Drop Room QR codes with native Android and iOS camera scanners.
  • Pull files from a joined room directly into a live hosted room.
  • Use optional room passwords and scoped folder access.
  • Save received files to the platform-appropriate user-visible location.
  • Transfer directly on your local network, or explicitly use Erebrus nodes for global reach.
  • Grab videos, audio and photos from public links (YouTube, X, TikTok, Reddit, Bluesky, Vimeo, SoundCloud, direct/HLS links) entirely on-device, finished with a bundled FFmpeg.

App Surfaces

  • Home: start or resume the current Drop Room.
  • Rooms: discover and join nearby Drop Rooms.
  • Library: view, share, and delete hosted files.
  • Smart Send: send quick text into a room.
  • Grab: paste or share a public media link and save it as video, audio (MP3 or original) or muted video straight into the Drop folder or live room.
  • Settings and About (gear on Home; rail entry on desktop): app details, privacy, terms, and NetSepio ethos.

Grab engine notes

  • Extractors live in lib/features/media_grab/extractors/ and talk to each site's public endpoints; YouTube uses youtube_explode_dart. Video+audio merging, MP3 encoding, muting and HLS remuxing run through ffmpeg_kit_flutter_new_full (LGPL build, no GPL codecs).
  • DRM-protected streams (e.g. most Vimeo HLS today) are refused rather than decrypted.
  • Reddit may answer anonymous requests with a bot challenge on some networks; set REDDIT_CLIENT_ID to use Reddit's official app-only OAuth instead.
  • integration_test/media_grab_test.dart exercises the full pipeline on a device (network).

What's New in 1.1.0+11

  • Phone-friendly browser room — on phones the browser client now has a bottom tab bar, a one-tap Upload button that opens the file picker directly (no separate "choose, then upload" step), a per-file queue with Cancel, and a free-space chip in the header. Rows show type and size, tapping a file selects it, and a Save bar downloads the selection. Desktop browsers can drop files anywhere on the page.
  • Storage checks before transfers — uploads, joined-room downloads, pulls into a live room, share-sheet imports and Grab downloads check free space first and explain the shortfall ("only 1.2 GB free, this needs 3.4 GB") instead of starting and stalling when the disk fills. Files over the room's 2 GB limit are named up front. The host rejects oversized or over-capacity uploads before reading the body and closes the connection, flushes uploads to disk as they arrive so a full disk fails fast, and reports a full disk as such (HTTP 507) rather than as an access error.
  • Room permissions are enforced — the "Guests can" choice (View only, Download only, Upload only, Media streaming only, Upload and download) is now enforced by the host for the browser API, WebDAV and room-to-room pull/push; previously it was only advertised. The browser client hides actions the room does not allow. "Drop folder only" keeps full access inside the selected folder.
  • Smooth streaming from the Drop folder — on Android, files in the selected Drop folder are now served in place through a native ranged reader instead of being copied to the cache for every request, so seeking in a video is instant and never fills storage; desktop hosts read the folder directly, and other hosts reuse one cached copy across range requests. Suffix and out-of-range Range headers are now handled correctly (206/416), and multipart uploads stream to disk instead of being held in memory.
  • Simpler flows — Start Room shows only the essentials (network, Drop folder, password) with name, access and Burn Mode under More options; Back returns to Home before leaving the app and only asks for confirmation while a room is live; stopping a room with guests connected asks first; tapping the room QR enlarges it; shorter copy across Home and Library.
  • Fixes — Android file picking no longer copies large files on the UI thread and cleans up its cache copies; joined-room transfers run one at a time; errors read as plain sentences instead of Bad state: {"error": …}; a failed Smart Send save, share-sheet import or mDNS publish is reported instead of silently failing; stopping a room always stops the server even if a native cleanup step fails; the browser client handles expired sessions, escapes file and folder names, and can no longer send empty notes.

Previously in 1.0.10+10

  • Grab: save media from public links — a new Grab tab downloads videos, audio and photos from YouTube, X, TikTok, Reddit, Bluesky, Vimeo, SoundCloud and direct/HLS links, entirely on-device (no NetSepio or third-party backend). Choose Video, Audio (MP3 or original) or Muted, from 360p up to 4K; 1080p and below are always H.264 MP4, and 1440p/4K are labelled WebM. Files land in the Drop folder or the live room, audio is tagged with title and artist, and links shared into the app from supported sites open in Grab automatically. DRM-protected streams are refused, not decrypted.
  • Settings moved behind a gear — Settings now opens from the gear on Home (full screen with a back arrow) to make room for Grab in the bottom bar; desktop keeps it in the side rail, reachable with Cmd/Ctrl+, or Cmd/Ctrl+6 (Cmd/Ctrl+5 now opens Grab).
  • Buttons fit small screens — buttons, toggles and trailing actions size down on narrow phones and shrink their label instead of wrapping or overflowing, with large system text capped inside buttons; verified at 320 px wide with 130% text.
  • Clearer Settings and About — the Settings footer reads the app version from pubspec.yaml instead of a hardcoded value, the toggles are now "Require password" and "Burn Mode", and About lists current features grouped as Nearby, Global, Grab and Everywhere. Privacy and Terms cover how Grab works and who is responsible for downloaded content.

Previously in 1.0.9+9

  • Burn Mode rooms now auto-expire — rooms started with Burn Mode enabled shut down automatically at their two-hour deadline (previously the deadline was recorded but never enforced), and the host dashboard shows a live "Expires in" countdown. Enforcement also catches rooms whose deadline passed while the app was backgrounded, tearing them down on resume.
  • Redeem invite codes — Settings now has an Invite code field to redeem a friend's referral code while signed in, so both of you are credited for the invite once you qualify.
  • True macOS menu-bar mode — Erebrus Drop no longer occupies the Dock. Closing the window keeps the app running in the menu bar, whose tray icon is the sole way to reopen it; Quit remains available from the tray menu.
  • Corrected Google sign-in — updated the Google server client ID used to verify Google sign-in tokens.

Previously in 1.0.8+8

  • Reliable session expiry handling — authenticated 401 responses now sign out once, clear persisted credentials, and explain that the session expired, while 403, network, and server failures remain recoverable; stored sessions are revalidated on launch and resume.

Previously in 1.0.7+7

  • Live room tray status — the desktop tray icon is muted while idle and switches to the full adaptive black/white macOS glyph while a Drop Room is live.
  • Cleaner desktop sign-in — browser sign-in is now the primary action; clipboard-token recovery appears only when the browser callback does not return automatically.
  • Clearer local and global sharing language — onboarding, Home, Library, Smart Send, organization selection, and account status now describe nearby rooms and optional Erebrus node sharing consistently.
  • Desktop-first workspaces — large Library and Smart Send views use split panes, the navigation rail shows live-room status, files can be dragged into Home or Send, and Cmd/Ctrl shortcuts cover tabs, refresh, and new rooms.
  • Persistent live Drop Rooms during sharing — receiving a file through the Android or iOS share flow no longer treats Flutter UI recreation as a request to stop the active room.
  • Cleaner repository metadata — macOS .DS_Store files are ignored throughout the repository.

Previously in 1.0.6+6

  • Configurable IPFS gateway — choose a preset (Erebrus, Cloudflare, Pinata, IPFS.io) or enter a custom gateway URL in Settings.
  • User-selected Drop folder — all gateway downloads save to the folder you pick through the system file picker.
  • Persistent macOS folder access — sandbox-safe security-scoped bookmarks preserve access to the selected Drop folder across launches.
  • Cleaner Settings — removed the Solana dApp Store wallet card and the "Private by design" promo block.
  • Google and Apple sign-in — native social login is available when enabled by the gateway, with Apple sign-in supported on iOS and macOS.
  • Reliable desktop browser sign-in — erebrusdrop:// callbacks return to the running app automatically on macOS, Windows, and Linux, including Google, Apple, and email accounts without a linked wallet; manual token paste remains available as a fallback.
  • Safer sign-in navigation — every platform can return from the sign-in screen and continue as a guest if login is cancelled or fails.
  • Better wallet sign-in — improved Solana Mobile Wallet and Reown message signing, waits for Reown readiness before enabling its action, and fixes the Erebrus Drop logo shown during wallet connection.
  • Safer sign-out — signing out now requires confirmation and uses the existing Erebrus visual language.
  • Sign-in legal links — both Terms and Privacy Policy are now linked on the sign-in screen.

Release

Current release version:

1.1.0+11

Android release versioning:

  • The number after + is the Android versionCode.
  • Google Play permanently reserves any uploaded versionCode, even if the draft/release is discarded.
  • Always increase the + build number before uploading another AAB.

The Android package id is:

com.erebrus.drop

Android uses two deploy flavors:

Flavor Output Store
playstore AAB Google Play
dappstore APK Solana dApp Store

Both signing blocks live in one file:

android/key.properties

Template:

android/key.properties.example

Full signing and publish commands:

docs/solana-dapp-store-release.md

Build commands:

# Debug Android defaults to playstore (no --flavor needed)
flutter run

# Google Play
flutter build appbundle --flavor playstore --release

# Solana dApp Store
flutter build apk --flavor dappstore --release

Desktop (macOS / Windows / Linux)

Erebrus Drop ships on macOS, Windows, and Linux as well: system tray, responsive layout, mDNS room discovery, folder library, automatic browser authentication callbacks, and hide-to-tray on close.

Generate brand assets (tray icons, Dock/taskbar launcher icons, macOS About icon, Linux window icon) before a desktop release build:

python3 scripts/generate-desktop-assets.py

This runs tray icon generation and dart run flutter_launcher_icons for macOS/Windows/Android/iOS launcher icons from assets/images/erebrus-glossy.png.

Linux builds require libsecret-1-dev; installed apps need libsecret-1-0 and an unlocked Secret Service keyring (GNOME Keyring or KWallet).

Persistent gateway authentication and recovery behavior are described in Gateway sessions.

Dev:

flutter pub get
python3 scripts/generate-desktop-assets.py   # first time or after logo changes
flutter run -d macos                       # or windows / linux

Release bundles (writes versioned artifacts under dist/):

./scripts/build-desktop.sh macos
./scripts/build-desktop.sh windows
./scripts/build-desktop.sh linux
./scripts/build-desktop.sh all             # macOS host; skips unavailable targets

Full desktop setup, packaging, and CI notes: docs/BUILD.md.

Development

Install dependencies:

flutter pub get

Copy the example environment file and fill in any missing values:

cp env.example .env

Key variables:

  • REOWN_PROJECT_ID — required for wallet/social login.
  • GATEWAY_URL — Erebrus gateway base URL (default https://gateway.erebrus.io).
  • IPFS_GATEWAY_URL — public IPFS gateway for CID downloads (default https://ipfs.erebrus.io).

Run the app with .env dart-defines (recommended):

scripts/build.sh run

Or run directly with Flutter:

flutter run --dart-define-from-file=.env

Android Studio / IntelliJ: the green Run button calls flutter run directly, so add --dart-define-from-file=.env to the run configuration’s Additional run args. For the Build APK action also include a flavor, e.g. --dart-define-from-file=.env --flavor playstore or --flavor dappstore.

The scripts/build.sh build-apk and build-appbundle commands default to the playstore flavor automatically.

Verify:

flutter analyze
flutter test

CI/CD

GitHub Actions:

  • CI — flutter analyze and flutter test on every PR and main push
  • Release — runs when a v{semver} tag matching pubspec.yaml is pushed. Builds Android APKs signed with the Play Store and dApp Store keys, the Play Store App Bundle (.aab) for the Play Console, plus Windows .zip and Linux .tar.gz bundles (macOS .zip once the repo variable ENABLE_MACOS_BUILD=true and Apple signing are set up), and publishes a GitHub Release with erebrus-drop-manifest-<tag>.json (asset sizes, SHA-256, signing certificates) and erebrus-drop-sha256sums-<tag>.txt. A manual Run workflow builds the same artifacts without publishing.

Release secrets (Actions): PLAYSTORE_KEYSTORE_BASE64, PLAYSTORE_STORE_PASSWORD, PLAYSTORE_KEY_ALIAS, PLAYSTORE_KEY_PASSWORD, the same four DAPPSTORE_* values, and REOWN_PROJECT_ID. The other .env keys in env.example are read from secrets or repo variables of the same name when set.

Release checklist:

  1. Bump version: in pubspec.yaml (e.g. 1.1.0+11).
  2. Run python3 scripts/generate-desktop-assets.py if brand images changed.
  3. Commit and push to main.
  4. Tag and push: git tag -a v1.1.0 -m "Erebrus Drop 1.1.0" && git push origin v1.1.0.
  5. Download artifacts from GitHub → Releases when the run finishes.

See docs/BUILD.md.

Native QR Scanner

The app uses its own platform-channel QR scanner instead of a third-party Flutter scanner plugin. Android uses CameraX with ZXing QR decoding. iOS uses AVFoundation QR metadata scanning. The scanner returns the raw Drop Link or Drop Code to Flutter, where the existing join parser validates and opens the room.

Local Network Debugging

Browse for advertised Drop Rooms on macOS:

dns-sd -B _erebrusdrop._tcp local

Resolve a discovered room:

dns-sd -L "<device name>" _erebrusdrop._tcp local

Check the room API:

curl http://<room-ip>:8787/api/room

Privacy

Erebrus Drop is local-first. Nearby Drop Rooms transfer directly over your Wi-Fi or hotspot without sending their contents to Erebrus services. Global Send is a separate, explicit path that uploads the file you choose to the selected Erebrus node. Grab downloads public media straight from the site that hosts it; links and grabbed files never pass through NetSepio or Erebrus services, and processing happens on the device.

Erebrus Drop does not collect analytics, advertising identifiers, contact lists, or location history. Global features necessarily process the active account session, selected node or organization, and explicitly uploaded file.

Erebrus Platform, brand, and apps are products of NetSepio.

About

A local-first, cross-device sharing app that allows a phone to become a temporary secure file server on the current Wi-Fi or local hotspot.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages