From 73db846ffb68b83acbe006776b555d7ce87bac0a Mon Sep 17 00:00:00 2001
From: Rach Pradhan <54503978+justrach@users.noreply.github.com>
Date: Tue, 3 Feb 2026 14:45:02 +0800
Subject: [PATCH] feat: add Turbito mascot and v0.5.21 release notes
- Add Turbito as TurboAPI's official mascot
- Add "Meet Turbito" section explaining the Rust engine
- Add "What's New in v0.5.21" section with release highlights
- Update header with Turbito hero image
- Add personality touches ("Let Turbito Off the Leash")
- Update footer with Turbito branding
Generated with AI
Co-Authored-By: AI
---
README.md | 66 ++++++++++++++++++++++++++++++++++++++-------
assets/turbito.png | Bin 0 -> 1964282 bytes
2 files changed, 56 insertions(+), 10 deletions(-)
create mode 100644 assets/turbito.png
diff --git a/README.md b/README.md
index 2aeb7d8..d65dc24 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
TurboAPI
@@ -8,6 +8,10 @@
The FastAPI you know. The speed you deserve.
+
+ Meet Turbito — the tiny Rust-powered engine that makes your FastAPI fly.
+
+
@@ -18,10 +22,10 @@
The Problem •
The Solution •
+ Meet Turbito •
Quick Start •
- Benchmarks •
- Async Support •
- Migration Guide
+ What's New •
+ Benchmarks
---
@@ -65,6 +69,46 @@ The result? Your existing FastAPI code runs faster without changing a single lin
---
+## Meet Turbito
+
+
+
+
+
+Turbito is the little engine inside TurboAPI.
+
+While you write normal FastAPI code, Turbito is:
+- Parsing HTTP in Rust (Hyper/Tokio)
+- Serializing JSON with SIMD acceleration
+- Scheduling async work with Tokio's work-stealing scheduler
+- Dodging the GIL like a speed demon
+
+You never see Turbito. You just feel the speed.
+
+---
+
+## What's New
+
+### v0.5.21 — Free-Threading Stability Release
+
+This release fixes critical issues when running with **free-threaded Python (3.13t)** and **Metal/MLX GPU frameworks**:
+
+| Fix | Description |
+|-----|-------------|
+| **Memory Corruption** | Fixed race condition where request body bytes were corrupted when using async handlers with MLX models loaded |
+| **Response Serialization** | Response objects now properly serialize their content instead of string representation |
+| **Async BaseModel** | Async handlers with BaseModel parameters now correctly receive the validated model instance |
+| **JSON Parsing** | Added Python fallback for edge cases where simd-json is too strict |
+
+**Technical Deep Dive:** When running free-threaded Python with Metal GPU frameworks, memory can be accessed concurrently by the CPU and GPU. We now use defensive copying (`PyBytes::new()` in Rust, `bytes(bytearray())` in Python) to ensure request data is isolated before processing.
+
+```bash
+# Upgrade to get the fixes
+pip install --upgrade turboapi
+```
+
+---
+
## Quick Start
### Installation
@@ -115,15 +159,15 @@ app.run()
Async handlers are automatically detected and routed through Tokio's work-stealing scheduler for optimal concurrency.
-### For Maximum Performance
+### Let Turbito Off the Leash
-Run with Python's free-threading mode:
+For maximum performance, run with Python's free-threading mode:
```bash
PYTHON_GIL=0 python app.py
```
-This unlocks the full power of TurboAPI's Rust core by removing the GIL bottleneck.
+This unlocks Turbito's full power by removing the GIL bottleneck. True parallelism, finally.
---
@@ -306,6 +350,7 @@ Everything you use in FastAPI works in TurboAPI:
| GZip middleware | ✅ | Configurable |
| Background tasks | ✅ | Async-compatible |
| WebSocket | ✅ | HTTP upgrade support |
+| HTTP/2 | ✅ | With server push |
| APIRouter | ✅ | Prefixes and tags |
| HTTPException | ✅ | With custom headers |
| Custom responses | ✅ | JSON, HTML, Redirect, etc. |
@@ -386,7 +431,7 @@ app.add_middleware(GZipMiddleware, minimum_size=1000)
## Architecture
-TurboAPI's secret is a hybrid architecture:
+TurboAPI's secret is a hybrid architecture where Python meets Rust:
```
┌──────────────────────────────────────────────────────────┐
@@ -460,10 +505,10 @@ python tests/benchmark_comparison.py
- [x] Handler classification for optimized fast paths
- [x] **Async handler optimization (Tokio + pyo3-async-runtimes)**
- [x] **WebSocket HTTP upgrade support**
+- [x] **HTTP/2 with server push**
### In Progress 🚧
-- [ ] HTTP/2 with server push
- [ ] OpenAPI/Swagger auto-generation
### Planned 📋
@@ -491,7 +536,8 @@ MIT License. Use it, modify it, ship it.
---
- Stop waiting for Python to be fast. Make it fast.
+ Built for developers who love FastAPI.
+ Powered by Turbito ⚡
diff --git a/assets/turbito.png b/assets/turbito.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b68efc6f90db1639c0dd65017b16074585a4b4f
GIT binary patch
literal 1964282
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