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

latest release: v0.9.8.1
5 hours ago

Release v0.9.8

Downloads

macOS (Universal) - Supports both Apple Silicon and Intel

Option 1: Installation Script (Recommended)

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

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

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.8-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.8-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.8-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.8 — 2026-05-26

Plumbing + quality release on top of v0.9.7: sing-box bumped to 1.13.12 on both modern and Win7-legacy builds, Win7-specific fixes (legacy build now reports correct version + template ref, Mesa3D OpenGL workaround for old hardware documented), main window usable in parallel with configurator, DNS Rules tab unified into one ordered list. Behind the scenes: README rewrite around platform-level positioning with 6 hero screenshots, three independent CI bugs found and fixed (Win7 ldflags injecting into a non-existent symbol, Windows test failures silently swallowed by set ERRORLEVEL trap, Linux/macOS test failing on a .gitignore-swallowed fixture file).

EN

Highlights

  • Main window stays usable while the configurator is open. Previously a transparent click-redirect overlay on the main window forwarded every click to the wizard, which made Update / Restart / Start / Stop / tab switches silently fail until you closed the configurator. The overlay is now disabled by default — the configurator opens as a sibling top-level window and the launcher controls keep working in parallel.
  • DNS Rules tab — unified ordered list (drag ↑↓). The wizard's DNS Rules section used to render preset DNS rules and user DNS rules in two fixed sections — preset rules always won sing-box first-match. The tab now shows a single ordered list where preset (🔗) and user (→) rules can be interleaved freely; use ↑↓ buttons on each row to reorder, and your custom domain can finally beat a preset's broader match. A small toggle at the top-right of the section swaps between this list and the raw-JSON editor (user rules only).
  • Sing-box bumped to 1.13.12 on both modern and Win7-legacy builds (was 1.13.11 modern / 1.13.2 Win7). Win7 jump closes a 9-patch gap accumulated since the original pin — picks up sing-box bug-fixes and DNS / route schema parity with the modern build, so configs generated by the current Configurator no longer fail to load on Win7 due to schema drift.
  • Win7 release build now reports correct version + template ref. The CI Win7 job was injecting ldflags into a non-existent main.Version symbol (it should target singbox-launcher/internal/constants.AppVersion), and was missing RequiredTemplateRef entirely. Result: Win7 binaries shipped with v-local-test shown in the auto-update popup and an unpinned template ref. Fixed in .github/workflows/ci.yml Win7 build step — now mirrors the resolution done in build/build_windows.bat.
  • Win7 32-bit: Mesa3D OpenGL workaround documented. On legacy Win7 hardware with OpenGL < 2.1 (Intel HD 1xxx-2xxx, some ATI/AMD chipsets) the launcher's tray icon appears but the main window renders as an empty frame — Fyne / GLFW requires OpenGL 2.1+. New docs/WIN7_OPENGL.md walks through dropping opengl32.dll + libglapi.dll from mesa-dist-win (x86 build) next to the launcher exe; Windows DLL search order picks up the local copies and Fyne gets a software-rendered 3.x context. Linked from the Troubleshooting table in both READMEs. Credit: user report from the Telegram channel.
  • README rewrite around platform-level positioning. Both README.md (EN) and README_RU.md (RU) reorganized: new hero one-liner («Desktop platform for network routing and traffic analysis. 15+ VPN protocols, configuration depth and API at enterprise level»), Features categorized by 8 capability tiers (Connectivity / Routing / DNS / Network observability / Reliability / System integration / Power tools / Distribution), 6 inline hero screenshots, Subscription provider compatibility table (Marzban / Marzneshin / Remnawave / NashVPN / V2Board / 3X-UI), Troubleshooting table, CLI flags + System tray + Share URI sections restored. New docs/PRODUCT_ANALYSIS.md (internal positioning artifact, not linked from READMEs).

Fixed

  • CI: Windows test failures were silently swallowed by an ERRORLEVEL trap. build/test_windows.bat had a duplicate set TEST_EXIT_CODE=%ERRORLEVEL% line; cmd's set itself succeeds and resets ERRORLEVEL=0, so the second capture always read 0 — exit /b %TEST_EXIT_CODE% then reported success even when go test had failed. Linux/macOS scripts use bash ${PIPESTATUS[0]} and were never affected. Real Windows-only regression that was hidden: TestConvertRuleSetToLocalRequired_* in core/build/ was embedding t.TempDir() paths into JSON-string literals via concatenation — C:\Users\…\Temp\… contains backslashes that are invalid JSON escapes (\U, \b, \t). Test now uses json.Marshal to escape paths properly. Both fixes restored Windows test reliability.
  • TestParseLogLine_KnownSamples missing fixture caused CI fail on Linux/macOS. The golden log file internal/traffic/testdata/sing-box-logs/sample.log was matched by the project-wide *.log .gitignore rule and never committed since SPEC 059 landed. Test used t.Fatalf if file absent → CI failed every run. Fixture now committed via explicit !internal/traffic/testdata/sing-box-logs/*.log exception (runtime logs under bin/logs/ still protected); test keeps t.Skipf branch as belt-and-suspenders.
  • CI: prerelease workflow was unusable due to chicken-and-egg. run_mode=prerelease computes the release-notes filename slug from git describe's HEAD short-SHA — but any commit adding the release-notes file shifts HEAD to a new SHA, so the file you commit (named for parent's SHA) never matches what CI computes on the post-commit HEAD. The strict file-check then failed Read release notes step, but the prerelease tag was already pushed earlier in the same job → orphan tag pollution. Fixed by falling back to docs/release_notes/upcoming.md when PRERELEASE=true and the exact slug file is absent. Stable releases (vX.Y.Z tags) keep the strict per-version-file requirement. docs/RELEASE_PROCESS.md §2.2 rewritten accordingly.

Technical / Internal

  • ui/wizard_overlay.go::wizardOverlayEnabled (const bool) gates the legacy main-window click-redirect overlay. Default false. Flip to true to restore the «wizard owns the foreground» UX without ripping out the implementation. The wizard's internal ChildWindowsOverlay (used over wizard tabs while a child dialog is open) is independent and unchanged.
  • .gitignore exception scoped narrowly: !internal/traffic/testdata/sing-box-logs/*.log. Surrounding *.log rule continues to protect runtime logs in bin/logs/.
  • core/rebuild.go::validateConfigViaSingBox and internal/platform/device_info_windows.go::wmicValue now route through platform.PrepareCommand(cmd) for consistency with every other exec.Command site in the codebase. Behavior unchanged (PrepareCommand keeps HideWindow:true only; CREATE_NO_WINDOW intentionally NOT enabled because it would silently break SendCtrlBreak graceful shutdown — comment in internal/platform/platform_windows.go documents the trade-off).

RU

Основное

  • Главное окно работает пока открыт конфигуратор. Раньше невидимый overlay перехватывал любой клик по главному окну пока визард открыт — Update / Restart / Start / Stop / переключение вкладок молча игнорились. Теперь overlay по умолчанию выключен, конфигуратор — обычное соседнее окно, лаунчер можно использовать параллельно.
  • Вкладка DNS Rules — единый упорядоченный список правил (drag ↑↓). Секция DNS rules в визарде раньше рисовала preset- и user-правила в двух фиксированных секциях — preset всегда выигрывал first-match у sing-box. Теперь это один ordered список, в котором preset (🔗) и user (→) правила можно перемешать произвольно: кнопки ↑↓ на каждой строке двигают порядок, и твой кастомный домен наконец может опередить более широкий match preset'а. Маленький toggle справа от заголовка переключает между этим списком и raw-JSON редактором (только user-правила).
  • Sing-box обновлён до 1.13.12 на modern и Win7-legacy сборках (было 1.13.11 modern / 1.13.2 Win7). Win7-bump закрывает gap в 9 patch-версий, накопленный с момента изначального pin'а — подтягивает bug-фиксы sing-box и schema-паритет DNS / route с modern-сборкой, конфиги из текущего Configurator теперь грузятся на Win7 без schema-drift.
  • Win7-релиз теперь правильно показывает версию + template ref. CI-job Win7-сборки инжектил ldflags в несуществующий символ main.Version (должен быть singbox-launcher/internal/constants.AppVersion) и вообще не передавал RequiredTemplateRef. Результат: Win7-бинарники показывали v-local-test в auto-update попапе и работали с unpinned template ref. Исправлено в .github/workflows/ci.yml Win7-build step — теперь зеркало build/build_windows.bat.
  • Win7 32-bit: задокументирован workaround OpenGL через Mesa3D. На legacy Win7-железе с OpenGL < 2.1 (Intel HD 1xxx-2xxx, некоторые ATI/AMD-чипсеты) у лаунчера появляется иконка в трее, но главное окно рендерится пустой рамкой — Fyne / GLFW требуют OpenGL 2.1+. Новый docs/WIN7_OPENGL.md описывает как положить opengl32.dll + libglapi.dll из mesa-dist-win (x86-сборка) рядом с exe лаунчера; Windows DLL search order подхватит локальные копии и Fyne получит software-рендереный 3.x контекст. Линк добавлен в таблицу Troubleshooting обоих README. Спасибо пользователю из Telegram-канала за репорт.
  • README переписан вокруг platform-level позиционирования. Оба README.md (EN) и README_RU.md (RU) реорганизованы: новый hero one-liner («Десктоп-платформа сетевой маршрутизации и анализа трафика. 15+ VPN-протоколов, глубина настроек и API уровня Enterprise»), Возможности разбиты по 8 категориям (Connectivity / Routing / DNS / Network observability / Reliability / System integration / Power tools / Distribution), 6 hero-скриншотов inline, таблица совместимости с подписочными провайдерами (Marzban / Marzneshin / Remnawave / NashVPN / V2Board / 3X-UI), таблица Troubleshooting, секции CLI флагов + System tray + Share URI возвращены. Новый docs/PRODUCT_ANALYSIS.md (внутренний позиционинг-артефакт, не линкуется из README).

Исправлено

  • CI: Windows test-фейлы молча проглатывались ERRORLEVEL-trap'ом. В build/test_windows.bat была дубликат-строка set TEST_EXIT_CODE=%ERRORLEVEL%; команда set сама успешно выполняется и сбрасывает ERRORLEVEL=0, поэтому второй capture всегда читал 0 — exit /b %TEST_EXIT_CODE% потом репортил success даже когда go test падал. Linux/macOS-скрипты используют bash ${PIPESTATUS[0]} и никогда не были затронуты. Реальная Windows-only регрессия, которая была скрыта: TestConvertRuleSetToLocalRequired_* в core/build/ встраивал пути из t.TempDir() в JSON-строку через конкатенацию — C:\Users\…\Temp\… содержит обратные слэши, которые невалидны как JSON-escape (\U, \b, \t). Тест теперь использует json.Marshal для правильного эскейпа путей. Оба фикса вернули Windows-тестам надёжность.
  • TestParseLogLine_KnownSamples отсутствующая фикстура валила CI на Linux/macOS. Golden log файл internal/traffic/testdata/sing-box-logs/sample.log попадал под общее *.log .gitignore правило и никогда не был закоммичен с момента ландинга SPEC 059. Тест использовал t.Fatalf если файл отсутствует → CI падал на каждом ране. Фикстура теперь закоммичена через явный exception !internal/traffic/testdata/sing-box-logs/*.log (рантайм-логи под bin/logs/ по-прежнему защищены); тест сохранил t.Skipf ветку как belt-and-suspenders.
  • CI: prerelease workflow был неюзабельный из-за chicken-and-egg. run_mode=prerelease вычисляет slug имени release-notes файла из short-SHA HEAD'а в git describe — но любой commit, добавляющий release-notes файл, сдвигает HEAD к новому SHA, поэтому файл, который вы коммитите (с именем по SHA родителя), никогда не совпадает с тем, что CI вычисляет на post-commit HEAD'е. Строгий file-check падал на Read release notes step, но prerelease-тег уже был push'нут раньше в том же job → orphan-тег. Исправлено fallback'ом на docs/release_notes/upcoming.md когда PRERELEASE=true и точный slug-файл отсутствует. Stable-релизы (vX.Y.Z теги) сохраняют строгое требование per-version файла. docs/RELEASE_PROCESS.md §2.2 переписан соответственно.

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

  • ui/wizard_overlay.go::wizardOverlayEnabled (const bool) — фича-флаг legacy-overlay'я главного окна. Default false. Поставь true — вернётся прежнее поведение «wizard захватывает фокус». Внутренний wizard'овый ChildWindowsOverlay (над wizard-табами когда открыто child-окно) — независим и не тронут.
  • .gitignore exception scoped узко: !internal/traffic/testdata/sing-box-logs/*.log. Окружающее *.log правило продолжает защищать рантайм-логи в bin/logs/.
  • core/rebuild.go::validateConfigViaSingBox и internal/platform/device_info_windows.go::wmicValue теперь проходят через platform.PrepareCommand(cmd) для consistency со всеми остальными exec.Command сайтами в коде. Поведение не изменилось (PrepareCommand оставлен с HideWindow:true только; CREATE_NO_WINDOW намеренно НЕ включён, потому что это silent-сломало бы SendCtrlBreak graceful shutdown — комментарий в internal/platform/platform_windows.go документирует trade-off).

Don't miss a new singbox-launcher release

NewReleases is sending notifications on new releases.