Меня достала реклама в торрент-клиентах. Я открываю такую программу с довольно скромным намерением: скачать файл, посмотреть скорость и свернуть окно. Предложение купить что-нибудь ещё в этот сценарий у меня не помещается.
В какой-то момент захотелось сделать клиент под себя. С приятным интерфейсом, выбором файлов перед загрузкой и нормальным поведением в фоне. Так появился Tern, бесплатный торрент-клиент для Windows с открытым кодом под MIT.
На момент написания статьи опубликована версия 1.2.0. По пути к ней пришлось разбираться с зависаниями на больших торрентах, ценой красивой полоски прогресса и удалением файлов. Последнее оказалось заметно сложнее, чем нарисовать кнопку с корзиной.

Интерфейс Tern с демонстрационными загрузками. Скриншоты в статье сделаны на тестовых данных; показанные скорости не являются результатами бенчмарка.
Реклама была первым поводом
У µTorrent Classic отсутствие рекламы выделено в отдельную платную редакцию Ad-Free. Это можно увидеть прямо на странице сравнения версий. Я понимаю, что разработку нужно оплачивать. Просто у меня нет желания видеть рекламу внутри утилиты для скачивания файлов.
При этом хорошие альтернативы уже существуют. qBittorrent открыт и не содержит рекламы, а у Transmission прямо заявлены отсутствие рекламных дополнений и отслеживания пользователей. Для избавления от баннеров вполне достаточно установить один из них.
Собственный клиент понадобился мне ещё и потому, что хотелось самому определять, как он выглядит и ведёт себя. Какие действия доступны из главного окна, что происходит после нажатия на крестик, как устроено обновление. И иметь возможность исправить то, что раздражает.
Я хотел оставить в центре внимания загрузки: название, состояние, скорость, оставшееся время, нужные файлы. Настройки очереди и ограничения скорости тоже нужны, но открывать их при каждом запуске я не собираюсь. Из этих довольно бытовых пожеланий и сложился Tern.
Как это выглядит в работе
Tern принимает .torrent-файлы и magnet-ссылки. Перед началом загрузки можно выбрать папку и убрать галочки с ненужных файлов. Набор скачиваемых файлов можно изменить и позже: например, сначала скачать один файл из раздачи, а потом вернуться за остальными.
В главном окне есть список торрентов, поиск, сортировка и фильтры по состоянию. Под выбранной загрузкой открывается панель с файлами, трекерами и сведениями о раздаче. Там же можно поставить торрент на паузу или изменить его место в очереди.
Вместо сплошной полосы прогресса я добавил карту частей торрента. Она показывает, как собирается загрузка: в списке это узкая полоса, в подробностях ещё и небольшая мозаика. В работающем клиенте рисунок строится по состоянию частей. Мне нравится, что по нему видно чуть больше, чем просто «62%».
Светлая и тёмная темы следуют настройке Windows. Интерфейс сейчас на русском.

