Меня достала реклама в торрент-клиентах. Я открываю такую программу с довольно скромным намерением: скачать файл, посмотреть скорость и свернуть окно. Предложение купить что-нибудь ещё в этот сценарий у меня не помещается.

В какой-то момент захотелось сделать клиент под себя. С приятным интерфейсом, выбором файлов перед загрузкой и нормальным поведением в фоне. Так появился Tern, бесплатный торрент-клиент для Windows с открытым кодом под MIT.

На момент написания статьи опубликована версия 1.2.0. По пути к ней пришлось разбираться с зависаниями на больших торрентах, ценой красивой полоски прогресса и удалением файлов. Последнее оказалось заметно сложнее, чем нарисовать кнопку с корзиной.

Главное окно Tern в тёмной теме
Главное окно Tern в тёмной теме

Интерфейс Tern с демонстрационными загрузками. Скриншоты в статье сделаны на тестовых данных; показанные скорости не являются результатами бенчмарка.

Реклама была первым поводом

У µTorrent Classic отсутствие рекламы выделено в отдельную платную редакцию Ad-Free. Это можно увидеть прямо на странице сравнения версий. Я понимаю, что разработку нужно оплачивать. Просто у меня нет желания видеть рекламу внутри утилиты для скачивания файлов.

При этом хорошие альтернативы уже существуют. qBittorrent открыт и не содержит рекламы, а у Transmission прямо заявлены отсутствие рекламных дополнений и отслеживания пользователей. Для избавления от баннеров вполне достаточно установить один из них.

Собственный клиент понадобился мне ещё и потому, что хотелось самому определять, как он выглядит и ведёт себя. Какие действия доступны из главного окна, что происходит после нажатия на крестик, как устроено обновление. И иметь возможность исправить то, что раздражает.

Я хотел оставить в центре внимания загрузки: название, состояние, скорость, оставшееся время, нужные файлы. Настройки очереди и ограничения скорости тоже нужны, но открывать их при каждом запуске я не собираюсь. Из этих довольно бытовых пожеланий и сложился Tern.

Как это выглядит в работе

Tern принимает .torrent-файлы и magnet-ссылки. Перед началом загрузки можно выбрать папку и убрать галочки с ненужных файлов. Набор скачиваемых файлов можно изменить и позже: например, сначала скачать один файл из раздачи, а потом вернуться за остальными.

В главном окне есть список торрентов, поиск, сортировка и фильтры по состоянию. Под выбранной загрузкой открывается панель с файлами, трекерами и сведениями о раздаче. Там же можно поставить торрент на паузу или изменить его место в очереди.

Вместо сплошной полосы прогресса я добавил карту частей торрента. Она показывает, как собирается загрузка: в списке это узкая полоса, в подробностях ещё и небольшая мозаика. В работающем клиенте рисунок строится по состоянию частей. Мне нравится, что по нему видно чуть больше, чем просто «62%».

Светлая и тёмная темы следуют настройке Windows. Интерфейс сейчас на русском.

Главное окно Tern в светлой теме
Главное окно Tern в светлой теме

Светлая тема, те же демонстрационные данные.

Из повседневных вещей есть ограничения скорости скачивания и отдачи, лимит одновременных загрузок, раздача после завершения и необязательный автозапуск вместе с 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 появились несколько изменений:

  • Сеть, хеширование и работа с диском вынесены в отдельный utilityProcess Electron. Главный процесс, который управляет окном, не выполняет эту работу в своём цикле событий.

  • Пополнение запросов к пирам объединяется в короткие пачки с таймером на 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; для этого есть инструкция для участников.

И мне интересно, что раздражает вас в торрент-клиентах помимо рекламы. Из моих претензий уже получилась отдельная программа. Возможно, следующий полезный пункт обнаружится в комментариях.

Комментарии (15)


  1. MAXH0
    05.10.2026 10:19

    Это слоп-программирование или всё руками?


    1. naky
      05.10.2026 10:19

      Там коммиты в тысячи LOC по несколько раз на дню.

      Да и какая разница? Оно всё равно на электрон.


  1. Arenoros
    05.10.2026 10:19

    чет не вижу я рекламы в qbittorrent


    1. MAXH0
      05.10.2026 10:19

      Зато там есть "ключевой недостаток" (с)


      1. sintech
        05.10.2026 10:19

        Что за недостаток мы конечно-же не узнаем. Какое-то программирование ради программирования.

        Мне вот в qbittorent не хватает фичи автоматического назначения категории по regexp адреса трекера, но пилить только для этого свой клиент и еще на Electron это перебор.


        1. 9982th
          05.10.2026 10:19

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


  1. highter
    05.10.2026 10:19

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


    1. withkittens
      05.10.2026 10:19

      https://www.qbittorrent.org/, и не морочьте себе голову.


  1. TheRaven
    05.10.2026 10:19

    Внезапно, для веб-интерфейса qbittorrent есть возможность делать свои шкурки, если не нравится стандартный интерфейс.

    Сколько сотен раздач вы пробовали одновременно запускать на своём? И присоединяюсь к вопросу из первого коммента.


  1. LeshaRB
    05.10.2026 10:19

    Меня дико интереусует удаленное управление transmission

    Аля https://github.com/equeim/tremotesf2

    В планах есть?


  1. dmitry001X
    05.10.2026 10:19

    нейрослоп


  1. dmitry001X
    05.10.2026 10:19

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


    1. TheRaven
      05.10.2026 10:19

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


  1. IDDQDesnik
    05.10.2026 10:19

    У µTorrent Classic отсутствие рекламы выделено в отдельную платную редакцию Ad-Free.

    Достаточно не полениться зайти в настройки и выключить пару опций.


  1. digrobot
    05.10.2026 10:19

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