Your files. Your devices. One local network.
Encrypted file, text and link transfer between macOS and Android — without cloud storage or accounts.
Downloads · What's new · Testing · CLI · Security
Connect over Wi-Fi, confirm the matching code and start sharing. QR pairing stays available as an alternative. Android now has dedicated Connections, Receive, Send and Text tabs, with refreshed received-file cards and Open/Share actions. The Text tab sends a snippet or link to the paired device; received text is copied to the clipboard and kept in an in-memory history with Copy and Open actions.
| Connect | Transfer | Stay in control |
|---|---|---|
| Discover devices on your LAN | Send multiple files in sequence | Confirm a new connection |
| Start pairing from either device | Send text and links from the clipboard | Cancel selection or transfer |
| Keep QR as an alternative | Choose your destination folder | Remove saved devices |
| Confirm on either screen | Preview received images on Android | Copy or open received text |
Experimental alpha: LAN only; no independent security audit. See the known limitations and test status below before relying on a build.
- Install Nodi on your Mac and Android phone and connect both to the same local network.
- Open Nodi on both devices. Find the other device over Wi-Fi and start connecting.
- Compare the displayed codes and confirm on both screens, or scan the Mac QR on Android.
- On the receiving device, choose a folder and enable receiving. Select files on the sender. Text and links do not need a destination folder; use the Text tab on Android or the text card on Mac.
Android discovery and pairing work before selecting a receiving folder.
Install the Android APK over your existing installation to retain app data when signatures match.
The macOS archive contains Nodi.app; current builds are ad-hoc signed, not notarized.
This source version is 1.0.0-alpha.3 (tag v1.0.0-alpha.3).
See Downloads for published builds.
Use MAJOR.MINOR.PATCH-alpha.N for prereleases and MAJOR.MINOR.PATCH for stable releases.
Android versionName matches the release version; versionCode increases for each distributed build (this build: 3).
macOS uses numeric CFBundleShortVersionString = 1.0.0 and CFBundleVersion = 6;
its release tag identifies the alpha. Increase the build number for each distributed build.
Go 1.22 is the minimum language/toolchain requirement in go.mod, not the app version.
Go 1.23.2 in earlier testing notes described a test environment, not a separate requirement.
Use a maintained Go toolchain for release builds; minimum-version compatibility still needs testing.
- QR pairing and Wi-Fi pairing with comparison-code confirmation; mDNS discovery.
- A connection request can start on either device; the other shows a confirmation prompt.
- Android tabs: Connections, Receive, Send and Text.
- Discovery and pairing do not require an Android destination folder; receiving files does.
- Sequential multi-file sending, cancellation and receiving into a chosen folder.
- Text and link transfer up to 64 KiB, with automatic clipboard copy and a session history of the last 10 items.
- Android received-file preview, Open and Share actions.
- TLS 1.3, certificate fingerprint checks and SHA-256 verification.
- Existing files are not overwritten; up to two incoming transfers and 2 GiB per file.
macOS: macOS 12+, Go 1.22+ and Xcode Command Line Tools.
Run bash scripts/run-macos.sh.
The script detects the active macOS SDK with xcrun and uses a fresh compiler cache.
If your compiler and default SDK differ, set SDKROOT to a compatible installed SDK.
Android: minSdk 29, compileSdk/targetSdk 37. Open android/ in Android Studio,
or run bash ./gradlew assembleDebug inside that directory with Android SDK and compatible JDK installed.
The APK is android/app/build/outputs/apk/debug/app-debug.apk.
Open Nodi on both devices on the same LAN. Use Find in Wi-Fi, select the discovered peer and start connecting. Compare the displayed codes and approve on both screens. QR remains an alternative: show the Mac pairing QR and scan it on Android. Discovery alone does not establish trust. On Android select a destination folder and enable receiving only when files are needed. On Mac the destination can be changed while the receiver is running; the receiver restarts.
No cross-network connection, folder transfer, resume or remote file browsing. Text history is kept in memory only and is lost when the app closes. The Go receiver requires a destination filesystem supporting hard links (for example APFS; FAT/exFAT do not). Android uses a document-provider folder and has separate permission semantics. macOS builds are ad-hoc signed, not notarized; Android alpha builds use debug signing. For known test gaps and the device checklist, see TESTING.md.
On Android, select one or more files in another app, choose Share → Nodi, then choose the paired device and tap Send. Text and links open the Text tab. Up to 100 shared files are accepted; the source app must grant read access. On Mac, drop up to 100 regular files onto the Nodi window, then click Send. Folders are not supported. New shares/drops do not replace an active transfer.
go vet ./...
go test -race ./...
python3 scripts/check-core.py
# Kotlin ↔ Go transport integration (JDK 25, no Android SDK required):
bash android/gradlew -p tests/interop test --no-daemonSee CLI documentation. Windows, Linux desktop apps, cross-network connections, folder transfer and resume remain roadmap items.
Apache-2.0. See LICENSE.