# slave-framework
The runtime behind applications created with
[slave](https://crates.io/crates/slave), a Laravel-inspired Rust framework for
MCP-first apps. You normally get it through `slave new` rather than adding it
by hand.
| `server` | `serve(router, host, port)`: an Axum server with graceful shutdown on Ctrl+C / SIGTERM |
| `env` | `.env` loading and typed settings (`var_or`, `parse_or`) |
| `logging` | `tracing` setup driven by `RUST_LOG` |
| `database` (feature `database`) | [Turso Cloud](https://turso.tech) connections (libSQL remote client only: no engine compiled in) |
| `migration` (feature `database`) | Migrations with batches, status and rollback, plus the console used by `slave migrate` |
| `oidc` (feature `oidc`) | Sign-in through an OpenID Connect provider: `OidcVerifier` checks ID tokens (signature via JWKS with key rotation, issuer, audience, expiry); `OidcClient` runs the Authorization Code flow with PKCE for server-rendered apps. No passwords are handled. |
| `testing` (feature `testing`) | `TestDatabase` and `TestIdentityProvider` (a tiny, **insecure** OIDC provider) for integration tests and local development |
`database` and `oidc` are on by default. Template apps in a slave workspace use
`default-features = false` plus `oidc` (for sign-in); the backend's tests add
`testing`.
```rust
#[tokio::main]
async fn main() -> slave_framework::Result<()> {
slave_framework::env::load_dotenv()?;
slave_framework::logging::init()?;
let router = axum::Router::new();
slave_framework::server::serve(router, "127.0.0.1", 3000).await
}
```
See the [slave README](https://github.com/kewcoder/slave) for the full
framework. License: MIT.