⚠️ indicates a breaking change.
[Unreleased]
Added
Changed
Removed
[0.10.1] - 2026-03-22
Changed
- Use a larger unit for elapsed time logging.
[0.10.0] - 2026-03-08
Added
ArgParser::setup_cmd()can be used to perform immediate configuration of the argument parser's internal rootCommandobject.- The
init_command!()macro can be used to initialize the argument parser'sCommandwith some metadata from the crate'sCargo.toml.
Changed
- ⚠️ Use
windows-registryinstead ofwinreg/registry.
[0.9.1] - 2026-03-07
Changed
- Skip timestamp for production log when running in service mode. (It is assumed that the system's logging facilities will implicitly add a timestamp).
- Bump MSRV.
[0.9.0] - 2026-03-06
Added
- Log
init(),run()andshutdown()runtimes to the production log (at debug level). - Log total service uptime to production log (at info level).
Changed
- ⚠️ Pass a mutable reference to
RunCtxinArgProc::build_apprt().
[0.8.2] - 2026-03-05
Changed
- Bugfix: Fixed missing argument parser initialization.
[0.8.1] - 2026-03-05 (yanked)
Changed
- Add missing
Syncbounds. This is really a breaking change, but0.8.0was yanked, so don't bump version.
[0.8.0] - 2026-03-05 (yanked)
Added
- Derive
Debug,PartialEqandEqforargp::Cmd. - It's now possile to pass buffers to initialization/termination handlers
without needing to store them in the service application's context.
- Init/Term data can be added when constructing a
RunCtx. - Init data can be extracted in the init handler using
InitCtx::take(). - Term data can be extracted in the term handler using
TermCtx::take(). - The
InitCtxcan also add more data for the term handler usingInitCtx::term_passthrough().
- Init/Term data can be added when constructing a
- There's a new function that can be called on the argument parser which will
register a closure to be called just before the service is run. The closure
will receive the
RunCtx, and must return it as well. - Support configuring production logging filtering using
LOG_FILTER(orLogFilterwhen running as a Windows service).
Changed
- Use Edition 2024. Bump MSRV to
1.85. - ⚠️ The service handlers'
init()/term()now gets passed a mutable reference toInitCtxandTermCtx, rather than pass ownership. (The runtime wants to access the (possibly modified) data in the InitCtx). - When init() returns, a report will be sent to the service subsystem stating that initialization is done.
- When term() returns, a report will be sent to the service subsystem stating that termination is done.
- ⚠️ Remove the
run-serviceargpsubcommand. Instead use the-S/--as-serviceoption. The service name can be specified using-N SVCNAME/--service-name SVCNAME.
Removed
- ⚠️ Removed
argp'saadd_subcommands().
[0.7.0] - 2024-10-17
Changed
- Fix bug in winsvc rt implementation that caused error to get lost.
- ⚠️ Add
std::fmt::Debugbounds to application errors at certain locations to assist in debugging.
[0.6.2] - 2024-10-17
Added
- After the qsu runtime as been launched
rt::runas()can be used to probe whether the runtime was run as a foreground application or as a service subsystem application.
Changed
- Make
display_nameanddescriptionoptions forregister-servicegenerally available on all platforms, but document which platforms they are used on."
[0.6.1] - 2024-10-05
Changed
- Rephrase
register-servicecommand line parser docs.
[0.6.0] - 2024-09-13
Added
- The reload service event has been implmented.
- It is not supported on Windows. (The Windows service subsystem offers no "reload" event).
- On unixy systems it is triggered through the SIGHUP signal.
- When using this feature on systemd, the server type should be set to
notify-reload, and qsu will automatically reportRELOADING,MONOTONIC_USECorREADYto systemd as needed.
- Translate SIGUSR1/SIGUSR2 signals to
SvcEvt's on unixy platforms.
Changed
- ⚠️ Rename instances of "trace level" to "trace filter".
- ⚠️
SvcEvt::ShutdownandSvcEvt::Terminatehave been merged into the variantSvcEvt::Shutdown(Demise), whereDemisecan be used to determine if the service application is terminating via interruption/Ctrl+C, service shutdown request or if the service application reached reached its end without any external termination requests. - ⚠️ Introduce
CbErr<ApEr>to carry application-specific error type, and useErrorto only store library errors. - Installer:
- Allow display name and description to be set on unsupported platforms, to allow application code to avoid platform gates.
- On Windows, implicitly add
Tcpipas a service dependency for services marked as a netservice.
Removed
- ⚠️ The
SvcEvtReaderchannel end-point has been removed. Previously this was passed to the service handlers'run()method. Now, instead, the application passes a service event handler closure when creating the runtime. To simulate the old behavior, an application can pass a closure that forwards all incomingSvcEvtevents to a channel, which has its receiving end-point stored in the service handler.
[0.5.0] - 2024-05-20
Added
TRACE_FILTERenvironment variable used to configure tracing to output.TraceFilterregistry key on Windows used to configure tracing output.
Changed
- ⚠️ Instead of specifying a "trace level" (similar to "log level"), specify a "trace filter", allowing fine-grained control of modules to include in traces.
Removed
TRACE_LEVELenvironment variable no longer used.TraceLevelregistry key on Windows no longer used.
[0.4.1] - 2024-05-19
Added
- Re-export
logandtracing.
Changed
- windows-service 0.6.0 → 0.7.0
[0.4.0] - 2024-03-22
Added
- Add a
rt::RunEnvtype that is passed to application handler callbacks, allowing the application to be information about whether they are being run as foreground processes or as services.
Changed
- Replace
StartStateandStopStatewithInitCtxandTermCtx, each of which also contain aRunEnv.
[0.3.0] - 2024-01-30
Changed
- Updated dependencies.
env_loggerupdated to 0.11.
[0.2.1]
Added
- Re-export
apperr
[0.2.0]
Changed
- Use apperr 0.2.0, which introduces trait bounds to the
AppErr::new(E)to make it more difficult to pass the wrong type to it.
[0.1.0] - 2024-01-10
Changed
- Use apperr crate for
AppErrinstead of using a custom in-tree implementation.
[0.0.7] - 2023-12-09
Changed
- Use rocket 0.5.0 for Rocket server application runtime types
- Updated dependencies.
[0.0.6] - 2023-11-10
Changed
- Bugfix: Attempted to use rocket without rocket feature.
[0.0.5] - 2023-11-03
Changed
- Use rocket 0.5.0-rc.4 for Rocket server application runtime types
[0.0.4] - 2023-10-29
Added
- Add the remaining
ArgsProccallbacks inArgParser.
Changed
- Rather than pass a creation closure to the
ArgParser::proc()for the run case, add aArgsProc::build_apprt()that'll be invoked to create the runtime instead. - More consistently use
AppErrfor callbacks.
Removed
- Removed
err::CbOrigin.
[0.0.3] - 2023-10-23
Added
- Introduce an
AppErrtype that can wrap application-specific errors that the service runtime callbacks return for theErr()case. - Make the
Error::App()take two values: AnCbOriginthat is used to identify which callback returned an error, and anAppErrcontaining the application-specific error.
Changed
- Make it possible to intsruct LumberJack not to initialize logging/tracing (because otherwise tests that initialize the qsu runtime will panic).
- Major refactoring. Moved runtime to its own
rtsubmodule, and put it behind a (default)rtfeature. - Put the tokio server application runtime behind a
tokiofeature. Note: qsu still depends on tokio without tokio runtime support (albeit only with thesyncfeature for channels).
Removed
leak_default_service_name()was removed because it no longer serves a purpose.- The
signalsmodule is no longer public. (It still exists, but is considered an implementation detail).
[0.0.2] - 2023-10-19
Added
- Added some optional clap integration convenience functionality, that can be enabled using the 'clap' feature.
- Added
SvcEvt::Terminate. - Argument parser allows setting default service logging/tracing settings when registering service.
- High-level argument parser that wraps service registration, deregistration, and running has been integrated into the qsu core library.
Changed
- SIGTERM/Ctrl+Break/Close sends
SvcEvt::Terminaterather thanSvcEvt::Shutdown. eventlogerrors are mapped toError::LumberJack(instead ofError::SubSystem).
[0.0.1] - 2023-10-15
Initial release.