This release is a pre-release and may not be stable for production use.
Sillo
Build serious Python backends with one coherent application model.
Sillo is an async Python web framework for building APIs, web applications, real-time systems, and business backends. Routing, request validation, dependency injection, middleware, sessions, authentication, records, background work, WebSockets, OpenAPI, and testing are first-party modules that share one configuration model.
The pitch is coherence, not breadth. One auth= declaration gates a route and writes its securityScheme into the OpenAPI spec. The queue and the scheduler start with the application lifecycle. Range requests, ETags, and content negotiation are middleware rather than something each project rewrites.
Requirements
- Python 3.10+
uvfor project and dependency management
Installation
uv add sillo-framework
For optional feature groups:
uv add "sillo-framework[templating]"
uv add "sillo-framework[jwt]"
uv add "sillo-framework[cache]"
uv add "sillo-framework[record]"
uv add "sillo-framework[graphql]"
For a full development setup:
uv add "sillo-framework[all]"
Hello World
from sillo import SilloApp
app = SilloApp(title="My API")
@app.get("/")
async def home(request, response):
return response.json({"message": "Hello from Sillo"})
Run it with an ASGI server:
uv add uvicorn
uv run uvicorn main:app --reload
Request Validation
Sillo validates request bodies with Pydantic through request_model.
from pydantic import BaseModel
from sillo import SilloApp
app = SilloApp()
class CreateUser(BaseModel):
name: str
email: str
@app.post("/users", request_model=CreateUser)
async def create_user(request, response, user: CreateUser):
return response.json(user.model_dump(), status_code=201)
The validated model is also available as request.validated_data.
Dependency Injection
Use Depend to inject request-scoped dependencies into handlers.
from sillo import Depend, SilloApp
app = SilloApp()
async def get_current_user():
return {"id": "user_1", "name": "Ada"}
@app.get("/me")
async def me(request, response, user=Depend(get_current_user)):
return response.json(user)
When a dependency needs the current request:
from sillo import Depend
def auth_header(request=Depend(get_request=True)):
return request.headers.get("Authorization")
Routing
from sillo import Router, SilloApp
app = SilloApp()
api = Router(prefix="/api")
@api.get("/users/{user_id:int}")
async def get_user(request, response, user_id: int):
return response.json({"id": user_id})
app.mount_router(api)
What Sillo Provides
- Async ASGI application core
- HTTP routing, route groups, and mounted routers
- Request and response helpers
- Pydantic request validation
- Dependency injection with nested dependencies
- Query, header, and cookie parameter helpers
- Middleware pipeline
- CORS and CSRF support
- Sessions and authentication utilities
- API keys, JWT helpers, users, permissions, and guards
- OpenAPI generation and interactive docs
- File uploads, streaming responses, static files, and frontend fallback serving
- WebSockets, consumers, channels, groups, events, and history helpers
- Cache abstraction with memory and Redis support
- Event system and background work primitives
- Record layer for database-backed models, transactions, scopes, casting, and pagination
- Mail service utilities
- Sync and async test clients
- Model admin at
/admin/that authenticates against your own user model sillocommand, andsillo.consolefor building a project's own
Scope And Boundaries
Sillo runs on its own. No hosted service is required to put an application into production.
The framework is opinionated at the defaults and open at the boundaries. Auth backends, middleware, cache drivers, session stores, and hashing algorithms are contracts you can implement yourself, and anything the framework does on your behalf is something you can read, override, or replace.
Sillo ships a sillo command with the framework-level operations, built on sillo.console. Inside a project it also merges in whatever that project's console.py registers, so sillo db:migrate works without the framework owning the command set. The operations underneath stay plain functions in sillo.record.commands, sillo.users.commands and sillo.work.commands, so a project that wants different names writes its own console against them.
Documentation
The documentation source lives in docs/docs.
Build it locally with:
cd docs/docs
bun run build
Testing
Run the core test suite with:
python3 -m pytest -q
Some optional integrations require their extras to be installed before their tests can run.
Release Principles
Sillo prioritizes:
- clear APIs and useful error messages
- strong defaults with replaceable internals
- production-oriented documentation
- compatibility, migration guidance, and honest release notes
- security and reliability before broad platform expansion
License
BSD-3-Clause
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sillo_framework-0.1.0b1.tar.gz.
File metadata
- Download URL: sillo_framework-0.1.0b1.tar.gz
- Upload date:
- Size: 3.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
10cb691d92ee59a5df962d814162f84a82ccf6e959f51fd1047548a95dfa7983
|
|
| MD5 |
b803bad1f64cea1a703a8bdc73c1df89
|
|
| BLAKE2b-256 |
2357a9596e5b18fa9ff110fba173f964af1cf60edc0855c96bf8bfcef0e65668
|
File details
Details for the file sillo_framework-0.1.0b1-py3-none-any.whl.
File metadata
- Download URL: sillo_framework-0.1.0b1-py3-none-any.whl
- Upload date:
- Size: 906.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f76a0959e16737cfa714c9b7b5ce04aaf431bcd54606330d4da5bf5d6f324e2a
|
|
| MD5 |
5682a03cc7ce8dcd4ff4abfb735bb830
|
|
| BLAKE2b-256 |
bf78435589eba9963a379df3853c794dd811b32a43a097e539741792bcf84cd5
|