github Leadaxe/singbox-launcher v0.9.9
release v0.9.9

8 hours ago

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.9

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-v0.9.9-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-v0.9.9-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-v0.9.9-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.

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 🏠 Local or 🌐 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 default singbox-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 /(🇳🇱|🇺🇸)/i regex; 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-tun adapter 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 under scripts/ for one-off manual purge.
  • Unified Enable TUN toggle (SPEC 066). Removed the tun_builtin phantom 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 docdocs/API.md ships 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 endpointGET/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. editSource is now decoupled from currentTab (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.md now 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.md clarifies that xhttp is NOT real xhttp support — it silently degrades to httpupgrade (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 in ui/clash_api_tab.go migrated from ac.APIService.GetClashAPIConfig() to EffectiveClashAPIConfig(ac). Tab availability rule is now running || hasOverride.
  • README's "28 endpoints" claim corrected to 24 — actual count verified against core/debugapi/ handler registrations.
  • New Settings.SubscriptionUserAgent field in internal/locale/settings.go. Plumbed through subscription.SubscriptionRequestSettings.UserAgent and applySubscriptionRequestHeaders — empty value falls back to configtypes.BuildSubscriptionUserAgent(). UIService.SettingsWindow singleton field added next to WizardWindow.
  • New core/debugapi/settings_endpoints.go for launcher-level preference mutations (separate namespace from /state/*). First inhabitant: /settings/user-agent.
  • Shared scrollbar-gutter helper at ui/components/scroll_gutter.go (ScrollbarGutterWidth constant + 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: — для провайдеров, которые режут наш default singbox-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 APIdocs/API.md: полный референс endpoint'ов + curl cookbook для headless-слоя. Заменяет разрозненный поиск по SPEC 038. Залинкована из обоих README.
  • Новый Debug API endpointGET/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.SettingsWindow singleton добавлено рядом с 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 вложенная секция) и не должна унифицироваться ради консистентности.

Don't miss a new singbox-launcher release

NewReleases is sending notifications on new releases.