# ch-rds
`ch-rds` resolves runtime resources and starts conventional local services when
an application uses loopback endpoints.
More information is available in the [API documentation](https://docs.rs/ch-rds).
## High-level features
- Typed loaders for web listeners, MariaDB, and SpacetimeDB
- Explicit production behavior with no local fallback
- Conventional `.env`, `.env.local`, and `services.env` discovery
- Health-gated, protocol-verified Docker Compose startup for loopback resources
- Optional frontend/backend development process orchestration
## Usage
```rust,no_run
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let runtime = ch_rds::Runtime::bootstrap()?;
let bind_addr = runtime
.load(ch_rds::WebBind::builder().addr("127.0.0.1:8080"))
.await?;
println!("{bind_addr}");
Ok(())
}
```
`Runtime` resolves configured remote endpoints directly. Production mode
rejects local fallbacks. `ENV_FILE` selects one explicit dotenv file, while
`PORT` overrides only the port of the fallback listener address.
Conventional layouts auto-discover MariaDB and
`crates/database/spacetimedb`; builders cover custom stacks. Protocol-level
readiness is checked only after Docker reports the service healthy. One locked
service restart remains available for a previously healthy but persistently
broken endpoint; containers are not restarted while their first initialization
is still in progress. SpacetimeDB updates publish in place to preserve data and
identity.
## Development runner
The `dev` feature provides `ProjectProfile` and `run_project`. Vite owns frontend
hot-module replacement; Watchexec restarts the backend when Rust sources,
manifests, lockfiles, Cargo configuration, or SQL migrations change.
```console
cargo install watchexec-cli --version 2.5.1 --locked
```
## Feature flags
| `dev` | Frontend/backend process orchestration and project profiles |
| `btcpay` | Local BTCPay setup in addition to `dev` |
## Minimum supported Rust version
`ch-rds` requires Rust 1.96 or newer.
## License
Licensed under the Sustainable Use License 1.0. See
[`LICENSE.md`](LICENSE.md).