Skaal
Your Python app is your architecture.
Write classes and functions. Skaal infers the infrastructure, generates the Pulumi, and your primitive classes are the typed clients. Pylance follows every call site straight down to the underlying SDK. One codebase. One mental model. skaal deploy knows what to build.
What Skaal looks like
from skaal import App, BlobStore, Cron, Store, Topic
from pydantic import BaseModel
class User(BaseModel):
id: str
email: str
class Users(Store[User]):
"""One table. The class is the table."""
by_email = "email" # declarative secondary index
class Avatars(BlobStore):
"""One bucket. The class is the bucket."""
class SignupEvents(Topic[User]):
"""One topic. The class is the topic."""
app = App("acme")
@app.expose
async def signup(user: User) -> User:
await Users.put(user.id, user)
await SignupEvents.publish(user)
return user
@app.schedule(Cron("0 * * * *"))
async def hourly_compact() -> None:
...
The class is the typed client, importable from anywhere with no codegen step:
from acme.users import Users
user: User | None = await Users.get("u1") # Pylance: user is User | None
When you need a backend-specific feature, you pin the type and get the real SDK client back, typed:
from skaal import Store
from skaal.backends.redis import Redis
class Sessions(Store[SessionRecord, Redis]):
"""Session rows backed by Redis in every environment."""
r = await Sessions.native() # redis.asyncio.Redis, in every environment
The CLI is symmetric:
skaal run # local: SQLite + filesystem + in-memory topic
skaal plan --env prod # diff: Users -> DynamoDB, Avatars -> S3, ...
skaal deploy --env prod # Pulumi up against AWS
There is no constraint DSL. There is no catalog you maintain. There is no solver. The shape of the code is the deployment plan; an environment picks the backend by a fixed table the framework owns.
How it works
- Declare classes (
Store[T],BlobStore,Topic[T],Table) and functions (@app.expose,@app.schedule,@app.job). - Infer an environment-independent
Blueprintby walking theAppgraph. - Bind the blueprint against an environment (
local,aws,gcp) using a fixed defaults table. - Generate Pulumi programs, Dockerfiles, and handler entrypoints from the bound plan.
- Deploy via Pulumi. The
skaal.lockfile pins each binding so the next plan is empty unless code changed.
For full HTTP routing, mount any ASGI app (FastAPI, Starlette, Litestar) — Skaal deploys it; the framework you already know owns the routes:
from fastapi import FastAPI
api = FastAPI()
app.mount("/api", api)
What Skaal targets
- Local — SQLite, filesystem, in-process topics, async functions, APScheduler.
- AWS — DynamoDB, S3, SQS, Lambda, EventBridge, RDS Postgres, Secrets Manager.
- GCP — Firestore, GCS, Pub/Sub, Cloud Run, Cloud Scheduler, Cloud SQL, Secret Manager.
The 0.4.0 cut ships AWS first; GCP follows in a 0.4.x point release.
Installation
pip install skaal # base
pip install "skaal[serve,runtime]" # local development
pip install "skaal[deploy,aws,runtime]" # AWS
pip install "skaal[deploy,gcp,runtime]" # GCP
Status
Alpha (0.4.0a0). The framework is functional end-to-end on the local target and against AWS via Pulumi. The public surface (App, Module, Store[T, B], BlobStore[B], Topic[T, B], Table[B], @app.expose, @app.schedule, @app.job) is the supported surface going forward — see notes/redesign-status.md for the live progress tracker against ADR 028.
Roadmap and design decisions: ADR index.
License
GPL-3.0-or-later. See LICENSE.
Metadata
Release files for skaal 0.4.0
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 |
|---|---|---|---|---|
| skaal-0.4.0.tar.gz | 505.0 kB | With provenance | Details for skaal-0.4.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| skaal-0.4.0-py3-none-any.whl | Python 3 | none | any | Details for skaal-0.4.0-py3-none-any.whl |
Total release size: 822.0 kB
Release files / skaal-0.4.0.tar.gz
| Download URL | skaal-0.4.0.tar.gz |
|---|---|
| Size | 505.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e66e632b15fb4116bf9353cdb886011da002410264cd815a651e94f3efb917fd
|
|
BLAKE2b-256 checksum How to use checksums |
56f7aab0707bec78e1556115ec903e1c4692e0f4801fe4f5a2df60871eba8693
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 18, 2026.
Transparency logRelease files / skaal-0.4.0-py3-none-any.whl
| Download URL | skaal-0.4.0-py3-none-any.whl |
|---|---|
| Size | 317.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
daceb6968efc73c9b3c1d3f7445e240af61aced1b829de6896285b81df27be2e
|
|
BLAKE2b-256 checksum How to use checksums |
12a341182f094f266f7a95a215ac5b828f7994097d2e3e3927a1c58c29e76eab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 18, 2026.
Transparency logSecurity for skaal 0.4.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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for skaal-0.4.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 18, 2026.
Transparency logA 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.