Skip to main content

Sayer

Sayer logo

Fast. Scalable. Elegant. Command the CLI like a boss. 🧙‍♂️

Test Suite Package version Supported Python versions


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)

Source distribution for sayer 0.8.0
File Size Uploaded
sayer-0.8.0.tar.gz 68.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sayer 0.8.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.8.0 This release

2 release files

0.7.7

2 release files

0.7.6

2 release files

0.7.5

2 release files

0.7.4

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.5

2 release files

0.5.4

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page