# Aro
Aro is a Rust web framework built as a **hexagonal Axum adapter**: ports live in
`aro-core`, HTTP and DI adapters in `aro-web`, persistence adapters in
`aro-fletch` / `fletch-orm`, and the `aro` crate is the facade you depend on.
It aims for a small, stable 1.0 surface — routing, macros, dependency injection,
JSON errors, and a blessed persistence path — while leaving advanced web
concerns to the Axum / tower ecosystem.
## Quickstart
```bash
cargo add aro
```
```rust
use aro::prelude::*;
use std::net::SocketAddr;
#[aro::get("/")]
async fn hello() -> &'static str {
"Hello, Aro!"
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let addr: SocketAddr = "0.0.0.0:3000".parse()?;
App::new()
.routes(routes![hello])
.serve(addr)
.await?;
Ok(())
}
```
Default features enable `web` and `macros`. Add `fletch` (and related flags) when
you need the persistence adapters.
## Feature flags
| `web` | yes | HTTP / DI layer (`aro-web`, including `App`) |
| `macros` | yes | Route attribute macros (`#[aro::get]`, …) |
| `fletch` | no | Persistence adapters (`aro-fletch` + `fletch-orm` query adapters) |
| `test-utils` | no | In-process `TestClient` helpers |
| `http2` | no | HTTP/2 support via Axum |
| `compression` | no | Response compression (gzip, brotli) |
| `compression-full` | no | Compression plus zstd and deflate |
| `decompression` | no | Request decompression (gzip, brotli) |
| `decompression-full` | no | Decompression plus zstd and deflate |
| `uuid` | no | UUID column / value support (implies `fletch`) |
| `chrono` | no | Chrono datetime support (implies `fletch`) |
| `query-adapters` | no | Query adapter wiring (pulled in by `fletch`) |
## MSRV
Aro’s minimum supported Rust version is **1.85.0** (Rust 2024 edition). The MSRV
is bumped only in minor releases, and only to a toolchain that is at least six
months old.
## Documentation
- **Guide (mdBook)** — [`docs/`](docs/) (`mdbook build docs`; open
`docs/book/index.html`).
- **API docs** — [docs.rs/aro](https://docs.rs/aro)
- **Examples** — [`examples/blog`](examples/blog),
[`examples/shortener`](examples/shortener)
- **ADRs** — [`docs/adr/`](docs/adr/)
- **Changelog** — [`CHANGELOG.md`](CHANGELOG.md)
- **Contributing** — [`CONTRIBUTING.md`](CONTRIBUTING.md)
## Intentionally delegated to the ecosystem
Aro 1.0 does **not** ship first-class solutions for these. Use Axum, tower, and
related crates instead:
- Authentication and authorization
- Sessions / cookies
- TLS termination
- Metrics and observability exporters
- OpenAPI generation
- Static file serving
- WebSockets
Aro re-exports Axum as an escape hatch (`aro::web::axum`) so you can compose
those layers without fighting the framework.
## License
MIT — see [LICENSE](LICENSE).