- For tokio: Use extractors (`Json<T>`, `Path<T>`, `Query<T>`, `State<T>`) in handler function parameters for type-safe request parsing.
- Share application state via `Router::with_state(state)` and extract with `State<AppState>` — wrap shared data in `Arc<T>` for thread safety.
- Use `axum::middleware::from_fn` to create middleware — access `Request` and call `next.run(request).await` to continue the chain.
- Return `impl IntoResponse` from handlers — use `(StatusCode, Json<T>)` tuples for responses with explicit status codes.
- For tokio: Share application state via `Arc<AppState>` passed with `router.with_state(state)`.
- Return types implementing `IntoResponse`: `Json<T>`, `(StatusCode, Json<T>)`, or `Result<Json<T>, AppError>`.
- Organize routes hierarchically with `.nest("/api", api_router)` for modularity.
- Chain middleware with `.layer(Layer)` using Tower layers (CORS, tracing, compression, auth).
- Serve via `axum::serve(listener, router.into_make_service()).await`.