Releases: varyen/detour
Release list
v1.41.0
detour v1.41.0
(no notes)
Packages
detour_1.41.0_all.ipk— panel for OpenWrt/GL.iNet (scripts/UI). On first install it bootstraps the detour feed and then pulls sing-box + tpws-zapret automatically.detour-keenetic_1.41.0_all.ipk— Keenetic/Entware (mipsel) package (on first install it bootstraps our mipsel feed and then pulls sing-box + tpws-zapret automatically; nothing bundled).
Binaries (sing-box + tpws-zapret)
Neither binary is bundled — after the panel package lands, its postinst adds our feed (src/gz detour https://raw.githubusercontent.com/varyen/detour/feed/aarch64 on OpenWrt; feed/mipsel on Keenetic) and installs sing-box + tpws-zapret in the background via detour-update. Build/publish the feed with python3 build_feed.py --version <sb-ver> --tpws-version <zapret-ver> --publish.
Install
Fresh (SSH)
opkg install /tmp/detour_1.41.0_all.ipk
The panel then bootstraps the feed and pulls sing-box + tpws-zapret itself.
Panel update (existing install)
LuCI → Software → Upload detour_1.41.0_all.ipk, or the panel's self-update, or detour-update apply.
Binary updates
Panel → version chip → «Обновление». sing-box: detour-update bins-apply (opkg upgrade sing-box); tpws-zapret: detour-update tpws-apply (opkg upgrade tpws-zapret).
v1.40.2
detour v1.40.2
(no notes)
Packages
detour_1.40.2_all.ipk— panel for OpenWrt/GL.iNet (scripts/UI). On first install it bootstraps the detour feed and then pulls sing-box + tpws-zapret automatically.detour-keenetic_1.40.2_all.ipk— Keenetic/Entware (mipsel) package (on first install it bootstraps our mipsel feed and then pulls sing-box + tpws-zapret automatically; nothing bundled).
Binaries (sing-box + tpws-zapret)
Neither binary is bundled — after the panel package lands, its postinst adds our feed (src/gz detour https://raw.githubusercontent.com/varyen/detour/feed/aarch64 on OpenWrt; feed/mipsel on Keenetic) and installs sing-box + tpws-zapret in the background via detour-update. Build/publish the feed with python3 build_feed.py --version <sb-ver> --tpws-version <zapret-ver> --publish.
Install
Fresh (SSH)
opkg install /tmp/detour_1.40.2_all.ipk
The panel then bootstraps the feed and pulls sing-box + tpws-zapret itself.
Panel update (existing install)
LuCI → Software → Upload detour_1.40.2_all.ipk, or the panel's self-update, or detour-update apply.
Binary updates
Panel → version chip → «Обновление». sing-box: detour-update bins-apply (opkg upgrade sing-box); tpws-zapret: detour-update tpws-apply (opkg upgrade tpws-zapret).
v1.40.1
detour v1.40.1
(no notes)
Packages
detour_1.40.1_all.ipk— panel for OpenWrt/GL.iNet (scripts/UI). On first install it bootstraps the detour feed and then pulls sing-box + tpws-zapret automatically.detour-keenetic_1.40.1_all.ipk— Keenetic/Entware (mipsel) package (on first install it bootstraps our mipsel feed and then pulls sing-box + tpws-zapret automatically; nothing bundled).
Binaries (sing-box + tpws-zapret)
Neither binary is bundled — after the panel package lands, its postinst adds our feed (src/gz detour https://raw.githubusercontent.com/varyen/detour/feed/aarch64 on OpenWrt; feed/mipsel on Keenetic) and installs sing-box + tpws-zapret in the background via detour-update. Build/publish the feed with python3 build_feed.py --version <sb-ver> --tpws-version <zapret-ver> --publish.
Install
Fresh (SSH)
opkg install /tmp/detour_1.40.1_all.ipk
The panel then bootstraps the feed and pulls sing-box + tpws-zapret itself.
Panel update (existing install)
LuCI → Software → Upload detour_1.40.1_all.ipk, or the panel's self-update, or detour-update apply.
Binary updates
Panel → version chip → «Обновление». sing-box: detour-update bins-apply (opkg upgrade sing-box); tpws-zapret: detour-update tpws-apply (opkg upgrade tpws-zapret).
v1.40.0
detour v1.40.0
(no notes)
Packages
detour_1.40.0_all.ipk— panel for OpenWrt/GL.iNet (scripts/UI). On first install it bootstraps the detour feed and then pulls sing-box + tpws-zapret automatically.detour-keenetic_1.40.0_all.ipk— Keenetic/Entware (mipsel) package (on first install it bootstraps our mipsel feed and then pulls sing-box + tpws-zapret automatically; nothing bundled).
Binaries (sing-box + tpws-zapret)
Neither binary is bundled — after the panel package lands, its postinst adds our feed (src/gz detour https://raw.githubusercontent.com/varyen/detour/feed/aarch64 on OpenWrt; feed/mipsel on Keenetic) and installs sing-box + tpws-zapret in the background via detour-update. Build/publish the feed with python3 build_feed.py --version <sb-ver> --tpws-version <zapret-ver> --publish.
Install
Fresh (SSH)
opkg install /tmp/detour_1.40.0_all.ipk
The panel then bootstraps the feed and pulls sing-box + tpws-zapret itself.
Panel update (existing install)
LuCI → Software → Upload detour_1.40.0_all.ipk, or the panel's self-update, or detour-update apply.
Binary updates
Panel → version chip → «Обновление». sing-box: detour-update bins-apply (opkg upgrade sing-box); tpws-zapret: detour-update tpws-apply (opkg upgrade tpws-zapret).
v1.39.0
detour v1.39.0
(no notes)
Packages
detour_1.39.0_all.ipk— panel for OpenWrt/GL.iNet (scripts/UI). On first install it bootstraps the detour feed and then pulls sing-box + tpws-zapret automatically.detour-keenetic_1.39.0_all.ipk— Keenetic/Entware (mipsel) package (on first install it bootstraps our mipsel feed and then pulls sing-box + tpws-zapret automatically; nothing bundled).
Binaries (sing-box + tpws-zapret)
Neither binary is bundled — after the panel package lands, its postinst adds our feed (src/gz detour https://raw.githubusercontent.com/varyen/detour/feed/aarch64 on OpenWrt; feed/mipsel on Keenetic) and installs sing-box + tpws-zapret in the background via detour-update. Build/publish the feed with python3 build_feed.py --version <sb-ver> --tpws-version <zapret-ver> --publish.
Install
Fresh (SSH)
opkg install /tmp/detour_1.39.0_all.ipk
The panel then bootstraps the feed and pulls sing-box + tpws-zapret itself.
Panel update (existing install)
LuCI → Software → Upload detour_1.39.0_all.ipk, or the panel's self-update, or detour-update apply.
Binary updates
Panel → version chip → «Обновление». sing-box: detour-update bins-apply (opkg upgrade sing-box); tpws-zapret: detour-update tpws-apply (opkg upgrade tpws-zapret).
v1.38.0
detour v1.38.0
Исправлено
- «WAN просел до 100 Мбит» горело вечно на 100-мегабитном Keenetic. Обе ветки проверки линка (
detour-wan-linkдля баннера панели иvpn-keepaliveдля push) считали деградацией любую скорость ниже гигабита — константа1000в коде. На роутере, у которого 100 Мбит/с и есть физический потолок порта, это ровно здоровое состояние, а панель показывала аварию, которую нечем чинить. Теперь эталон — не гигабит, а потолок самого порта:WAN_LINK_MAX_MBPSвdetour.conf/PORT_MAX_MBPS=вwan-watch.conf(ручное значение) →Supported link modesизethtool→ максимум скорости, когда-либо виденный на этом роутере (запоминается в state-файле). Если потолок определить нечем — предупреждение не показывается вовсе: молчание лучше ложной тревоги. Отдельно разведён случай «сосед умеет меньше нас»: линк на максимуме соседнего порта (ONU/модем на 100 Мбит) больше не авария, а факт в диагностике. Полный выключатель:WAN_LINK_MONITOR=off. - GitHub отвечал 403 на проверку обновлений.
api.github.comбез токена даёт 60 запросов в час на IP, а за провайдерским CGNAT этот лимит общий на всех абонентов адреса — отсюда «attempt 1/4 … 4/4 failed» иERROR: GH API request failedпри полностью рабочем интернете. Добавлен обход: если API недоступен, тег берётся из редиректа обычной страницыgithub.com/<repo>/releases/latest(в этот лимит она не входит), а ссылки на ассеты собираются по детерминированному шаблону/releases/download/<tag>/<файл>. Проверка версии и установка работают и в этом режиме; теряется только текст changelog. - Установка могла «пройти успешно», оставив старую версию в базе opkg. После
opkg installверсия сверялась через файл/etc/detour/version, который пишет postinst самого пакета — то есть установка подтверждалась по данным устанавливаемого файла, а не по данным opkg. Расхождение (.ipkновой версии лежит на флешке, в базе Entware по-прежнему старая, сервисы крутят старые файлы) такая проверка не ловила. Теперь читается именно база (opkg list-installed), и несовпадение сVersion:из пакета — это ошибка установки, а не успех.detour-update selftestпечатает такое расхождение отдельной строкой с подсказкой, что делать.
Добавлено
- Предупреждение о скорости WAN-порта можно скрыть и вернуть. В баннере — ссылка «Скрыть это предупреждение», в шапке (⚙ → Уведомления) — пункт «Вернуть предупреждение о WAN». Пункт появляется только когда есть что возвращать. Скрытие привязано к подписи «интерфейс/скорость/ожидаемое»: как только любое из чисел изменилось (линк просел ещё сильнее, сменился порт), предупреждение показывается снова — одно нажатие не глушит будущую, уже настоящую аварию.
Кросс-платформенность
- Правки в
detour-wan-link,vpn-keepalive,detour-update,index.html— общие файлы, обе платформы получают их из одного манифеста; новых файлов не добавлялось. ⚠️ На живом OpenWrt (GL-BE9300) проверено: разборethtoolпод busybox awk, новый JSON статуса (порт 2.5G, аплинк 1G → не авария),selftestсо сверкой базы opkg, редирект-фолбэк GitHub. Логика WAN-потолка прогнана на 10 сценариях в изоляции (включая 100-мегабитный порт безethtool), логика «скрыть/вернуть» — на 7 шагах.⚠️ На живом Keenetic не проверялось — роутер недоступен с рабочей машины. Нужна проверка владельцем: пропал ли баннер/push про 100 Мбит, проходит ли проверка обновлений при 403 от API, что печатаетdetour-update selftest(в пакете обновлёнkeenetic/validate-recent-features.sh— печатаетport_max/expected/peer_limited).⚠️ Обход 403 живёт внутри этого пакета: если роутер уже упирается в 403, первую установку придётся сделать вручную (detour-update apply-local /opt/tmp/detour-keenetic_1.38.0_all.ipk), дальше самообновление станет устойчивым.
Packages
detour_1.38.0_all.ipk— panel for OpenWrt/GL.iNet (scripts/UI). On first install it bootstraps the detour feed and then pulls sing-box + tpws-zapret automatically.detour-keenetic_1.38.0_all.ipk— Keenetic/Entware (mipsel) package (on first install it bootstraps our mipsel feed and then pulls sing-box + tpws-zapret automatically; nothing bundled).
Binaries (sing-box + tpws-zapret)
Neither binary is bundled — after the panel package lands, its postinst adds our feed (src/gz detour https://raw.githubusercontent.com/varyen/detour/feed/aarch64 on OpenWrt; feed/mipsel on Keenetic) and installs sing-box + tpws-zapret in the background via detour-update.
Install
Fresh (SSH)
opkg install /tmp/detour_1.38.0_all.ipk
Panel update (existing install)
Панель → «Установить последнюю», либо detour-update apply, либо загрузка .ipk в модал «Установить из файла».
v1.37.3
detour v1.37.3
Багфикс-релиз: чинит выбор файла в модале обновления панели и приводит поля ввода к одному виду в обеих темах.
Исправлено
-
Кнопка «Установить из файла» выглядела нерабочей. Нажималась она на самом деле: клик доходил до обработчика, тот видел пустой
<input type="file">и печатал подсказку «Выберите .ipk» — но файл выбрать было нечем. Оба поля стояли сaccept=".ipk"/accept=".sig", а Safari (macOS/iOS) и часть Android-пикеров показывают неизвестное расширение как недоступное: в диалоге выбора пакет просто гаснет, диалог закрывается пустым, поле остаётся «файл не выбран». Снаружи это и читается как «кнопка не нажимается».Теперь
acceptне ставится вовсе, нативные инпуты скрыты, а выбор идёт кнопками «📦 Выбрать .ipk» / «🔏 Выбрать .sig» — тем же приёмом, что уже используется для импорта профилей и hosts-источников. Рядом показываются имя и размер выбранного файла, а нажатие «Установить из файла» с пустым полем не тупикует сообщением, а сразу открывает диалог выбора. -
Поля ввода без класса рисовались нативно. В тёмной теме такое поле оставалось белым, а пара мест с инлайновым фолбэком
var(--bg-input, #1b1b1b)давала обратное — тёмный прямоугольник посреди светлой панели (переменной--bg-inputв проекте нет). Добавлен базовый блок стилей для всехinput/select/textareaна одних токенах: фон, рамка, фокус,::placeholder,:disabled, оформление кнопки file-инпута. Компонентные правила поверх задают только метрики. -
var(--amber)не резолвился: токена с таким именем не существовало, и текст «SWAP не создан» наследовал обычный цвет вместо предупреждающего. Добавлен алиас на--yellow.
Изменено
- Из плейсхолдеров и комментариев убраны реальные адреса — заменены на документационные диапазоны.
Кросс-платформенность
Все правки — в общем index.html, исполняются в браузере и одинаково приезжают в оба пакета (OpenWrt и Keenetic). Платформо-зависимых веток не добавлялось.
Packages
detour_1.37.3_all.ipk— панель для OpenWrt/GL.iNet. На первой установке прописывает наш фид и сама подтягивает sing-box + tpws-zapret.detour-keenetic_1.37.3_all.ipk— Keenetic/Entware (mipsel), аналогично черезfeed/mipsel; бинарники не бандлятся.
Рядом с каждым .ipk лежит .ipk.sig (usign).
Install
Панель (обновление)
Панель → чип версии → «Обновление панели» → «Установить последнюю», либо по SSH:
opkg install /tmp/detour_1.37.3_all.ipk
Бинарники
Панель → чип версии → «Обновление». sing-box: detour-update bins-apply (opkg upgrade sing-box); tpws-zapret: detour-update tpws-apply (opkg upgrade tpws-zapret).
v1.37.2
detour v1.37.2
Исправлено
-
Лог-мост плодил процессы при каждом перезапуске.
/proc/<pid>/commядро обрезает до 15 символов, поэтому наши же подоболочки видны там какdetour-logbridg, а whitelist вkill_treeсверялся с полным 16-символьнымdetour-logbridge— совпадения не было никогда. При рестарте умирали толькоtailиlogger(их имена короткие), а подоболочка-followвыживала и черезsleep 5поднимала себе новую пару; одновременно новыйrunдобавлял ещё четыре.На референсном роутере за 1 день 22 часа аптайма накопилось 48
tail+ 48logger+ 49 подоболочек при 331 процессе всего. Теперь whitelist матчит обрезанное имя, а на старте добавлена зачистка по/proc:CHILDREN_FILEзнает только текущее поколение, поэтому всё, что оставил после себя убитый по SIGKILLrun, было для него невидимо навсегда.Замерено после фикса на живом GL-BE9300: 4/4/5 и не растёт через три перезапуска подряд, пересылка в syslog живая и ровно в одной копии.
-
Матричный фон не перекрашивался при смене темы.
toggleTheme()сначала вешает на<html>класс сtransition: background-color 0.25s, и только потом меняетdata-theme. Наблюдатель срабатывал мгновенно и читалgetComputedStyle(...).backgroundColor, который в этот момент возвращал ещё старый цвет — переход только начался. Цвета глифов берутся напрямую из атрибута, поэтому перекрашивались сразу, а фон оставался в прежней теме, причём навсегда: этот же цвет дальше использует затухающая заливка, и починить его мог только ресайз окна. Теперь читается токен--bg(кастомные свойства не анимируются, значение переключается мгновенно), с фолбэком наbackgroundColor.
Кросс-платформенность
- Фикс лог-моста — в общем
detour-logbridge, обход/procплатформо-независим и приезжает на обе платформы. ⚠ Проверен на живом OpenWrt (GL-BE9300); на живом Keenetic не проверялся — как и весь Keenetic-путь этого скрипта с момента его появления. - Фикс темы — целиком в
index.html, исполняется в браузере, одинаков на обеих платформах.
Packages
detour_1.37.2_all.ipk— OpenWrt / GL.iNet (BE9300, Flint).detour-keenetic_1.37.2_all.ipk— Keenetic / Entware (mipsel).
Рядом с каждым пакетом лежит .ipk.sig (usign).
v1.37.1
detour v1.37.1
Изменено
- Матричный фон ускорен на 20%. Все три скоростные константы умножены на 1.2 — скорости колонок (теперь 4.6–16.8 строк/с), затухание хвоста и темп перезапуска отработавших колонок. Масштабируется именно весь эффект целиком: если поднять одни скорости, хвосты стали бы на 20% длиннее, а так картинка та же, просто проигрывается быстрее.
Кросс-платформенность
- Правка целиком в
index.htmlи исполняется в браузере — одинаково приезжает в оба пакета.
Packages
detour_1.37.1_all.ipk— OpenWrt / GL.iNet (BE9300, Flint).detour-keenetic_1.37.1_all.ipk— Keenetic / Entware (mipsel).
Рядом с каждым пакетом лежит .ipk.sig (usign).
v1.37.0
detour v1.37.0
Добавлено
- Проверка «доходит ли порт до роутера из интернета». У каждого включённого проброса появилась кнопка «Проверить снаружи». Обычный port-checker на этот вопрос отвечает неверно: если внешний порт перехватывает оборудование провайдера, оно само завершает TCP-рукопожатие, и чекер рапортует «открыт», хотя до роутера не доходит ничего.
- Поэтому проверка сверяет два сигнала: ответ внешних узлов и прирост счётчика пакетов на нашем же правиле файрвола (nft на OpenWrt/fw4, iptables на fw3 и Keenetic) вокруг пробы. Счётчик дёрнулся — отвечали мы; не дёрнулся — отвечал кто-то другой.
- Вердикты:
reachable,hijacked(перехват выше роутера — с советом сменить порт на нестандартный),blocked,open_unverified,unknown. - CLI:
detour-portmap check-external <id>; CGI:portmap_check_external.
- Обычный
checkдополнительно отдаётwan_packets— сколько пакетов из интернета видело правило проброса с последней перезагрузки файрвола.
Изменено
- Матричный фон стал спокойнее, а колонки — разноскоростными. Скорость задавалась в строках за кадр, то есть зависела от герцовки: на 120 Гц фон летел вдвое быстрее, чем на 60. Теперь она в строках в секунду и умножается на реальный
dt— 3.8–14 стр/с вместо прежних ≈21–66, примерно впятеро медленнее. Скорость колонки выбирается лог-равномерно, поэтому медленные капли и быстрые росчерки встречаются одинаково часто. - Попутно исправлено то, что вылезает именно на медленной скорости: голова капли привязана к сетке строк и берёт новый глиф только при переходе на строку вниз (раньше перевыбирала символ каждый кадр — дрожание на месте), а затухающая заливка тратит альфу порциями вместо микро-альфы каждый кадр (слишком малая альфа не меняет 8-битные пиксели, и хвосты не дочищались до фона). Побочно — ~17 вызовов
fillTextна кадр вместо ~160. ⚠️ Проверка проброса обращается к стороннему сервису (check-host.net) — единственное такое место в проекте. Наружу уходят только WAN-IP и номер порта, оба и без того публичны. Запускается только по кнопке, никогда сама.
Исправлено
- Проверка доступности устройства в LAN врала на любом веб-сервисе.
target_reachableиспользовалnc, а BusyBox nc возвращает ошибку, если собеседник ничего не прислал первым — то есть каждый HTTP-сервер, вежливо ожидающий запрос, показывался как «устройство не отвечает». Теперь признак —%{time_connect}у curl.
Кросс-платформенность
check-externalиwan_packetsсделаны сразу для обеих платформ. ⚠ Ветка Keenetic по-прежнему не проверялась на живом железе — как и весь «Проброс сервисов» с 1.35.0.- Правка матричного фона живёт целиком в
index.htmlи исполняется в браузере — приезжает в оба пакета одинаково.
Packages
detour_1.37.0_all.ipk— панель для OpenWrt/GL.iNet (BE9300, Flint). При первой установке сама прописывает фид и подтягивает sing-box + tpws-zapret.detour-keenetic_1.37.0_all.ipk— Keenetic/Entware (mipsel), бинарники из нашего mipsel-фида.
Рядом с каждым пакетом лежит .ipk.sig (usign).
Install
Обновление панели: кнопкой в самой панели, загрузкой .ipk в её модал, или по SSH:
opkg install /tmp/detour_1.37.0_all.ipk