Skip to content

Changelog

Quadkit is alpha (0.0.x). The current release is 0.0.42 — thirteen packages on PyPI. Pin what you import; public APIs may still move before 1.0.

Terminal window
uv add "quadkit>=0.0.42,<0.1"
uv add "quadkit-cli>=0.0.42,<0.1"
uv add "quadkit-web>=0.0.42,<0.1"

This page is the product digest: what a visitor should know. Per-package release history lives with each package on PyPI — see quadkit’s release history.

The architecture is the part we are not casually rewriting:

  • Published packages depend only on quadkit and quadkit-contracts, never on each other. The documented exceptions are tooling: quadkit-cli and quadkit-testing.
  • Providers register then boot. register() does not resolve.
  • Domain failures are Result[T, E]. Infrastructure failures still raise.
  • One project tree (domains/, app-root di/), grown with quadkit new module. Templates add packages, not a different shape.

Expect names, extra kwargs, and the reserved-but-unpublished packages to keep moving.

The current cut. This is the line to pin.

The public line is now thirteen distributions, released together, each with a wheel and an sdist on PyPI:

GroupPackages
Foundationquadkit, quadkit-contracts
Webquadkit-web, quadkit-http
Dataquadkit-sql, quadkit-cache, quadkit-storage
Eventsquadkit-events
Infraquadkit-tasks, quadkit-monitor
Securityquadkit-auth
Toolingquadkit-cli, quadkit-testing
  • Outbound HTTP, storage, and auth are public — quadkit-http, quadkit-storage, and quadkit-auth join the line alongside SQL, cache, events, tasks, and monitoring.
  • PyPI. All thirteen are installable at 0.0.42. Pin >=0.0.42,<0.1.
  • Docs. Every package page is generated from its published sdist: README, guides, and an API reference built from the exports each package actually declares.
Terminal window
uv add "quadkit-cli>=0.0.42,<0.1"

The cut that opened the line.

  • Application and container. Async-first DI: create_app(), modules, YAML config, structured logging (json_format).
  • Providers. register() receives ContainerRegistrarProtocol. boot() receives ContainerResolverProtocol. Shutdown runs in reverse priority.
  • Result. Domain failures are Result[T, E]. Do not wrap a dead database in Result; do not unwrap() without is_ok().
  • Contracts. quadkit-contracts is zero-dependency: protocols, value types, exceptions. If two packages need the same type, it lives there.

Five distributions, all alpha on the same line:

PackageWhat it gives you
quadkitApplication, DI container, providers, modules, config, Result, logging, validation
quadkit-contractsZero-dependency protocols, value objects, and exceptions
quadkit-webASGI — controllers, routing, middleware, OpenAPI, templates, uploads
quadkit-cliScaffolding, generators, dev server, config inspection
quadkit-testingTest harnesses, fakes, fixtures, compliance suites

Persistence, auth, queues, search, storage, and the AI platform are not published — they are built on the same contracts in the private repository and will appear on PyPI as they stabilise. quadkit-contracts reserves their domain directories; nothing published depends on them.

  • CLI. quadkit new project, quadkit new module, quadkit gen, quadkit add, quadkit run.
  • Import linter. A cross-extension import that type-checks still fails CI.
  • PyPI. All five packages are installable at 0.0.4. Pin >=0.0.4,<0.1.
  • Machine surfaces. /llms.txt, /agents.md, /SKILL.md, and per-package /llms/<package>.txt.

One layout. Feature types live in domains/. App providers live in app-root di/. Modules have provider.py. There is no models/ directory and no second tree.

See Project Structure.

Terminal window
uv add "quadkit-cli>=0.0.4,<0.1"
quadkit new project my-app --template web-api
cd my-app
quadkit run

Open http://127.0.0.1:8000/docs for OpenAPI. Walkthrough: Your First App.

Coding agents should start at For coding agents, then /llms.txt and /agents.md.