github Leadaxe/singbox-launcher v1.4.1
release v1.4.1

latest releases: v1.4.2, mesa3d-26.2.0
5 hours ago

Release v1.4.1

Downloads

macOS (Universal) - Supports both Apple Silicon and Intel

Option 1: Installation Script (Recommended)

Install with a single command (version v1.4.1):

curl -fsSL https://raw.githubusercontent.com/Leadaxe/singbox-launcher/develop/scripts/install-macos.sh | bash -s -- v1.4.1

The script will:

  • Download the release archive
  • Extract and install to /Applications/
  • Fix macOS quarantine attributes and permissions
  • Launch the application automatically

Option 2: Manual Installation

  1. Download: singbox-launcher-v1.4.1-macos.zip
  2. Extract the ZIP file
  3. Remove quarantine attribute (required):
    xattr -cr "singbox-launcher.app" && chmod +x "singbox-launcher.app/Contents/MacOS/singbox-launcher"
  4. Double-click singbox-launcher.app to run
    • If macOS blocks the app, go to System Settings → Privacy & Security and click "Open Anyway"
    • Alternatively, right-click the app and select "Open" (first time only)

Windows (amd64)

  1. Download: singbox-launcher-v1.4.1-win64.zip
  2. Extract the ZIP file to a folder, for example: C:\Program Files\singbox-launcher\
  3. Run singbox-launcher.exe from that folder
    • You may need administrator rights to install to Program Files
    • The launcher will automatically download sing-box and wintun.dll on first launch

Windows 7 (x86, legacy)

  1. Download: singbox-launcher-v1.4.1-win7-32.zip
  2. Extract the ZIP file to a folder and run singbox-launcher-win7-32.exe
    • For Windows 7 / 32-bit or legacy compatibility only

Linux Support

⚠️ Linux build temporarily unavailable - мы ищем тестировщика для ручного тестирования перед включением автоматической сборки.

Checksums

See checksums.txt for SHA256 checksums of all files.

v1.4.1

EN