Светлая тема, те же демонстрационные данные.
Из повседневных вещей есть ограничения скорости скачивания и отдачи, лимит одновременных загрузок, раздача после завершения и необязательный автозапуск вместе с Windows.
Tern можно назначить обработчиком .torrent и magnet:. Кнопка «Сделать по умолчанию» регистрирует приложение и открывает настройки Windows. Сам выбор остаётся за пользователем.
Да, внутри Electron
Стек проекта: Electron, обычные HTML/CSS/JavaScript для интерфейса и WebTorrent в качестве торрент-движка. За обновления отвечает electron-updater.
Готовый движок дал возможность сосредоточиться на приложении: интерфейсе, работе с файлами, интеграции с Windows. Реализацию BitTorrent с нуля я не писал. WebTorrent работает внутри настольного приложения и подключается к обычным BitTorrent-пирам.
У Electron есть цена в размере дистрибутива и памяти. Поэтому называть Tern самым лёгким торрент-клиентом я не буду. Для меня практический вопрос был в том, какую лишнюю работу приложение делает, пока я им не пользуюсь.
При закрытии в трей Tern уничтожает окно и освобождает его renderer. При повторном открытии создаёт окно заново. Пока видимого окна нет, движок не собирает снимки состояния для списка загрузок, а служебный таймер приложения работает реже. Скачивание и раздача при этом продолжаются.
Это убирает работу, которая нужна только интерфейсу. Сеть, запись на диск и проверка данных всё равно требуют ресурсов, даже если окно закрыто.
Потом мой клиент сам начал тормозить
На больших торрентах и высокой скорости ранние версии Tern начали подвисать. Получилось неловко: хотелось удобную утилиту, а пришлось чинить свою.
Одна из причин была в повторных обходах частей торрента. После получения очередной части движок мог снова просматривать длинный уже проверенный участок файла. Отдельно похожую работу делали проверки интереса пиров и расчёт прогресса для интерфейса. На большом количестве частей эти проходы становились дорогими.
Добавлялась частота сетевых событий. При 60 МиБ/с блоки размером 16 КиБ поступают примерно 3840 раз в секунду. Если после каждого блока заново запускать часть логики пополнения запросов к пирам, небольшая операция превращается в постоянную нагрузку.
В результате в Tern появились несколько изменений:
Сеть, хеширование и работа с диском вынесены в отдельный
utilityProcessElectron. Главный процесс, который управляет окном, не выполняет эту работу в своём цикле событий.Пополнение запросов к пирам объединяется в короткие пачки с таймером на 5 мс.
Проверки завершения и интереса пиров учитывают уже проверенный префикс, чтобы не проходить его заново.
Список торрентов, вкладка файлов и сохранение состояния используют общий расчёт прогресса.
Проверка хешей при этом осталась включённой.
Для сравнения использовался локальный тест: Windows x64, Ryzen 7 5700X, файл 256 МиБ, части по 4 МиБ и шесть пиров на loopback. Лимит передачи составлял 60 МиБ/с. Выполнены три парных прогона, порядок старого и нового вариантов чередовался.
Показатель |
База 1.0.2 |
Оптимизации 1.0.3 |
|---|---|---|
Среднее процессорное время движка на передачу |
1,932 с |
1,510 с |
Средняя скорость |
59,56 МиБ/с |
60,36 МиБ/с |
Максимальные задержки цикла событий в трёх прогонах |
516 / 586 / 541 мс |
28 / 31 / 30 мс |
В этом тесте среднее процессорное время уменьшилось на 21,8%, а полусекундные задержки перестали воспроизводиться. На коротких задержках p95/p99 заметного улучшения не было. Размер и SHA-256 скачанных файлов проверялись.
Эти цифры относятся к движку в конкретном локальном тесте. Они не включают весь интерфейс приложения и не предсказывают результат многочасовой загрузки из интернета. Сравнения с qBittorrent или Transmission здесь тоже нет. Условия, исходные измерения и команду запуска я сохранил в отчёте о производительности.
Есть и цена сопровождения: часть оптимизаций опирается на внутренние методы WebTorrent. Его версия закреплена в зависимостях, а при обновлении движка эти места нужно проверять заново.
Проверка файлов тоже умеет загрузить компьютер
Скачивание оказалось только одной частью задачи. Когда клиент открывает уже существующие файлы и проверяет их целостность, он может активно читать диск и считать хеши, хотя скорость сетевой загрузки равна нулю.
Для этой операции в Tern есть отдельный общий лимит: по умолчанию 256 МиБ/с на все проверяемые торренты. Его можно изменить в настройках или убрать, выставив ноль. К ограничению скорости скачивания он отношения не имеет.
При таком ограничении полная проверка может занимать больше времени. Это осознанный компромисс: мне важнее продолжать пользоваться компьютером во время проверки большого объёма данных. В интерфейсе её прогресс показывается отдельно от скачивания. Методика и результаты тестов этой части лежат в отдельном отчёте.
Удаление, обновления и несколько ограничений
В версии 1.2.0 появилось подтверждение удаления. По умолчанию галочка удаления файлов снята: торрент исчезает из списка, а скачанные данные и исходный .torrent остаются на диске.
Если отметить галочку, Tern отправит скачанные файлы и сохранённый исходный .torrent в корзину Windows. Исходный путь известен для новых импортов обычных .torrent-файлов; у magnet-ссылок и старых записей его может не быть.
Перед отправкой в корзину клиент проверяет пути и принадлежность файлов. Общие файлы других торрентов, изменившийся исходник и небезопасные пути он сохраняет. Если часть файлов удалить не удалось, показывает предупреждение. Подробности поведения описаны в документации удаления.
Обновления приходят из GitHub Releases. Установленное приложение проверяет их перед запуском торрент-движка. Если новая версия есть, скачивает её и перезапускается после установки. При ошибке проверки или загрузки можно повторить попытку либо запустить установленную версию. Дополнительные фоновые проверки отключаются в настройках; проверка при запуске при этом остаётся.
Рекламы и телеметрии в Tern нет. Список загрузок и настройки хранятся локально. Приложение, конечно, общается с торрент-сетью и обращается к GitHub за обновлениями.
Проект пока небольшой. Готовая сборка рассчитана на Windows 10/11 x64, интерфейс доступен только на русском, uTP и web seeds отключены. У установщика ещё нет цифровой подписи, поэтому Windows SmartScreen может показывать предупреждение. SHA-256 опубликован в описании релиза и позволяет сверить скачанный файл, но цифровую подпись не заменяет.
Где попробовать и что мне интересно услышать
Скачать установщик можно со страницы последнего релиза. Исходники, инструкция по сборке и история изменений находятся в репозитории Tern.
Если попробуете клиент, мне особенно полезны конкретные неудобства: где непонятен статус, каких действий не хватает в главном окне, как ведёт себя приложение на больших раздачах. Ошибки можно описать в Issues, а изменения предложить через pull request; для этого есть инструкция для участников.
И мне интересно, что раздражает вас в торрент-клиентах помимо рекламы. Из моих претензий уже получилась отдельная программа. Возможно, следующий полезный пункт обнаружится в комментариях.
Комментарии (16)

