Servy

Akram El Assas·aelassas.Servy

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.

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, environment variables, dependencies, pre-launch and post-launch hooks, pre-stop and post-stop hooks, and parameters. Servy is digitally signed with a code-signing certificate provided by the SignPath Foundation. The signature verifies the publisher, enables Windows to detect any modification of the released binaries and installers, and prevents SmartScreen warnings. Servy offers a desktop app, a CLI, and a PowerShell module that let you create, configure, and manage Windows services interactively or through scripts and CI/CD pipelines. It also includes a Manager app for easily monitoring and managing all installed services in real time. Features: - Clean, simple UI - Monitor and manage all installed services with Servy Manager - Real-time CPU and RAM monitoring with live performance graphs for installed services - Real-time service stdout and stderr output preview in Servy Console - Service dependency tree visualization with status indicators - CLI and PowerShell module for full scripting and automated deployments - Run any executable as a Windows service - Set service name, description, startup type, priority, CPU affinity, working directory, environment variables, and dependencies - Environment variable expansion supported in parameters, process paths, and startup directories - Run services as Local System, local or domain accounts, Active Directory accounts, or gMSAs - Redirect stdout/stderr to log files with automatic size-based and date-based rotations - Run pre-launch hooks before starting the service, with retries, timeout, logging and failure handling - Run post-launch hooks after the application starts successfully - Run pre-stop and post-stop hooks before and after the application stops - Supports Ctrl+C for command-line apps, close-window for GUI apps, and force kill if unresponsive - Supports Ctrl+C propagation to descendant processes of the wrapped process - Prevent orphaned/zombie processes with improved lifecycle management while ensuring resource cleanup - Health checks and automatic service recovery - Browse and search logs by level, date, and keyword for faster troubleshooting from Servy Manager - Export/Import service configurations for easy backups and automation - Service Event Notification alerts on service failures via Windows notifications and email - Compatible with Windows 7 SP1 through 11 (x64/ARM64) and Windows Server editions Who is it for? - Developers: Run development servers, scripts, or custom tools as services without extra setup. - Sysadmins & IT professionals: Ensure critical background processes stay alive, monitored, and properly logged. - Teams or organizations: Automate background services reliably across multiple machines.

winget install --id aelassas.Servy --exact --source winget

Latest 9.9·August 28, 2026

