scalo
The runtime layer for Python control-plane services: config, logging, metrics, health probes, secrets and a service CLI, already wired together. Subclass one class and your service reads its config, logs in the right format for where it runs, and serves its health probes.
It is built for APIs, orchestrators, CLI tools and integration glue. For the hot path there is a Rust sister library, scalo-rs, with the same conventions and a different API.
What it gives you
- A seven-layer config cascade, from CLI flags and env vars down to YAML and defaults, that reads the same in a laptop shell and a Kubernetes pod.
- Structured logs, JSON in a container and readable text at a terminal. Credentials, tokens and keys are masked, and so are cards, IBANs, emails and phone numbers, and Australian ABN, ACN, TFN and Medicare numbers where a keyword names them. TRACE records skip the scrubber by default.
ServiceApp: subclass it and getrun,version,config-checkandgenerate-artefacts, with config and logging started for you, and metrics too oncescalo[metrics]is installed./livezand/readyzon an observability port kept apart from your application's own.- With the
metricsextra, Prometheus and OpenTelemetry metrics, process and container gauges included, scraped from/metricson the same port. Without a metrics manager that path answers 404. - Secrets from OpenBao or Vault, AWS, GCP, Azure, Kubernetes and Ansible Vault, one extra per backend.
- A deployment contract: return one from
deployment_contract()andgenerate-artefactswrites your runtime Dockerfile and the contract the scalo-service Helm chart renders from. - Kafka, CEL expressions and an HTTP client with jittered retry, each behind its own extra.
Example
uv add scalo
from scalo.cli import ServiceApp, VersionInfo
from scalo.logger import logger
class Greeter(ServiceApp):
name = "greeter"
env_prefix = "GREETER"
def version_info(self) -> VersionInfo:
return VersionInfo(self.name, "1.0.0")
def run_service(self, config) -> None:
logger.info("hello", target=config.get("target", "world"))
if __name__ == "__main__":
Greeter().cli()
GREETER_TARGET=team python greeter.py run logs hello with target=team, and python greeter.py config-check validates the config without starting anything.
Extras
| Extra | Adds |
|---|---|
api |
FastAPI conventions: operation ids, ETag and If-Match, problem+json errors, pagination |
cli |
A whole CLI generated from an OpenAPI spec |
mcp |
MCP tools generated from a scalo.api app's spec, served on the same app |
http |
An httpx client with jittered retry |
metrics |
Prometheus and OTLP export, process and container gauges |
opentelemetry |
The OpenTelemetry half of metrics on its own |
expression |
CEL expressions |
kafka |
Produce, consume and schema inference |
deployment |
The deployment contract and its Dockerfile and manifest generators |
secrets-vault, secrets-aws, secrets-gcp, secrets-azure, secrets-kubernetes, secrets-ansible-vault |
One secrets backend each |
secrets |
Every secrets backend |
Pick the secrets backend you use rather than secrets, since each backend brings its own cloud SDK.
Docs and source are at https://github.com/hyperi-io/scalo-py. Requires Python 3.14 or later. Licensed Apache-2.0: https://github.com/hyperi-io/scalo-py/blob/main/LICENSE.
Metadata
Release files for scalo 2.32.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| scalo-2.32.5.tar.gz | 551.8 kB | Without provenance | Details for scalo-2.32.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| scalo-2.32.5-py3-none-any.whl | Python 3 | none | any | Details for scalo-2.32.5-py3-none-any.whl |
Total release size: 1.2 MB
Release files / scalo-2.32.5.tar.gz
| Download URL | scalo-2.32.5.tar.gz |
|---|---|
| Size | 551.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
645fe7b0c5c3da1249fad5f623f8c8b3e94f3ce72abe9215a367b6a43d9279aa
|
|
BLAKE2b-256 checksum How to use checksums |
fd2cc2999d29c45df14095f81d3e7cf06dbfcb7a01e2214575931d0758f196e2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / scalo-2.32.5-py3-none-any.whl
| Download URL | scalo-2.32.5-py3-none-any.whl |
|---|---|
| Size | 645.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ab66a1bf81af61d04f2667d31be0adbf83ce3a68cb2c336da05177443109298d
|
|
BLAKE2b-256 checksum How to use checksums |
80ccb847cf00fcde6030826b9edcd51a6eef92b75dc9752dd9d35f5f4334e63f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for scalo 2.32.5
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.