-
Notifications
You must be signed in to change notification settings - Fork 0
EN Changelog
-
Fixed CI publish-version validation to read the canonical product version from
Directory.Build.props, matching repository/release tooling instead of requiring a forbidden project-local<Version>inShadowsocks.WinUI.csproj. The release-ready source archive now includes and validates GitHub workflow files so this contract cannot drift outside the packaged source. -
Fixed localization release validation to use the same ordinal, case-sensitive key semantics as the runtime catalog. Exact duplicate English keys are still rejected, while intentional case-distinct keys such as
Active/ACTIVEremain valid; stale case-only UI keys were canonicalized and unused duplicates removed. -
Fixed a PowerShell runtime-semantic regression in
Validate-Repository.ps1: XML/package helpers no longer usereturn if (...), which PowerShell treats as an attempt to invoke a command namedif. A validator self-check now rejects directreturnoperands that are statement keywords. -
Fixed the release validator under PowerShell
Set-StrictMode -Version Latest: empty success-path collections no longer use synthetic.FullName/.Namemember enumeration while formatting diagnostics; packaging scripts project names explicitly before joining them, and validation now rejects the unsafe pattern. -
DNSCrypt first-use defaults and tests are now separated correctly: active runtime routing still defaults through Shadowsocks and requires a valid local SOCKS5 endpoint, while offline/direct test fixtures opt out explicitly; resolver-catalog TOML ignores the active runtime proxy preference because it only reads the pre-seeded signed cache.
-
5.2.31 analyzer hotfix: online-config selection recovery now accepts the concrete
List<Server>already provided byConfiguration.configs, clearing CA1859 without suppression or behavior changes. -
5.2.31 compile hotfix: the empty-server editor state no longer assigns
IsEnabledto a WinUIBorder; availability is applied to the actual editor controls, and the repository validator now rejectsIsEnabledassignments to known non-Control container/visual types. -
Final routing hardening excludes incomplete legacy/damaged profiles from Balancing/High Availability, tray selection and server hotkeys; HA and SIP003 process tracking keep same-endpoint profiles distinct. TCP strategy connections use the timeout of the actually selected server, and subscription refresh preserves selection without colliding with a local profile at the same host/port.
-
5.2.31 hotfix: removed the synthetic empty
Server 1; zero servers is now a valid state and incomplete drafts do not unlock server-dependent features. -
DNS, PAC and enabling the Windows system proxy are disabled until a complete Shadowsocks server exists; removing the last usable server disables effective proxy/DNS/capture activity but preserves the saved DNS policy for reuse when a working server is added.
-
Added non-blocking busy feedback for Start on Boot, Administrator capture/UAC transitions and update operations.
-
Fresh DNSCrypt configuration enables every first-use option except IPv6. Existing persisted DNSCrypt settings are preserved exactly; schema v3 does not migrate or overwrite them.
-
WinUI navigation, Logs and UAC/Administrator glyphs now use explicit Windows 10-compatible Segoe MDL2 Assets.
-
5.2.31 hotfix: DNSCrypt Minisign verification now supports the official resolver catalog's legacy
Edsignature format as well as modern pre-hashedED, preserving full payload and trusted-comment authentication. -
Self-update handoff now resumes the live shell state captured at update time instead of the process's original startup argument, so a window opened or hidden after launch keeps that state across an application update.
-
Reboot/session restore now preserves the real shell state: Start with Windows and Restart Manager remain mutually exclusive, but use
--start-visible/--start-hiddento restore an open window as open and a tray-only session as tray-only.WM_QUERYENDSESSIONsnapshots the state before Windows closes the HWND, and both restore markers bypass plain second-launch handling so redirected system restore cannot surface the already-running dialog. -
Fixed the DNSCrypt release validator StrictMode failure caused by an uninitialized
$controllerPath. -
Cleared the final DNSCrypt TOML CA1859 diagnostics by using the already-materialized concrete
Dictionarytype in private static-resolver serialization and its test helper; analyzer rules remain enabled. -
DNSCrypt component GitHub release discovery and ZIP/Minisign downloads now use Cloudflare DoH over Shadowsocks with Google DoH fallback; redirect hosts are re-resolved through the same tunnel, and failures are logged before rollback instead of surfacing a raw
api.github.comsystem-DNS error. -
Fixed the DNSCrypt resolver-catalog bootstrap deadlock: Cloudflare DoH over Shadowsocks is primary, Google DoH over Shadowsocks is fallback, resolver-list HTTPS also stays inside the tunnel, Minisign is verified before publication, and dnscrypt-proxy consumes only an offline local cache (
urls = [],bootstrap_resolvers = [],ignore_system_dns = true). -
Completed a full WinUI localization/accessibility/context-state audit: the selected app locale now controls the built-in Settings navigation entry, indirect Hotkey action labels and registration-status tooltips; Forward Proxy field labels are localized in all seven shipped locales; and selection/dirty/busy state now consistently gates actions across Servers, PAC/GeoSite, Online Config, Plugins, Games, Hotkeys, Sharing, Traffic and Updates.
-
Tightened contextual UI behavior: invalid persisted Online PAC URLs are corrected before activation from either page or tray, GeoSite refresh shows progress and blocks conflicting edits, duplicate Add actions are disabled, update operations lock conflicting controls, Plugin=None hides plugin-only fields without destructively clearing unsaved values, and the obsolete generated Local PAC editor action is removed in favor of
user-rule.txt. -
Fixed four first-use/UI gaps:
ss://imports now offer installation of missing known catalog plugins, first DNSCrypt installation keeps animated progress visible, Local PAC exposesuser-rule.txt, and Local managed-routing cards are hidden in Online PAC mode. -
Fixed stale legal-resource tests to assert the current Adblock Plus-derived network routing notice wording, and made fake GitHub plugin release payloads byte-stable so SHA-256 verification is deterministic and anti-downgrade tests reach the intended version gate.
Fork-specific changes are tracked here. Historical upstream Shadowsocks for Windows changes remain in CHANGES.
-
Final release audit: persisted DNSCrypt compatibility values are no longer rewritten during configuration processing or when visible DNSCrypt settings are applied; Administrator-mode DNSCrypt interception still enforces effective fail-closed protection. Saving mixed local/subscription servers also preserves the selected server across grouping/sort reordering.
-
Fixed built-in QTun installation from GitHub releases: the Windows selector now follows the upstream
x86_64-pc-windows-msvcZIP naming convention instead of thewindows-nativeActions artifact label. -
Fixed UDP load-balancing selection for negative endpoint hash codes; server indexing now uses unsigned modulo and cannot produce a negative list index.
-
Fixed the WinUI DNS resolver-selection compile regression left by the cancellation-ownership refactor: switching away from manual resolver selection now cancels latency probing through
_cancelResolverLatencyinstead of referencing the removed_resolverLatencyCancellationfield. -
Completed the WinUI analyzer/lifetime follow-up:
App,DnsPageandLogsPagehave explicit shutdown ownership, cached pages are disposed before the controller, DNS cancellation sources remain owned by their async operations, Logs serializes settings writes through a non-disposable .NETLock, and the remaining CA1725/CA1822/CA1834/CA1305/CA1806/CA1859 findings were corrected without production-wide suppression. -
Added managed background SIP003 catalog updates: trusted built-in packages auto-check once per day, in-use packages are deferred, failed checks remain retryable, per-plugin automatic updates can be disabled, and the Plugins page exposes an explicit Check updates action. Manual imports never auto-update; arbitrary repository input remains a TODO pending a dedicated trust/asset-selection design.
-
Hardened plugin package promotion with release provenance, optional GitHub SHA-256 asset-digest verification, bounded download/extraction, Windows-ADS/path rejection, staging/rollback and transient-directory cleanup.
-
Replaced the non-terminating traffic-statistics thread/public mutable queue with a cancellation-aware task and locked snapshot API, eliminating the WinUI traffic/log race.
-
Cleared the Visual Studio strict-build follow-up diagnostics: fixed the TrafficPage local-variable casing compile regression; applied concrete private hot-path types and .NET 10 argument helpers; modernized test TaskCompletionSource bridges and pointer/culture handling; and changed DNSCrypt/WinDivert security-pin tests to read runtime constant metadata. Test-only CA1707/CA1861 are intentionally disabled for Method_Scenario_Result names and local literal fixtures, while production analyzers remain enabled.
-
Finalized Variant B managed routing: Local GeoSite + EasyList/ABP routing is exclusively C#
FilterEnginein User and Administrator paths. Removedabp.js, compiled-PAC compatibility, the historical backend selector, and executable customabp.txt; Local PAC is only the minimal Windows proxy funnel. Removed settings are pruned by schema migration. Online PAC remains a separate explicit external-PAC mode. -
Centralized product versioning in
Directory.Build.props, removed duplicated project<Version>values, and aligned release metadata validation around the canonical version. -
Replaced the oversized source-token release validator with compact structural, localization, packaging, PowerShell-parser and supply-chain checks; behavioral routing/update/DNS contracts remain enforced by unit/integration tests.
-
Added complete English and Russian user guides alongside the existing Simplified Chinese guide, corrected the
Shadowsocks.Windows.WinUIdependency graph, synchronized all three root README mirrors, and documented the final managed-routing architecture. -
Standardized WinUI shell namespaces and enabled the .NET 10 recommended analyzer ruleset during builds.
-
Final compile/analyzer cleanup corrected the DNSCrypt resolver-array length check, removed meaningless
protectedmembers from the sealed controller, and madeUDPRelayexplicitlyIDisposable. -
About → License and Third-party notices now use the selected UI language for explanatory text in EN/RU/zh-CN/zh-TW/JA/KO/FR, while authoritative license wording remains embedded in its original language.
-
Corrected the release version after the previous RC was mistakenly numbered 2.2.31. All product/assembly/manifest/package/test/documentation metadata now uses 5.2.31 / 5.2.31.0, so normal numeric version ordering correctly treats 5.2.22 as older.
-
Fixed stale startup-copy version detection in automatic update: installed 5.2.31 now rejects 5.2.22/5.2.31 even if an older LocalAppData startup copy is running; updater mode also performs a final target FileVersion anti-downgrade check immediately before replacement. Regression tests cover stale-copy, downgrade/equal rejection and 5.2.32 acceptance.
-
Restored canonical English, Russian and Simplified Chinese README files in the application repository root while keeping synchronized Wiki mirrors; refreshed their DNS documentation for the current 5.2.31 implementation and kept the separate classic-style Chinese usage guide.
-
Corrected stale DNS documentation: Administrator Mode currently implements transparent UDP/TCP 53 routing for
System,Direct,Proxy,CustomDohandDnsCrypt; the older pre-5.2.31 limitation is historical only. -
Moved long-form Markdown documentation into the dedicated GitHub Wiki while retaining the three localized root README files.
.githubremains functional in Git for workflows/templates but.gitand.githubare excluded from distributed source archives; legal notices are embedded fromTHIRD-PARTY-NOTICES.txt. -
Added a complete Simplified Chinese usage page (
Shadowsocks Windows 使用说明) and linked it from Home, English, Russian and the Wiki sidebar. -
Fixed duplicate Start-with-Windows instances by restoring stale Run-entry deduplication and adding a process-wide single-instance guard independent of unpackaged WinUI executable identity; legacy-only Run entries are migrated, disabling autostart removes stale entries too, and hidden startup activations no longer raise the already-running dialog.
-
Disabled Fody-generated
FodyWeavers.xsdschema files, removed stale copies, and removednoNamespaceSchemaLocationreferences from bothFodyWeavers.xmlfiles so Visual Studio no longer requests a missing generated schema. -
Fixed the final false-positive updater release-validator regex: automatic update stream disposal is now guarded by the Windows regression test instead of brittle source formatting. The self-update handoff was verified successfully with a previous-version to newer-version test build.
-
Fixed automatic update download promotion on Windows: the temporary
.downloadstream is fully disposed beforeFile.Move, eliminating the sharing violation observed during previous-version to newer-version update tests. SHA-256 sidecars now accept both standardsha256sumformat and a plain 64-hex digest. -
Fixed DNSCrypt loopback-port allocation on Windows/GitHub Actions hosts where TCP and UDP dynamic/excluded ranges differ: allocation is now UDP-first, verifies the same numeric port over TCP, falls back to a dual-bind application-port candidate when needed, and preserves the last socket failure for diagnostics.
-
Relaxed the Bouncy Castle Bzip2 notice validator to verify the legal contract (
modified Bzip2+Apache License 2.0) instead of one obsolete wording. -
Fixed the Phase 10 NetworkService version release-validator check after version response ownership moved from
Program.cstoNetworkServiceResponses.cs; validation now also requires the versioned-ping regression test. -
Fixed invalid multiline PowerShell boolean expressions in
Validate-DnsCrypt.ps1; the release parser gate now passes this DNSCrypt validation block instead of stopping before repository validation. -
Fixed a release-validator PowerShell interpolation parser error and added a CI/release PowerShell parser gate for every
packaging/*.ps1script. -
Synchronized the living Markdown documentation with the final 5.2.31 implementation: updater integrity/UAC handoff, release security gates, current selectable
RichTextBlockLogs contract, storage architecture and release verification are now documented consistently. -
Fixed the release validator after the Logs viewer migration from
ListViewto selectableRichTextBlock: validation now enforcesIsTextSelectionEnabled = trueinstead of the retiredListViewSelectionMode.Noneimplementation token. -
Fixed a release-blocking self-updater compilation regression:
UpdateCheckernow resolvesSelfUpdaterfrom the service namespace, and launching the installed updated executable uses a valid explicitProcess.Startnull check instead of an invalid standalone null-coalescing expression. -
Fixed the DNSCrypt TOML test so
odoh_servers = falseis no longer mistaken for adoh_servers = falseline, and added the missing resolver-filter translation in every shipped locale. -
Kept the automatic updater contract release-safe: canonical
Shadowsocks-win-x64.zip/.sha256verification, PID handoff, rollback, replacement of the primary product EXE, relaunch, and cleanup remain required by repository validation. -
Synchronized the product version across Core, Windows infrastructure, WinUI integration, NetworkService, manifests and
ApplicationInfoso all shipped assemblies identify as 5.2.31 / 5.2.31.0. -
Strengthened release validation around updater compilation invariants,
ss://protocol-command quoting, single-file packaging and Windows 10 build 19041 compatibility metadata. -
Refreshed release workflow defaults, packaging commands, checklist examples and third-party notice metadata for 5.2.31.
-
Raised the release SDK security floor to .NET SDK 10.0.303 (runtime 10.0.11), made NuGet audit availability/vulnerability findings
NU1900-NU1904fail CI/release restores, and verify the finalShadowsocks.exeFileVersion exactly matches5.2.31.0before packaging. -
Hardened automatic update handoff against local staged-payload tampering: the verified updater is held read-only/non-deletable across
Process.Start/UAC, its SHA-256 is carried as an internal handoff argument, and the updater re-verifies its own staged image before replacing the installed executable.
- Replaced the legacy SOCKS5 forward-proxy handshake with an RFC 1928/1929 implementation: username/password authentication now works, domain-name replies are accepted, and fragmented socket reads/writes are handled correctly.
- Replaced the stale browser impersonation User-Agent in HTTP CONNECT with the product User-Agent, made CONNECT writes/header reads fragmentation-safe, preserved tunnel bytes received with the proxy response, and added forward-proxy regression tests.
- Hardened the UDP relay: SOCKS5 UDP destinations now participate in server-strategy selection, malformed/fragmented datagrams are rejected, failed associations can be recreated, encryptors are disposed deterministically, and the borrowed generic LRU cache was replaced with a purpose-built bounded association cache.
- Replaced the download-to-Explorer update flow with a strict automatic single-file self-updater: canonical GitHub ZIP/SHA-256 assets are verified, the new EXE performs a PID handoff with rollback, replaces the product binary, launches the installed copy and is then removed by that new copy.
- Start-with-Windows now records the primary product EXE in the Run command so an automatic update launched from the stable LocalAppData startup copy updates the real product binary instead of only the startup copy.
- Removed retired executable-side configuration/PAC/cache migration, pre-SIP002 URL handling, unmanaged plugin PATH/absolute-path fallback, old IPC/thread utility code and stale updater compatibility fallbacks; release validation rejects their return.
- Rebuilt the embedded product license and third-party notices for the actual dependency set of that development snapshot; About now reads validated non-empty legal resources through
EmbeddedResources. - Fixed
ss://protocol registration so Windows quotes both the product executable path and the imported URL placeholder; associations now remain valid whenShadowsocks.exeis installed in a path containing spaces, and release validation prevents the unsafe command from returning. - Locked WinUI release validation to the intended compatibility contract: compile against the Windows 26100 SDK while keeping
SupportedOSPlatformVersionandTargetPlatformMinVersionat Windows 10 build 19041 for both WinUI projects, with the Windows 10/11 manifest compatibility declaration required.
- DNS page now starts with live Windows DNS status (active adapters, configured DNS servers, selected Shadowsocks DNS policy and transparent-interception state), adds localized tooltips/accessibility help for DNS controls, and shows only the settings relevant to the currently selected DNS mode.
- DNSCrypt
Automaticresolver selection now resolves a concrete DNSCrypt/DoH server from the signed catalog using the configured DNSSEC, no-log, unfiltered and address-family constraints. It prefers a resolver in the active Shadowsocks server country, falls back to the best compatible catalog entry, and refreshes the choice when the active server/strategy changes. - Added DNS privacy diagnostics and a self-test that verifies DNSCrypt health, Administrator DNS interception, fail-closed/system-DNS isolation, active-runtime bootstrap settings, filtered Automatic resolver pinning and the current secure transport.
- Server list labels now show the friendly server name plus a country flag and no longer append the server IP/hostname. Country metadata is resolved best-effort over HTTPS and cached in memory.
- Added a DNS-page
Test DNSCrypthealth-check action for the currently running local DNSCrypt listener. - Added built-in DoH provider presets for Cloudflare, Google Public DNS, Quad9 (secure/unfiltered), AdGuard DNS (default/unfiltered) and Mullvad while retaining a custom HTTPS endpoint option.
- Added a
Show DNS Logslogging option, disabled by default; DNS lifecycle/upstream events follow this switch, while raw dnscrypt-proxy resolver probes/RTT diagnostics additionally requireVerbose Logging, and application-level DNS errors remain visible. - Restored severity-aware log highlighting in the WinUI log viewer while keeping selectable text, wrapping control and horizontal scrolling.
- NetworkService helper extraction now uses a stable version/SHA-256 path instead of a PID/GUID path, preventing Windows Firewall from treating every Admin Mode start as a different executable.
- Direct DNS can now use primary/fallback IPv4/IPv6 resolver presets or custom addresses and can optionally route those selected DNS endpoints through the local Shadowsocks SOCKS5 path; with no explicit server, the original DNS destination can also be routed through Shadowsocks.
- Custom DoH now has an independent option to route its HTTPS upstream through the local Shadowsocks SOCKS5 endpoint.
- DNSCrypt resolver UX now shows the active Automatic resolver immediately, keeps ODoH disabled, exposes DNSCrypt/DoH protocol plus country/address-family/privacy filters for manual catalog browsing, measures manual-list latency in the background without blocking the UI, and replaces the active resolver's estimate with DNSCrypt Proxy's actual RTT when available.
- DNSCrypt settings changes are debounced and applied without locking the page; failed manual resolver changes use a bounded rollback and surface the last dnscrypt-proxy upstream error instead of an indefinite loading state.
- DNSCrypt resolver country metadata is derived exclusively from resolver endpoint IPs via batched GeoIP lookup; resolver names/descriptions are never used as geographic hints, and Anycast is neither represented as a pseudo-country nor guessed from description text.
- Final DNS regression pass reuses the verified resolver-source cache for temporary catalog/settings validation processes, removes duplicate DNS-page refreshes during background RTT probing, normalizes legacy manual resolver selections to supported DNSCrypt/DoH entries, and prevents stale manual resolver metadata from being persisted.
- Log rendering now keeps warning/error emphasis on multiline continuation and stack-trace lines and emphasizes the severity token while retaining theme-aware colors.
- DNSCrypt resolver mode is now stored explicitly instead of being inferred from
serverNames; legacy stale manual selections migrate to Automatic, manual DNSCrypt/DoH selections are health-validated before persistence, and Automatic resolves a concrete server from the signed catalog using the configured DNSSEC, no-log, unfiltered and address-family filters instead of bypassing those filters with a Cloudflare-only pin. -
Show Plugin Outputno longer reloads Shadowsocks or restarts SIP003; plugin stdout/stderr is captured asynchronously and filtered dynamically, plugin shutdown waits are bounded, and logging-level toggles no longer restart the network stack. - DNSCrypt install/update candidate validation now verifies the exact candidate version first, then resolves an eligible resolver from that candidate's signed catalog before its runtime health check, so Automatic mode remains provider-neutral without breaking first install or component upgrades.
- Completed the Russian localization audit, corrected misplaced license translations, and added repository validation that rejects CJK/Japanese/Korean text accidentally placed in the
ru-RUcolumn.
- Logs page responsiveness: logging-only switches no longer trigger full page refreshes; log file I/O is background/coalesced and RichTextBlock rendering is capped to prevent UI hangs under verbose/plugin output.
- Fixed an Administrator Mode DNSCrypt leak window: classic UDP/TCP 53 is now fail-closed before DNSCrypt startup, never falls back to plaintext system DNS, and Shadowsocks/SIP003 DNS queries no longer bypass DNSCrypt interception.
- Added signed, managed DNSCrypt Proxy installation from the official
DNSCrypt/dnscrypt-proxyWindows x64 releases, with SHA-256/Minisign verification, safe extraction, resolver selection and rollback-safe activation. - Added health-checked DNSCrypt runtime lifecycle with dynamic loopback ports, non-blocking normal startup, prepared-version
-checkvalidation, crash recovery, Job Object cleanup and optional routing through the local Shadowsocks SOCKS5 endpoint. - Added the DNS page and tray controls for System, Direct, DNS-through-Shadowsocks and Custom DoH/DNSCrypt policies, plus install/update/reinstall/remove, DNSSEC/no-log/no-filter/IPv6, resolver selection and automatic component updates. Administrator-mode DNSCrypt interception enforces fail-closed behavior as a runtime security invariant rather than a user toggle.
- Added Administrator Mode transparent UDP/TCP port 53 policy routing through WinDivert for Proxy, Custom DoH and DNSCrypt, while Direct remains direct; DNSCrypt runtime also remains available in User Mode for Shadowsocks-managed hostname resolution.
- Added automatic DNSCrypt update maintenance with a persisted minimum 24-hour check interval; the first component installation remains an explicit user action.
- Added bootstrap recursion protection for DNSCrypt-over-Shadowsocks and hardened WinDivert/CaptureChild fault propagation, UDP/TCP relay lifecycle, runtime rollback and process supervision.
- Added DNSCrypt Clean Mode integration tests and release validators that reject bundled
dnscrypt-proxy, native Minisign/libsodium helpers, invalid DNS policy values and missing third-party notices. - Added embedded project and third-party license notices for the one-file executable, including Bouncy Castle and its modified Bzip2 component.
- Hardened WinDivert acquisition to the fixed official GitHub 2.2.2-A release asset with bounded streaming download, exact x64 archive paths, pinned SHA-256 verification for both x64 runtime payloads and PE architecture validation before loading.
- Added fragment-safe transparent routing: fragmented datagrams that require DNS/proxy rewriting are dropped as a whole instead of partially rewriting the first fragment, while direct fragment flows remain direct.
- Added a read-only WinDivert FLOW-layer ownership observer so new TCP/UDP endpoints are attributed to their process ID before NETWORK-layer routing; IP Helper lookup remains a safe fallback for pre-existing or ambiguous flows.
- Hardened automatic-update clock handling against implausible future timestamps and added a testable Clean Mode session lifecycle with exclusive lock ownership and deterministic tree cleanup.
- Suspend/shutdown now cancels active and queued DNSCrypt management transactions before WinDivert/DNSCrypt teardown and resumes the coordinator only on the next controller start lifecycle.
- Added managed SIP003 plugin storage below the active
Pluginsdirectory; normal mode uses%LOCALAPPDATA%\Shadowsocks\Pluginsand Clean Mode uses its disposable Temp session. - Replaced the application Registry settings backend with atomic
settings.json/settings.backup.jsonunder%LOCALAPPDATA%\Shadowsocks; old Shadowsocks Registry configuration is intentionally ignored. - Localization now uses only the embedded
i18n.csv; external LocalAppData overrides are no longer loaded or migrated. - Added Rufus-style Clean Mode: an executable stem ending in
predirects all writable application state to a disposable%TEMP%\Shadowsocks\Clean\...session and cleans it on Quit. - Added explicit LocalAppData/Clean Mode folder actions to Settings and disabled Start with Windows in Clean Mode at UI, tray, and backend levels.
- Replaced the legacy second-launch Win32 MessageBox with a localized Fluent WinUI
ContentDialogowned by the already-running instance; the existing window is restored/foregrounded first, with an InfoBar fallback if another modal dialog is active. - Fixed global hotkey modifier detection on the WinUI/.NET 10 frontend by using the Win32 key-state path.
- Main-window User/Admin traffic controls now apply immediately like tray commands; Administrator mode carries the UAC shield affordance.
- Product single-file publish removes PDB files copied from referenced projects before validating the one-EXE release layout; normal build symbols remain unchanged.
- Restored historical lower-case percent escapes when generating SIP002
ss://links for compatibility with existing URL tests/links.
- Added a Plugins page with built-in
xray-plugin,v2ray-pluginandqtuninstallation plus manual ZIP/TAR.GZ import; Servers now selects installed plugins from a dropdown and shows Server Name above Server IP. - Added localized WinUI tooltips and matching accessibility help text across navigation, server management, traffic, Game Mode, PAC/GeoSite, online configuration, hotkeys, sharing, logs, settings and update controls.
- Completed all six non-English localization columns (
ru-RU,zh-CN,zh-TW,ja,ko,fr) for every active embedded UI key and added release validation that rejects missing translations or placeholder mismatches. - Moved
Verbose LoggingandShow Plugin Outputto the Logs page, andCheck for Updates at Startupto About & updates. - Updated the pinned dependency graph to Windows App SDK 2.4.0, Microsoft.WindowsAppSDK.WinUI 2.3.6, NLog 6.2.0, Fody 6.9.3, Google.Protobuf 3.35.1, Newtonsoft.Json 13.0.4, System.Drawing.Common 10.0.11, Microsoft.NET.Test.Sdk 18.9.0, Windows SDK BuildTools 10.0.28000.2526, WinUIEx 2.9.3, ZXing.Net 0.16.11, MSTest 4.3.3 and System.Management 10.0.11.
- Updated NLog file archiving to the NLog 6
ArchiveSuffixFormatconfiguration. - Start with Windows now uses a SHA-256-verified copy at
%LOCALAPPDATA%\Shadowsocks\Startup\Shadowsocks.exe; legacy Run entries are migrated and the copy is refreshed when a newer product EXE is launched manually. - Game Mode keeps manual rules and adds optional discovery suggestions from Steam, Epic Games, GOG and Xbox installations.
- Password reveal is hidden for servers imported from
ss://links or online configuration sources; manual server entries retain the option. - Logs toolbar is always visible; the Font command and Show toolbar preference were removed.
- Tray colors were refined for clearer/professional state separation: graphite (Disabled), bronze (Local PAC), forest teal (Online PAC), navy (Global), with muted activity accents.
- Historical limitation in this development snapshot: DNS policy values existed in configuration/IPC, but transparent DNS interception/routing was not yet implemented. This limitation was resolved later; current 5.2.31 Administrator Mode implements transparent UDP/TCP 53 routing.
- Migrated the product to .NET 10, x64 and WinUI 3 / Windows App SDK.
- Retired the legacy WinForms/WPF presentation layer after functional parity was reached.
- Added the Windows 11 Fluent shell, tray-first lifecycle, AppInstance single-instance activation, Mica, navigation, native dialogs/status UI and theme support.
- Migrated localization to
ILocalizationServicebacked by the existing seven-column CSV format.
- Replaced Privoxy with the managed HTTP/HTTPS forwarding path.
- Replaced external sysproxy helpers with Windows integration.
- Added User/Admin traffic modes and transparent TCP/UDP Admin capture through WinDivert.
- Added automatic Game Mode and per-application
Proxy,Direct,Blockrouting. - Added live NetworkService/WinDivert/TCP/UDP capture status in the WinUI Traffic page.
- Preserved PAC/GeoSite, Online Config, SIP003 plugins, QR workflows, hotkeys and UDP relay.
- Moved persistent configuration away from executable-side
gui-config.json; the current backend isISettingsStore/JsonFileSettingsStoreunder LocalAppData. - Added file-backed rollback snapshots and one-time migration backups under
%LOCALAPPDATA%\Shadowsocks\Migration. - Centralized all normal-mode application-owned writable state under
%LOCALAPPDATA%\Shadowsocks; Clean Mode redirects the same logical tree to a disposable%TEMP%\Shadowsocks\Clean\...session. - Removed portable-mode storage semantics that wrote mutable data beside the EXE.
- Added global per-user single-instance behavior to protect shared Windows integration and storage state.
- Embedded the self-contained single-file NetworkService helper into the product and materialized it only on Admin activation with SHA-256 validation, extraction serialization, version handshake and cleanup.
- Added unpackaged, self-contained, win-x64, single-file release packaging with a strict final layout of one
Shadowsocks.exe. - Added repository/release validators, CI packaging checks, storage/deployment tests and read-only/removable-drive validation rules.
- Historical limitation in this modernization baseline: DNS policy values existed in configuration/IPC, but transparent DNS interception/routing was not yet implemented. This limitation was resolved later; current 5.2.31 Administrator Mode implements transparent UDP/TCP 53 routing.