Populars: Dades actualitzades el 26 d’octubre del 2026

Categories

Internet1.355
Comunicació321
Àudio i vídeo898
Gràfics i disseny539
Ofimàtica i productivitat1.120
Eines per a desenvolupadors3.132
Eines d’IA527
Seguretat i privadesa385
Eines del sistema3.113
Jocs523
Educació i ciència239
Xarxa i TI284

Servy: baixar versions anteriors

Servy lets you run any app as a native Windows service with full control over the working directory, startup type, process priority, CPU affinity, logging, health checks, hooks, and parameters.

Akram El Assas Terminals i línia d’ordres #93 Terminals i línia d’ordres

Aquí hi ha 96 versions de Servy, des de 6 de setembre del 2025 fins a l’actual, 10.6. Cadascuna enllaça amb els instal·ladors del mateix desenvolupador.

2025: 33 33 25 2026: 63 63 26

96 versions en 1 any · unes 86 per any

VersióDataMidaFitxers
10.6Darrera versió 21 d’octubre del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
Servy v10.6 replaces handle64.exe / handle64a.exe with native P/Invoke, eliminating all third-party executable dependencies and licensing constraints. This release also focuses on hardening security across the database, ACLs, IPC, resource extraction, vault ownership, and service-account grants.
Full Changelog
- feat(core): replace handle64.exe / handle64a.exe with native Restart Manager P/Invoke (#7578)
- fix(security): address security findings across vault hardening, log writing, executable resolution, and host IPC (#7541)
- fix(core): purge non-admin vault entries and re-grant service account permissions on elevated starts (#7526)
- fix(core): enforce reparse-point and final-path validation in RotatingStreamWriter (#7527)
- fix(core): enforce vault binary precedence over application directory lookups in Release builds (#7528)
- fix(core): improve vault binary extraction security and DACL rebuilding (#7530)
- fix(core): revoke legacy recovery folder access and sanitize counter file imports (#7532)
- fix(core): enforce final path equality and hard-link limits in PathSecurityGuard (#7533)
- fix(core): remove unused HasCopiedResources property from ResourceHelper (#7554)
- fix(core): remove unused HardenServiceAccountsAsync method from hardener interface (#7551)
- fix(core,service): align 8.3 short-path validation in ProcessLauncher with PathSecurityGuard (#7553)
- fix(core): remove unused LocalPipeServer overload and clean up duplicate XML documentation (#7562)
- fix(infra): encrypt HeartbeatUrl in database by marking it as a sensitive field (#7579)
- fix(host): pin named pipe client process identity at connection time to prevent PID reuse races (#7534)
- fix(host): enforce 256 KB request payload cap and dynamic buffer growth for host named pipes (#7536)
- fix(host): add first-instance probing and diagnostic warnings for named pipe creation in LocalPipeServer (#7537)
- fix(host,manager): validate ActiveStdoutPath and ActiveStderrPath before storage and file inspection (#7535)
- fix(ui): fix dead tag name fallback logic in update check helper (#7522)
- fix(manager): prevent full-file enumeration in LogTailer non-UTF-8 history load when maxLines is zero (#7523)
- fix(manager): clean up unused local variables and redundant conditions in LogTailer UTF-16 history parsing (#7524)
- fix(cli): enforce owner verification and secure permissions on ProtectedKeyProvider DPAPI keys (#7531)
- fix(cli): enforce early elevation check before bootstrapping vault database (#7573)
- fix(dump): create dump archives with hardened ACLs and secure hash sidecar generation (#7538)
- fix(notifications): retain full bracketed message text in toast notification body
- fix(notifications): add Event ID filtering and per-run caps to failure notification scheduled tasks (#7539)
- fix(setup): validate script integrity and file permissions for taskschd scheduled tasks (#7529)
10.5 15 d’octubre del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
Servy v10.5 introduces a right-click context menu on service rows and an optional Display Name column in the Servy Manager Services grid. The column can be toggled by right-clicking any column header, and column visibility preferences persist automatically across sessions. Additionally, confirmation dialogs across Servy Manager and the Servy desktop app explicitly include the targeted service name for improved clarity (#7483).
v10.5 adds explicit architecture checks for x64 and ARM64 installers. Running an installer on an incompatible architecture displays a clear error message, while running an x64 installer under ARM64 emulation prompts a soft warning to encourage using the native build (#7481).
This release also includes security hardening for the installer elevation path, bug fixes, and documentation updates.

Full Changelog:
- feat(manager,desktop): include service name in message box actions (#7483)
- feat(manager): add context menu to Services grid rows
- feat(manager): support DisplayName column in Services grid
- feat(setup): show a clear error when the installer architecture doesn't match the OS (#7481)
- feat(setup): prompt ARM64 users when running x64 installer under emulation (#7481)
- fix(core): remove unused import validation string resources in Servy.Core (#7485)
- fix(core): eliminate duplicate SID fields and helper methods in Servy.Core.Security (#7490)
- fix(core): standardize broad group SID checks across SecurityHelper and PathSecurityGuard (#7493)
- fix(core): stop the ancestor process walk at a recycled PID in ProcessKiller (#7512)
- fix(core): remove unreachable ArgumentException catch block in ServyHostInstaller (#7514)
- fix(infra): add IOException error handling during orphan file import (#7516)
- fix(infra): remove unused public UpdateSet clause constant in SqlConstants (#7517)
- fix(host): remove unused FodyWeavers.xml configuration from Servy.Host (#7494)
- fix(service): remove redundant System namespace import in IConsoleCtrlNative (#7498)
- fix(service): remove unused using directives in Service and IStreamWriterFactory (#7499)
- fix(restarter): remove unused Servy.Infrastructure dependency and trim targets (#7496)
- fix(restarter): fix XML documentation formatting in Restarter Program (#7520)
- fix(manager): resolve BOM alignment and character splitting for UTF-16 logs in LogTailer (#7519)
- fix(notifications): resolve toast error code capture in failure notification handler (#7509)
- fix(setup): restrict upgrade registry probes to HKLM to prevent elevation of privilege (#7484)
- chore(dotnet): bump dotnet sdk version from 10.0.401 to 10.0.402
- chore(deps): update dependencies
10.4 12 d’octubre del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
Servy v10.4 introduces enhancements in Servy Manager, including the ability to show or hide columns in the Services and Logs grids by right-clicking on a column header, with preferences automatically persisted across sessions. Additionally, the Description column in the Services grid can now be resized and supports horizontal scrolling for better readability.
This release also includes bug fixes, security patches, and documentation updates. The full changelog is listed below.
Full Changelog
Click to expand release notes!
- feat(manager): persist services table column visibility state (right-click on a column header to show/hide columns) (#7412)
- feat(manager): persist logs table column visibility state (right-click on a column header to show/hide columns) (#7412)
- feat(manager): allow description column resizing and horizontal scrolling (#7412)
- fix(core): ServiceDto.cs - AllowOverriddenRuntimeVars is the only optional property with no ShouldSerialize hook, though the block comment names only Name and ExecutablePath as exceptions (#7413)
- fix(core): AppConfig.cs - DbBatchIdSyncChunkSize lost its last reader when #7376 removed UpsertBatchAsync and its ID-sync loop (#7416)
- fix(core): ServyExePermissionsHardener.cs - GetWritableFolderFileRights ignores its relativePath parameter (#7437)
- fix(core): ServyExePermissionsHardener.cs - the revocation purges a former service account's ACEs but leaves it the owner of the log files it created, so its implicit WRITE_DAC lets it re-grant itself access (#7442)
- fix(core): EventLogLogger.cs - ScopedEventLogLogger's whitespace guards in SanitizePrefixSegment (525) and Format (538) are unreachable (#7450)
- fix(infra): ServiceRepository.cs - the try/catch around field.Set(dto, null) in HandleCorruptServiceDecryption cannot catch anything, every target is an auto-property (#7460)
- fix(service): consolidate active descendant process logging into a single message
- fix(service): ProcessLauncher.cs - Start's catch-all logs 'Failed during synchronous execution or log flushing' for a FireAndForget or never-started launch, where Win32Exception from process.Start() is the real cause (#7421)
- fix(desktop): ServiceCommands.cs (Servy) - OpenRuntimeVariablesLinkAsync discards the Process that IProcessHelper.Start returns, while OpenManagerAsync and HelpService.OpenExternalUrl dispose theirs (#7422)
- fix(manager): decrease bottom scroll threshold for resume in console tab
- fix(manager): MainWindow.xaml (Manager) - the Description column and its cell TextBlock are the only two elements whose attribute continuation lines are not aligned under the element name, a residual of #6076 (#7424)
- fix(manager): LogLine.cs - the static _nextId counter and the public Id it feeds are written on every line and read by nothing (#7456)
- fix(cli): Program.cs (Servy.CLI) - RunAsync never unsubscribes its Console.CancelKeyPress handler, which keeps cancelling a CancellationTokenSource the using block has disposed (#7472)
- fix(psm1): Servy.psm1 - the -EnvVars and -PreLaunchEnv format errors tell the user to escape a double quote as \" while the parser and the CLI help use " (#7417)
- fix(psm1): Servy.psm1 - Install-ServyService passes HeartbeatUrl on the servy-cli command line and Format-SecureLogMessage does not mask it, although the service masks the same URL in every log line (#7428)
- fix(bump-runtime.ps1): the TargetFramework now lives only in Directory.Build.props, which no bump step targets, so a runtime bump reports success and leaves every project on the old TFM (#7480)
- ci(loc.yml): actions/checkout is the only action in .github/ pinned to a mutable tag (@v4), in a job that holds contents: write (#7478)
- chore(deps): update dependencies
10.3 9 d’octubre del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
- feat(service): add AllowOverriddenRuntimeVars option to allow runtime environment variable expansion (#7411)
- feat(manager): add column visibility toggle and enable column resizing in services table (#7412)
- fix(desktop): move None date rotation option to top of dropdown
- fix(manager): fix console log tailer scroll bottom gap
- ci(loc.yml): switch to cloc for accurate code-only line counts
- docs: add Embedding in Custom Installers guide
10.2 5 d’octubre del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
Servy v10.2 introduces full per-service security isolation (see Security.md and Architecture.md for details), a new CLI show command, automated ACL hardening, and core engine stability improvements.
Key Highlights
- Full Per-Service Security Isolation: Custom service accounts can no longer read or modify other services' configurations, runtime states, or logs. Decryption and database access are now proxied through the isolated Servy host process (Servy.Host.exe) via a DACL-restricted local Named Pipe.
- Per-Service Log Isolation: Each wrapped service now writes its wrapper and restarter logs to an isolated subfolder (%ProgramData%\Servy\logs\service\<ServiceName>\). Custom service accounts hold permissions strictly within their own log subfolder and cannot access or tamper with logs from other services.
- Automated Vault & Binary Hardening: Servy automatically enforces strict ACL lockdown rules on the %ProgramData%\Servy root vault and core binaries (.exe/.dll), removing the need for manual sysadmin hardening scripts or elevated permissions setup.
- CLI show Command (#7018): Inspect and print service configurations directly from the terminal in a clean, human-readable format.
Complete List of Changes
- Security & IPC Proxy: Introduced Servy.Host.exe for local IPC configuration and state requests, enforced process identity verification (GetNamedPipeClientProcessId vs SCM PID), hardened vault permissions, added per-service log folder isolation, improved NTFS hard-link safeguards, and strengthened key-vault access rules.
- CLI & PowerShell: Added the show command (#7018) and fixed wildcard path resolution issues in Servy.psm1.
- Core Engine & Process Management: Resolved concurrency race conditions in log stream rotation and handle drain timeouts, corrected environment variable line parsing, and cleaned up unused constants.
- Desktop App & Servy Manager: Preserved node expansion states in the Dependencies tab, fixed log-tailing scroll jumps, resolved secondary-tab automation name collisions, and localized event log level displays.
- Notifications & Task Scheduler: Prevented stale-read race conditions during watermark updates, improved WinRT type load error classification, and fixed bracket truncation in service message parsing.
- CI/CD & Release Tooling: Streamlined test coverage gates, fixed SonarCloud package caching paths, filtered stress tests out of release builds, and hardened Markdown tag escaping in changelog scripts.
Breaking Changes
1. Reserved Service Name (Servy): The service name "Servy" is now reserved for the Servy Host service (Servy.Host.exe) that manages secure IPC communication. If you previously installed a Windows service named "Servy", you must rename it prior to installing v10.2.
2. Fixed Vault File Locations: Custom directory paths for Servy.db and keying material are no longer supported. The configuration database and security keys must reside in %ProgramData%\Servy\db and %ProgramData%\Servy\security, where they are automatically hardened and managed by the host process.
Full Changelog
- feat(cli,psm1): Add show command to display service configuration in a human-readable format (#7018)
- feat(security): Add per-service security isolation through secure IPC, DACLs and ACLs
- feat(security): harden the vault in C# instead of Set-ServyExePermissions.ps1 and re-apply the hardening whenever a binary is extracted
- fix(security): Set-ServyExePermissions.ps1 - the handle64/handle64a probe is if/elseif, so a machine with both binaries present (after an architecture migration) leaves one unhardened and unreported (#6855)
- fix(security): Set-ServyExePermissions.ps1 - Get-Acl/Set-Acl follow NTFS hard links with no reparse/link-count check, letting the runner account redirect the admin's own hardening run onto an arbitrary file (#6866)
- fix(security): Set-ServyExePermissions.ps1 - the admin-membership warning condition is written twice, and the final-summary copy has already drifted (lost a space around -eq) (#68
10.1 16 de setembre del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
This release includes bug fixes, security patches, code quality improvements, and documentation updates. The full changelog is listed below.
Full Changelog
Click to expand release notes!
- feat(manager): LogsView.xaml / LogEntryModel.cs - EventId is read off every Event Log entry, stored in an observable property and unit-tested, but no column, filter or detail pane ever reads it (#6022)
- feat(scripts): add ShouldProcess confirmation prompt for SCM service installation in Servy-Restore.ps1
- fix(core): ProcessKiller.cs / ISystemProcess.cs - the CriticalSystemProcesses safelist trusts a process's self-reported name with no path or SID check, so a renamed executable becomes immune to Servy's kill sweep (#6782)
- fix(core): handle64.exe invocation flagged as malicious by Cortex XDR (shellcode/injection detection) (#6808)
- fix(infra): SQLiteDbInitializer.cs - the whitespace zombie detector and the Version 9 UserAccount migration use SQLite TRIM(), which strips ASCII space only, so tab-padded legacy values are neither detected nor normalized (#6759)
- fix(service): ProcessWrapper.cs - Kill(bool) neither verifies the process died nor reports failure, unlike its own sibling twelve lines above, so ProcessLauncher's orphan-cleanup catch can never fire (#6043)
- fix(service): EnvironmentVariableHelper.cs - the indirect-circular-reference warning is unreachable because protectInjectedValues masks every substituted token before the pass that would need to see it again (#6739)
- fix(service): EnvironmentVariableHelper.cs - ProtectedVariables blocks CA-bundle overrides but not the proxy variables that give the same interception capability (#6797)
- fix(service): EnvironmentVariableHelper.cs - ExpandWithDictionary's own IsNullOrEmpty(value) early return can never fire; every call site already guarantees a non-empty value (#6811)
- fix(manager): StatusConverter.cs / StartupTypeConverter.cs - GetFallbackValue is the only unshared code left after #2986 and the two overrides disagree on null, so adjacent DataGrid columns render the same unloaded state as blank and as 'Fetching...' (#5771)
- fix(manager): EnumLocalizedConverter.cs - GetFallbackValue declares a non-nullable object parameter, but null is precisely the input it exists to handle and both overrides null-check it (#5993)
- fix(manager): PidBadgeControl.xaml - binds Pid and CopyPidCommand off an undeclared inherited DataContext, while its folder-sibling ServiceListControl exposes six dependency properties (residual of #4832) (#6018)
- fix(manager): LogsView.xaml - unlike every Services grid column, none of the four Logs columns give their cells an AutomationProperties.HelpText, only a header Name (#6793)
- ci: build.yml / security.yml / test.yml / loc.yml / wiki.yml - 13 run steps still omit the explicit 'shell:' line that #4665 established for publish.yml; the other 14 CI files are 100% explicit (#5836)
- ci(test.yml); Restore dependencies and both Build solution steps run dotnet as bare native calls with no exit-code check, so a broken restore or build can report green (#6773)
- ci(test-project.yml): Write-Error alone does not stop the script or fail the step, so a Debug test failure can be silently overwritten by a passing Release run (#6761)
- ci(security.yml): Restore dependencies and Build for Analysis steps run dotnet as bare native calls with no exit-code check, letting CodeQL silently scan a build that never compiled (#6772)
- ci(bump-version.yml): bump-version.ps1 - the new copyright patterns' [©\xc2\xa9\w\W] class is just [\w\W]: the three escapes are inert, and \xc2\xa9 is a UTF-8 byte pair, not a character (#6476)
- ci(wiki.yml): Build test project step (net48) never checks msbuild's exit code, so a compile failure surfaces as a vstest file-not-found error instead of the real build failure (#6764)
- ci(wiki.yml): Run parity check (dotnet test) step (main) never checks dotnet test's exit code, so a broken protected-variables parity check reports green (#6774)
- ci(wiki.yml
10.0 8 de setembre del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
This major release includes new backup and restore features, a hardened PowerShell module, bug fixes, security patches, code quality improvements, and documentation updates. The full changelog is listed below.
Full Changelog
Click to expand release notes!
- feat: add Servy-Dump.ps1 and Servy-Restore.ps1 PowerShell backup and recovery scripts
- fix(security): break inheritance and enforce read-only ACLs on configuration files
- fix(security): Set-ServyExePermissions.ps1 - Grant Delete permission strictly to restarter executable
- fix(security): Set-ServyExePermissions.ps1 - binaries absent at run time are skipped in grey text, reported as "complete", and inherit Modify when Servy creates them later (#6201)
- fix(security): Set-ServyExePermissions.ps1 - a present-but-FAILED binary lands in the same skipped bucket as a missing one, and a wholly missing directory exits 0 (residual of #6201) (#6397)
- fix(security): Set-ServyExePermissions.ps1 - explicit ACEs of third-party principals survive hardening and ResourceHelper re-applies them on every re-extract (sibling of fixed #1291) (#6398)
- fix(security): Set-ServyExePermissions.ps1 - explicit Deny ACEs for the target survive the purge the comment claims, and the audit prints them under [Target Granted] (#6412)
- fix(security): Set-ServyExePermissions.ps1 - the step-5 audit translates ACEs to NTAccount in bulk, so one orphaned SID reports a successfully hardened binary as FAILED (#6411)
- fix(security): Set-ServyExePermissions.ps1 - -TargetAccount SYSTEM or Administrators makes step 4 replace the FullControl step 3 just granted (#6438)
- fix(security): Set-ServyExePermissions.ps1 - the unconditional owner rewrite is absent from both the header and the step-5 audit (#6439)
- fix(security): Set-ServyExePermissions.ps1 - the [Target Granted] if-guard wraps an already empty-safe foreach, unlike its two header-gating siblings (sibling of #6421) (#6440)
- fix(security): Set-ServyExePermissions.ps1 - the [Owner] replaced audit line prints before Set-Acl commits, so a failed hardening still logs an owner replacement that never happened (#6465)
- fix(security): Set-ServyExePermissions.ps1 - the SID-to-name translate-with-fallback expression is maintained twice, once per audit fix (#6467)
- fix(security): Set-ServyExePermissions.ps1 - -TargetAccount Everyone, Users or Authenticated Users makes step 4 re-grant the broad group step 2 just purged (sibling of #6438) (#6468)
- fix(security): Set-ServyExePermissions.ps1 - the ARM64 probe reads process-architecture env vars, so an emulated x64 shell on ARM64 hardens the wrong handle binary and exits 2 forever (#6472)
- fix(security): Set-ServyExePermissions.ps1 - an unresolvable -TargetAccount leaves through throw and exits 1, the code the header reserves for 'Privilege Error' (sibling of #6466) (#6536)
- fix(security): Set-ServyExePermissions.ps1 - a target account that is a MEMBER of Administrators keeps FullControl through the group, and the audit reports the ReadAndExecute ACE as if it were the effective access (#6680)
- fix(security): Set-ServyExePermissions.ps1 - Test-ServyAdminGroupMember's ADSI fallback returns $false for a nested-group admin, so the #6680 warning never fires (#6697)
- fix(core): clarify CPU affinity error messages
- fix(core): AppConfig.cs - ServyServiceCLIFileName and AppFolderName are still static readonly after #3181 converted every other plain literal to const (#5501)
- fix(core): AffinityHelper.cs - ValidateAffinity returns the raw exception message, so every CPU affinity validation error shows "(Parameter 'affinityInput')" to the user (#5502)
- fix(core): Helper.cs - IsValidPath and ParseVersion null-check their argument but declare it non-nullable, unlike the seven siblings in the same file that do the same guard (#5510)
- fix(core): ProcessHelper.cs - Math.Max(totalCpu, 0.0) in GetProcessTreeMetrics is provably a no-op; every GetProcessMetrics path returns a non-negative CpuUsage (#5513)
- fix(core): ProcessKiller.
9.9 28 d’agost del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
This release includes bug fixes, security patches, code quality improvements, and documentation updates. The full changelog is listed below.
Full Changelog
Click to expand release notes!
- fix(security): explicitly assign admin owner and streamline single-pass ACL hardening in Set-ServyExePermissions.ps1
- fix(security): add admin privilege check to Set-ServyExePermissions.ps1
- fix(core): ServiceAccounts.cs - IsGmsa trims and whitespace-checks the account but not the password, so a gMSA with a whitespace-only password is sent through the LSA privilege assignment its own doc forbids (#5702)
- fix(core): ProcessHelper.cs - FormatRamUsage prints 1024.0 KB/MB/GB just below each unit boundary because the unit is chosen before rounding (#5716)
- fix(core): SecureXml.cs / JsonSecurity.cs - the eight ignored ServiceDto fields are silently dropped by a JSON import but abort an XML import, and the wiki documents only the JSON behaviour (#5751)
- fix(core): ServiceAccounts.cs - LocalSystemAliases omits the bare 'Local System' and '.\Local System' forms its two sibling sets gained in #4713/#5021, so the Manager's own display label fails IsBuiltInServiceAccount (#5900)
- fix(core): EnvironmentVariablesValidator.cs - the key guard covers CR, LF and NUL but not '=', so an escaped = smuggles an equals sign into a variable NAME and slips past the ProtectedVariables check (third case of #3768/#4716) (#5905)
- fix(core): ServiceAccounts.cs / NativeMethodsHelpers.cs / ServiceManager.cs - three consumers trim the service account name, no producer does, so a padded name passes validation as built-in and reaches CreateService un-trimmed (#5909)
- fix(core): AffinityHelper.cs - an inverted range and a zero hex mask are both reported as "Core index in range ... is out of bounds", which is false for both (#5911)
- fix(core): ConfigParser.cs - the Flags parity check in ParseEnum(string) uses long.TryParse, which fails open for ulong-backed values and is culture-sensitive; the third site the #1341 invariant sweep missed (#5913)
- fix(core): ReservedNames.cs - the list is shared but the normalisation is not: "CON .txt" is blocked by PathSecurityGuard, accepted by IsServiceNameValid and left unescaped by MakeFilenameSafe (residual of #2141) (#5921)
- fix(core): ResourceHelper.cs - every re-extraction freezes the vault ACL onto the extracted binaries, so a grant or revocation on the vault root never reaches Servy.Service.exe again (#5922)
- fix(core): EventLogReader.cs - SafeToOffset's DateTimeKind.Utc branch is unreachable from its only caller (EventRecord.TimeCreated comes from DateTime.FromFileTime, always Local), and the MinValue guard precedes the one path that cannot overflow (#5939)
- fix(core): LogonAsServiceGrant.cs - #5532's 'this is expected, service creation will proceed' catch guards only the grant; the LSA check one line above throws the same exception uncaught, and #3218's exception docs are gone again (#5943)
- fix(core): RotatingStreamWriter.cs - EnforceMaxRotations resets the failure counter on every successful delete, so the 'disk space growth is no longer bounded' alarm can never fire in the partial-failure case that actually grows the disk (#5944)
- fix(core): RotatingStreamWriter.cs - the Daily arm's 23-hour DST guard measures from the last rotation rather than from midnight, so local-time daily rotation walks an hour earlier each day instead of aligning to calendar days (#5945)
- fix(core): Logger.cs - the levelName bounds check in Log() is provably always true and its 'Fallback for safety' arm is unreachable (sibling of #5156) (#5946)
- fix(core): ProtectedKeyProvider.cs - the #1854 mutex DACL grants WorldSid Synchronize on the lock guarding the key vault, the same SID SecurityHelper.ApplySecurityRules purges from that vault by name (#5953)
- fix(core): ProtectedKeyProvider.cs - GetOrGenerate's key-generation block sits outside the try that wraps every other failure, so a first-run DPAPI Protect error skips the workaround message th
9.8 24 d’agost del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
This release includes bug fixes, security patches, code quality improvements, and documentation updates. The full changelog is listed below.
Full Changelog
Click to expand release notes!
- fix(security): Set-ServyExePermissions.ps1 - the -TargetAccount regex forbids spaces, so 11 of the 23 aliases in ServiceAccounts.cs are rejected, including the 'NT AUTHORITY\LocalService' and 'NT AUTHORITY\NetworkService' const values the product itself stores (#5479)
- fix(core): ConfigParser.cs / ServiceInstallValidator.cs - Enum.TryParse ORs comma-separated names on non-Flags enums, so "RestartService, RestartProcess" silently installs as RestartComputer (#5507)
- fix(core): ServiceManager.cs / LogonAsServiceGrant.cs - the EnsureLogOnAsServiceRight guard matches 1 of the 23 built-in account aliases ValidateCredentials accepts, so installing under .\NetworkService aborts with a Cannot resolve SID error (#5531)
- fix(core): LogonAsServiceGrant.cs - HasLogonAsService only sees directly-assigned rights, so an account granted SeServiceLogonRight through a group is treated as lacking it and Ensure attempts a privileged LSA write (#5532)
- fix(core): SecureData.cs - DecryptV2 discards the TryHashData result and verifies whatever is in the stackalloc buffer; Encrypt discards TryToBase64Chars and would persist a marker followed by NUL characters (#5542)
- fix(core): SecureDataIntegrityException.cs / ServiceRepository.cs - two of the seven throw sites are policy refusals, not integrity failures, so an intact legacy record is shown to the user as corrupt and has its credential fields scrubbed (#5545)
- fix(core): ServiceDependenciesValidator.cs - the name regex has no '+', so a load-order group dependency (+TDI) is rejected even though the SCM accepts one in lpDependencies (#5547)
- fix(core): ServiceManager.cs - SetServiceDescription documents 'a null value removes the description', but a NULL lpDescription is Win32 for 'leave unchanged'; the empty string is what deletes it (#5554)
- fix(core): Strings.resx / Helper.cs (Core) - Msg_InvalidServiceName is shown for four rejection branches but describes only the character one, so a service named CON is told to avoid nine characters it does not contain (sibling of #5169) (#5583)
- fix(core): EnvironmentVariableParser.cs / StartOptionsParser.cs - 3 of 4 FormatException arms echo the whole KEY=VALUE record, and SafeParseEnvVars writes it unmasked to the service log (residual of #5029) (#5621)
- fix(core): Strings.resx / ServiceDependenciesValidator.cs - the '+' load-order prefix added by #5547 reached the regex but none of the four documented character lists, so the rejection message still tells the user '+' is not allowed (#5650)
- fix(infra): ServiceRepository.cs / SecureDataLegacyBlockedException.cs - the #5545 fix added the policy-refusal exception but no consumer branches on it, so an intact legacy record is still labelled corrupt and still scrubbed (#5568)
- fix(infra): ServiceRepository.cs - UpsertBatchAsync preserves credentials from a SafeDecrypt-scrubbed row, so a Manager refresh writes NULL over the stored Password of any service whose secrets will not decrypt (#5572)
- fix(infra): ServiceRepository.cs - SearchAsync is the only name lookup left on SQLite's ASCII-only LIKE, so the Manager search box cannot find a non-ASCII service name typed in the wrong case (#5573)
- fix(infra): DatabaseInitializer.cs / SQLiteDbInitializer.cs - UNICODE_NOCASE is registered after connection.Open(), so a pooled connection fails every write to Services with 'no such collation sequence' (#5631)
- fix(service): Servy fails to restart process (#5584)
- fix(service): ProcessWrapper.cs / ProcessExtensions.cs - StopTree and StopDescendants leak the unvisited Process handles when the Toolhelp32 snapshot throws, and Service.cs swallows the fault without a log line (residual of #3770) (#5625)
- fix(service): IServiceHelper.cs - LogStartupArguments' Security Note assigns masking to the logger, but all 8 masking calls are 
9.7 21 d’agost del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
- feat(security): add Set-ServyExePermissions.ps1 to harden service binaries with explicit Read & Execute rights
- feat(security): update service account documentation and UI to require Set-ServyExePermissions.ps1 hardening
- fix(core): preserve file ACLs across atomic resource extractions in ResourceHelper.cs
- fix(cli): align install command options sequence with core service schema
- test: migrate test runner and coverage collection from VSTest to MTP
- chore(deps): update dependencies
- ci(publish.yml): signed exe injected into Resources without a matching pdb, leaving embedded debug symbols stale for the shipped binary (#5436)
9.6 19 d’agost del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
This release includes UI/UX improvements for low and HD resolutions, bug fixes, security patches, code quality improvements, and documentation updates. The full changelog is listed below.
Full Changelog
Click to expand release notes!
- fix(core): ResourceHelper.cs - log messages still say GetHostProcessLastWriteTimeUTC after the #4804 Utc rename (#5154)
- fix(core): Logger.cs - Initialize(null) wipes the re-init baseline while the writer stays live, turning every setter into a silent no-op (#5155)
- fix(core): ServiceMapper.cs - ToDomain silently mutates its input DTO (HydrateDefaults fills nulls in place), losing null-vs-default semantics the persistence layer relies on (#5157)
- fix(core): NativeMethodsHelpers.cs - GetFileIdentity's string.Empty pre-initialization makes IsDifferentFrom's SAFE DEFAULT unreachable; a failed content probe reads as 'proven same' (regression of #1456) (#5160)
- fix(core): Strings.resx (Servy.Core) - style drift between sibling messages: Pre-Launch/pre-launch casing, two range-message phrasings, terminal-punctuation flips, lone contraction (#5163)
- fix(core): SecureData.cs - raw-legacy security block is swallowed by its own catch filter; Decrypt still returns ciphertext as plaintext (the #1371 fix never took effect) (#5167)
- fix(core): Strings.resx / ServiceDependenciesValidator.cs - Msg_InvalidServiceDependencyName omits 'periods' again; the #1294 fix regressed when the sentence was rebuilt for #2600/#3388 (#5169)
- fix(core): ServiceManager.cs - UninstallServiceAsync alone rethrows unexpected exceptions; Install/Start/Stop convert them to OperationResult.Failure (#5176)
- fix(core): ServiceManager.cs - InstallServiceAsync's second IsServiceInstalled call drops the cancellation token its sibling at line 253 forwards (#5177)
- fix(core): ServicePathValidator.cs - FindAllViolations reflects over typeof(T), not target.GetType(); a base-typed call silently validates nothing (#5181)
- fix(core): ServiceValidationRules.cs - the CpuAffinity error is the only rule gated on 'errorMessage != null'; if the guard ever fired it would accept the invalid config silently (#5182)
- fix(core): AffinityHelper.cs - comma-only affinity strings bypass validation and silently return IntPtr.Zero, while the hex branch rejects the same zero mask loudly (#5307)
- fix(core): ServiceDependenciesValidator.cs - the length error omits the offending dependency name, the defect #1601 fixed in ServiceValidationRules before this check was written (#5341)
- fix(core): ServiceManager.cs / ServiceHelper.cs - only the SCM-registering call site zeroes the pre-stop timeout when no pre-stop hook exists, so the runtime stop wait outlives the pre-shutdown deadline (residual of #4465) (#5367)
- fix(core): ImportGuard.cs - the fileStream null guard is unreachable once IsValid is established, and Msg_ImportReadFailure is dead with it (#5370)
- fix(infra): ServiceRepository.cs - HandleCorruptServiceDecryption's UI marker is written into the stored Description on the next save and stacks on every load/save cycle (#5186)
- fix(service): ServiceHelper.cs - MaskRawArguments masks only the last token of an unquoted value, so the credential itself leaks whenever a positional argument follows it (#5223)
- fix(service): ServiceHelper.cs - RestartService logs a non-zero restarter exit code at Info level; the failure case is the only path that reaches the line (#5226)
- fix(service): ProcessWrapper.cs - SendCtrlC reads Marshal.GetLastWin32Error after process.HasExited has clobbered it, so attach failures classify on a stale error code (#5232)
- fix(service): ProcessLauncher.cs / Service.cs - centralizing hook launches dropped the per-hook audit prefix; every hook's expansion warnings now read '[ProcessLauncher.Start]' (#5234)
- fix(service): Service.cs - clean-exit path honors RecoveryOnCleanExit without the health-monitoring gate, leaving a zombie service that neither stops nor recovers (#5235)
- fix(service): Service.cs - StartPreStopProcess's LogIss
9.5 15 d’agost del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
This release brings ARM64 support to the Patch My PC Enterprise catalog, bug fixes, security patches, code quality improvements, and documentation updates. Full changelog listed below.
Full Changelog
Click to expand release notes!
- feat: add ARM64 support to the Patch My PC Enterprise catalog
- fix: resolve DeepInstinct false positives for net48 and ARM64 builds
- fix(core): log and report legacy DPAPI unprotect fallback
- fix(core): validate path buffer size bounds before uint to int cast in PathSecurityGuard.cs
- fix(core): ProcessHelper.cs -move RAM sampling inside per-PID lock for consistent metrics snapshot
- fix(core): Logger.cs - ensure old log writer is disposed in try-finally during swap
- fix(core): EventLogReader.cs - Event log field failures swallowed without diagnostics
- fix(core): ServiceManager.cs - StartServiceAsync's inline timeout calc omits PreLaunchRetryAttempts, reintroducing the #2211 false-timeout bug (#5043)
- fix(core): AppConfig.cs - HandleExeRegexTimeout uses FromSeconds on a millisecond constant, yielding a 2000-second timeout (#5104)
- fix(core): ServiceAccounts.cs - alias hash-sets carry case-only-duplicate literals redundant under OrdinalIgnoreCase (#5105)
- fix(core): ServiceHelper.cs - CalculateStartTimeout can throw OverflowException from two individually-valid PreLaunch field (#5106)
- fix(core): EventLogLogger.cs - ScopedEventLogLogger's own log level is never consulted for Info/Warn/Error (residual of #1443) (#5107)
- fix(core): ProtectedKeyProvider.cs - InvalidateCache wipes both cached Key and IV even when only one material migrates (#5109)
- fix(core): ServiceManager.cs - Unicode-casing rename silently reverts when the legacy OS service is already gone (#5110)
- fix(core): PathSecurityGuard.cs / ExportServiceCommand.cs - late validation failure leaves the OpenOrCreate stub file behind (regression of closed #2167) (#5111)
- fix(core): ServiceManager.cs - InstallServiceAsync's stale-casing DeleteAsync runs unguarded, unlike the sibling SCM-cleanup branch (#5129)
- fix(infra): SQLiteDbInitializer.cs - Missing DROP before CREATE TABLE IF NOT EXISTS in migration in ApplyVersion4()
- fix(service): Servy.Service.exe - orphan 5-byte dummy placeholder in Servy.Service's own Resources folder (#5045)
- fix(service): ServiceHelper.cs - LogStartupArguments Recovery block logs every health-monitoring-gated field but omits EnableHealthMonitoring itself (#5118)
- fix(service): Service.cs - RunFireAndForgetPreLaunch drops the process wrapper without disposing it when UnderlyingProcess is not a native Process (#5119)
- fix(service,restarter): DatabaseValidator.cs - CVE-2025-6965 SQLite version check missing from Servy.Service and Servy.Restarter (#5044)
- fix(restarter): ServiceRestarter.cs - missing exception type in transitional-error retry filter
- fix(restarter): ServiceRestarter.cs - Stop()/Start() command calls still catch only InvalidOperationException, not Win32Exception (last sibling of #2110/#4385/#4088) (#5050)
- fix(restarter): ServiceRestarter.cs - HandleTransitionalError treats a vanished service like a busy SCM, burning the full timeout instead of returning ServiceNotFound (#5116)
- fix(ui): AppBootstrapper.cs - bare catch in AppDomain unhandled-exception handler
- fix(ui): CursorService.cs - application.Current re-checked non-atomically before dispatcher use
- fix(ui): Strings.resx (Servy.UI) - Msg_InvalidPath has no consumer anywhere in the project (#5051)
- fix(desktop): ServiceCommands.cs (Servy) - InstallServiceAsync, UninstallServiceAsync and Start/Stop/Restart swallow OperationCanceledException as unexpected error (#5053)
- fix(desktop): MainWindow.xaml (Servy) - MaxLines=2147483647 repeated raw on 7 multi-line TextBoxes instead of a shared resource (#5122)
- fix(desktop): MainWindow.xaml (Servy) - RequiredFields legend hardcodes Foreground=Gray while every other hint text uses the system brush (#5123)
- fix(desktop): ServiceCommands.cs (Servy) - Export/Import/OpenManager show gene
9.4 13 d’agost del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
- feat(config): add EnableSizeRotation option to control log size rotation for Servy's internal log files
- fix(core): correct property ordering in XML and JSON exports
- fix(core): ServiceDependenciesValidator.cs - dependency names are charset-checked but never length-checked, unlike Helper.IsServiceNameValid (#5038)
- fix(service): add debug logs for heatbeat ping URLs
- fix(desktop): resolve PasswordBox styling issues
- fix(desktop): crisp textbox cursor on low resolutions
- fix(setup/net48): prevent uninstall conflict between x64 and ARM64 installers (#4990)
- chore(deps): update dependencies
- style: normalize source code line endings to CRLF
- style: add .gitattributes to enforce CRLF line endings
- ci: fix Node.js 20 runner deprecation warnings
- docs(wiki): update documentation
9.3 11 d’agost del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
- fix(core): reject unknown properties in JSON and XML imports (#4653)
- fix(core): ServiceControllerWrapper.cs - GetDependenciesInternal's injectable factory cannot exercise tree building; every mock wrapper is cast away (#5027)
- fix(service): EnableEventLog=false does not suppress the ServiceBase.AutoLog entries written under the "Servy" event source (#5036)
- fix(desktop,manager): crisp textbox cursor on low resolutions
- fix(setup): resolve InitializeSetup issues and type mismatches
- ci(publish.yml): Verify-PublishExclusions.ps1 - the script contains a byte-identical copy of publish.yml's filter block rather than invoking it, so all nine assertions pass no matter how the real filter changes (#4684)
9.2 9 d’agost del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
- fix(core): AppFoldersHelper.cs / AppConfig.cs - vault subfolder names 'recovery' and 'logs' are duplicated literals that can drift between default and custom vaults (#4791)
- fix(core): ResourceHelper.cs - the staleness check is one-directional, so a version downgrade never re-extracts and the newer wrapper stays in the vault silently (#4803)
- fix(core): ServiceHelper.cs (Core) - StopServicesAsync never settles transitional SCM states, so stopping a StartPending service fails the batch (stop-side sibling of the #2025 fix) (#4807)
- fix(core): ServiceAccounts.cs / NativeMethodsHelpers.cs - display alias sets and RunnableServiceAccounts have drifted apart again; BUILTIN/dot/spaced forms accepted at install show raw in the Manager UI (#5021)
- fix(core): EnvironmentVariablesValidator.cs - the value-side illegal-character message echoes the full value, unlike its key-side twin (residual of #4716) (#5029)
- fix(core): ServiceManager.cs - ToScmStartType coerces AutomaticDelayedStart but not Unknown, sending dwStartType=0 (SERVICE_BOOT_START) to the SCM (#5031)
- fix(infra): DapperExecutor.cs - BeginTransaction/BeginTransactionAsync are the only members without the Busy/Locked retry policy; transaction acquisition fails on the first SQLITE_BUSY the class remarks promise to ride out (#5007)
- fix(desktop,manager): SplashWindow.xaml (Servy + Manager) - AllowsTransparency=True on a fully opaque window adds layered-window overhead for nothing (#4841)
- fix(cli): ExportServiceCommand.cs - createdByUs length heuristic deletes a pre-existing empty file on write failure (residual of #2039) (#5000)
- fix(psm1): Servy.psm1 / EnvironmentVariablesValidator.cs - the module's EnvVars pre-validation regex rejects keys with spaces and multi-space separators that the CLI's authoritative validator accepts (#5012)
- fix(notifications): Write-ServyLog.ps1 - retention pruning glob ${baseName}_*${ext} matches sibling live logs and their rotations, deleting files it does not own (#4994)
- fix(setup): setup/servy.iss - uninstall leaves HKLM\Software\Servy (AddedToPath marker) behind; the key is written but never deleted (#4779)
- fix(setup): setup/servy.iss - ShouldAddCurrentUser compares the localized account name to 'SYSTEM' while claiming to replicate the C# SID comparison (#4781)
- fix(setup): setup/servy.iss - x64 and arm64 installers share {autopf}\Servy but have different AppIds; on ARM64 both install side-by-side and uninstalling one breaks the other (#4990)
- fix(setup): tools-config.ps1 - Resolve-Tool validates paths with bare Test-Path: bracketed paths fail as wildcards and a directory passes as a tool (#4997)
- fix: Format-SourceHygiene.ps1 - Set-Content -Encoding UTF8 emits a BOM on PowerShell 5.1, re-introducing what #4944/#4966 cleaned (11 of 21 .github files now BOM'd, was 2) (#5033)
- ci(resolve-version/action.yml): latest-release API fallback is a single-shot Invoke-RestMethod; one transient API error fails the job with a misleading 'no tag' message (residual of the #3635 class) (#4956)
- ci(download-with-retry/action): negative max_retries yields zero attempts and a silently successful step (boundary residual of the #4663 fix) (#4953)
- ci(download-with-retry/action.yml): every failure is retried and logged as 'Transient', including permanent 404/403s (sibling of the #1384 class) (#4954)
- ci(bump-version.yml): pushes to main/net48 via single-shot Invoke-Git push while dot-sourcing the Invoke-PushWithRetry helper its three sibling workflows use for exactly this race (#4959)
- ci(sbom.yml): generate-sbom.ps1 - BaseVersion is unvalidated (siblings publish.ps1/publish-sc.ps1 call Assert-ServyVersion); a malformed value is stamped silently into the published SBOM (#4984)
- ci(scoop): setup/scoop/servy.json - description drifted from the README feature sentence: 'CPU affinity' is missing (autoupdate never rewrites the description) (#4987)
- fix: various code quality, enhancements, and inconsistency issues
9.1 7 d’agost del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
- feat(desktop): add recovery action help button (#4828)
- fix(cli): Servy.CLI.dll flagged by ESET Server Security (#5024)
- fix(core): AffinityHelper.cs - hex affinity masks skip the processor-bounds check the range/list forms enforce; invalid masks pass validation and silently fail at runtime (#4788)
- fix(core): AffinityHelper.cs - both 'start < 0' and 'core < 0' guards are provably unreachable: the '-' split consumes every minus sign before parsing (#4789)
- fix(core): HandleHelper.cs - 'match.Success' is always true for matches enumerated from Regex.Matches; the term is provably constant (#4792)
- fix(core): ProcessHelper.cs - GetProcessTree's TryGetValue-miss continue is provably unreachable: both enqueue sites record the start time first (#4794)
- fix(core): ProcessKiller.cs - CriticalSystemProcesses protects the Hyper-V management services but not the per-VM worker processes (vmwp, vmmem) (#4799)
- fix(restarter): Servy.Restarter Program.cs - logs 'Successfully restarted service' and exits 0 when the service does not exist in the SCM (void RestartService hides its vanished-service clean returns) (#4893)
- fix(desktop,manager): app.manifest (Servy + Manager) - no DPI-awareness declaration; both WPF apps blur on mixed-DPI monitor setups (#4842)
- fix(manager): DependenciesView.xaml - five DataTriggers bind 'IsCycle' but the model property is 'IsCyclic', so all cycle visuals are dead (#4816)
- fix(manager): LogTailer.cs - flush-torn handling still leaks a truncated line through the threshold flush and replays published lines on exception-reopen (residual of #4084/#3302) (#4867)
- fix(setup/servy.iss): SetupAppRunningError says '%n%Please', so the dialog renders a literal '%' and loses the blank line (#4778)
- fix(setup/servy.iss): task XMLs declare UTF-8 but are saved with ANSI SaveStringsToFile; a non-ASCII install path corrupts them (#4780)
- fix(license): handle64.exe / handle64a.exe - Sysinternals binaries committed and redistributed in four projects with no attribution, version record, or redistribution license (#4756)
- ci(security.yml): .gitleaks.toml - allowlist-only config without [extend] replaces the default ruleset, so the CI secret scan runs with zero rules (#4749)
- fix: various code quality, robustness and inconsistency issues
- docs: fix various issues in the documentation (wiki)
9.0 4 d’agost del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
- fix(core): ServiceValidationRules.cs - the shared validator hardcodes the 12 [ServicePath] fields that the CLI-import and service-startup validators reflect over, so a new path property is silently unvalidated for the Manager and desktop app (#4401)
- fix(core): AppFoldersHelperTests.cs / AppFoldersHelper.cs - EnsureFolders_ValidPaths looks temp-dir scoped but EnsureFolders unconditionally re-ACLs the real C:\ProgramData\Servy vault plus its recovery and logs folders (#4491)
- fix(core): InstallServiceOptions.cs (Core) - HeartbeatUrl and its two companions omit the 'Only used when EnableHealthMonitoring is true' caveat their five siblings carry, and the gate silently drops every ping (#4498)
- fix(core): NativeMethodsHelpers.cs / NativeMethodsHelpersTests.cs - AtomicSecureMove guards with IsNullOrWhiteSpace but its message says 'null or empty' and neither theory has a whitespace row; ValidateCredentials in the same file does all three correctly (#4506)
- fix(core): ServiceDependenciesValidator.cs - Validate emits one error per duplicate occurrence while Parse de-duplicates the same token stream (#4513)
- fix(core): SecurityHelper.cs - the breakInheritance:true non-admin fallback cannot fall back: both downstream catch filters require !breakInheritance (#4556)
- fix(core): EventLogService.cs - a whitespace-only sourceName disables both provider filters and skips the allowlist (IsNullOrWhiteSpace at line 55 vs IsNullOrEmpty at line 130) (#4561)
- fix(core): IServiceManager.cs / ServiceManager.cs - GetDependencies checks cancellation before its argument guard, so the documented ArgumentException becomes an OperationCanceledException; its three sibling reads do the opposite (#4564)
- fix(core): SafeWinProcessHandle.cs - DangerousGetHandle hides the non-virtual base member with 'new', so the documented "IntPtr.Zero when closed" guarantee is bypassed through any base-typed reference (#4640)
- fix(manager): PerformanceViewModel.cs - AddPoint takes both the history queue and the MetricType that already selects it; a mismatched pair compiles and silently renders the wrong graph (#4374)
- fix(manager): MainViewModel.cs (Manager) - five minor items: ServiceCommands setter (null guard / notification / field placement), ServicesView private set, Refresh() naming, cursor reset on early returns, no disposed guard on CreateAndStartTimer (#4369)
- fix(manager): ServiceRowViewModel.cs - ConfigureCommand is the only one of the ten row commands built without the shared CanExecuteServiceCommand predicate (#4594)
- fix(cli): BaseCommand.cs - a failed service operation with a blank OperationResult.ErrorMessage logs nothing at all; the #3387 fix hardened only the user-facing path (residual) (#4701)
- ci(publish.yml): $env:SEVEN_ZIP assignment in the install step is a no-op; only the GITHUB_ENV export on the next line reaches the packaging step (#4664)
- ci(publish.yml): setup/servy.iss and setup/servy-arm64.iss are 575 of 582 lines identical; the 7 differing lines are all expressible with an Inno /DArch define, which both callers already use for /DMyAppVersion (#4688)
- ci(dependabot.yml): schedule.interval is inert while open-pull-requests-limit is 0, so the nuget/github-actions daily-vs-weekly split implies a cadence difference that does not exist (#4662)
- ci(scoop.yml): the Extras branch probe is wrapped in Invoke-Git, which exits on non-zero; 'rev-parse --verify --quiet' always exits 1 on a fresh clone, so run_extras_pr:true can never succeed (#4667)
- ci(changelog.yml): 'git add' runs before the porcelain check, so the following 'git diff --staged' else branch is unreachable; choco.yml and bump-version.yml order the same two guards the other way (#4659)
- ci(wiki.yml): the 'workspace files are present' guard uses 'ls -A .', which always lists .git after actions/checkout, so the empty/inaccessible branch is unreachable (#4678)
- ci(security.yml): the concurrency group falls back to github.sha for push/schedule/dispatch, making it unique per ru
8.9 30 de juliol del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
- fix(core): JsonServiceSerializer.cs - FormatLineInfo casts the exception to IJsonLineInfo, which no Newtonsoft exception implements, so JSON parse errors never report line/position (#4459)
- fix(core): ServiceControllerWrapper.cs - the 'if (deps != null)' guard in BuildDependencyTree's disposal finally is provably always true (#4460)
- fix(core): ServiceDtoImportValidator.cs - the manual CR/LF strip duplicates Logger's central SanitizeToSingleLine, and renders the same name differently from every other log line (#4463)
- fix(service): ProcessLauncher.cs - three provably-always-true path-emptiness terms at lines 205, 239 and 249, already folded into psi.RedirectStandardOutput/Error at 148-149 (#4404)
- fix(ui): AppBootstrapper.cs - critical-configuration failure tells operators to check an appsettings.json file that no app ships (#4437)
- fix(desktop): MainViewModel.cs (Servy) - three minor items: ManagerCommand is the only busy-block command without the !IsBusy guard, LoadServiceConfiguration missed the #3858 Async rename, trailing whitespace at 915 (#4447)
- fix(desktop,manager): DesignTimeAppConfig.cs / DesignTimeMocks.cs / DesignTimeServiceCommands.cs - the five design-time stand-ins follow four different implementation and documentation conventions (#4440)
- fix(manager): ConsoleViewModel.cs - t.IsFaulted is provably always true inside a TaskContinuationOptions.OnlyOnFaulted continuation (#4347)
- fix(manager): ConsoleViewModel.cs - ConsoleSearchText setter lacks the equality guard every sibling setter uses; a no-op write cancels the in-flight debounce and re-filters the whole buffer (#4349)
- fix(manager): Console/DependenciesViewModel.cs - SetPidText runs on every monitoring tick, defeating the change-detection branch immediately above it (#4353)
- fix(manager): MainViewModel.cs (Manager) - Select All raises HasSelectedServices once per row; the _isUpdatingSelectAll guard covers UpdateSelectAllState but not the notification (O(N²)) (#4367)
- fix(manager): PerformanceViewModel.cs - AddPoint's two 'valueHistory.Count > 0' guards (319, 361) are provably always true after the unconditional Enqueue at 311 (#4373)
- fix(cli): UninstallServiceCommand.cs - when the SCM service is already gone, the pipeline fails before onSuccess, so the repository row can never be cleaned from the CLI (#4235)
- fix(cli): Program.cs (Servy.CLI) - status/export still run the full runtime bootstrap (wrapper-exe extraction, event source, DB init); a corrupt servy.db breaks even 'status' (follow-up to #1760) (#4242)
- fix: linker.shared.xml - three trimmer roots preserve capabilities the trimmed projects do not have (Claims unused, FileSystemWatcher only in an untrimmed project, no STA code at all) (#4445)
- ci: resolve-version/action.yml - unused step 'id: resolve' left over from the removed outputs block (#2832) (#4172)
- ci: bump-version.yml - 'update-index --chmod=+x bump-version.ps1' is a no-op (mode already 100755, and Windows execution never needs it) (#4174)
- ci: loc.yml - badge deploy lacks force_orphan, so the loc branch accumulates one junk commit per push to main forever (#4177)
- ci: scoop.yml - step env re-maps HASH/VERSION to themselves; sibling Extras step proves the mapping is unnecessary (#4191)
- ci: bump-version.ps1 - no -DryRun preview mode, unlike sibling bump-runtime.ps1 (#4202)
8.8 29 de juliol del 2026 — 64 bits EXE (Inno Setup)ARM64 EXE (Inno Setup)
Notes de la versió
- feat: allow configuring CPU affinity in service definitions (#4436)
- feat: Add ARM64 architecture support to WinGet, Chocolatey and Scoop (#4199,#4206)
- fix(core): ResourceHelper.cs - CopyEmbeddedResource generic catch logs OperationCanceledException as 'Failed to copy' Error and swallows the cancellation (post-#3222) (#4331)
- fix(core): ServiceHelper.cs - StartServices/StopServices catch OperationCanceledException from the wait loops as a service failure (mislogged Error; last-service cancel throws AggregateException not OCE) (#4332)
- fix(core): ImportGuard.cs / ServiceDtoImportValidator.cs - the same MaxConfigFileSizeBytes rejection is logged as Error in one half of the import guard and Warn in the other (#4419)
- fix(service): ProcessLauncher.cs - CreateStartInfo documents a null-or-whitespace working-directory fallback but uses ??, so an empty string silently inherits the service's System32 directory (#4405)
- fix(service): ProcessWrapper.cs - SendCtrlC's finally clears the service's Ctrl+C ignore flag instead of restoring it, undoing what OnStart set and StartProcess carefully preserves (#4408)
- fix(service): EnvironmentVariableHelper.cs a custom variable referencing another whose value holds a system placeholder never resolves it; the class's own documents output the engine cannot produce (#4409)
- fix(restarter): ServiceRestarter.cs - stop-phase timeout message says 'No time remaining to stop' although Stop() was already issued; the service is left stopped and never started (residual of #949) (#4388)
- fix(desktop): ServiceConfigurationValidator.cs (Servy vs Manager) - a null DTO is silently swallowed in the desktop validator but reported to the user in the Manager one (#4361)
- fix(desktop): ServiceValidationRules.cs - an empty Confirm password field skips the mismatch check entirely, so an unconfirmed password installs in the desktop app (#4400)
- fix(manager): Manager monitoring ViewModels - shared _isDisposed guard tripped in every Dispose(bool) override makes base.Dispose() skip its cleanup (DispatcherTimer/CTS leak) (#4323)
- fix(manager): ServiceCommands.cs (Manager) - export path is the only GetByNameAsync call site that relies on the implicit decrypt:true default (#4337)
- fix(manager): ServiceCommands.cs (Manager) - ImportConfigAsync silently overwrites an existing service; InstallServiceAsync confirms first (#4341)
- fix(manager): ConsoleViewModel.cs - unchecked 'as' cast on Clone() makes a type mismatch silently clear the console every tick (#4348)
- fix(manager): LogTailer.cs - Dispose nulls OnNewLines but not OnLoopCompleted, though the doc says it detaches event handlers (#4357)
- fix(manager): MonitoringViewModelBase.cs - StartMonitoring has no _isDisposed gate; it rebuilds the timer and CTS on a disposed view model and re-hooks the Tick handler Dispose removed (#4370)
- fix(cli): Helper.cs (Servy.CLI) - TryParseFileType digit guard misses sign-prefixed numerics: '+1' is accepted as Json, '-0' as Xml (#4237)
- fix(cli): InstallServiceOptions.cs - 'Maximum time context in seconds' word salad leaks into user-facing --help; preLaunch/preStop timeout HelpTexts omit their unit (#4238)
- fix(psm1): Servy.psm1 - timeout-kill path leaks WaitForExit's Boolean return into the pipeline (missing [void]) (#4252)
- fix(psm1): Servy.psm1 - HeartbeatUrlTimeoutSeconds help promises 'Set to 0 for unlimited wait' but ValidateRange(2,30) rejects 0 (#4253)
- ci: changelog.yml - [datetime]::Parse converts the Z-suffixed published_at to runner-local time; release dates shift by a day on non-UTC runners (#4268)
- chore(deps): update dependencies
- other fixes: check GitHub Issues for details.
8.7 21 de juliol del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat: add External Heartbeat Ping URL (#2700)
- fix(service): move constructor guard clauses outside try-catch to prevent premature runner crash
- fix(service): wrap masking regex value patterns in atomic groups to eliminate ReDoS timeouts
- fix(service): move state cleanup inside the lock boundary to eliminate telemetry snapshot sync races
- fix(ui): BulkObservableCollectionTests.cs - TrimToSize_NonListImplementation_UsesManualLoop never reaches the manual-loop branch: every ObservableCollection ctor copies into a List (#3129)
8.6 12 de juliol del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(core): separate atomic and progressive creation paths to preserve inheritance when breakInheritance is false (#3896)
- fix(service): wrap masking regex value patterns in atomic groups to eliminate ReDoS timeouts
- fix(manager): prevent tab switching from prematurely freezing search commands
- chore(deps): update dependencies
8.5 28 de juny del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
Servy 8.5 focuses on stability, security, and maintainability, with a large number of fixes across all components and full native support for ARM64. The full changelog is available below.
Full Changelog
Click to expand release notes!
- feat: provide ARM64 binaries (#2243)
- fix: Wrapper executable not found (#4134)
- fix: Cannot remove service with status "Not Installed" - Uninstall button greyed out (#2904)
- fix(core): XmlServiceValidator.TryValidate / JsonServiceValidator.TryValidate - Compares string.Length (chars) against MaxConfigFileSizeBytes (bytes), allowing 2-3x oversized payloads with multibyte UTF-8 content (#1441)
- fix(core): AppConfig.cs - Doc comment references non-existent constant 'MaxBulkOperationParallelism' (actual is 'DefaultMaxBulkOperationParallelism') (#1445)
- fix(core): AppConfig.cs - MaxPreLaunchRetryAttempts = int.MaxValue is inconsistent with bounded MaxMaxRestartAttempts (100_000); allows unbounded retry loops (#1446)
- fix(core): AppConfig.cs - Confusingly similar names: DefaultStopTimeout (5s) vs DefaultServiceStopTimeoutSeconds (60s) (#1448)
- fix(core): ProcessKiller.cs - parentProcess.WaitForExit return value ignored; inconsistent with KillProcessTree/WalkAndKillChildren which log on timeout (#1449)
- fix(core): ResourceHelper.cs - ShouldCopyResource XML doc lists 'targetFileName' as out parameter, but the actual signature has no such parameter (#1453)
- fix(core): Helper.IsServiceNameValid - missing length check inconsistent with ServiceValidationRules.Validate (allows long names through start/stop/uninstall paths) (#1457)
- fix(core): Logger.FormatException - 'truncation to LoggerMaxFormattedExceptionLength' overshoots by 14+ chars (writes '... [truncated]' AFTER setting Length) (#1458)
- fix(core): AppConfig.cs - Static constructor invariant check between two const ints is dead code (compile-time folded) (#1460)
- fix(core): ServiceHelper.CalculateStopTimeout - Math.Max(total, floor) is always 'total' (dead floor guard) (#1462)
- fix(core): Logger.Log() - log entry timestamps reuse '_useLocalTimeForRotation' flag, conflating rotation policy with log formatting (#1464)
- fix(core): Helper.Quote() - whitespace-only inputs are coerced to empty quotes; literal-whitespace arguments cannot be passed (#1465)
- fix(core): SecureData.Encrypt - plainBytes allocated outside try, not zeroed on early failure (Aes.Create / aes.Key throws) (#1488)
- fix(core): StringHelper.cs - unused 'using System.Text.RegularExpressions' import (#1490)
- fix(core): ProtectedKeyProvider.cs - defensive 'encrypted is null' branch throws FileNotFoundException with a 'failed to read' message (#1501)
- fix(core): ServiceHelper.StartServices - Math.Max(startTimeout, DefaultServiceStartTimeoutSeconds) is dead floor (same family as #1462) (#1502)
- fix(core): SecureData.Decrypt - 'Returning original input' log message contradicts the immediately-thrown SecureDataIntegrityException (#1509)
- fix(core): ProtectedKeyProvider.GetOrGenerate - inconsistent retry backoff between IOException (exponential) and UnauthorizedAccessException (fixed 100ms) (#1512)
- fix(core): AppConfig.AllowLegacyV1Decryption - documented as a runtime migration toggle but is a static-readonly hard-coded false (no runtime override) (#1517)
- fix(core): AppConfig.ResolveExe - XML doc claims it throws FileNotFoundException but the implementation never throws (#1518)
- fix(core): Helper.WriteFileAtomic / WriteFileAtomicCore - duplicated 'retries = 3' and '100ms backoff' magic numbers across sync and async (#1522)
- fix(core): AppConfig.cs - TargetFramework field throws unconditionally even though it is only consumed inside #if DEBUG blocks (#1525)
- fix(core): SecureData.Decrypt - legacy fallback path emits two redundant 'returning as plaintext' warnings on a single decrypt failure (#1526)
- fix(core): ProcessKiller.KillParentProcesses - parent Process handle opened twice (once for StartTime, then re-opened to Kill) (#1527)
- fix(core): ProcessKiller.WalkAndKi
8.4 11 de maig del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
Servy 8.4 introduces enhanced recovery orchestration, improved security protocols, and significant performance optimizations across the entire service ecosystem.
Key Highlights
- Advanced Recovery Orchestration: New configuration options to ensure critical services maintain high availability through complex failure states.
- Granular Configuration: Expanded settings for process management and lifecycle handling, offering deeper flexibility for specialized environments.
- Hardened Security & Stability: Under-the-hood improvements to core security logic and stability, ensuring safer operation in production settings.
- System Maintenance: Comprehensive bug fixes and optimizations for a more reliable developer and operator experience.
The full changelog is available below.
Full Changelog
Click to expand release notes!
- feat(core): recovery for when the service process exits cleanly (#1311)
- fix(core): Timing/retry magic numbers scattered across LogTailer, ServiceHelper, DapperExecutor, ProcessHelper, RotatingStreamWriter - consolidate into AppConfig (#818)
- fix(core): ProcessKiller.KillProcessTree - GetParentProcessId called O(N×depth) times during recursion (#826)
- fix(core): Helper.IsRunningInUnitTest - only detects xUnit; NUnit/MSTest assemblies fall through to production code paths (#830)
- fix(core): ServiceManager constructor - missing ArgumentNullException guards (inconsistent with rest of codebase) (#839)
- fix(core): Logger.cs - Log timestamp lacks UTC/local indicator, ambiguous when UseLocalTimeForRotation is enabled (#842)
- fix(core): DefaultRotationSize is duplicated between AppConfig and Logger (DRY) (#845)
- fix(core): DapperExecutor.cs - unreachable 'return default' after for-loops with const retry counts (#850)
- fix(core): NativeMethods.cs - duplicate Win32 status struct (ServiceStatus and SERVICE_STATUS) - name also collides with the public ServiceStatus enum (#865)
- fix(core): ServiceManager.cs - Win32 access-right and service-type constants are re-declared shadowing the same names in NativeMethods.cs (#867)
- fix(core): IServiceManager - async lifecycle methods (Start/Stop/Restart/Install) lack CancellationToken while Uninstall and read methods accept one (#871)
- fix(core): Helper.EscapeArgs and ProcessHelper.EscapeProcessArgument implement the same Win32 algorithm in two different files (#872)
- fix(core): ProcessHelper.ResolvePath - XML doc and inline comment claim 'SERVICE’s environment' but the call expands the CALLER's environment (#878)
- fix(core): ServiceMapper.ToDomain - RecoveryAction default hardcoded as 'RecoveryAction.RestartService' instead of using 'AppConfig.DefaultRecoveryAction' (#892)
- fix(core): Service.cs (Domain) - RecoveryAction property has no default initializer; falls back to enum 0 (None) instead of AppConfig.DefaultRecoveryAction (RestartService) (#893)
- fix(core): Two parallel ServiceDto validators with different rule sets - XML/JSON imports skip upper-bound checks that CLI install enforces (#898)
- fix(core): EnvironmentVariablesValidator and EnvironmentVariableParser - duplicated 'SplitByUnescapedDelimiters' and 'IndexOfUnescapedChar' implementations (DRY) (#901)
- fix(core): ServiceDependenciesValidator - XML doc, inline comment, and error message all say 'letters/digits/hyphens/underscores' but the regex also allows '.' (#902)
- fix(core): Servy.Core Helper.GetBuiltWithFramework - naive 'net' prefix strip mangles 'netstandard*' TFMs into '.NET standard*' (#917)
- fix(core): Helper.EnsureEventSourceExists & Servy.Restarter Program.cs - Logger.Error duplicates ex.Message in formatted text and again in the exception parameter (#918)
- fix(core): AppFoldersHelper.EnsureFolders - hand-rolled connection-string parser fails on quoted paths and paths containing semicolons (#922)
- fix(core): Logger.Initialize - default parameter value '10' for logRotationSizeMB hardcoded instead of DefaultLogRotationSizeMB constant (#923)
- fix(core): ServiceDtoHelper.ApplyDefaults silently clo
8.3 27 d’abril del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
Servy 8.3 improves the UI experience and includes many fixes. The full changelog is available below.
Full Changelog
Click to expand release notes!
- fix(service): Console.CursorVisible causes service crash when running console app as Windows service (#814)
- fix(core): ImportServiceCommandTests - MockXmlValidator/MockJsonValidator ignore isValid parameter (#738)
- fix(core): implement fine-grained per-PID locking and atomic cache pruning in ProcessHelper (#796)
- fix(core): ServiceManager.UninstallServiceAsync - stop-wait loop ignores cancellation, blocks up to ServiceStopTimeoutSeconds (#798)
- fix(core): HandleHelper.cs - regex timeout hardcoded to 1s, bypasses AppConfig.InputRegexTimeout convention (#801)
- fix(core): ServiceValidationRules.cs - Service name not validated against SCM-forbidden characters (, /) (#806)
- fix(core): ServiceManager.cs - ServiceStopTimeoutSeconds hardcoded as a local const, should live in AppConfig (#809)
- fix(core): ServiceDto.cs - ShouldSerializEnableSizeRotation typo (missing 'e') breaks conditional serialization of EnableSizeRotation (#810)
- fix(core): ServiceManager.GetAllServices - Parallel.ForEach has no per-service timeout, single hung SCM RPC blocks a worker (#819)
- fix(core): ProcessKiller.CriticalSystemProcesses - incomplete safelist; killing dwm/MsMpEng/audiodg/fontdrvhost can destabilize the host (#825)
- fix(core): ProcessHelper.GetProcessTreeMetrics - caps summed CPU at 100%, hides multi-core saturation (#829)
- fix(core): ProcessHelper.EscapeArgument - fails to double backslashes that precede an internal quote (Win32 CommandLineToArgvW corruption) (#827)
- fix(core): Logger.cs - MaxBackupFiles is hardcoded to 0 (unlimited), no admin override path (#838)
- fix(core): SecureData.Decrypt - on crypto failure of marked payload, returns the post-marker payload (not the documented 'original cipherText') (#848)
- fix(core): ProtectedKeyProvider.GetOrGenerate - comment claims 'exponential backoff' but Thread.Sleep math is linear (#852)
- fix(core): ProcessHelper.cs - EscapeProcessArgument is dead code; only the broken EscapeArgument is called (#857)
- fix(core): ProtectedKeyProvider.SaveProtected - WindowsIdentity from GetCurrent() is never disposed (handle leak per save) (#861)
- fix(core): SecurityHelper.CreateSecureDirectory - WindowsIdentity from GetCurrent() never disposed (handle leak per call) (#868)
- fix(core): LogonAsServiceGrant.Ensure - InvalidOperationException loses the underlying SID-resolution failure cause (#874)
- fix(core): ResourceHelper + ServiceExporter - non-atomic file writes can leave truncated/partial files on crash, mid-copy interruption, or disk full (#875)
- fix(core): SecurityHelper.ApplySecurityRules — comparing the current user's SID to BuiltinAdministrators/LocalSystem GROUP SIDs is meaningless (#933)
- fix(core): ProcessKiller.KillProcessTreeAndParents(string) - silent catch-all swallows ALL errors with no logging (#935)
- fix(core): ProcessKiller.KillProcessTree - uses stale 'allProcesses' snapshot during recursion; processes spawned mid-walk survive (#936)
- fix(core): ResourceHelper.TerminateBlockingProcesses - for .exe resources, kills ALL processes matching the filename, including unrelated instances belonging to other services (#938)
- fix(core): Logger.Log - bare 'catch { /* Fail-silent */ }' on the write path swallows every I/O exception with no fallback channel (#940)
- fix(core): ServiceManager.GetAllServices - orphaned PopulateNativeDetails task races with results consumer and uses scmHandle after dispose (#965)
- fix(core): EventLogReader.ReadEvents - materializes the entire result set in memory before MaxResults limit can apply (#970)
- fix(core): EventLogLogger.Info/Warn/Error - EventLog.WriteEntry calls have no try/catch and no length truncation (32766-char limit) (#971)
- fix(core): ServiceControllerWrapper.BuildDependencyTree - bare catch swallows every error with no logging, leaving '(Unavailable)' nodes indistinguishable (#972)
- fix
8.2 24 d’abril del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(manager): CPU, RAM and PID resource monitoring shows "N/A" or frozen values for services (#796)
- fix(manager): set PID to N/A when service is uninstalled
- fix(core): ServiceValidationRules.cs - Missing Name/ExecutablePath reported as Warnings instead of Errors (#785)
- fix(core): RotatingStreamWriter.cs - Constructor captures _useLocalTimeForRotation before it is assigned (#791)
- fix(service): TimerAdapter.cs - Disposed-state check bypassed on event/property accessors (#786)
- fix(restarter): AppDbContext created but never disposed (#792)
- ci(setup-dotnet): dotnet-install.ps1 downloaded and executed without signature or hash verification (#787)
- ci(global.json): rollForward: latestPatch weakens build reproducibility (#790)
- ci(publish): CycloneDX CLI, Inno Setup, and 7-Zip installers downloaded and executed without integrity verification (#793)
8.1 22 d’abril del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
Servy 8.1 introduces many fixes across main components. The full release notes are available in the expandable section below.
Full Changelog
Click to expand release notes!
- fix(core): Child folder ACLs in %ProgramData%\Servy break multi-account setups (#725)
- fix(core): mixed string empty checks: IsNullOrWhiteSpace vs IsNullOrEmpty used interchangeably (#397)
- fix(core): Multiple files - Process.MainModule!.FileName! pattern repeated in 7 locations (follow-up to #724) (#757)
- fix(core): RotatingStreamWriter.cs - Synchronous Thread.Sleep retries during rotation stall stdout/stderr capture (#761)
- fix(core): Post-launch hook missing EnvironmentVariables / Stdout / Stderr / Timeout / Retry / IgnoreFailure — asymmetric with pre-launch (#762)
- fix(core): Servy Event Log - C# code (1000/2000/3000) and PowerShell scripts (9901/9903) use disjoint Event ID ranges on the same source (#764)
- fix(core): AppConfig.cs - ConfigurationAppPublishDebugPath and ManagerAppPublishDebugPath point to Release folders (#768)
- fix(core): AppConfig.cs - Inconsistent relative-path depth across Debug/Release folder constants (#769)
- fix(core): HandleHelper.cs - Silent catch swallows Kill() failure on handle.exe timeout (#771)
- fix(core): Domain/Service.cs - StartupType, Priority, and DateRotationType lack inline default initializers despite sibling properties having them (#776)
- fix(core): ServiceManager.cs - Null-forgiving operator on scmHandle then null check is self-contradictory (#781)
- fix(infra): DapperExecutor.cs - synchronous Thread.Sleep in SQLite busy-retry blocks thread pool (#759)
- fix(infra): DapperExecutor.cs - SpinWait.SpinUntil(() => false, delay) misuses SpinWait as Thread.Sleep (#779)
- fix(service): Fire-and-forget PRESHUTDOWN registration races OnStart failure (#758)
- fix(service): ProcessLauncher.cs - stdout/stderr log flush has no error handling, buffer lost on disk failure (#770)
- fix(service): EnvironmentVariableHelper.cs - MaxExpansionPasses and MaxStringLength hardcoded, should live in AppConfig (#775)
- fix(service): Partial nginx shutdown leaves orphan process running (#784)
- fix(restarter): database locked on restricted accounts
- fix(desktop): MainViewModel.cs - ConfirmPassword silently overwritten with Password on configuration reload (#782)
- fix(desktop,manager): Export/Import XML vs JSON methods duplicated in both GUI projects (#407)
- fix(desktop,manager): Start/Stop/Restart boilerplate duplicated in both ServiceCommands (#408)
- fix(desktop,manager): MainViewModel.cs - IsManagerAppAvailable snapshotted at ctor, never refreshed (#783)
- fix(desktop,manager,cli): Validation logic triplicated across Servy, Manager, and CLI (#404)
- fix(manager): ConsoleViewModel.cs - LogTailer instances leaked across service switches (no store, no dispose) (#763)
- fix(manager): Strings.resx - Status_StopPending and Status_PausePending display values lack space, inconsistent with sibling statuses (#778)
- fix(psm1): stderr ArrayList capture is unbounded while stdout has a 1 MB cap (asymmetric) (#765)
- fix(notifications): ServyFailureEmail.ps1 - timestamp only persisted on email success causes event storm after SMTP outage (#760)
- fix(tests): ProcessKillerTests.Dispose - cmd cleanup loop has empty body; dead code or missing Kill() (#740)
- fix(tests): LogTailerTests - Hardcoded Task.Delay(300/1000) timing flake risk (#749)
- fix(bump-version): dead else branches in version-format logic (#772)
- fix(publish): docstring example uses -fm but actual parameter is -Tfm (#773)
- fix(bump-runtime): counters use $global: scope, pollute caller session (#774)
- ci(workflows): Multiple workflows - No permissions block, inheriting default read-write token scope (#589)
- ci(scoop): scoop.yml - git config --global injects PAT into runner globally, persists for all subsequent steps (#777)
8.0 20 d’abril del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
Servy 8.0 introduces many fixes across all components. The full release notes are available in the expandable section below.
Full Changelog
Click to expand release notes!
- feat(core): allow MaxRestartAttempts to be set to 0 for unlimited restart attempts (#701)
- feat(desktop): replace process parameters inputs by a resizable textarea (#700)
- fix(core): EnableRotation is ambiguous now that date rotation exists - should be EnableSizeRotation (#381)
- fix(core): MaxRestartAttempts upper bound of 100 is too restrictive for long-running system services (#701)
- fix(core): ProtectedKeyProvider.cs - DPAPI entropy migration failure logs Warn once, stuck state invisible (#723)
- fix(core): Child folder ACLs in %ProgramData%\Servy break multi-account setups (#725)
- fix(core): Central config - Regex ReDoS timeout 200ms duplicated across 6 regexes (#726)
- fix(core): NativeMethods.cs - Inconsistent SafeHandle vs bare IntPtr across SCM/Job P/Invokes (#730)
- fix(core): ProtectedKeyProvider.SaveProtected - No explicit file ACL, non-atomic write (#731)
- fix(core): EventLogReader.cs:44 - Truncated docstring ending mid-word (#748)
- fix(service): ensure event log availability during pre-shutdown via explicit dependency
- fix(service): ProcessLauncher.cs - Duplicate FireAndForget check is dead code (#707)
- fix(service): EnvironmentVariableHelper.cs - Duplicate XML doc on ExpandWithDictionary (#708)
- fix(service): ProtectedKeyProvider: stale aes_key.dat from cloned/imaged hosts causes silent 1053, no recovery path (#712)
- fix(service): ProcessLaunchOptions.cs - DefaultWaitChunkMs and DefaultScmAdditionalTimeMs duplicated (#728)
- fix(desktop): MainViewModel.cs - Hardcoded English dialog titles in 4 SaveFile calls (#735)
- fix(desktop): ServiceConfigurationMapper - Mixed AppConfig vs hardcoded defaults within same file (#745)
- fix(desktop,manager): App.xaml.cs initialization duplicated between Servy and Manager (#405)
- fix(desktop,manager): MainWindow.xaml.cs - CreateMainViewModel is 60-line composition root in View code-behind (#649)
- fix(desktop,manager): App.xaml.cs - ContinueWith(async t) drops inner Task, startup faults lost (#714)
- fix(desktop,manager): AppBootstrapper.cs - OnExit disposes SecureData but not DbContext (#715)
- fix(desktop,manager): 14 unused resource keys across Servy and Servy.Manager (#729)
- fix(desktop,manager): ServiceCommands.ValidateFileSize duplicated across Servy and Servy.Manager (#743)
- fix(desktop,manager,cli): misleading error "Max Restart Attempts must be a number greater than or equal to 1" fires for upper-bound violations too (#702)
- fix(desktop,manager,cli): improve validation messages for numeric options (#703)
- fix(manager): MonitoringViewModels - OnTick guard + timer pattern triplicated across 3 ViewModels (#517)
- fix(manager): ViewModels - SearchServicesAsync duplicated across ConsoleViewModel, PerformanceViewModel, DependenciesViewModel (#632)
- fix(manager): MainViewModel.cs - Child ViewModels newed up directly, not injectable (#648)
- fix(manager): MainWindow.xaml.cs - GetDependenciesVm uses 'logsView' as pattern variable (copy-paste bug) (#705)
- fix(manager): MainWindow.xaml.cs - Type pattern variable shadows type name in GetPerformanceVm/GetConsoleVm (#706)
- fix(manager): XAML code-behind - async void event handlers swallow exceptions (#713)
- fix(manager): Monitoring ViewModels - no IDisposable, DispatcherTimer/CTS leak on GC race (#716)
- fix(manager): LogsViewModel - CTS + Cleanup() without IDisposable (#732)
- fix(manager): ServiceConfigurationMapper vs ServiceMapper - Divergent default-handling and enum validation (#733)
- fix(manager): LogTailer.cs - CreationTime rotation detection misses FAT32 tunneling and same-size rotation (#734)
- fix(cli): InstallServiceCommand.cs - Duplicate XML doc blocks on Execute method (#704)
- fix(cli): ConsoleHelper.cs - Duplicate XML doc on RunWithLoadingAnimation (#709)
- fix(tests): ServiceRepositoryTests - Brittle reflection-based property 
7.9 16 d’abril del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
Servy 7.9 introduces a hardened security infrastructure, significant performance optimizations, and a wealth of new features. It's packed with an extensive list of improvements, and the full release notes are available in the expandable section below.
Full Changelog
Click to expand release notes!
- feat(desktop): replace process parameters input by a resizable textarea (#700)
- feat(manager): Get CPU and RAM usage of the whole process tree (#446)
- feat(core): replace WMI with native P/Invoke for improved performance and reliability (#94)
- feat(notifications): move SMTP settings to external XML config
- fix(security): ServiceHelper: debug logging can write passwords and sensitive values to plaintext log files (#161)
- fix(core): Resource leak: StringWriter not disposed in ServiceExporter.ExportXml (#95)
- fix(core): WindowsServiceApi.GetServices: ServiceController instances not disposed after enumeration (#97)
- fix(core): HandleHelper.GetProcessesUsingFile: int.Parse can throw FormatException (#98)
- fix(core): HandleHelper: command injection risk via string-interpolated Arguments (#99)
- fix(core): RotatingStreamWriter.GenerateUniqueFileName: null-forgiving operator on Path.GetDirectoryName (#101)
- fix(core): SecureData.Decrypt: silent fallback to plaintext on cryptographic errors (#103)
- fix(core): Async method naming: Task-returning methods missing Async suffix (#110)
- fix(core): IServiceManager: mixed sync and async methods in same interface (#114)
- fix(core): inconsistent return types for operation success across layers (#116)
- fix(core): ServiceHelper.GetRunningServyServices: verbose list union can be a single LINQ expression (#124)
- fix(core): EnvironmentVariableParser: list allocated before guard clause - use early return (#128)
- fix(core): ResourceHelper: verbose conditional list initialization can be a single ternary (#127)
- fix(core): StringHelper: typo in method name FormatEnvirnomentVariables - missing 'o' (#139)
- fix(core): InstallServiceAsync: SetServiceDescription called with zero handle when CreateService fails (#158)
- fix(core): SecureData: key material retained in memory indefinitely - class lacks IDisposable (#159)
- fix(core): ProtectedKeyProvider: DataProtectionScope.LocalMachine allows any local process to decrypt keys (#160)
- fix(core): ServiceManager.UninstallServiceAsync: Thread.Sleep blocks thread pool thread in async method (#162)
- fix(core): RotatingStreamWriter.Rotate: redundant nested lock - caller already holds _lock (#164)
- fix(core): Logger.Log: null check on _writer outside lock - race condition with Shutdown() (#165)
- fix(core): RotatingStreamWriter: _disposed check outside lock - race with concurrent Dispose() (#168)
- fix(core): Helper.IsValidPath: path traversal check is too broad - blocks legitimate paths (#169)
- fix(core): XXE vulnerability in XmlServiceValidator deserialization (#172)
- fix(core): SecureData missing ObjectDisposedException guard on Encrypt/Decrypt (#177)
- fix(core): PID reuse TOCTOU race condition in ProcessKiller (179)
- fix(core): Race condition between Refresh and Start in ServiceHelper.StartServices (#181)
- fix(core): unbounded loop in RotatingStreamWriter.GenerateUniqueFileName (#183)
- fix(core): Credential validation bypassed when password is empty (#182)
- fix(core): RotatingStreamWriter: uses DateTime.Now instead of UTC for rotation date tracking (#202)
- fix(core): XmlServiceValidator: XXE vulnerability - XmlDocument loaded without disabling DTD processing (#221)
- fix(core): EventLogReader: EventRecord objects may reference disposed reader resources (#223)
- fix(core): EventLogService: XPath injection risk in query filter construction (#224)
- fix(core): HandleHelper: WaitForExit without timeout - caller blocks indefinitely if handle.exe hangs (#251)
- fix(core): EventLogService.SearchAsync: unbounded result list - OOM on large event logs (#253)
- fix(core): ProtectedKeyProvider: no retry on File.ReadAllBytes - AV lock fails service startu
7.8 4 d’abril del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(logger): add LogRollingInterval config for daily, weekly, or monthly log rotation
- fix(logger): defer file creation until first write (lazy init)
- fix(core): replace WMI with SCM/Registry for resource refresh service queries (#48)
- fix(cli): --version output goes to stderr instead of stdout (#49)
- fix(cli): only inject the default verb if the user didn't provide a recognized verb
- fix(psm1): misleading error message when Servy CLI is not found (#50)
- fix(psm1): Invoke-ServyCli: non-zero exit code caught by its own try/catch block (#51)
- fix(psm1): Install-ServyService: Pre-stop and Post-stop parameters missing [string] type declaration (#52)
- fix(psm1): missing module manifest (.psd1) for Servy PowerShell module (#53)
- fix(psm1): Add-Arg does not quote values containing spaces (#54)
- fix(psm1): use System.Diagnostics.Process instead of & in Invoke-ServyCli (#54)
- fix(psm1): Uninstall-ServyService: incorrect function name in .EXAMPLE (#55)
- fix(psm1): Show-ServyVersion: inconsistent invocation pattern compared to other functions (#56)
- fix(psm1): Show-ServyHelp: .EXAMPLE does not demonstrate -Command parameter (#57)
- fix(psm1): Install-ServyService: PostLaunch missing parameters that PreLaunch has (#58)
- fix(psm1): Import-ServyServiceConfig: missing -Name parameter unlike Export-ServyServiceConfig (#59)
- perf(core): accelerate startup by replacing WMI with fast SCM/Registry queries (#48)
7.7 3 d’abril del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(logger): add EnableEventLog option to allow disabling Windows Event Log via configuration
- refactor(core): general code cleanup and refactoring
- docs(wiki): improve Advanced Configuration documentation
- chore(announcement): launch new Servy website with refreshed branding, security audits, and 100% code coverage
7.6 2 d’abril del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(service): read entire service configuration from database instead of service parameters
- feat(logger): implement dual-channel LogLevel support for the Windows Event Log and local files
- feat(logger): add LogRotationSizeMB configuration option (default: 10MB)
- feat(logger): add NONE Log Level to disable logging
- fix(logger): implement IDisposable in EventLogLogger for clean teardown
- fix(logger): prevent duplicate exception text in logs
- fix(service): use synchronous resource extraction to ensure thread safety
- fix(service): move resource refresh to service constructor to ensure it's done before any operations that rely on it
- fix(service): move logger disposal to service teardown
- fix(service): include LogLevel setting in .NET Framework 4.8 build
- fix(service): move event source creation to constructor for self-healing initialization
- fix(service): refactor InstallService to use InstallServiceOptions class for improved maintainability
- fix(restarter): ensure logger is disposed on exit
- fix(manager): improve stability and configuration consistency
- fix(manager): ensure EventRecords are disposed to prevent memory leaks
- fix(manager): include missing ConfigurationAppPublishPath configuration in .NET Framework 4.8 build
- fix(manager): remove deprecated EnableDebugLogs setting from .NET 10.0 build
- fix(manager): optimize log search threading by removing redundant Task.Run and Dispatcher nesting
- fix(net48): rename Servy.Restarter.exe to Servy.Restarter.Net48.exe to avoid conflict with the .NET 10.0 build
- ci(publish): update publish workflow to handle the new Servy.Restarter.Net48.exe filename for the .NET Framework 4.8 build
7.5 31 de març del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(logger): expand observability across Desktop, CLI, Manager, Service, and Restarter logs
- feat(logger): add DEBUG level for more verbose output during troubleshooting
- feat(logger): add LogLevel setting to dynamically adjust log verbosity at runtime
- fix(logger): prevent null entries in logs after abrupt termination
- fix(core): improve embedded resource extraction and refresh reliability after installation
- fix(core): prevent redundant resource refreshes using 20-minute timestamp delta
- fix(core): ensure reliable resource extraction on the first run after installation
- fix(cli): ensure logger is initialized before use in CLI
7.4 30 de març del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(logger): expand observability across Desktop, CLI, and Manager apps
- fix(logger): ensure recovery logic coverage and prevent zombie handles
- fix(logger): restore correct encoding after log rotation to prevent garbled text
- fix(logger): enable 10MB default size rotation for Desktop, CLI and Manager logs
- fix(logger): include year boundary check in weekly log rotation
- fix(core): verify process StartTime before termination to prevent PID reuse kills
- fix(core): prevent recursive process termination of the current process tree
- fix(core): await Dapper tasks to prevent premature connection disposal
- fix(db): resolve TOCTOU race condition via atomic upsert in ServiceRepository
- fix(db): migrate service name index to UNIQUE to support ON CONFLICT logic
- fix(service): respect Windows service model forcing sync OnStart/OnStop
- fix(service): allow direct timeout checks for fire-and-forget pre-launch tasks
- fix(service): release managed handles for detached processes
- fix(service): add null-checks and error logging for Process.Start robustness
- fix(manager): implement high-performance log tailing via batch trimming
- fix(manager): allow root dependency node to expand and collapse
- fix(manager): move performance metrics off the UI thread
- ci(publish): migrate 7zip download to GitHub releases and fix install path
7.3 26 de març del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(core): use local time instead of UTC for log rotation (#47)
- fix(core): correct log cleanup logic (#47)
7.2 26 de març del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(core): change log rotation naming to insert timestamp before extension (#47)
- feat(core): use local time instead of UTC for log rotation (#47)
- feat(core): update log cleanup logic (#47)
- ci(publish): fix VirusTotal 502 timeouts
7.1 25 de març del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(cli): typo in import validation message (#45)
- fix(cli): install after import not registered with Servy.Service.CLI.exe (#46)
- ci(publish): wrong Inno Setup download URL
- ci(publish): upgrade artifact upload to actions/upload-artifact@v6
- ci(publish): fix SBOM schema version
- ci(publish): fix VirusTotal 502 timeouts
- chore(deps): update dependencies
7.0 14 de març del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(desktop,manager): add --force-sr flag to resolve blank UI issues on MeshCentral (#44)
- fix(desktop): fix manager app detection when launched from CLI
- fix(manager): fix desktop app detection when launched from CLI
6.9 13 de març del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(desktop,manager): blank UI on some machines (#44)
- fix(desktop,manager): add logger with software-rendering diagnostics (#44)
- fix(desktop): pre-stop and post-stop file dialogs not working
- fix(installer): remove Servy Manager launcher from post-install window
- chore(deps): update dependencies
6.8 26 de febrer del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- perf(core): optimize encryption with modern high-performance crypto APIs
- perf(manager): optimize Services tab performance
- perf(manager): move console log sorting off the UI thread
- fix(desktop): improve layout sizing on small displays
- fix(desktop): update pre-launch help text and clarify pre-launch and pre-stop timeouts
- fix(manager): set minimum width for Select All column
- fix(dev): correct wrapper service path resolution in Debug mode
- chore(deps): update dependencies
- docs(wiki): add Kopia service sample to Examples & Recipes docs (#41)
6.7 15 de febrer del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(manager): restore decryption on refresh to fix field values
- fix(ci): resolve coverlet runtime issue on net48 branch
6.6 14 de febrer del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(manager): optimize background timer performance
- fix(manager): remove unnecessary decryptions across all tabs
- fix(manager): correct wrapper service path in Debug mode
- fix(apps): ensure full application shutdown on main window close
- docs(wiki): update CLI and PowerShell docs
6.5 13 de febrer del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(security): implement authenticated encryption using AES-CBC with HMAC-SHA256
- perf(core): improve performance and overall stability
- fix(service): remove duplicate recovery flag reset
- fix(net48): ensure SQLite assemblies are deployed at runtime
- chore(deps): update dependencies
- docs(wiki): update documentation
6.4 9 de febrer del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(cli): auto-disable spinner when no console is attached (#39)
- chore(setup): normalize the publish scripts and CI workflow
- docs(wiki): update and enhance the documentation
6.3 6 de febrer del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(service): register PRESHUTDOWN support in OnStart (#37)
- fix(service): ignore PRESHUTDOWN signal during computer restart recovery action
- fix(service): prevent infinite crash loops with stability-based counter reset
- fix(service): implement proportional stability threshold for monitoring
- fix(service): prevent restart counter reset during computer restart recovery action
- fix(service): decouple health detection from recovery execution
- fix(service): improve performance and stability of health monitoring
- fix(service): resolve race conditions in process health checks
- fix(service): ignore recovery when teardown starts
- fix(service): synchronize health monitor with teardown state
- fix(service): implement thread-safe access to restart attempts file
- feat(setup): add "Launch Servy Manager" option after setup completes
6.2 4 de febrer del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(service): explicitly handle OS shutdown with SCM wait pulses (#37)
- fix(core): ensure service start respects configured pre-launch timeout
- fix(core): ensure service stop and restart respect configured pre-stop timeout
- feat(manager): add visual detection of circular dependencies in service tree
- feat(manager): add dynamic tooltips for service status and cycle warnings
- feat(manager): sort service tree nodes alphabetically by display name
6.1 3 de febrer del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(manager): add Dependencies tab to show service dependency tree with status indicators
- refactor(manager): extract service list into a reusable control
- refactor(manager): move UI constants to Servy.UI for reuse
- chore(psm1): replace backticks with splatting in PowerShell samples
6.0 1 de febrer del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(core): support fire-and-forget pre-launch hooks when timeout is set to 0
- fix(service): clean up orphaned pre-launch and post-launch hook processes on service stop
- fix(service): remove post-launch, pre-stop, and post-stop arguments from logs for security
- fix(desktop): reduce window height on small resolutions
- fix(cli): typo in --preStopTimeout option documentation for install command
- chore(ci): add LoC badges for prod, tests, and total code
- docs(wiki): add Pre‐Stop & Post‐Stop Actions docs
5.9 30 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(manager): add Console tab to display real-time service stdout and stderr output
- feat(core): add pre-stop and post-stop hooks (#36)
- fix(service): request SCM additional time in pulses while pre-launch hook is running
- fix(tests): correct test script issues
- chore(tests): upgrade to xUnit v3
- chore(tests): remove deprecated xUnit packages
5.8 25 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(service): implement resilient recursive process tree termination
- fix(service): prevent orphaned child processes when parent is force-killed
5.7 24 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(service): ensure cleanup of zombie child processes
- fix(service): ensure Ctrl+C signal is sent to child processes
- fix(service): implement pulsed shutdown to allow exhaustive process tree cleanup
- fix(service): ensure SCM remains responsive during long-running descendant termination
- fix(service): overhaul process stop logic to handle complex process trees
- fix(service): synchronize restart recovery actions with the configured stop timeout
5.6 22 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(core): allow environment variable expansion in process paths (#35)
- feat(core): allow environment variable expansion in startup directories
- fix(service): keep SCM responsive by requesting additional time in short pulses during stop
- fix(service): improve startup options validation for process paths and startup directories
5.5 21 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(core): request additional SCM start and stop time when configured timeout approaches limit
- fix(core): ensure service is in database before performing start, stop and restart actions
- fix(core): align start and stop timeouts with service timeouts from SCM and database while restarting services
- fix(core): use previous stop timeout while calculating total stop time during restart
- docs(wiki): update CLI commands and examples in multiple wiki pages
- docs(wiki): expand FAQ with more questions and answers
5.4 20 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(psm1): improve CLI discovery for installed and portable setups
- fix(manager): handle long user session values with proper width and trimming
- fix(tests): eliminate race condition from fire-and-forget async work in ServiceCommands
- chore(psm1): update PowerShell module samples
- chore(deps): update dependencies
- docs(psm1): update PowerShell module docs
- docs(wiki): expand FAQ with more questions and answers
5.3 14 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(psm1): make Servy PowerShell module fully compatible with PowerShell 2.0+
- feat(psm1): ensure Servy PowerShell module compatibility with Windows 7+ and Windows Server 2008+
- fix(psm1): resolve servy-cli.exe path relative to module for portable and SCCM (#31)
- fix(psm1): correct validation for -StartupType and -DateRotationType parameters for Install-ServyService function
- fix(psm1): replace exit statements with throw for proper PowerShell error handling
- fix(psm1): throw error when cli exits with non-zero exit code
- fix(psm1): add validation to help command
- fix(cli): return exit code 0 for help and version commands instead of 1
- fix(manager): increase performance graph grid thickness for pixel-perfect visibility
- refactor(psm1): dry up code and improve error handling
- chore(deps): update dependencies
- chore(core): remove unused dependency System.Diagnostics.PerformanceCounter
- docs(psm1): clarify module usage for installed and portable Servy versions (#31)
- docs(wiki): update Export/Import and PowerShell docs
5.2 13 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(manager): optimize CPU and RAM graph rendering performance
- fix(manager): disable hit testing on CPU and RAM graphs
- fix(manager): ensure character ellipsis triggers in service Name and Description columns
- fix(manager): set minimum window width to 940px to prevent layout clipping
- fix(manager): correct PID badge padding and layout in Performance tab
5.1 12 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(manager): add copy PID button to Performance tab
- feat(manager): theme PID label as a badge using performance color palette
- fix(manager): prevent content clipping of PID badge in Performance tab
- fix(manager): center search text and cursor vertically in Services and Logs tabs
- fix(manager): prevent search box auto-focus when changing between tabs
- fix(manager): remove focus style from focused elements
- docs(manager): finalize graph interaction model to match Windows Task Manager standards
- chore(installer): fix false positive virus scan detections (Windows Defender, Deep Instinct, ClamAV)
5.0 11 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(manager): refine CPU and RAM graph point collection and rendering
- feat(manager): optimize background refresh with batch fetching, throttling, and atomic flags
- feat(manager): optimize overall performance and responsiveness of Services and Performance tabs
- fix(manager): stop CPU and RAM graphs from blocking mouse clicks
- fix(manager): prevent multiple service selection in Performance tab
- fix(manager): correct hover background color for logs grid
- chore(installer): fix false positive virus scan detections (Windows Defender, ClamAV)
4.9 10 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(cli): add --install option to import command to install service after import
- feat(powershell): add -Install switch to Import-ServyServiceConfig cmdlet to install service after import
- feat(manager): optimize real-time CPU and RAM metric collection in Services tab
- feat(manager): apply modern look to services list in Performance tab
- feat(manager): allow sorting services by name in Performance tab
- feat(manager): add hover background to services and logs grids
- fix(manager): stabilize CPU and RAM graph polling in Performance tab
- fix(manager): keep the UI thread smooth during CPU and RAM graph updates
- fix(manager): prevent timer re-entry and zombie restarts during monitoring
4.8 8 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(core): add start and stop timeout options to desktop app, CLI and PowerShell module
- feat(manager): optimize real-time CPU and RAM metric collection in Services tab
- docs(wiki): update FAQ, CLI, PowerShell and Export/Import docs
4.7 7 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(manager): optimize CPU and RAM graphs rendering and responsiveness
- fix(manager): handle service restarts by resetting CPU and RAM graphs on PID change
- fix(manager): correct visual synchronization of CPU and RAM graphs data
- fix(manager): resolve fencepost error for perfect graph-grid alignment
- fix(manager): prevent redundant CPU and RAM graphs resets and improve state tracking
- fix(manager): prevent race condition in async search
- fix(manager): optimize performance tab search
- fix(manager): add logging to performance tab in case of search failure
- refactor(manager): decouple CPU and RAM graphs grid logic from View Model to View
4.6 6 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(manager): apply modern look to CPU and RAM performance graphs
- feat(manager): use raw CPU and RAM values in performance graphs without averaging
- feat(manager): add padding to services list for better readability in performance tab
- fix(tests): prevent multiple WPF Application instances across STA unit tests
4.5 5 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(manager): add performance tab with real-time CPU and RAM monitoring graphs
- chore(setup): add dark mode support to installers
- chore(setup): add Uninstall shortcut to Start Menu
- chore(setup): add .NET Framework 4.8 install check in net48 installer
- fix(net48): correct desktop app and manager paths in app config
- ci(winget): fix WinGet workflow
- docs(wiki): expand Troubleshooting section with additional use cases
- docs(wiki): expand FAQ with more frequently asked questions
4.4 1 de gener del 2026 — 64 bits EXE (Inno Setup)
Notes de la versió
- chore(desktopapp): improve service logon information text
- chore(desktopapp): remove unused System.ServiceProcess.ServiceController reference
- chore(cli): improve service user install command help text
- test(tests): add missing unit tests to achieve 100% code coverage
- ci(net48): fix publish and test workflows
- docs(wiki): update Usage, CLI and Troubleshooting documentation
- docs(wiki): expand FAQ with more frequently asked questions
4.3 19 de desembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(core): upgrade to System.Data.SQLite 2.0.2 to ensure database stability and security
- fix(sbom): exclude test projects from SBOMs
- fix(sbom): add Servy version to SBOMs
4.2 17 de desembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(core): encrypt process parameters for maximum security
- fix(core): move process parameters retrieval from binary path to database
- chore: include SBOMs in release artifacts for provenance
4.1 16 de desembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(core): resolve SCM limit for extremely large environment variables (#29)
- fix(core): encrypt environment variables for maximum security
4.0 15 de desembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- chore: officially signed all executables and installers with a trusted SignPath certificate for maximum trust and security
- chore: fix multiple false-positive detections from AV engines (SecureAge, DeepInstinct, and others)
- chore(deps): update dependencies
- feat(core): add max rotations option (#26)
- feat(core): add date-based log rotation (#27)
- feat(desktop): add Logging tab for stdout/stderr and logging configuration
- feat(setup): add Add Servy to PATH installation option
- feat(setup): add custom installation options for advanced users
- fix(core): update stdout/stderr rotated file naming to include rotation index as extension
- fix(security): isolate recovery configuration files (#25)
- fix(desktop): add validation to start, stop, and restart service commands
- fix(desktop): improve validation of number input fields
- fix(setup): grant write access to %ProgramData%\Servy for Local Service and Network Service accounts
- ci: automate code signing with SignPath and GitHub Actions
3.9 27 de novembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix: significantly reduce executable and installer sizes (#24)
- ci(choco): update Chocolatey workflow to use the new API
- chore(setup): update build script to keep console window open after failure
3.8 26 de novembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix: reduce executable sizes by optimizing build configurations (#24)
- fix(service): stdout/stderr redirection issues for pre-launch process
- fix(notifications): missing details in email notifications
- fix(setup): correct resource and publish steps in build scripts
- refactor(core): general code improvements and optimizations
- chore(setup): refactor build scripts for consistency and maintainability
3.7 19 de novembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(core): properly grant "Log on as a service" right for local and Active Directory accounts
- chore(desktop): update service display name info text
- refactor(core): general code improvements and optimizations
3.6 18 de novembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(core): add service display name
- fix(core): ensure user account has the "Log on as a service" right
- fix(core): ensure event source exists in the desktop app, the cli and the manager app
- fix(about): make .NET runtime and year retrieval automatic
- chore(about): refine about info text for Servy and Servy Manager
- chore(psm): correct Add-Arg function description
3.5 16 de novembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- chore(setup): significantly reduce portable archive sizes for better distribution
- chore(deps): update dependencies
- docs(wiki): add more samples to examples & recipes
3.4 13 de novembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(psm): improve argument parsing and handling of optional parameters
- docs(wiki): add more samples to examples & recipes
3.3 12 de novembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- chore: upgrade to .NET 10 LTS
- chore(deps): update dependencies
- fix(restarter): increase service stop and start timeouts to 120 seconds
- fix(service): improve service restart wait handling and logging
- docs(wiki): update documentation
3.2 10 de novembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(restarter): add detailed error logs for service restart failures (#23)
- chore: update info message about service account permissions (#23)
- chore: add info message about recovery permissions (#23)
3.1 9 de novembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(core): support NetworkService, LocalService, and passwordless accounts (#23)
3.0 8 de novembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(core): add support for automatic (delayed) service startup type
- fix(core): properly escape special characters in process parameters (#22)
- fix(core): switch to network logon since some domain accounts don't allow interactive logon
- fix(core): allow valid characters in DOMAIN\Username logon
- fix(core): improve logon validation for gMSA accounts
- fix(manager): validate credentials when importing a service
- chore: add project manifest
2.9 30 d’octubre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(service): stdout/stderr pipes are lost after sending Ctrl+C to child process (#20)
2.8 27 d’octubre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(core): escape environment variables correctly when formatting after import
- fix(restarter): publish script command fix
2.7 26 d’octubre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- chore(winget,chocolatey): update manifests
2.6 25 d’octubre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(service): resolve stdout/stderr UTF-8 encoding issues (#20)
- fix(manager): ensure service list is sorted correctly
- fix(service): remove unnecessary logs
2.5 23 d’octubre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(service): correctly display non-ASCII characters in stdout/stderr (#20)
- fix(recovery): allow graceful restart
2.4 21 d’octubre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(service): incorrect process termination (#20)
- fix(logging): add Event ID to Info, Warning, and Error service logs
- fix(core): ensure PID is preserved after importing a running service
- fix(core): exclude service Id and PID from XML and JSON exports
- ci(sonar): add SonarCloud analysis workflow
- ci(release): add release workflow
- refactor: general refactoring and code cleanup
2.3 13 d’octubre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(security): add debug logging option and prevent sensitive data exposure (#19)
- fix(psm1): handle parameters correctly in PowerShell module to avoid argument misparsing (#18)
- fix(cli): correct help text for environment variables
- fix(packaging): include PowerShell module in portable ZIP
- docs(psm1): update documentation and examples for PowerShell module
- chore: resolve false positives in SecureAge and Gridinsoft
2.2 9 d’octubre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(manager): enhance DataGrid virtualization and performance
- fix(manager): prevent resizing DataGrid rows
- fix(service): service install not working when Windows is installed on a drive letter other than C: #16
- fix(service): reorganize and clean up startup parameters log
2.1 9 d’octubre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(clients): Servy.Service.exe not copied when Windows is installed on a drive letter other than C: #16
- fix(clients): load appsettings.json from project root in debug and exe directory in release #16
- fix(configurator): export XML and JSON not working when password is supplied
2.0 7 d’octubre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(clients): prevent loading stray appsettings.json at runtime #16
- fix(core): robust and accurate CPU usage calculation
- fix(service): avoid stopping services when copying Servy.Restarter.exe from resources
- fix(service): add missing log for post-launch options
1.9 4 d’octubre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(manager): adjust service list column widths when maximizing window
- chore(release): add generic installer
- chore: update dependencies
1.8 1 d’octubre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(core): using the same file for stdout and stderr prevents log rotation #14
- fix(installer): manager and cli apps not killed on uninstall
- fix(core): use ConcurrentDictionary for thread-safe CPU usage tracking of services
- fix(core): prevent NullReferenceException in CPU usage retrieval
- fix(core): optimize resource copying for better performance
- fix(manager): escape \, % and _ in services search to match literals
- fix(manager): lower services refresh interval to 4 seconds
- fix(manager): enforce blue background and white text for selected DataGrid rows
- chore(installer): fix false positives in VirusTotal, Microsoft Defender, SecureAge, and Zillya
- chore(installer): add Servy to Scoop extras bucket
1.7 29 de setembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(manager): add real-time CPU & RAM monitoring for services
- feat(manager): add PID column and Copy PID action to services
- fix(core): optimize resource copying for better performance
- fix(service): reliably update service without checking Win32 error
- fix(manager): performance issues on UI thread when loading and updating services
- fix(manager): adjust actions column width in services
- fix(manager): load configuration from appsettings.manager.json
- fix(configurator): load configuration from appsettings.json
- fix(cli): load configuration from appsettings.cli.json
- fix(cli): correct help text for --preLaunchEnv argument in install command
- chore: update dependencies
1.6 23 de setembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(core): add support for post-launch actions
- feat(installer): add Servy to Scoop package manager
- fix(configurator): increase tab height for better visibility
- fix(installer): adjust LZMA dictionary size to 64MB to reduce memory usage during install
1.5 20 de setembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(installer): resolve false positives from VirusTotal and Microsoft Defender
- fix(installer): increase LZMA dictionary size to 128MB
1.4 18 de setembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(cli,powershell): add --quiet and -q options to CLI and -Quiet switch to PowerShell module #11
- fix(cli): rotation size calculation
- fix(configurator): make failure program path optional instead of required
1.3 18 de setembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- feat(core): add failure program recovery action
- feat(core): add support for gMSA accounts
- feat(cli): add Servy PowerShell module
- feat(configurator,cli): change rotation size unit from bytes to megabytes (MB) for improved readability #10
- fix(configurator,cli): ensure rotation and health check default values are persisted correctly
- fix(configurator): correct confirm password validation
- chore: update dependencies
1.2 15 de setembre del 2025 — 64 bits EXE (Inno Setup)
Notes de la versió
- fix(cli): support both version and --version arguments
- fix(cli): update --rotationSize help text for install command
- fix(pre-launch): add missing info text and row in configurator
- fix(manager): refine column alignment and layout in services and logs grids
- fix(manager): freeze widths of checkbox and context menu columns
- fix(manager): prevent moving columns while allowing resize
- fix(manager): enable sorting for Name and Description columns in services grid
- fix(manager): prevent columns from shrinking below min width in services grid
- fix(installer): missing icons
1.0 6 de setembre del 2025 — 64 bits EXE (Inno Setup)

El més popular a Terminals i línia d’ordres

Mostra-ho tot
  1. PowerShellTerminals i línia d’ordres · Microsoft Corporation
  2. QPDFTerminals i línia d’ordres · QPDF
  3. Oh My PoshTerminals i línia d’ordres · Jan De Dobbeleer
  4. Microsoft Azure CLITerminals i línia d’ordres · Microsoft Corporation
  5. yqTerminals i línia d’ordres · Mike Farah
  6. AlacrittyTerminals i línia d’ordres · Alacritty
  7. fzfTerminals i línia d’ordres · Junegunn Choi
  8. PuTTYTerminals i línia d’ordres · Simon Tatham
  9. cURLTerminals i línia d’ordres · curl
  10. TabbyTerminals i línia d’ordres · Tabby Developers

Etiquetes

Comparteix