# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Commands ```bash # Build cargo build cargo build --release # Run (requires config.toml or APP__ env vars) cargo run # Check without building cargo check # Run tests cargo test # Run a single test cargo test # Lint cargo clippy # Format cargo fmt ``` ## Configuration Copy `config.example.toml` to `config.toml` and fill in the values. All config fields can be overridden with `APP__` prefixed environment variables using `__` as separator (e.g. `APP__DATABASE__URL`, `APP__S3__BUCKET`). Supports both SQLite (`sqlite://mikebase.db`) and PostgreSQL (`postgresql://user:pass@host/db`) via `sqlx::AnyPool`. ## Architecture The app is an Axum HTTP server with shared state (`AppState`) containing two components: - **`Database`** (`src/db.rs`): Thin wrapper around `sqlx::AnyPool` supporting SQLite and PostgreSQL. Runs migrations from `migrations/` on startup. All timestamps are stored as ISO 8601 strings (not native DB types) because `sqlx::Any` lacks a blanket chrono `Encode`/`Decode` impl. - **`S3Storage`** (`src/storage.rs`): AWS SDK S3 client pointed at a configurable endpoint (Wasabi by default). Images are uploaded under the key `emoji/` and public URLs are built from the configured `public_url` base. **Data flow for emote creation:** multipart form → upload bytes to S3 → insert row into DB → return `EmoteResponse` JSON. **Models** (`src/models.rs`): - `EmoteRow` — raw DB row (timestamps as strings) - `EmoteResponse` — JSON API response (timestamps as `DateTime`) **Routes** (`src/routes/`): - `GET /` — health check - `GET /version` — git commit hash and tag (baked in at build time via `build.rs`) - `GET /json` — list all emotes - `POST /emotes` — create emote (multipart: `name`, `alias?`, `file`) - `PUT /emotes/{uuid}` — update emote metadata (JSON: `name?`, `alias?`, `image_key?`) - `DELETE /emotes/{uuid}` — delete emote from DB and S3 (S3 delete is best-effort) ## Releases Pushing a `v*` tag triggers the GitHub Actions release workflow, which builds a Linux binary and uploads it to a GitHub Release.