About a year ago, I had an idea for a Python ORM for DynamoDB. I wanted a good developer experience, async support, and strong typing, but I also wanted to move expensive work out of the Python layer. That became pydynox, with a Rust core handling serialization and other CPU-heavy work.
More recently, I started thinking about the SDK underneath applications that use several AWS services. Especially with agents, a workflow might combine model calls with documents in S3, state in DynamoDB, and messages in SQS. Async calls and clear input and output types matter there too. Whether a developer or a coding agent writes the code, I want a type checker to help catch mistakes.
So I built rboto.
rboto 0.1.0 is now on PyPI — its first official release. It provides async-only Python clients powered by Rust, with 34 service clients available, including S3, DynamoDB, Lambda, SQS, Bedrock Runtime, EventBridge, Scheduler, and Pipes.
It’s still alpha. The API may change. I’ll try to preserve compatibility where possible and document breaking changes.
Install the services you need:
pip install "rboto[s3,dynamodb]==0.1.0" Here’s a small example fetching object metadata and a DynamoDB item concurrently. It assumes configured AWS credentials and an existing bucket and table:
import asyncio from rboto import DynamoDBClient, S3Client async def main() -> None: s3 = S3Client(region="us-east-1") dynamodb = DynamoDBClient(region="us-east-1") document, user = await asyncio.gather( s3.head_object( bucket="my-bucket", key="documents/report.pdf", ), dynamodb.get_item( table_name="users", key={"pk": {"s": "USER#123"}}, ), ) print(document.content_length) print(user.item) if __name__ == "__main__": asyncio.run(main()) The method arguments and returned objects have built-in types. Your editor knows that document.content_length is int | None, for example. There’s no separate package of type stubs to install.
A few things included in this release:
- Typed inputs, outputs, service exceptions, and async paginators.
- Async byte streams and event streams for supported operations.
- Global JSON logging with per-service controls, and async interceptors.
- Pydantic and dataclass usage patterns for application-defined inputs and outputs, without requiring Pydantic.
- Wheels for Python 3.12–3.15 on Linux and macOS, including ARM64 and musl Linux.
Network requests run on Tokio. Regular outputs stay in Rust until their fields are accessed, and response bodies can be consumed in chunks. There’s still synchronous work in input conversion, response materialization, and callbacks; reducing copies and event-loop pauses with larger payloads is ongoing work.
I’m excited to get this first release out and hear from people using it in their own applications. Which service or workflow would you try first? Where does the API feel awkward?
GitHub · Documentation · PyPI
rboto is an independent project maintained by Ferrumio, not affiliated with or endorsed by Amazon Web Services.