Release Notes

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 the read path gets (#5954)
  • fix(core): SecureData.cs - Decrypt's marked-payload catch logs SecureDataLegacyBlockedException as 'Integrity failure', the classification #5545/#5568 exist to prevent, and duplicates the correct Warn two lines above the throw (#5955)
  • fix(core): SecureData.cs - Encrypt/Decrypt read the key arrays with no lock against ZeroSensitiveData, the TOCTOU the sibling ProtectedKeyProvider takes _cacheLock to prevent; a racing Dispose persists a blob encrypted under a zeroed key (#5956)
  • fix(core): SecurityHelper.cs - the non-admin create fallback returns success with no directory on disk, and its warning promises inherited permissions that cannot exist (#5957)
  • fix(core): ServiceControllerWrapper.cs - unresolvable dependencies sort under the first letter of the localized error sentence, because Msg_DependencyUnavailable is written into DisplayName and DisplayName is the sort key (residual of #1828) (#5966)
  • fix(core): ServiceManager.cs - MapStartupType's protected-service catch expects Win32Exception, but ServiceController.StartType wraps it in InvalidOperationException, so every protected service logs at Error as 'Unexpected' on each service-list refresh (#5970)
  • fix(core): ServiceManager.cs - StartServiceAsync and StopServiceAsync never refresh before their wait loop, so the first check re-reads the status cached by the pre-flight test and every start and stop sleeps a full 500 ms poll interval it does not need (#5979)
  • fix(core): HandleHelper.cs - the InvalidOperationException guard on Process.Start cannot fire with UseShellExecute=false, and the real unstartable-exe failure is an undocumented Win32Exception the test suite already asserts (#6089)
  • fix(core): EventLogReader.cs / EventLogService.cs - the '' fallbacks that #1295 and #2061 added are unreachable; the bracket filter discards every record carrying one (#6128)
  • fix(core): ServiceManager.cs - GetServiceStartupType discards the start type it already resolved when the delayed-auto-start probe throws, while GetAllServices keeps it (#6134)
  • fix(service): Service.cs - a crashing child is the one EvaluateExitOutcome arm that logs no exit code, and its failure counter reports the exit as a failed health check (#5754)
  • fix(service): Service.cs - IsRecoveryEnabled's options != null conjunct is provably always true; OnStart throws on null 39 lines earlier and is its only caller (#5791)
  • fix(service): ServySecurity.ps1 / ServiceHelper.cs - a sensitive keyword preceded by letters with no separator is never masked, so PGPASSWORD= and APITOKEN= leak in full (prefix mirror of #3765) (#5877)
  • fix(service): Service.cs - the RestartProcess recovery action never re-applies Priority or CpuAffinity, so every automatic restart silently drops both settings (#6044)
  • fix(service): Service.cs - the heartbeat fail-flag still reads RecoveryOnCleanExit without the health-monitoring gate #5235 added, so a clean exit-0 stop pings /fail (residual of #5235) (#6045)
  • fix(service): Service.cs - UpdateServiceStatus zeroes dwControlsAccepted for SERVICE_STOPPED but reports the accumulated dwCheckPoint, so a pre-shutdown teardown ends on a stopped-but-progressing status (#6050)
  • fix(service): Service.cs / StreamWriterFactory.cs - a syntactically-bad log path degrades gracefully, but an unreachable one throws out of the factory and aborts OnStart before the child process is launched (residual of #2068) (#6054)
  • fix(service): ProcessLauncher.cs / Service.cs - the !Start() guards cannot fire with UseShellExecute=false, and the real unstartable-exe failure (Win32Exception) is undocumented on ProcessLauncher.Start (residual of #6089) (#6097)
  • fix(ui): AppBootstrapper.cs - the embedded-resource extraction failure dialog is captioned 'Elevation Required', a cause the admin check twelve steps earlier has already ruled out (#6052)
  • fix(ui): AppBootstrapper.cs - the splash floor pads by a fixed 500 ms instead of by the time remaining, so a 50 ms start shows it for 550 ms and a 1001 ms start shows it for less than a 999 ms one (#6053)
  • fix(ui): HelpService.cs - a failed browser launch after a successful update check is reported as 'Failed to check updates', while the sibling documentation path has a purpose-built message (residual of #1585) (#6055)
  • fix(ui): AppBootstrapper.cs - UpdateAvailabilityState re-tests a path its only caller already pinned to non-empty, so the guard is provably always true (class of #1943 / #2007) (#6056)
  • fix(desktop): Strings.resx / MainWindow.xaml (Servy) - the Pre-Launch and Pre-Stop timeouts are the only two second-valued fields whose unit appears nowhere on screen, though their screen-reader text states it (#6061)
  • fix(desktop): ServiceCommands.cs / IServiceCommands.cs (Servy) - the Install path's null-DTO guard returns false without the error report its contract promises, while Export routes the same null into the validator (#6062)
  • fix(desktop): MainViewModel.cs (Servy) - LoadServiceConfigurationAsync's not-found exit is silent, so opening the desktop app for an unknown service shows a defaults form as if it were that service's configuration (#6068)
  • fix(desktop): MainViewModel.cs (Servy) - BindServiceDtoToModel casts all four enum settings from int with no membership check, so an imported out-of-range value renders as a blank ComboBox and still installs (#6069)
  • fix(manager): LogsViewModel.cs - the default log-search window is computed once in the constructor, so a Manager left running past midnight keeps searching a window that ends on the day it started (#6007)
  • fix(manager): DependenciesView.xaml - an unavailable dependency renders as a stopped service, tooltip included; IsUnavailable is the one node flag the template never binds (#6020)
  • fix(manager): MainViewModel.cs (Servy.Manager) - GetServiceUpdateInfo casts the DB StartupType with no membership check, so a not-installed row with an out-of-range value renders as a raw number (residual of #319/#6069) (#6073)

Installer type: inno

x6496B58D58843729431DC56E148FB58F2E8BA9ECC9ABC963F03A508474687D3F24
arm64C42CB368091B59B7D96ED25C99BEDB92C4DAC499F09EB1EFA7AFAD043C5A08CC

Details

Homepage
https://servy-win.github.io/
License
MIT
Publisher
Akram El Assas
Support
https://github.com/aelassas/servy/issues
Copyright
Copyright (c) 2026 Akram El Assas
Moniker
servy

Tags

adminautomationbackground-serviceclidevopsdotnetnssmpowershellscmservice-managerservice-supervisorservice-wrapperwatchdogwindows-servicewindows-toolswinsw

Older versions (88)

9.8
x644215FD05B425FB32C350D4B5527CBEC333B84696FDFCCFBCDD138524AC5F4050
arm6464A96E4A04DA044B94712F57CA6F26ABFB1F33F4A58F79ECED378CFE80354627
9.7
x64BAD4EDFF026348B58418C1E2224E8D1405C706AE9D575AD19A9268A602B56458
arm64694EE9297F0ACFFA8FD4627F64FCC5443B8E9CA3E5516C5D88E2335493C5A01E
9.6
x64FA4E2D6F469FD3B8254F522998C3FADABDD23AE7ABFC3786D6FF35969532669A
arm64E0EDC95ECD331E416E649E3E89BE30467800D2C0AC47DC683B2FD89E67856793
9.5
x6470AD1B237BB2CB4F50A8A3A5B6C417146A42360E76A854FDEC1C1510FAA33418
arm6421086DB213D3104FA20158005A97FB3C67315B5431239728C2C8AAEC97377912
9.4
x646DD204A4D1656976E49E8460F6C264DC3E9826C6722D8CE9C9544F659BEC860A
arm6405FBB8067964AD854C729C5045692F1F05738B3AAADFF6D830CFC883134474D4
9.3
x647A7A5C4A1C64E07C5CEE333A4228F943CF7790D46EE87EDBC71DB67C49A6E2D9
arm64A5108F48FB0CB895B3E3C7EDC2B0CC6C215CF72EFAF92AF3BC4323B329C8F5E7
9.2
x64C68384EEE57C3B778C5D00E4E41290811C1EC8E236884B482CFC38464FD3239D
arm64147E08BD1F47C5DB01B4B70F1EFA0004D42143F6DF1C80C7A75D0258FEE8E7C8
9.1
x64EE309E2E6024828500552A53325E1D5255AC629B9E9BB1E809BEE9C48BCBD92E
arm646934CF1179D5AB2CE5C1651C8D3D829D1C5660CB66FCFB4E47A4B14AA40BF635
9.0
x642618CFB276F6A1764CA173ADA7F63C61F35914241642A31AFE10D6D4530530CA
arm64B3AADF4EFA2C6F36CFC0918E62D2F804A370BA7787C143303782603AF2270A8C
8.9
x6461A25D31BC9CFCE24857BF97EF942155612CFA146C1A9FE1604401549A3235F1
arm6490200DBD00020EC8A5285512E757ED3E6EEE1BF98AA7EA599D7C5A0565E60708
8.8
x64D21158C52AC231EA2B4D6D72ABD98E630E27E8622A6EFC6AF93ADBC639BB9063
arm64A2EAFDE697F1DC7C4F4598BB9972F09EC7AC9ADE4FFC0C935AD7074326AFDB40
8.7
x643F27BDF8F6100D3C6DC1CEDA72137D4C54A330D1334DD5B6A08B5605F7193053
8.6
x6449F688F053F6C1408107F968CF806E694CE65F0CDF53CE5542234DC0B950893C
8.5
x64C66ED0661D25853131347783A7F3F94997EDBC62B1F9BFB3F70DAD0DB128CCC8
8.4
x6461E989201EE977864EAF5A6B2E2EB046B1C6F6F629CECA2C324477116F3E7C51
8.3
x64B2747253F21A0495BA598E9B4FE1C662081C21EA3AE263BE6D109168371ABBF5
8.2
x643F45266BA19C808799701F1829AB9F443A8A1E159E5071CB4EDCCB770BF51492
8.1
x64E9BA6DB66B96FD94A4DB706FC1355EA5E5B053FD74BB61594E87CC24703D1EDF
8.0
x64115EA71C70B93C170EE8609A21A295BD271193CCAAE223B8F965A2E9E4898BFA
7.9
x645273168E6019FEA1E423C134E082A33E4F8DE8348B97F4BCAAF8EE5456E509ED
7.8
x648199F86ED63BEC73BCB8A7F315CE4CD32C561B27E234A6EBE933E83B9249AF57
7.7
x6441D3BD8B0C311533991349D5244DB0590CF2CCDF8B5F3B6EF112A2AF7781B8DF
7.6
x64FDC60166AE7E05FF087298B3F1501F4CE3AF468F871336403E493F98A3330F3E
7.5
x641F708A2AF30A9A0AA8803D716A1931FD09F6A3C4701F1D698B2A2DDD84C0D78C
7.4
x64F8E90E9468EF3EAB9BA3835F90251CE2FF4A8E0C2E95038A4283E2D190ECBE7A
7.3
x642D3FB4A8E6BBB66BD70964FA178D66897628420DC1E6B53EDEDE7CD4B0B25202
7.2
x64CCA530E4C05A04A665B5BFD72E64AE158F547ACE8B0DAD646AF69D07E182FBC0
7.1
x644F6B84A739AF4806FA78BBD22966E704707A0CD38F6531578F3901E62B4596A3
7.0
x64EB90815276D561B2BC9FB54CF47F386A1DA0711185A6F91033F960D5CA12A4C3
6.9
x648D1EC4B3F6BF8046A28FE7B4FB27E84D725039A149C1DB2509A552EA866EECFF
6.8
x64D69FBE16C1A5BBE1B61979A7FEBF3C908A8E62E9E11645F77E60E929FCDBD005
6.7
x64FFC3FA3BF12B7F0E723C3692C10EA0AB5E5D29A46676D672A49583ADE6CCF173
6.6
x6464A5F634C8955C950F44AF7DD26E1C04216F7D931C1A72D0B2261308C591DB02
6.5
x64140927A69DBEA6296393784CC1140DAC0D90E2538527E1F2CC8B9750CFABA770
6.4
x641DAB7F00D87DD2A1D91D114E08D8132BCC1C16DBFD248B1AD869316169F4BEA6
6.3
x643CD8E4FF1632946031088E5446CF055D4E8042E4F07E25A91D3DE1F6EDFE442C
6.2
x647195B55E05B5D407930A4D6C17700D0A17346A5651FBB8CE8B3CFD235FA1AFE1
6.1
x64B1F00045C5F52AFF3952B8E6657D65576D14DCF5CE5257ADD142F2EDCB5DD3D2
6.0
x64DE07175DD09DC6C9E52F5A5520F74F5C3100EADEFF8797B1DD7757A188CB495E
5.9
x645EDC0222C92EA457D53346F445DA3802CE3FE72147A8BBE660C3B5144F78135B
5.8
x642DD25798CF0E231DCF3DDE21D12E0DD5ABEAC709B3BAA03AC5BAD3467334A3F0
5.7
x6480726F54C5C5F2CC9DFFDBE2D8E5D80F4A373A9E2547620D1A42EB9CD658DAD9
5.6
x64A47BA0C676B95F74D35AB9B1B01FAA6E6F95BABC0F4F44EE71959C2521019246
5.5
x64EB1EEB87CE77D37EA57FA468E7EFA1602B93F98113F76A7EF7B6B83FCF0B2C94
5.4
x64D4D71F1A6C9AB8CF5ED5B3210EAC9AA30BBFBC254A3B9ED6E59774B563292EE8
5.3
x64761F9918576580EE10258007172C26015A2B39A2BC12E5D797C7EE9D5B274D39
5.2
x6441525E879E2A494C1FABC3DB2EDD3A93FDD473D38312B782DB06DAA5BC02E323
5.1
x649B6749A90F4908014416A33039B63CD586E57B61530E46DF8E4FD3F3887FBE3E
5.0
x646827D9D5A761EDFBF64A8B196F677042EFD2D400E2476029691492BA0722ECCB
4.9
x648A29AE76FE904F347C99D217C0F5EA4C4C7416E52BA0919C6C20453AFDE9BC46
4.8
x645FA20A5EF4615E04FC7002C31512CD5A5A85442F8BC82C54E7EBEB5AF9AD21AD
4.7
x64497150FBC13723F5BF310E83DC23EA283821C7705B6D2219A94B5F3331275823
4.6
x64E035A6A94B167F78A7F6ACC932A720D4C368A9DEF520583FAD5D2D439FB2A623
4.5
x64E7652DBF8C78300419482786C7DF36CEDA306C6EFC1752CF3B6B2C95EFCF7328
4.4
x642462DC640426D4AAA4BEE7B15BBD04BE4BBAB0FEAAF61E1997CCBAB9C37E0FA7
4.3
x6455DFE76AF23A99D75A9066362CCCEF02DA0C7126976598DC99943654AC559A92
4.2
x64EA2C9555539AECA1C8EF3281F87FBB305B74D54ED4F46347873A37AB1405D410
4.1
x64803A7CF860BE5CA12BBF45E8B3032E166B2554242DAF39D20BC28E71B0B5DFEC
4.0
x641126AAECB151FE91140C39E247631C1043700BC8733B7A3B48E18525E124C578
3.9
x64B62FF2BA44B351244E450D339808ACCF4F044DC6FAEF25336EC6A8BBBC0C4B60
3.8
x644D6F7EAA7CC6423C69D99FE33807FCA9230E65900EBE5AC44A36CE2B5F63AC35
3.7
x64F8058871F78FE902F5EA04CC9DB4614C828FBEB1CBDE390A9486529D4158DB53
3.6
x64990D12556C86F3C20DA016AD93F4DFCD93E2A550F654A0273C8BBCD78F9C9E09
3.5
x6413DCA3D8B4DC8B9737B0FE16BCE18CD9C7318D590A6EC39B5C63993948682705
3.4
x64364A9B1A137EF1C46453ED534A7AE3AB73AC3567B6F4F5E72CD9A7B4122ED9F2
3.3
x6410F5CF8F7DD447F4F7CBFDE949D9A8343743AA416653B53C9C74EEB18196F748
3.2
x644FFE8C86C1F374F379D2F8BCE1C3D69D58EC06BE39AC8188D86D5DC3808FAF64
3.1
x648B761348E50E24B33D883D9CCBDD6294595E6E7770FBDCAA4FE5BBFE0698BE84
3.0
x64A26738F051587A6D3048D0A9FD046B48E416242DDAAE96E1C63DFAA0127CB2D1
2.9
x64C0A310E080A6E5E22CB47071B955311F5AE2662A984026770AA2393B28D81052
2.8
x649F0DCA13694FE32C7EF7824DE323AEB2E45651B3F25AF0C597DC81A16C74C119
2.7
x6407C88F640ECDF2592ACA4F2A0DDD2640318A1FBD73788538ECE63ADD10384555
2.6
x64C0E306302F1DE097AF90BD7C8F99E58D1023D1E4A6161F53C231C4556B4EAEC5
2.5
x64938E76B7585546E48EEC1097572EDC7627E6615327D9F9ED20A93A229E81607A
2.4
x646955FAF56EE70B6E9D59B28D95F9B84B4A101620D795B5648F707C141654AB9A
2.3
x6435CC536F575CE4DFE9993B919BB04E6832CDECCD59AFAB6B2A8EA696DC533A80
2.2
x64983156A09BC17E1EBEBDA5EA90E364427550B8F2FF2D56A20617E63A9465040A
2.1
x64DA1DBDB27F06278CD080EA90FAAA46F60345ECC3B4E21A4D621724D37ADFDB06
2.0
x645DD5D8112183A57615D19E028649D7F1B04FAB243F6C29101E81DC3EBBAD2448
1.9
x64EFC5F6ABBA42FEA790B19FC28E3B10352FFE7C6C4C40BF0478DBFA53CB1EC3AE
1.8
x648CDCEC1320A16CBA243B84096F68E8A377975B2B521A3FA2E33C759972EE1F34
1.7
x64250FDA5E528E1C31744AE5EDA633962A1C62F386BD345227C50DF6C1D69AFE82
1.6
x648A79845742A7D739309735EDDAE46E650D3A4237CB8A3A3F8FAF26AE0826DE0F
1.5
x645AADEE0290115CD98134E8C3FF09C45E86173D41FE431F2537EEE4448FF27B74
1.4
x645491E0D00CE50F58E05E180B322C5097E3B09F76D097E19B1BFAAE0D2ED438EA
1.3
x64C0174BFA502F900885ECAABB52DB0DD1C6C066C9874E6DCCA4941E1206BF481D
1.2
x64BF0089BA5E77BD7AF2354CAEB894534842D4D5BA8457EBD382AE8FA10E61E8F4
1.0
x648D8EB49758E388EABD60A09B4CE609727F5DADB111532D925183D1CA4C8633A4