Sayer
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.
🤔 What is Sayer?
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.
📦 Installation
Using pip:
pip install sayer
Or with uv (blazing fast):
uv pip install sayer
🧩 Features
- ✅ 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.
🔥 Why Sayer?
| 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 | Ty + Ruff compliant |
| Fun to Use? | 🕺 Extremely | Let the code dance with you |
🚀 Getting Started
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!
🧪 Testing
hatch run test:test
Or with pytest:
pytest -v
📚 Documentation
Full 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 🐣
Metadata
Release files for sayer 0.8.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 | |
|---|---|---|---|
| sayer-0.8.0.tar.gz | 68.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sayer-0.8.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 153.1 kB
Release files / sayer-0.8.0.tar.gz
| Download URL | sayer-0.8.0.tar.gz |
|---|---|
| Size | 68.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ecb4ba0ed48187154ce61cc9736d0e8208208f5f00dbfb38bfc399d459059cef
|
|
BLAKE2b-256 checksum How to use checksums |
f5ba4e0a18c81fe5038723c15b44680b1d261dce2080a30a9f76fed2f606a7bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.18.1 {"ci":true,"cpu":"x86_64","distro":{"id":"noble","libc":{"lib":"glibc","version":"2.39"},"name":"Ubuntu","version":"24.04"},"implementation":{"name":"CPython","version":"3.12.15"},"installer":{"name":"hatch","version":"1.18.1"},"openssl_version":"OpenSSL 3.0.13 30 Jan 2024","python":"3.12.15","system":{"name":"Linux","release":"6.17.0-1022-azure"}} HTTPX2/2.13.1
|
Release files / sayer-0.8.0-py3-none-any.whl
| Download URL | sayer-0.8.0-py3-none-any.whl |
|---|---|
| Size | 84.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
838738f7f0be19769a5aac82af3b909caa6c0e0fc95ab985f8f5e3dd8affdf63
|
|
BLAKE2b-256 checksum How to use checksums |
5445b7a40ce3df722e539478c1a047f11548a701fec3c1ec169479895685e512
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.18.1 {"ci":true,"cpu":"x86_64","distro":{"id":"noble","libc":{"lib":"glibc","version":"2.39"},"name":"Ubuntu","version":"24.04"},"implementation":{"name":"CPython","version":"3.12.15"},"installer":{"name":"hatch","version":"1.18.1"},"openssl_version":"OpenSSL 3.0.13 30 Jan 2024","python":"3.12.15","system":{"name":"Linux","release":"6.17.0-1022-azure"}} HTTPX2/2.13.1
|