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

3 hours ago

Release v0.9.2

Downloads

macOS (Universal) - Supports both Apple Silicon and Intel

Option 1: Installation Script (Recommended)

Install with a single command (version v0.9.2):

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

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

Highlights (EN)

Hotfix release. Restores the v0.8.x SRS rule-set workflow that the v0.9.0/v0.9.1 architecture refactor accidentally broke. If you ever ran v0.9.0 or v0.9.1 with template-default rules enabled, you would have hit FATAL: start service: initialize rule-set ... v2ray-http-upgrade: unexpected status: 404 on the first start — sing-box was trying to download remote rule-sets through the VPN proxy, which the proxy refused. v0.9.2 makes config.json always emit type: local rule-sets only; existing installs heal automatically on next Save.

Fixed

  • SRS rule-sets restored to local-only emit (regression fix from v0.9.0/v0.9.1, restores v0.8.x behavior). config.json now never contains type: remote rule-sets. The build pipeline (core/build/route_merge.go::convertRuleSetToLocalRequired) emits inline and local only — remote entries with a downloaded bin/rule-sets/<tag>.srs get rewritten on the fly to {type: local, format: binary, path: ...}; missing files raise a build error with the message open Configurator → Rules and re-download. Sing-box stops trying to fetch rule-sets through the VPN at startup (the v0.9.x cold-start FATAL: start service: initialize rule-set ... v2ray-http-upgrade: unexpected status: 404 is gone). Tracked in SPEC 045 фаза 9.
  • Auto-rebuild after Save / Update. Save in Configurator (in-wizard button or close-dialog → Save) and Update on Core Dashboard now both trigger RebuildConfigIfDirty automatically — config.json is always in sync with the just-saved state without an extra click. The old Auto Rebuild on Change right-click toggle is removed (the rebuild was made unconditional). The duplicate Refresh & Rebuild icon button next to the Configurator entry is removed too — the regular 🔄 Update button now does both passes.
  • Content-addressed SRS tag for user-added rules. add_rule_dialog.go::srsTagFromURL now produces <filename-without-srs>-<hash8(sha256(URL))> instead of the old custom-<filename> with order-dependent -2/-3 collision suffixes. Same URL → same tag (idempotent dedup); different URLs that share a filename → different tags (collision impossible). Template-shipped tags (ru-blocked-main, ads-all, games, …) are untouched — handcrafted by template authors.
  • Orphan GC for bin/rule-sets/. After every RebuildConfigIfDirty the directory is swept against the union of tags from all bin/wizard_states/*.json (multi-stage safety, mirrors the SPEC 052 GC for bin/subscriptions/). Anything not in the live set is removed — including non-.srs files and Cyrillic-named junk. The directory is treated as a launcher-managed cache, no exceptions for stray files.

Technical / Internal

  • convertRuleSetToLocalRequired (renamed from convertRuleSetToLocalIfNeeded) returns (any, error) — the previous silent fallback to type: remote is gone. Caller paths (MergeRouteSectionBuildConfigRebuildConfigIfDirty) propagate the error end-to-end; config.json is never overwritten with an invalid one.
  • buildContextFromState is now a method on *AppController and propagates ac.FileService.ExecDir into RouteConfig.ExecDir — required by the local-path resolver in the build pipeline.
  • New services.DeleteOrphanRuleSets(execDir, knownTags) ([]string, error) mirrors state/v5.DeleteOrphans for subscriptions. Called from RebuildConfigIfDirty after atomicWriteConfig. Multi-stage safety via new core.collectAllStageRuleSetTags helper.
  • UpdateConfigFromSubscriptions now calls RebuildConfigIfDirty and emits ShowSubsResultFunc itself (was: only via RunParser wrapper). Auto-update fallback paths (RebuildConfigIfDirtyUpdate because raw cache incomplete) no longer leave the toast hanging at 100% in-progress; if the rebuild fails, the toast surfaces it as (rebuild failed: ...).
  • Settings.AutoRebuildOnChange field removed from internal/locale/settings.go. Existing settings.json files with that field are tolerated (omitempty, ignored on read). Locale key core.update_autorebuild_label removed from all 11 locale files.
  • The updateAndRebuildButton UI control (icon-only refresh+rebuild combo) and its handlers are removed from Core Dashboard. Locale key core.button_update_rebuild_tooltip is gone too.

Migration notes

  • No migration required. Existing v0.9.x installs that hit the cold-start FATAL heal automatically: open Configurator → Save → auto-rebuild generates a fresh config.json with all rule-sets as type: local. SRS files already on disk under bin/rule-sets/<tag>.srs (downloaded by previous UI clicks) are reused.
  • If you manually deleted SRS files, the Configurator → Rules tab will show them as 🔵 srs (re-download needed); one click per row downloads, Save → rebuild emits the local config.

Основное (RU)

Hotfix-релиз. Восстановлен workflow SRS rule-sets из v0.8.x, который поломал архитектурный рефактор v0.9.0/v0.9.1. Если вы ставили v0.9.0 или v0.9.1 с включёнными rules из шаблона по умолчанию — на первом старте получали FATAL: start service: initialize rule-set ... v2ray-http-upgrade: unexpected status: 404 (sing-box пытался скачать remote rule-set через VPN-прокси, прокси отказывал). v0.9.2 гарантирует что config.json всегда эмитит rule-sets только с type: local; существующие установки лечатся автоматически на следующем Save.

Исправлено

  • SRS rule-sets снова local-only при эмите в config.json (регресс v0.9.0/v0.9.1 починен, восстановлено поведение v0.8.x). config.json теперь не содержит rule-set'ов с type: remote. Build pipeline (core/build/route_merge.go::convertRuleSetToLocalRequired) эмитит только inline и localremote-entries со скачанным bin/rule-sets/<tag>.srs на лету переписываются в {type: local, format: binary, path: ...}; отсутствие файла поднимает build error с сообщением open Configurator → Rules and re-download. Sing-box больше не пытается скачать rule-set через VPN на старте (cold-start FATAL: start service: initialize rule-set ... v2ray-http-upgrade: unexpected status: 404 v0.9.x ушёл). Отражено в SPEC 045 фаза 9.
  • Auto-rebuild после Save / Update. Save в конфигураторе (in-wizard кнопка или close-диалог → Save) и Update на Core Dashboard теперь оба автоматически дёргают RebuildConfigIfDirtyconfig.json всегда синхронен со свежим state без дополнительного клика. Старый right-click toggle Auto Rebuild on Change убран (rebuild стал безусловным). Дублирующая icon-кнопка Refresh & Rebuild рядом с конфигуратором тоже убрана — обычный 🔄 Update теперь делает оба прохода.
  • Content-addressed SRS tag для user-added rules. add_rule_dialog.go::srsTagFromURL теперь выдаёт <filename-без-srs>-<hash8(sha256(URL))> вместо старого custom-<filename> с order-зависимыми -2/-3 суффиксами. Та же URL → тот же tag (идемпотентный дедуп); разные URL с одинаковым filename → разные tags (коллизия невозможна). Template-shipped tags (ru-blocked-main, ads-all, games, …) не трогаем — они handcrafted автором шаблона.
  • Orphan GC для bin/rule-sets/. После каждого RebuildConfigIfDirty папка чистится по union'у тегов из всех bin/wizard_states/*.json (multi-stage safety, зеркалит SPEC 052 GC для bin/subscriptions/). Всё что не в живом множестве — удаляется, включая не-.srs файлы и кириллические имена. Папка — launcher-managed кэш, без исключений для левых файлов.

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

  • convertRuleSetToLocalRequired (переименовано из convertRuleSetToLocalIfNeeded) возвращает (any, error) — прежний молчаливый fallback на type: remote ушёл. Cаller-цепочка (MergeRouteSectionBuildConfigRebuildConfigIfDirty) пробрасывает error end-to-end; config.json не перезаписывается невалидным.
  • buildContextFromState теперь метод на *AppController и пробрасывает ac.FileService.ExecDir в RouteConfig.ExecDir — нужно резолверу локальных путей в build pipeline.
  • Новый services.DeleteOrphanRuleSets(execDir, knownTags) ([]string, error) зеркалит state/v5.DeleteOrphans для подписок. Вызывается из RebuildConfigIfDirty после atomicWriteConfig. Multi-stage safety через новый core.collectAllStageRuleSetTags.
  • UpdateConfigFromSubscriptions теперь сам вызывает RebuildConfigIfDirty и эмитит ShowSubsResultFunc (было: только через RunParser обёртку). Auto-update fallback (RebuildConfigIfDirtyUpdate при пустом raw cache) больше не оставляет toast зависшим на 100%-in-progress; при сбое rebuild'а toast показывает (rebuild failed: ...).
  • Поле Settings.AutoRebuildOnChange убрано из internal/locale/settings.go. Существующие settings.json с этим полем толерантны (omitempty, игнорируется при чтении). Locale-ключ core.update_autorebuild_label удалён из всех 11 локалей.
  • UI-контрол updateAndRebuildButton (icon-кнопка refresh+rebuild) и его handler'ы убраны с Core Dashboard. Locale-ключ core.button_update_rebuild_tooltip тоже снесён.

Миграция

  • Миграция не требуется. Существующие v0.9.x-инсталляции, поймавшие cold-start FATAL, лечатся автоматически: открыть Configurator → Save → auto-rebuild сгенерирует свежий config.json со всеми rule-sets как type: local. SRS-файлы уже на диске под bin/rule-sets/<tag>.srs (скачанные предыдущими UI-кликами) переиспользуются.
  • Если вы вручную удалили SRS-файлы, на вкладке Configurator → Rules они отобразятся как 🔵 srs (нужна re-download); один клик на строку — скачка, Save → rebuild эмитит local-config.

Don't miss a new singbox-launcher release

NewReleases is sending notifications on new releases.