
LocalSend — AirDrop, который работает между всем
Файл лежал в двух метрах от меня. На макбуке. Нужен был на рабочей Windows-машине.
Я скинул его себе в «Избранное» в Telegram.
То есть файл поехал на сервер в дата-центр, полежал там, вернулся обратно - и всё это чтобы переместиться на два метра. И так я делаю уже несколько лет, не задумываясь. 🤦
📦 Что это такое
LocalSend - открытый кроссплатформенный обмен файлами по локальной сети. Apache-2.0, 70 тысяч звёзд на GitHub, больше 5 миллионов загрузок, сотня контрибьюторов. Ни рекламы, ни трекеров, ни аккаунта.
Работает на Windows, macOS, Linux, Android, iOS. Ставится откуда угодно: winget, Homebrew, Flathub, AUR, Snap, App Store, F-Droid, обычный .deb.
Никакой регистрации. Открыл на двух устройствах в одной сети - они видят друг друга. Выбрал файл, ткнул в устройство, подтвердил на той стороне. Всё.
🔌 Как это устроено внутри
Мне мало «просто работает», хочется понимать механику. Она приятно скучная.
Устройство кидает UDP-мультикаст на 224.0.0.167, порт 53317 - короткий JSON с алиасом, моделью, типом устройства, версией протокола и отпечатком. Остальные отвечают либо ответным мультикастом, либо POST-запросом на /api/localsend/v2/register.
Дальше обычный REST поверх HTTPS. Отправка в два шага:
POST /api/localsend/v2/prepare-upload
POST /api/localsend/v2/upload?sessionId=...&fileId=...&token=...
Первый запрос согласовывает метаданные и отдаёт токены, второй льёт бинарь - можно параллельно. При желании к prepare-upload цепляется ?pin=123456.
TLS-сертификат генерируется на лету на каждом устройстве, а отпечаток в анонсе - это SHA-256 этого самого сертификата. Он же нужен, чтобы устройство не нашло само себя и чтобы запомнить доверенные.
Спецификация лежит отдельным репозиторием. Текущая версия протокола - 2.1. Мультикаст-адрес выбран из-за ограничений Android на группы - мелочь, но по таким мелочам видно, что протокол писали люди, которые его действительно внедряли.
🖥️ Почему это именно моя боль
У меня три экосистемы одновременно: MacBook Pro, отдельная рабочая машина на Windows 11 LTSC и iPhone. Плюс десяток линуксовых серверов.
AirDrop из этого набора закрывает ровно одну пару.
ЕС сейчас давит на Apple по DMA, чтобы AirDrop открыли для сторонних устройств - Apple это оспаривает в суде. Даже если однажды откроют, это будет ЕС и это будет Apple на своих условиях. LocalSend уже работает, сегодня, между чем угодно.
И второе, что для меня важнее. Привычка «скину через мессенджер» означает, что рабочий файл уезжает на чужой сервер в чужой юрисдикции - просто потому, что так удобнее. Здесь данные не покидают локальную сеть. Совсем.
🆕 Что приехало буквально на днях
Проект долго молчал - после 1.17.0 в феврале прошлого года релизов не было. А в августе прилетело сразу три.
1.18.0 (10 августа) - первый релиз CLI, на той же Rust-библиотеке, что и само приложение. Плюс приём файлов по ссылке через браузер, поддержка IPv6 и проверка контрольных сумм, включённая по умолчанию.
1.18.1 (11 августа) - правки, включая разрешение ACCESS_LOCAL_NETWORK для Android 17+.
1.18.2 (21 августа) - перетаскивание файлов в браузерную страницу приёма, свои HTML-шаблоны этой страницы и запрет следовать за HTTP-редиректами от пиров.
CLI - это то, чего мне не хватало. Приём по ссылке через браузер - тоже: на машину, куда ничего ставить не хочется, теперь можно закинуть файл без установки клиента.
😤 Честно про минусы
Вот что реально может мешать.
Мультикаст режут. На гостевом Wi-Fi, в отелях, в коворкингах почти всегда включена изоляция клиентов - устройства просто не увидят друг друга. Я сам такие сети и настраиваю, так что претензий к LocalSend тут нет, но знать надо. Спасает ручное добавление по IP.
Порт 53317 надо открыть. TCP и UDP, входящий и исходящий. Windows-фаервол и корпоративные политики про это не в курсе.
Доверие строится на отпечатке, а не на центре сертификации. Сертификат самоподписанный по определению - модель «доверяю этому конкретному устройству», а не «доверяю цепочке». Для локалки это нормально, но это не то же самое, что HTTPS в браузере.
Автообновления нет. Разработчики прямо просят ставить через магазин или пакетный менеджер, иначе так и будете сидеть на прошлогодней версии. Учитывая, что в 1.17.0 закрывали path traversal при сохранении файлов - не игнорируйте это.
Что я с этим сделал
Поставил на все четыре устройства: brew install localsend на маке, winget на Windows, из App Store на телефон. Открыл 53317 в фаерволе. Проверил передачу - макбук нашёл телефон за пару секунд.
И убрал из привычки «отправить себе в Избранное».
Формат, кстати, знакомый: про Termius я писал ровно с тем же чувством - инструмент, который закрывает раздражение, о котором ты уже перестал думать, потому что привык.
Такие раздражения самые дорогие. Их не замечаешь.

Комментарии