Quill¶
Modern RPC for the Real World¶
A protobuf-first RPC framework with adaptive HTTP/1-3 transport, real HTTP errors, streaming, and a unified CLI.
-
Adaptive Transport (Prism)
Negotiate HTTP/1.1, HTTP/2, or HTTP/3 per-hop. Edge uses H3 for mobile, interior uses H2 for efficiency.
-
Real HTTP Errors
No
200 OKwith error envelopes. Proper status codes + Problem Details (RFC 7807) for structured errors. -
Streaming Built-In
Server streaming, client streaming, and bidirectional streaming with credit-based flow control.
-
Protobuf-First
.protois the source of truth. Generate type-safe clients and servers for Go, TypeScript, Rust, and Python.
Quick Example¶
use quill_server::QuillServer;
use bytes::Bytes;
async fn greet(request: Bytes) -> Result<Bytes, QuillError> {
let req = GreetRequest::decode(request)?;
let response = GreetResponse {
message: format!("Hello, {}!", req.name),
};
Ok(response.encode_to_vec().into())
}
#[tokio::main]
async fn main() {
QuillServer::builder()
.register("greeter.v1.Greeter/Greet", greet)
.build()
.serve("0.0.0.0:8080".parse().unwrap())
.await
.unwrap();
}
use quill_client::QuillClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = QuillClient::builder()
.base_url("http://localhost:8080")
.build()?;
let request = GreetRequest { name: "World".into() };
let response = client
.call("greeter.v1.Greeter/Greet", request.encode_to_vec().into())
.await?;
let greet = GreetResponse::decode(&response[..])?;
println!("{}", greet.message);
Ok(())
}
Transport Profiles (Prism)¶
Quill adapts to your network environment automatically.
| Profile | Protocol | Best For |
|---|---|---|
| Classic | HTTP/1.1 + H2 | Enterprise proxies, legacy networks |
| Turbo | HTTP/2 end-to-end | Internal cluster traffic |
| Hyper | HTTP/3 over QUIC | Browser/mobile, lossy networks |
Learn more about Transport Profiles
Architecture¶
┌─────────────────────────────────────────────────────────────┐
│ Application │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ quill-server │ │ quill-client │ │
│ │ Server SDK │ │ Client SDK │ │
│ └────────┬────────┘ └────────┬────────┘ │
│ └────────────┬───────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ quill-core │ │
│ │ Core Types │ │
│ └────────┬────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ quill-transport │ │
│ │ Classic│Turbo│ │ │
│ │ Hyper │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Design Principles¶
Protobuf-First
.proto is the single source of truth. No code-first, no schema drift.
Real HTTP Errors
Proper status codes. Never 200 OK with an error envelope.
No Trailers Required
Works through any proxy. No HTTP/2 trailer dependency.
Progressive Enhancement
HTTP/3 is optional. Gracefully degrades to HTTP/2 or HTTP/1.1.
Get Started¶
-
Quick Start
Get up and running in 5 minutes with a simple echo server.
-
Installation
Install the Rust crates, CLI tool, or Python bindings.
-
First Service
Build a complete service with protobuf and streaming.