Release v0.9.9
Downloads
macOS (Universal) - Supports both Apple Silicon and Intel
Option 1: Installation Script (Recommended)
Install with a single command (version v0.9.9):
curl -fsSL https://raw.githubusercontent.com/Leadaxe/singbox-launcher/develop/scripts/install-macos.sh | bash -s -- v0.9.9The 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
- Download:
singbox-launcher-v0.9.9-macos.zip - Extract the ZIP file
- Remove quarantine attribute (required):
xattr -cr "singbox-launcher.app" && chmod +x "singbox-launcher.app/Contents/MacOS/singbox-launcher"
- Double-click
singbox-launcher.appto 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)
- Download:
singbox-launcher-v0.9.9-win64.zip - Extract the ZIP file to a folder, for example:
C:\Program Files\singbox-launcher\ - Run
singbox-launcher.exefrom that folder- You may need administrator rights to install to Program Files
- The launcher will automatically download
sing-boxandwintun.dllon first launch
Windows 7 (x86, legacy)
- Download:
singbox-launcher-v0.9.9-win7-32.zip - 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.
v0.9.9
EN
Highlights
- Servers tab can connect to remote Clash API endpoints (SPEC 064). Gear ⚙ button in the tab header opens a small dialog where you set host / port / secret and connect to any Clash-API-compatible server: sing-box on a home router (e.g. RouteRich on
192.168.10.1), mihomo on a VPS through ssh-tunnel, another launcher instance on the same machine. Status badge shows🏠 Localor🌐 host:port. Tab stays accessible even when the local sing-box isn't running, as long as remote override is active. Ephemeral (RAM-only) — resets on launcher restart. HTTP only for MVP. - Settings is now a separate window opened from the
⚙️tab. The tab acts as a button — clicking it pops a standalone resizable window (520×640, scrollable) with Subscriptions / Language / Subscription identification / Debug API sections. Singleton — reopening just focuses the existing window. Tab order:Core │ Servers │ 🔍 │ ⚙️ │ ❓. - Custom subscription User-Agent. Settings → Subscriptions has a
User-Agent:field for providers that reject our defaultsingbox-launcher/<ver> (<os> <arch>)UA. Type a custom one (e.g.v2rayN/7.5.0,Hiddify/1.0.0) — autosaves 500ms after you stop typing. ⟳ button resets to default. Default is shown as placeholder + hint text. Sent on every subscription fetch. - Emoji flag picker for outbound filters. In the Outbound Edit dialog, the Filter field has a 🌐 button that opens a picker showing every flag emoji discovered across all parsed nodes with hit counts. Click chips to build a
/(🇳🇱|🇺🇸)/iregex; an "Exclude" checkbox negates. The picker shows a live mirror of the Preview node list (green ✓ for matching, red ✗ for excluded) so you see exactly which servers the filter selects before saving. - Windows 7 phantom TUN adapter cleanup (SPEC 065). On Win7 each launcher restart could leave a stale
singbox-tunadapter behind; after 10–20 sessions Device Manager would show a tower of disabled adapters. Launcher now auto-cleans phantom adapters at startup. Helper scripts shipped underscripts/for one-off manual purge. - Unified Enable TUN toggle (SPEC 066). Removed the
tun_builtinphantom variable that used to keep TUN inbound mandatory on Windows/Linux while the macOS UI showed an "Enable TUN" toggle. Now all three platforms share one toggle, defaults preserved (TUN on). Wizard warns when no inbound is enabled (TUN off + Proxy-in off → no traffic flows). - Debug API reference doc —
docs/API.mdships a complete endpoint reference + curl cookbook for the headless control plane. Replaces ad-hoc lookups in SPEC 038. Linked from both READMEs. - New Debug API endpoint —
GET/PATCH /settings/user-agent. GET returns{user_agent, default, effective}. PATCH with{"user_agent":"..."}writes;{"user_agent":""}resets to default. No sing-box restart needed — fetcher reads settings lazily on every fetch.
Fixed
- Add-Outbound Scope dropdown no longer offers server-type sources — only subscriptions, since a group outbound can only reference subscriptions.
- Edit-Outbound dialog tab transitions: switching between Settings / JSON / Preview no longer discards form state.
editSourceis now decoupled fromcurrentTab(the visible tab) — Preview-on-the-way-back no longer steals authoritative content. - Preview now works without a tag — a synthetic
_preview_substitution lets you see the rendered outbound without filling tag first. - Outbounds tab: dropped the redundant "— Global" suffix on every global outbound row.
Documentation
docs/ParserConfig.mdnow inventories all 9 supported protocols (VLESS, VMess, Trojan, Shadowsocks, Hysteria2, SSH, SOCKS5, NaïveProxy, WireGuard) with protocol-specific quirks (VLESS packetEncoding allow-list, Vision auto-port-443, VMess legacy cleartext, Shadowsocks SIP002 vs legacy, Hysteria2 multi-port).docs/ParserConfig.mdclarifies thatxhttpis NOT real xhttp support — it silently degrades tohttpupgrade(mode, extra, packetEncoding dropped).
Technical / Internal
- SPEC 064 implementation: new
ui/clash_remote.go(RemoteOverride storage + EffectiveClashAPIConfig resolver + generation counter for drop-stale in refresh goroutines + NormalizeHost helper). All 9 callsites inui/clash_api_tab.gomigrated fromac.APIService.GetClashAPIConfig()toEffectiveClashAPIConfig(ac). Tab availability rule is nowrunning || hasOverride. - README's "28 endpoints" claim corrected to 24 — actual count verified against
core/debugapi/handler registrations. - New
Settings.SubscriptionUserAgentfield ininternal/locale/settings.go. Plumbed throughsubscription.SubscriptionRequestSettings.UserAgentandapplySubscriptionRequestHeaders— empty value falls back toconfigtypes.BuildSubscriptionUserAgent().UIService.SettingsWindowsingleton field added next toWizardWindow. - New
core/debugapi/settings_endpoints.gofor launcher-level preference mutations (separate namespace from/state/*). First inhabitant:/settings/user-agent. - Shared scrollbar-gutter helper at
ui/components/scroll_gutter.go(ScrollbarGutterWidthconstant +NewScrollGutter()+WrapInScrollWithGutter()). 16 call sites across 4 packages migrated; the three duplicate const definitions removed. Doc-comment documents the deliberate "inside vs outside scroll" distinction — both produce the gutter spacer the same way, but their position in the layout tree signals different scroll scope (whole-page vs nested-section) and must not be unified for the sake of consistency.
RU
Основное
- Вкладка Servers подключается к удалённым Clash API (SPEC 064). Кнопка-шестерёнка ⚙ в шапке таба открывает диалог с полями host / port / secret — подключаемся к любому Clash-API-совместимому серверу: sing-box на роутере (например RouteRich на
192.168.10.1), mihomo на VPS через ssh-tunnel, другой инстанс лаунчера на той же машине. Badge в шапке показывает🏠 Localили🌐 host:port. Tab остаётся доступным даже если локальный sing-box не запущен — пока активен remote override. Ephemeral (только в памяти) — сбрасывается при рестарте лаунчера. HTTP only для MVP. - Настройки переехали в отдельное окно — открывается кликом по табу
⚙️. Таб теперь работает как кнопка: клик открывает standalone окно (520×640, со скроллом) с секциями Подписки / Язык / Идентификация устройства / Debug API. Singleton — повторный клик просто фокусирует уже открытое. Порядок табов:Core │ Servers │ 🔍 │ ⚙️ │ ❓. - Кастомный User-Agent для подписок. В Settings → Подписки появилось поле
User-Agent:— для провайдеров, которые режут наш defaultsingbox-launcher/<ver> (<os> <arch>). Впишите свой (напримерv2rayN/7.5.0,Hiddify/1.0.0) — автосохранение через 500ms после остановки печати. Кнопка ⟳ сбрасывает на стандартный. Default показан как placeholder + подсказка. Отправляется при каждом обновлении подписки. - Picker эмодзи-флагов для outbound фильтров. В диалоге Edit Outbound у поля Filter появилась кнопка 🌐 — открывает picker с каждым эмодзи-флагом, найденным во всех распарсенных нодах, с счётчиком попаданий. Клик по чипам собирает regex
/(🇳🇱|🇺🇸)/i; чекбокс "Exclude" инвертирует. Picker показывает live-зеркало Preview node-list (зелёная ✓ для попавших, красный ✗ для исключённых) — видно ровно какие серверы выбирает фильтр, ещё до Save. - Очистка phantom TUN адаптеров на Windows 7 (SPEC 065). На Win7 каждый рестарт лаунчера мог оставлять stale
singbox-tunадаптер; после 10–20 сессий Device Manager показывал башню disabled адаптеров. Лаунчер теперь автоматически чистит phantom адаптеры на старте. Подscripts/лежат helper'ы для ручной разовой зачистки. - Единый toggle Enable TUN (SPEC 066). Убрана фантомная переменная
tun_builtin, которая на Windows/Linux держала TUN-inbound обязательным, а UI на macOS показывал "Enable TUN" toggle. Теперь все три платформы используют один toggle, дефолты сохранены (TUN включён). Wizard предупреждает когда не включен ни один inbound (TUN off + Proxy-in off → трафик никуда не пойдёт). - Документация Debug API —
docs/API.md: полный референс endpoint'ов + curl cookbook для headless-слоя. Заменяет разрозненный поиск по SPEC 038. Залинкована из обоих README. - Новый Debug API endpoint —
GET/PATCH /settings/user-agent. GET возвращает{user_agent, default, effective}. PATCH с{"user_agent":"..."}пишет;{"user_agent":""}сбрасывает на default. Рестарт sing-box не нужен — fetcher читает настройки lazy на каждом fetch'е.
Исправлено
- Add-Outbound Scope dropdown больше не предлагает источники типа "сервер" — только подписки, потому что группа может ссылаться только на подписки.
- Edit-Outbound диалог: переключение между Settings / JSON / Preview больше не теряет состояние формы.
editSourceтеперь развязан сcurrentTab(видимый таб) — возврат через Preview больше не подменяет источник. - Preview теперь работает без tag — синтетическая подстановка
_preview_позволяет увидеть отрендеренный outbound, ещё не заполнив tag. - Outbounds tab: убран лишний суффикс "— Global" с каждой строки глобального outbound.
Документация
docs/ParserConfig.mdтеперь инвентаризирует все 9 поддерживаемых протоколов (VLESS, VMess, Trojan, Shadowsocks, Hysteria2, SSH, SOCKS5, NaïveProxy, WireGuard) с протокол-specific особенностями (VLESS packetEncoding allow-list, Vision auto-port-443, VMess legacy cleartext, Shadowsocks SIP002 vs legacy, Hysteria2 multi-port).docs/ParserConfig.mdпоясняет чтоxhttp— НЕ настоящая поддержка xhttp: тихо деградирует вhttpupgrade(mode, extra, packetEncoding выкидываются).
Техническое / Внутреннее
- SPEC 064 реализация: новый
ui/clash_remote.go(RemoteOverride storage + EffectiveClashAPIConfig resolver + generation counter для drop-stale в refresh-goroutine'ах + NormalizeHost helper). Все 9 callsite'ов вui/clash_api_tab.goмигрировали сac.APIService.GetClashAPIConfig()наEffectiveClashAPIConfig(ac). Tab availability rule теперьrunning || hasOverride. - Заявление в README про «28 endpoints» исправлено на 24 — реальный счётчик сверен с handler-регистрациями в
core/debugapi/. - Новое поле
Settings.SubscriptionUserAgentвinternal/locale/settings.go. Плумбится черезsubscription.SubscriptionRequestSettings.UserAgentиapplySubscriptionRequestHeaders— пустое значение → fallback наconfigtypes.BuildSubscriptionUserAgent(). ПолеUIService.SettingsWindowsingleton добавлено рядом сWizardWindow. - Новый файл
core/debugapi/settings_endpoints.goдля мутаций launcher-level preferences (отдельный namespace от/state/*). Первый житель:/settings/user-agent. - Общий scroll-gutter helper в
ui/components/scroll_gutter.go(константаScrollbarGutterWidth+NewScrollGutter()+WrapInScrollWithGutter()). 16 callsite'ов в 4 пакетах мигрированы; 3 дубля const-определения удалены. Doc-комментарий зафиксировал deliberate разницу "gutter inside vs outside scroll" — оба создаются одним и тем же helper'ом, но позиция в layout-дереве сигналит разный scope (вся страница vs вложенная секция) и не должна унифицироваться ради консистентности.