Arenoros
05.10.2026 10:19чет не вижу я рекламы в qbittorrent

MAXH0
05.10.2026 10:19Зато там есть "ключевой недостаток" (с)

sintech
05.10.2026 10:19Что за недостаток мы конечно-же не узнаем. Какое-то программирование ради программирования.
Мне вот в qbittorent не хватает фичи автоматического назначения категории по regexp адреса трекера, но пилить только для этого свой клиент и еще на Electron это перебор.

9982th
05.10.2026 10:19Речь идет про фатальный недостаток, за рубежом известный как Not Invented Here.

highter
05.10.2026 10:19Жаль что нет на маке готовой сборки, я бы поставил. Если честно - боль такая же - достала реклама

TheRaven
05.10.2026 10:19Внезапно, для веб-интерфейса qbittorrent есть возможность делать свои шкурки, если не нравится стандартный интерфейс.
Сколько сотен раздач вы пробовали одновременно запускать на своём? И присоединяюсь к вопросу из первого коммента.

LeshaRB
05.10.2026 10:19Меня дико интереусует удаленное управление transmission
Аля https://github.com/equeim/tremotesf2
В планах есть?

dmitry001X
05.10.2026 10:19Это вроде тот самый соник, которому аккаунты по КД банят, и он свой нейрослопные продукты каждый раз на новых аккаунтах заливает?

TheRaven
05.10.2026 10:19Судя по гиту перед нами виртуал вот этого юзернейма https://habr.com/ru/users/by-sonic/articles/

IDDQDesnik
05.10.2026 10:19У µTorrent Classic отсутствие рекламы выделено в отдельную платную редакцию Ad-Free.
Достаточно не полениться зайти в настройки и выключить пару опций.

digrobot
05.10.2026 10:19Поменяю ли я клиент размером 400 Кб, который меня полностью устраивает, на другой, с теми же самыми функциями, весящий 113 Мб в архиве?

Grynder
05.10.2026 10:19In the browser, WebTorrent uses WebRTC (data channels) for peer-to-peer transport. It can be used without browser plugins, extensions, or installations. It's Just JavaScript™. Note: WebTorrent does not support UDP/TCP peers in browser.
Интересно, торренты по WebRTC :)
MAXH0
Это слоп-программирование или всё руками?
naky
Там коммиты в тысячи LOC по несколько раз на дню.
Да и какая разница? Оно всё равно на электрон.