Skip to content

atomozero/LocalSend

Repository files navigation

LocalSend for Haiku

Native Haiku client for the LocalSend: share files and text messages over LAN with any device (Android, iOS, Windows, macOS, Linux) running LocalSend, without internet and without third-party servers.

LocalSend on Haiku

If LocalSend for Haiku saves you time, consider supporting development: Buy Me A Coffee

Features

  • Native Haiku GUI and CLI clients
  • Secure HTTPS transfers with self-signed TLS certificates
  • Automatic LAN device discovery via multicast
  • Send files and text messages to any LocalSend-compatible device
  • Share files through browser-downloadable links
  • Shared board: publish files once, every Haiku peer on the LAN sees them in real time and can download them (or auto-sync them from favorites)
  • Desktop replicant: a drop zone on your desktop — drop files to publish them on the board, Shift+drop to send them straight to all online favorites
  • Send to circle: one click sends files to every online favorite at once
  • Drag & drop support and Tracker context-menu integration
  • Favorites, transfer history, notifications, and PIN protection — enforced both when receiving and when sending to a PIN-protected peer
  • Integrity-checked transfers: received files are verified against the sender's sha256 and discarded on mismatch
  • BFS MIME type integration for received files
  • Parallel file uploads for improved performance
  • Localized via the Haiku Locale Kit (English, Italian, Japanese, Chinese, Spanish) — the UI follows your system language automatically
  • No external dependencies beyond Haiku system libraries and OpenSSL

Quick start

GUI (recommended)

make
./LocalSend

The GUI window shows discovered devices on the LAN. Select a device and:

  • Click "Send file..." to send files (or drag files onto the window)
  • Click "Send text..." to send a text message
  • Click "Send to circle..." to send files to every online favorite at once
  • Click "Share via link..." to generate a browser-downloadable link
  • Click "Board" to open the shared board window
  • Click to add/remove a device from favorites

Incoming transfers show an accept/reject dialog (favorites are auto-accepted).

The circle and the shared board

The circle is your set of favorite devices (★). Two ways to share with it:

  • Push: "Send to circle..." (or Shift+drop on the desktop replicant) sends the files immediately to every favorite currently online. With "Auto-accept from favorites" enabled on their side, files arrive silently.
  • Board: publish files on your board (drop them on the desktop replicant, or "Board" → "Add files..."). Every Haiku peer on the LAN is notified in under a second, sees the list in its own Board window, and downloads what it wants with a double click. Favorites can enable "Auto-download from favorites' boards" (Settings → Security) to sync new board files automatically — already-downloaded files are remembered and never fetched twice.

The board is served on port 53318 with the standard LocalSend v2.1 download API, so official LocalSend clients (and browsers, via the share link) can also browse and download it.

Who can see the board

Settings → Security → "Board visible to:" controls board access:

  • Everyone (default) — anyone on the LAN can browse and download.
  • Favorites only — restricted to your circle (★).
  • Priority contacts only — restricted to a dedicated, hand-picked allow-list, separate from favorites. This is the tightest option: a favorite does not get board access automatically — you add each PC on purpose. Right-click a device in the list → "Add to priority contacts" (they show a purple dot), and manage the full list — including offline ones — via "Manage priority contacts…". Identity is the device's TLS fingerprint, so it can't be spoofed by renaming.

Access is granted by the peer's fingerprint (Haiku peers send it) or by the IP of a known online device in the chosen list; everyone else gets 403.

Desktop replicant

Enable "Show replicants" in the Deskbar menu, open Settings → Integration, and drag the drop-zone widget onto your desktop. The replicant shows a badge with the number of files on your board and a green dot per online favorite; it survives reboots and keeps working even when the app is closed (drops relaunch it automatically). Right-click it for quick actions, remove it via its dragger menu.

Tracker integration

make install-addon

Right-click any file in Tracker → Add-ons → "Send with LocalSend".

CLI

Send files:

./localsend-send <host> <file> [file...] [--pin PIN] [--port PORT] [--alias NAME]

Receive files:

./localsend-receive [--dir FOLDER] [--port PORT] [--alias NAME] [--pin PIN] [--auto]

Build

Requires Haiku with GCC, OpenSSL (openssl_devel), and standard system libraries (libbe, libnetwork, libtracker).

make                 # builds everything: GUI, CLI tools, add-on, replicants, catalogs
make install-addon   # installs Tracker context menu add-on
make install-catalogs # installs locale catalogs for testing (non-packaged)
make check           # runs all protocol-level unit tests
make test-receive    # receive-side protocol tests only
make test-board      # shared-board protocol tests only
make clean           # removes all build artifacts

Translations

The UI uses the Haiku Locale Kit and follows your system language (Preferences → Locale). Translatable strings are the B_TRANSLATE(...) calls in the source; translations live in locales/<lang>.catkeys.

To add or update a language:

make catkeys              # regenerate locales/en.catkeys after string changes
# copy en.catkeys to locales/<lang>.catkeys and fill in the translations
make catalogs             # compile locales/*.catkeys into .catalog files
make install-catalogs     # install them for local testing

Keep the fingerprint on the first line of each .catkeys identical to en.catkeys — it ties the translations to the exact set of source strings.

Note: the LocalSendDesktop replicant binary is registered in the MIME database by mimeset during the build. If you move it, run mimeset -f LocalSendDesktop on the new location so Tracker can restore the desktop replicant after a reboot.

Protocol conformance

Implements the LocalSend v2.1 protocol and interoperates with the official clients. Discovery uses multicast (224.0.0.167:53317) with the HTTP /register two-way fallback; transfers use HTTPS with a self-signed certificate whose SHA-256 is the device fingerprint.

Endpoints served: /info (v1 and v2), /register, /prepare-upload, /upload, /cancel (upload API) and /info, /prepare-download, /download (download API, used by the shared board and browsers).

Security and robustness details:

  • PIN protection is honored in both directions and on both APIs: the receiver answers 401 until the correct ?pin= is supplied, and the sender prompts for the PIN and retries when a peer requires one.
  • Session/IP binding: upload is accepted only from the same IP that ran prepare-upload; a valid token replayed from another address is rejected with 403.
  • Integrity: when the metadata carries an sha256, the received bytes are hashed and compared before anything touches disk; a mismatch is rejected and discarded.
  • Status codes: prepare-upload returns 200/204/400/401/403/ 409/429, and upload returns 400 for missing parameters (vs. 403 for an invalid token). A generous rate limit answers 429 Too Many Requests to floods.

The download API is centered on the Haiku shared board: its session id is stable (board), so a client that resends ?sessionId= after a refresh resumes the same session, and access is granted by contact identity or, as an alternative, by the configured PIN.

Run the protocol-level unit tests with make check.

Be careful

Developer's Note: This software may contain traces of peanuts and LLM. It has been developed with passion for the Haiku platform.

Support

If you find this project useful, you can buy me a coffee: Buy Me A Coffee

About

Native Haiku client for the LocalSend: share files over LAN with any device

Topics

Resources

License

Stars

11 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors