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

latest release: v0.8.8.3
8 hours ago

Release v0.8.8.1

Downloads

macOS (Universal) - Supports both Apple Silicon and Intel

Option 1: Installation Script (Recommended)

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

curl -fsSL https://raw.githubusercontent.com/Leadaxe/singbox-launcher/develop/scripts/install-macos.sh | bash -s -- v0.8.8.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-v0.8.8.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-v0.8.8.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-v0.8.8.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.

What's New from 0.8.8

Version 0.8.8.1 Release Notes — Hotfix

Hotfix release for the URLTest placeholder regression that prevented sing-box from starting on fresh v0.8.8 (and v0.8.7) installs. No new features, no API changes — pure bug fix. Safe to upgrade in place.


EN

Fixed

  • @urltest_* placeholders now resolve in parser_config.outbounds[]. v0.8.7 (SPEC 040) introduced template variables @urltest_url / @urltest_interval / @urltest_tolerance in the auto-proxy-out URLTest selector, but the parser code path that copies these options into the final config.json never ran the substitution — sing-box then failed outbounds[1].interval: time: invalid duration "@urltest_interval". Symptom: fresh installs (or any state.json copied from the v0.8.7+ template's parser_config) couldn't pass sing-box check and the launcher refused to start.

    Fix: core/config/SubstituteParserConfigPlaceholders is now invoked at the entry of GenerateOutboundsFromParserConfig. It walks every Options map under parser_config.outbounds[] and parser_config.proxies[].outbounds[], replacing string values that look like @varname. Resolution order: user override from state.jsonwizard_template.json default_value → built-in fallback for the three known URLTest placeholders (matching v0.8.6 hard-coded values) → leave the literal in place with a loud warning.

    Existing broken state.json files are healed transparently: the placeholder text remains in the wizard's editor view (so users see the template reference), but the generated outbound JSON fed to sing-box has the resolved value. No manual action required after upgrade.

Technical / Internal

  • New file core/config/varsubst.go: VarSubstituter type, SubstituteParserConfigPlaceholders, BuildVarSubstituterFromDisk(binDir), plus the hard-coded fallback table for urltest_url / urltest_interval / urltest_tolerance. Self-contained — no new dependencies, no UI imports (avoids a cycle with ui/wizard/template/).
  • Hook points: core.ConfigService.GenerateOutboundsFromParserConfig (wizard preview / Save path) and core.ConfigService.UpdateConfigFromSubscriptions (manual Update + auto-update cron) build a substituter from disk before generation.
  • 17 new unit tests covering: nil safety, hard-coded fallback, custom substituter, mixed string + object form options, non-string values left intact, type coercion (int for tolerance, bool for tun toggles), missing-file resilience, end-to-end with on-disk template + state.

A proper architectural fix (typed event-bus + state/config decoupling) is underway as SPEC 045 / 047 for v0.9. This hotfix is the minimal targeted patch to unblock current users.


RU

Исправлено

  • Плейсхолдеры @urltest_* теперь корректно разрешаются в parser_config.outbounds[]. В v0.8.7 (SPEC 040) у auto-proxy-out URLTest options появились шаблонные переменные @urltest_url / @urltest_interval / @urltest_tolerance, но путь генерации outbound'ов в парсере копировал их дословно — sing-box падал с outbounds[1].interval: time: invalid duration "@urltest_interval". Симптом: на свежей установке (или на любом state.json, чей parser_config был скопирован из шаблона v0.8.7+) sing-box check не проходил, и лаунчер отказывался запускаться.

    Фикс: на входе GenerateOutboundsFromParserConfig вызывается новая функция core/config/SubstituteParserConfigPlaceholders. Она обходит все Options под parser_config.outbounds[] и parser_config.proxies[].outbounds[] и подставляет строковые значения вида @varname. Порядок разрешения: пользовательский override из state.jsondefault_value из wizard_template.json → встроенный fallback для трёх известных URLTest-плейсхолдеров (совпадает с захардкоженными значениями v0.8.6) → оставить literal с громким warning'ом в логе.

    Существующие сломанные state.json лечатся автоматически: текст плейсхолдера остаётся в редакторе визарда (юзер видит шаблонную ссылку), но в outbound JSON, который уезжает в sing-box, попадает разрешённое значение. Никаких ручных действий после апгрейда не требуется.

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

  • Новый файл core/config/varsubst.go: тип VarSubstituter, функции SubstituteParserConfigPlaceholders, BuildVarSubstituterFromDisk(binDir), плюс таблица hardcoded fallback для urltest_url / urltest_interval / urltest_tolerance. Self-contained — без новых зависимостей и без импорта ui/wizard/template/ (не даёт цикла).
  • Точки внедрения: core.ConfigService.GenerateOutboundsFromParserConfig (визард preview / Save) и core.ConfigService.UpdateConfigFromSubscriptions (ручной Update + auto-update cron) строят substituter с диска до генерации.
  • 17 новых юнит-тестов: nil-safety, hardcoded fallback, кастомный substituter, mixed string + object form, нестроковые значения не трогаем, type-coercion (int для tolerance, bool для tun-флагов), устойчивость к отсутствующим файлам, end-to-end с шаблоном и state.json на диске.

Архитектурный фикс (типизированный event-bus + разведение state/config) идёт как SPEC 045 / 047 в v0.9. Этот hotfix — минимальная точечная заплатка, чтобы разблокировать текущих пользователей.

Don't miss a new singbox-launcher release

NewReleases is sending notifications on new releases.