Fast. Scalable. Elegant. Command the CLI like a boss. 🧙♂️
Documentation: https://sayer.dymmond.com 📚
Source Code: https://github.com/dymmond/sayer
The official supported version is always the latest released.
Sayer is a modern, async-native Python CLI framework built for developers who want more:
- More structure.
- More power.
- More expressiveness.
Less boilerplate. Less headache. Less "why doesn't this just work?".
Designed to scale from weekend scripts to enterprise-grade CLI suites — with a touch of magic.
Using pip:
pip install sayerOr with uv (blazing fast):
uv pip install sayer- ✅ Fully async support out-of-the-box
- ✅ Param metadata via
Option(...),Argument(...),Env(...)— inspired by the best - ✅ Declarative CLI building with decorators
- ✅ Built-in middleware system (yes, for CLI!)
- ✅ Shared app state and lifecycle management
- ✅ Terminal-rich output via
rich - ✅ Easy testing with
SayerTestClient - ✅ Flexible help and docs rendering
- ✅ Clean project scaffolding, sensible defaults
- ✅ 100% type annotated.
| Feature | Sayer | Notes |
|---|---|---|
| Async Support | ✅ Yes | Truly async from top to bottom |
| Param Metadata | ✅ Yes | With rich options, env vars, etc. |
| Middleware Support | ✅ Yes | Per-command, app-wide, scoped |
| Lifecycle Hooks | ✅ Yes | on_startup, on_shutdown |
| State Management | ✅ Yes | Like a Flask g but better |
| Testability | ✅ Yes | CLI client for unit tests |
| Output Styling | ✅ Yes | Built-in rich integration |
| Based on Modern Tools | ✅ Hatch + UV | Modern dev setup from day 1 |
| Full Typing | ✅ Yes | Mypy + Ruff compliant |
| Fun to Use? | 🕺 Extremely | Let the code dance with you |
Create your first CLI app:
from sayer import Sayer, Option
app = Sayer()
@app.command()
def hello(name: str = Option(..., help="Your name")):
"""Say hello to someone"""
print(f"Hello, {name}!")
if __name__ == "__main__":
app()Run it:
$ python app.py hello --name Ada
Hello, Ada!hatch run test:testOr with pytest:
pytest -vFull docs available at: https://sayer.dymmond.com
You'll find:
- Full API reference
- Command examples
- Parameter deep dives
- Middleware patterns
- Configuration strategies
- ... and some fun easter eggs 🐣