Release v0.9.5
Downloads
macOS (Universal) - Supports both Apple Silicon and Intel
Option 1: Installation Script (Recommended)
Install with a single command (version v0.9.5):
curl -fsSL https://raw.githubusercontent.com/Leadaxe/singbox-launcher/develop/scripts/install-macos.sh | bash -s -- v0.9.5The 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.5-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.5-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.5-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.
Highlights (EN)
Single-fix point release continuing the cleanup of the dual-storage residue from SPEC 045/052 refactor. After v0.9.4 fixed route.final losing the user's choice on Save, this release fixes the same architectural class for per-source outbounds in Configurator → Outbounds tab.
Fixed
- Configurator → Outbounds: per-source outbound now persists across Save. Reported by Michael M. Adding a new outbound with any Scope ≠ "For All" produced no persistent change after Save (entry vanished from the list). Editing an existing outbound and switching Scope from "For All" to a source-specific one had the same symptom — entry disappeared. Same root cause as the v0.9.4
route.finalregression: the Outbounds tab is the only UI surface that mutates the legacymodel.ParserConfig.ParserConfig.Proxies[i].Outboundsview directly, and the on-apply callback synced only the global outbounds back to canonicalmodel.GlobalOutbounds— per-source outbounds had no equivalent sync, so they only existed in the derived view and were dropped at Save when presenter copiedmodel.Sourcesintostate.Connections.Sources. Fix is one block inonConfiguratorApplythat walksmodel.Sourcesin lockstep withParserConfig.Proxies(built 1:1 from Sources viaAsParserConfig, index alignment guaranteed) and copiesOutboundsback. Covers all four operations: Add, Edit (with or without scope change), Delete, Reorder ↑↓ — they all close through the same callback.
Technical / Internal
- Audit completed across remaining UI surfaces (Source edit window, Source enable/disable/delete, DNS tab, Rules tab, Settings tab) — all of them write canonical store directly, no other dual-book pattern remains. Outbounds tab was the last instance.
- Pre-existing
state.jsonfiles with per-source outbounds load correctly —Sources[i].Outboundsis read on Load and projected into the derivedParserConfigview byRefreshDerivedParserConfig. The bug was strictly write-side, no migration needed.
Основное (RU)
Точечный фикс — продолжение чистки последствий двойного хранилища из рефактора SPEC 045/052. После v0.9.4, где починили потерю выбора route.final при Save, этот релиз закрывает тот же архитектурный класс для per-source outbound'ов во вкладке Configurator → Outbounds.
Исправлено
- Configurator → Outbounds: per-source outbound теперь сохраняется при Save. Сообщил Michael M. Добавление нового outbound со Scope ≠ "For All" не давало эффекта после Save (запись пропадала из списка). Редактирование существующего outbound со сменой Scope с "For All" на source-specific — тот же симптом, запись исчезала. Корень тот же что у v0.9.4 регрессии с
route.final: вкладка Outbounds — единственный UI surface, который мутирует legacy viewmodel.ParserConfig.ParserConfig.Proxies[i].Outboundsнапрямую, а on-apply callback синхронизировал обратно в canonicalmodel.GlobalOutboundsтолько глобальные outbound'ы — per-source эквивалентной sync не было, поэтому они существовали только в derived view и терялись при Save (когда presenter копируетmodel.Sourcesвstate.Connections.Sources). Фикс — один блок вonConfiguratorApply, который идёт поmodel.Sourcesпараллельно сParserConfig.Proxies(построен 1:1 из Sources черезAsParserConfig, выравнивание индексов гарантировано) и копируетOutboundsобратно. Покрывает все четыре операции: Add, Edit (с / без смены scope), Delete, Reorder ↑↓ — все закрываются через тот же callback.
Техническое / Внутреннее
- Аудит остальных UI surfaces (Source edit window, Source enable/disable/delete, DNS tab, Rules tab, Settings tab) показал что все они пишут в canonical store напрямую — других дыр того же класса нет. Outbounds tab был последним.
- Существующие
state.jsonс per-source outbound'ами загружаются корректно —Sources[i].Outboundsчитается на Load и проектируется в derivedParserConfigview черезRefreshDerivedParserConfig. Баг был строго на write-side, миграция не нужна.