Highlights

  • Debug API now covers the whole remote-machines feature set (SPEC 100): pair/re-pair/remove machines, health, start/stop/rollback of the machine's core, deploy (resources + config in one call), per-machine wizard state mirrors (/remote/machines/{id}/state/*), observability (proxies, switch, url-test, pool, rules, connections, DNS/log windows, host telemetry, LAN clients), and the machine's resource store.
  • Debug API: local lxd-daemon group /daemon/* (macOS) — status, pair/unpair, address/secret, engine switch (classic|daemon), and ready-to-run sudo commands (the API never executes them).
  • Debug API: raw passthrough to any paired daemon — POST …/raw/rest (arbitrary admin-REST call) and POST …/raw/grpc (arbitrary daemon.* gRPC call resolved via protoregistry; unary + server-stream windows), plus GET /grpc/methods discovery. The tunnel only reaches the paired daemon's control channel — it is not an open proxy.
  • Debug API manifest (GET /) now carries capabilities (remote / daemon / raw_grpc) so agents know up front which groups this build exposes.
  • Debug API: UI remote-override control — GET /remote/ui, POST /remote/machines/{id}/ui/connect, POST /remote/ui/disconnect do exactly what the Remote tab's Connect/Disconnect buttons do (switch the Servers tab to a machine and back). Health-gated; 503 when the launcher runs headless.
  • Detour through a single server (SPEC 101): the Source dialog's "Detour server" picker now offers other single-server sources (marked ») alongside groups. The hop is referenced by node identity hash, so it survives renames/prefixes; if the hop disappears, the dependent source's nodes are dropped from the config (fail-closed) instead of silently dialing direct. WireGuard endpoints can now be chained too (detour is applied to them; only listen_port endpoints stay direct — the core rejects that combination).
  • WireGuard share-URI/.conf keys (private/public/preshared) are validated at parse time: non-32-byte/non-base64 values (e.g. Proton's masked ***** placeholder) degrade that node with a warning instead of emitting a config that fails sing-box check wholesale; URL-safe/unpadded key variants are normalized to the std form the core requires.
  • Node identity hashes for WireGuard nodes now cover the full endpoint (keys, addresses): previously all WG nodes on one server:port collapsed into one identity, so a per-node disable mark covered all of them. Existing disable marks on WG nodes reset once.

Fixed

  • Renaming a template-derived outbound group no longer breaks the config: on save the entry is materialized as a standalone one, and already-orphaned template references are dropped from the build with a warning instead of emitting an empty-type outbound that failed the whole config (unknown outbound type: "").
  • A dangling node/endpoint detour (its target group renamed or removed) is stripped at final assembly with a warning instead of failing the whole deploy with dependency not found.
  • Traffic profiler shows the connection path as two labeled lines — Outbound: (selection chain, root→leaf) and Via: (transport/detour tail in packet hop order) — instead of one garbled merged chain; per-client grouping now uses the true root outbound.
  • Remote machine gRPC subscriptions (connections, DNS, status, group selection) survive Deploy/Start/Stop: streams resubscribe automatically instead of dying silently until Disconnect/Connect.
  • The server list recovers on its own after the machine's core restarts: the selected group is re-asserted and the auto-refresh tick re-reads the machine's groups — no more permanent "Reading the machine's selector groups…".
  • Remote tab: protocol/transport subtitles are resolved against the connected machine's own config — nodes that exist only on that machine (its endpoints, its local sources) show their subtitle again.
  • Machine row: new Restart button (↻) — Stop + Start with a single confirmation.
  • Config Wizard, Outbounds tab: mouse-wheel scrolling works over the outbounds list.

Technical / Internal

  • Deploy chain (resources-before-config) extracted from ui/machine_list_panel.go into services.(*RemoteRegistry).Deploy — UI and API call the same function.
  • services.TransportPool: cached per-machine gRPC transports for the API (lazy dial, 90s idle close, invalidation on remove/re-pair/addr change).
  • lxdclient.(*Client).Do: raw admin-REST passthrough primitive.
  • debugapi Server builds its router at Start() (not New()), so optional endpoint groups registered in between land in routing and /help.
  • runResilientStream (lxd remote transport): shared resubscribe-with-backoff loop for all machine gRPC streams.
  • Parsed-config cache for server-list subtitles is per-path — the Local and Remote panels no longer evict each other's cache on every row redraw.

RU

Основное

  • Debug API покрывает весь remote-функционал (SPEC 100): сопряжение/пере-сопряжение/удаление машин, health, start/stop/rollback ядра машины, deploy (ресурсы + конфиг одним вызовом), зеркала состояния визарда per-machine (/remote/machines/{id}/state/*), наблюдаемость (узлы, переключение, url-test, пул, правила, соединения, окна DNS/лога, телеметрия хоста, клиенты сети) и ресурс-стор машины.
  • Debug API: группа локального демона /daemon/* (macOS) — статус, pair/unpair, адрес/секрет, переключение движка (classic|daemon) и готовые sudo-команды (API их не исполняет).
  • Debug API: произвольные вызовы к сопряжённому демону — POST …/raw/rest (любой admin-REST запрос) и POST …/raw/grpc (любой daemon.* gRPC-метод через protoregistry; unary + окна server-stream), плюс discovery GET /grpc/methods. Туннель ведёт только на управляющий канал сопряжённого демона — это не открытый прокси.
  • Манифест Debug API (GET /) несёт capabilities (remote / daemon / raw_grpc) — агент заранее видит, какие группы есть в этой сборке.
  • Debug API: управление remote-override UI — GET /remote/ui, POST /remote/machines/{id}/ui/connect, POST /remote/ui/disconnect делают ровно то же, что кнопки Connect/Disconnect вкладки Remote (переводят вкладку Servers на машину и обратно). С health-гейтом; 503 при headless-запуске.
  • Detour через одиночный сервер (SPEC 101): пикер «Detour server» в диалоге источника теперь предлагает и другие server-источники (с маркером »), не только группы. Хоп адресуется identity-хешем узла — переживает переименования и префиксы; если хоп пропал, ноды зависимого источника выкидываются из конфига (fail-closed), а не уходят молча напрямую. WireGuard-endpoint'ы теперь тоже можно пускать цепочкой (detour к ним применяется; напрямую остаются только endpoints с listen_port — ядро отвергает эту комбинацию).
  • Ключи WireGuard из share-URI/.conf (private/public/preshared) валидируются при парсинге: значение не из 32 байт base64 (например, маскированный ***** у Proton) деградирует только эту ноду с warning, а не валит весь sing-box check; URL-safe/беспаддинговые варианты нормализуются в std-форму, которую требует ядро.
  • Identity-хеш WireGuard-узлов теперь считается от полного endpoint (ключи, адреса): раньше все WG-ноды одного server:port схлопывались в одну идентичность, и отметка «выключить ноду» накрывала их все. Существующие отметки на WG-нодах сбросятся один раз.

Исправлено

  • Переименование группы, взятой из шаблона, больше не ломает конфиг: при сохранении запись материализуется в самостоятельную, а уже осиротевшие ссылки на шаблон дропаются при сборке с warning — вместо outbound'а с пустым type, валившего весь конфиг (unknown outbound type: "").
  • Висячий detour ноды/endpoint'а (целевую группу переименовали или удалили) зачищается при финальной сборке с warning — вместо отказа всего деплоя с dependency not found.
  • Профайлер трафика показывает путь соединения двумя подписанными строками — Outbound: (цепочка выбора, корень→лист) и Via: (транспортный хвост в порядке следования пакета) — вместо одной перемешанной цепочки; группировка by-client берёт честный корневой outbound.
  • gRPC-подписки удалённой машины (соединения, DNS, статус, выбор группы) переживают Deploy/Start/Stop: стримы переподписываются сами, а не умирали молча до Disconnect/Connect.
  • Список серверов восстанавливается сам после перезапуска ядра машины: выбранная группа переутверждается, тик автообновления перечитывает группы — вечное «Reading the machine's selector groups…» ушло.
  • Вкладка Remote: подписи «протокол·транспорт» берутся из конфига подключённой машины — ноды, существующие только на ней (её endpoint'ы, локальные источники), снова с подписью.
  • Строка машины: новая кнопка Restart (↻) — Stop + Start одним подтверждением.
  • Визард, вкладка Outbounds: колесо мыши работает над списком outbound'ов.

Техническое / Внутреннее

  • Deploy-цепочка (ресурсы строго раньше конфига) вынесена из ui/machine_list_panel.go в services.(*RemoteRegistry).Deploy — UI и API зовут одну функцию.
  • services.TransportPool: кеш gRPC-транспортов per-machine для API (ленивый dial, закрытие по 90s простоя, инвалидация при remove/re-pair/смене адреса).
  • lxdclient.(*Client).Do: примитив raw admin-REST passthrough.
  • debugapi Server собирает роутер в Start() (а не в New()) — опциональные группы, включённые между ними, попадают в роутинг и /help.
  • runResilientStream (lxd remote transport): общий цикл переподписки для всех gRPC-стримов машины.
  • Кэш разбора config.json для подписей списка — per-path: панели Local и Remote больше не выбивают кэш друг друга на каждой перерисовке.

Don't miss a new singbox-launcher release

NewReleases is sending notifications on new releases.