Skip to content

What's in the Box

What `uv add sillo-framework` actually installs, which subsystems are extras you opt into, which live in separate packages, and the tools that sit alongside the framework.

Sillo is described as batteries-included, which is true about its surface and misleading about its install. The base install is five packages. Everything that carries a third-party dependency is something you ask for.

This page is the map: what comes with the framework, what is one flag away, what is a separate install, and what is a tool rather than a library. It describes the 0.x line — the released one. Four of these boundaries move in 1.0, and the last section says which.

Terminal window
uv add sillo-framework

Five dependencies: uvicorn, anyio, python-multipart, pydantic, and typing-extensions below Python 3.13. Python 3.10 or newer.

What that gives you, with no further installs:

Note what is not on that list: a database, a Redis client, and a JWT library.

Four subsystems are part of the framework on this line and become separate packages in 1.0. They are documented here because this is the released version, not because they are permanent:

See What moves in 1.0 before you build something large on any of them.

Each of these adds one dependency, for one subsystem.

ExtraBringsFor
recordtortoise-ormThe ORM — models, migrations, factories
jwtpyjwtJWT authentication
cacheredisCaching across processes
eventsredisEvent distribution across processes
cryptocryptographyThe encrypted cast and sillo.helpers.crypto
storage-s3httpxThe S3 storage driver
mailjinja2Templated email bodies
hashing-bcryptbcryptbcrypt password hashing
hashing-argon2argon2-cffiArgon2 password hashing
hashing-scryptscryptscrypt password hashing
hashing-allall three, plus passlibAll of the above
graniangranianAn alternative ASGI server to uvicorn
alleverything aboveNot thinking about it
Terminal window
uv add "sillo-framework[record,jwt,hashing-argon2]"
uv add "sillo-framework[all]"

Two of these are worth a second look. The S3 driver depends on httpx rather than boto3 — request signing is a few dozen lines of HMAC, and boto3 is a very large synchronous dependency to carry for it. And the hashing extras are separate rather than bundled because a project standardises on one algorithm; installing three compiled backends to use one is exactly the imposition the extras exist to avoid.

These are not extras. They are their own distributions, versioned and released on their own cadence, because each has a dependency, a release rhythm, or a scope that the framework should not carry on everybody’s behalf.

PackageInstallImportWhat it is
Wiresillo-wiresillo.wireRooms, presence, replay and fan-out for WebSockets
GraphQLsillo-graphqlsillo.graphqlA production GraphQL endpoint over a Strawberry schema — see the caveat below
WarderwarderwarderA declarative admin panel over your models, with a React interface
Inertiasillo-inertiasillo_inertiaServer-driven pages with React or Vue, no API layer
OAuthsillo-oauthsillo_oauthSocial login and OAuth2 providers

Wire and GraphQL extend the framework’s own surface, so they also take a name inside it: from sillo.wire import Hub and from sillo_wire import Hub bind the same class. The others keep their own top-level names — Warder most deliberately of all, because it is not an extension of sillo but an application you mount on yours. The Packages index explains how the aliasing works and why it is not a directory shipped into the framework.

Not libraries you import — programs you run.

ToolInstallWhat it does
silloships with the frameworkMigrations, users, queues, the scheduler, and your own commands
sillo-startuv tool install sillo-startCreates a project by copying a working application, not by generating one
sillo-viseuv add sillo-visevise serve — the development server, with readable logging and the Foreman operations dashboard mounted beside your app
@sillo/atlasnpmThe OpenAPI reference UI and API client, ~79 KB with no runtime dependencies

Four things leave the framework in 1.0. If you are starting something now and expect to follow the framework forward, these are the four to make a decision about rather than discover later.

Here, in 0.xIn 1.0
Built-in admin panelwarder
HTML templating layer (Jinja)Removed; templated email bodies are the one place a template is still rendered
WebSocket rooms, channels and groupssillo-wire
sillo.graphql in the frameworksillo-graphql, claiming the same import name

The same reason applies to all four: each had grown a dependency, a release cadence or a scope of its own, and keeping it in core made everybody carry it.

None of them disappear — three become installs and one becomes a design decision you make yourself. The templating removal is the only one without a drop-in replacement: if you are rendering server-side HTML today, decide whether that is where the application is going before 1.0 makes the decision for you.

A useful default for a JSON API with users and a database:

Terminal window
uv add "sillo-framework[record,jwt,hashing-argon2]"

Add cache and events when you run more than one process. Add nothing else until something asks for it.

For rooms and presence over WebSockets, and for an admin panel, 0.x has both in the framework — see the channels guide and the admin. sillo-wire and warder are where those go in 1.0.

If you would rather start from a working application than assemble one, sillo-start copies the official starter — session auth against a real user model, migrations, a JSON API and a queue, all already wired together.