Service Manager
A cross-platform library for installing and managing services on Windows, macOS, and Linux.
Overview
The Service Manager library provides a unified interface for managing system services across different operating systems. It follows standard service management conventions, allowing you to:
- Install/uninstall services
- Enable/disable services at boot time
- Start/stop running services
- Query service status
It creates user-level services (not system-wide root services), which means:
- Linux: User systemd services (
systemctl --user) - macOS: LaunchAgents (
~/Library/LaunchAgents) - Windows: Scheduled Tasks (running on user login)
Installation
pip install etiket-service-manager
Pre-configured Services
This library includes pre-configured service definitions for the QHarbor application suite. These helper functions automatically set up the correct paths, executable locations, and naming conventions for QHarbor's sync components.
from etiket_service_manager.services import sync_agent, sync_api
from packaging.version import Version
# Get the manager for the Sync Agent
agent_manager = sync_agent.get_service()
agent_manager.status # Check status
# Install — no need to pass program_arguments, the config carries them
agent_manager.install(version=Version("1.0.0"))
# Get the manager for the Sync API
api_manager = sync_api.get_service()
api_manager.install(version=Version("1.0.0"))
The pre-configured services resolve their executable via default_runner_install_location(), which knows the canonical location of the runner on each OS:
| Platform | Data directory (app_dir) |
Runner executable |
|---|---|---|
| macOS | ~/Library/Application Support/quantum_machines/services |
~/Applications/quantum_machines/eTiKeT Service.app/Contents/MacOS/etiket_service_runner |
| Linux | ~/.local/share/quantum_machines/services (or $XDG_DATA_HOME/quantum_machines/services) |
<app_dir>/etiket_service_runner |
| Windows | %LOCALAPPDATA%\quantum_machines\services |
<app_dir>\etiket_service_runner.exe |
On macOS the runner ships as a code-signed .app bundle so it's identifiable to Gatekeeper, TCC, and System Settings (Privacy & Security → Full Disk Access). On Linux and Windows the bare binary lives in the per-user data directory.
Actions and Behaviors
The following table describes each action, its expected behavior, possible errors, and resulting service states:
| Action | Description | Possible Errors | Expected Status After Action |
|---|---|---|---|
| install | Installs, enables, and starts the service | ServiceAlreadyInstalled, ServiceOperationError |
installed=True, enabled=True, running=True |
| enable | Enables the service to start automatically at boot | ServiceAlreadyEnabled, ServiceOperationError |
installed=True, enabled=True, running=unchanged |
| start | Starts the service | ServiceAlreadyStarted, ServiceOperationError |
installed=True, enabled=unchanged, running=True |
| stop | Stops the service | ServiceAlreadyStopped, ServiceOperationError |
installed=True, enabled=unchanged, running=False |
| disable | Disables the service (prevents starting at boot) | ServiceAlreadyDisabled, ServiceOperationError |
installed=True, enabled=False, running=False |
| uninstall | Uninstalls the service | ServiceAlreadyUnInstalled, ServiceOperationError |
installed=False, enabled=False, running=False |
Configuring the Service Manager
To use the Service Manager for your own applications, you need to create a ServiceConfig object. exe_install_location is required and uses a PlatformPath so the same config works across OSes — the entry matching the running OS is selected at install time.
from pathlib import Path
from etiket_service_manager import PlatformPath, ServiceConfig, ServiceManager
config = ServiceConfig(
service_name="my_service",
app_dir=Path.home() / ".my_service", # Runtime data: logs, state
exe_install_location=PlatformPath(
darwin=Path("/Applications/MyService.app/Contents/MacOS/my_service"),
linux=Path.home() / ".local/bin/my_service",
windows=Path.home() / "AppData/Local/MyService/my_service.exe",
),
default_args=["--serve"], # Optional: appended to the executable
)
manager = ServiceManager(config)
ServiceConfig fields
| Field | Type | Required | Purpose |
|---|---|---|---|
service_name |
str |
yes | Service identifier (used in plist label, systemd unit name, scheduled task name). |
app_dir |
Path |
yes | Per-service runtime directory for logs and state. Created if missing. |
exe_install_location |
PlatformPath |
yes | Per-OS absolute path to the installed executable. Resolved to a single path at install time. |
default_args |
list[str] | None |
no | Arguments appended after the resolved executable when manager.install() is called without program_arguments. |
PlatformPath
A dataclass that holds one path per OS and resolves to the correct one based on platform.system():
from etiket_service_manager import PlatformPath
p = PlatformPath(
darwin=Path("/usr/local/bin/foo"),
linux=Path("/usr/bin/foo"),
windows=Path(r"C:\Program Files\foo\foo.exe"),
)
p.resolve() # → the path matching the running OS
Example Usage
from pathlib import Path
from packaging.version import Version
from etiket_service_manager import PlatformPath, ServiceConfig, ServiceManager
def main():
# 1. Configure: declare where the executable lives on each OS and the
# default invocation. The same config works across all three OSes.
config = ServiceConfig(
service_name="my_service",
app_dir=Path.home() / ".my_service",
exe_install_location=PlatformPath(
darwin=Path("/Applications/MyService.app/Contents/MacOS/my_service"),
linux=Path.home() / ".local/bin/my_service",
windows=Path.home() / "AppData/Local/MyService/my_service.exe",
),
default_args=["--serve"],
)
manager = ServiceManager(config)
# 2. Install. With exe_install_location + default_args set on the config,
# program_arguments is inferred — no need to pass it.
manager.install(
version=Version("1.0.0"),
raise_if_already_installed=True,
)
# If you need a one-off override, pass program_arguments explicitly:
# manager.install(version=Version("1.0.0"),
# program_arguments=["/custom/path", "--debug"])
# 3. Check status
print(f"Service status: {manager.status}")
# 4. Stop / disable / uninstall as needed
manager.stop()
manager.disable()
manager.uninstall()
if __name__ == "__main__":
main()
Platform Specific Details
Windows Services
This application is implemented as a Scheduled Task rather than a Windows service. A scheduled task can run without administrator permissions, unlike Windows services.
The scheduled task:
- Runs as a background process with
wscript(hidden window). - Starts automatically when the user logs in.
- Provides support for process recovery when it terminates unexpectedly.
Requirements
- The service name is used as the Task Name.
- Tasks are created with "LeastPrivilege" run level, so no UAC prompt is needed.
Logging
- Behavior: Unlike Linux/macOS, Windows Task Scheduler does not capture or redirect Standard Output (
stdout) or Error (stderr). Any output printed to the console is lost. - Requirement: Your application must internally handle logging to files.
- Do not rely on
print(). - Use a logging library (e.g., Python's
loggingmodule) to write directly to a file.
- Do not rely on
- Suggested Location:
{app_dir}/logs/to match other platforms.
macOS Services
This document outlines the process for creating and managing macOS services using launchctl. These services run in the GUI session of the logged-in user (LaunchAgents).
Installation Locations
- Service configuration file:
~/Library/LaunchAgents/com.quantum-machines.{service_name}.plist - Executable: ship as a code-signed
.appbundle in~/Applications/{company}/{app_name}.app(per-user, no admin required, Finder-discoverable for Privacy & Security grants) or/Applications/{app_name}.app(system-wide). For QHarbor'setiket_service_runnerthe canonical path is~/Applications/quantum_machines/eTiKeT Service.app/Contents/MacOS/etiket_service_runner. - Runtime data (
app_dir): kept separate from the executable, in~/Library/Application Support/{company}/. - Logs:
{app_dir}/{service_name}_logs/
The service definition (plist) includes:
KeepAlive: True (system attempts to restart it if it crashes)RunAtLoad: True (starts immediately upon load/login)ThrottleInterval: 60 seconds
Linux Services
Service in Linux are implemented using systemd user services. This is a robust system that works very well for user-level background processes.
Locations
- Configuration: The systemd user unit file (
{service_name}.service) is created in~/.config/systemd/user/. - Logs: Managed by systemd. View logs using:
journalctl --user -u {service_name}
- Use
-fto follow logs in real-time. - Use
-eto jump to the end.
- Use
- Application Binary: The application executable should be in a stable, user-accessible location.
- Recommended:
~/.local/bin/for standalone binaries. - Note: Self-contained application directories often reside in
~/.local/share/. - Important: Always provide the absolute path to the executable when installing the service.
- Recommended:
Behavior
- Uses
systemctl --usercommands to manage the service. - defined as
Type=simple. - Configured with
Restart=alwaysand a 5-second delay to ensure reliability.
Metadata
Release files for etiket-service-manager 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 35.5 MB
Release files / etiket_service_manager-0.3.0-cp314-cp314-win_amd64.whl
| Download URL | etiket_service_manager-0.3.0-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 709.6 kB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
86ef685595f816ee77877a103ba01de6f7fb274016c9a13e9fad33c5071ff4f4
|
|
BLAKE2b-256 checksum How to use checksums |
7863ab77bc44a85e4cc96e68e772b77056cb086c427678bfe6c9283cf082b6c6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | etiket_service_manager-0.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 4.7 MB |
| Tags | CPython 3.14 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
dab0253f7628743c0d17536159f63dced336a0378032c96f026aa62a1354ac55
|
|
BLAKE2b-256 checksum How to use checksums |
ac43276c4ed320f6b0724202b9c324b2764ba0850e5db8004ddc663a76cd366c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp314-cp314-macosx_11_0_x86_64.whl
| Download URL | etiket_service_manager-0.3.0-cp314-cp314-macosx_11_0_x86_64.whl |
|---|---|
| Size | 801.1 kB |
| Tags | CPython 3.14 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
adf72042a20a6be25295e6c17f2d5b35b99612ec10b0c91e5093ce7a5aaa2672
|
|
BLAKE2b-256 checksum How to use checksums |
7146f7704e824ec29482b51cb12695010d21558f8af52cee37470a804ef332fc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | etiket_service_manager-0.3.0-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 741.1 kB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
725ab909c450e6c1741382d63834e0ecb242e984baca9782721b6b780bb55deb
|
|
BLAKE2b-256 checksum How to use checksums |
61416619a5ba3c1a309b74ccc9a544e25dc38ebfec3b2b34984fcd17806daf6c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp313-cp313-win_amd64.whl
| Download URL | etiket_service_manager-0.3.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 692.2 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
6093a7b30b8bbcb12a6b9cbb7b7ae08d286f85d9c2c1999d37306bc26742a513
|
|
BLAKE2b-256 checksum How to use checksums |
7c77ff72cf6420f482df8456baf7b816f66dafbec6a143593b4580484b20b76e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | etiket_service_manager-0.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 4.8 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
2c38eb6f2fffde3d4233f66286f5b4cbc13f0a1d700a021ab1bd2c9145f66dff
|
|
BLAKE2b-256 checksum How to use checksums |
229a1db80153bf059235e2225d208c426bb44e0d18850c159698e92160c9eec4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp313-cp313-macosx_11_0_x86_64.whl
| Download URL | etiket_service_manager-0.3.0-cp313-cp313-macosx_11_0_x86_64.whl |
|---|---|
| Size | 801.9 kB |
| Tags | CPython 3.13 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
4deaa82255ae3c0a1d94608a4fe4f767404cdba3b0bf7960141165ad302a5855
|
|
BLAKE2b-256 checksum How to use checksums |
1248a67fd36c485d285d800529c69d56fdf7dfbc2afbac5bb117a350dbc07010
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | etiket_service_manager-0.3.0-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 735.9 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c8c50f931edaab14de4346e8b5d229bf9b6999585415c2e69ebc7f8304cd3fd2
|
|
BLAKE2b-256 checksum How to use checksums |
437966e2f39267be0bb6ccfc02f96605314ee5ed42a72cf3eb2442e36928f516
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp312-cp312-win_amd64.whl
| Download URL | etiket_service_manager-0.3.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 705.9 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
bc66173d4568935f64d69759ac487023fab39dfb58bb5d602e7c6acaa341d777
|
|
BLAKE2b-256 checksum How to use checksums |
d7d9663eca275b2b14657979a92c097d60e4b3dcf5b3258381961befbce7c849
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | etiket_service_manager-0.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 4.9 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
39e8e30c8aa315e7142980fb0cb64ab3f85d26a5c8ff2fbc7df3e3b86d82e9a8
|
|
BLAKE2b-256 checksum How to use checksums |
a5ada33d2dcfb834a4a193ec5732f0edf5dc28901b628945ecbce6b120d0aee9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp312-cp312-macosx_11_0_x86_64.whl
| Download URL | etiket_service_manager-0.3.0-cp312-cp312-macosx_11_0_x86_64.whl |
|---|---|
| Size | 810.2 kB |
| Tags | CPython 3.12 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
c74d0bfee545ddd61d8468e15c5f4061b0d7d16292fc98e0724c2bc3b4b95fc3
|
|
BLAKE2b-256 checksum How to use checksums |
32ea9b6f1d2c9c0a83633b587cdc57e27d3b0a431cad2701499439804156e7d4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | etiket_service_manager-0.3.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 746.8 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
91295fe040a241e327230442dd41a03f0a55809457ce7a53bbd472a8290c9afa
|
|
BLAKE2b-256 checksum How to use checksums |
f451d5f4f5c4daf95f58836e47212ab46988bc40d91c8dd6d2a36cde2f5f5443
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp311-cp311-win_amd64.whl
| Download URL | etiket_service_manager-0.3.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 727.4 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
8478f99924e1549cb744af4df03e5e3b039de0b0dcff8c472d76a03c8b6ca501
|
|
BLAKE2b-256 checksum How to use checksums |
d990e99be4d650f8db0464fbe5f580da07b24693cd6c36cda4edc57c6d752125
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | etiket_service_manager-0.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 4.9 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
20d61685f2aae3c07a89551f793eb107966549b78093ffa07435e31968554fb9
|
|
BLAKE2b-256 checksum How to use checksums |
cbed63cb986bedd71c190465aadb9f03811e10bd9ceff770eb3db1fd504ac772
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp311-cp311-macosx_11_0_x86_64.whl
| Download URL | etiket_service_manager-0.3.0-cp311-cp311-macosx_11_0_x86_64.whl |
|---|---|
| Size | 803.8 kB |
| Tags | CPython 3.11 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
5056923037a315e5c1c6eff2d431a982ed2ff82eff538c3fbc43cfe836aae28e
|
|
BLAKE2b-256 checksum How to use checksums |
26b794835a179aed69917e7856736af113d891f0a4c743ce33a854ef9e87f395
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | etiket_service_manager-0.3.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 748.8 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
86753b8303bb6d11896413847f0e2c3c72c7f9caec1a02a6f9588b2429b7ba3a
|
|
BLAKE2b-256 checksum How to use checksums |
9461e068d9d8dfaae842c7b5bfbc2bf8bf6a1a314c074577265e0fe289a7310e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp310-cp310-win_amd64.whl
| Download URL | etiket_service_manager-0.3.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 733.0 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
a493808a0cd5a7bd3d8da85a12b067703778bf9a46daf2ee504cbb996e382c7b
|
|
BLAKE2b-256 checksum How to use checksums |
741dacf63dd581a5aeec54ca528f23acc571bf8defd63a60229c2d673abf93bf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | etiket_service_manager-0.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 4.7 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
689951ad0a8b9d8f0aef21d131a8852e94ae3bb600a320c49d350fb5113ea22a
|
|
BLAKE2b-256 checksum How to use checksums |
290c69c9cc81120dce68db1b2e85b429e04ad8e2da45d1558f87ea6e059d481a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp310-cp310-macosx_11_0_x86_64.whl
| Download URL | etiket_service_manager-0.3.0-cp310-cp310-macosx_11_0_x86_64.whl |
|---|---|
| Size | 818.2 kB |
| Tags | CPython 3.10 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
4e7366c53738842b623c06312e4898de8ede518f0b615ba585a3d3f0c92ae5a5
|
|
BLAKE2b-256 checksum How to use checksums |
6421cb77e73765cb3ddb6f83de28bcffce422d35e4d68e386acf994ccf68b30b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / etiket_service_manager-0.3.0-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | etiket_service_manager-0.3.0-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 762.9 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
834b70bf595dbe6cbb728df32718ad277c790d5fd0e9a9bfae75de64616c0dfa
|
|
BLAKE2b-256 checksum How to use checksums |
67f97769889fb9dccd13a55a07eaf5d2dc0729c43d137226d6f750b296d24110
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Security for etiket-service-manager 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.