English only. Workspace crates publish through normal PR flow to dev.
| Doc | Topic |
|---|---|
| VISION.md | Why Symfony-shaped Rust; what Serenade is not (incl. no core admin generator) |
| KERNEL.md | Kernel components; admin / back-office ownership |
| HTTP_OPS.md | Request-id, health/ready probes, graceful drain |
| CONSOLE.md | Console Application, commands, --env / ratatui |
| RECIPES.md | Flex-like recipes, serenade new, Cargo stays PM |
| SECURITY.md | AuthN/Z, firewall, CSRF, password hashing, session login, OAuth/OIDC (oauth), LDAP bind (ldap) |
| FORMS.md | HTML forms, CSRF default-on, XSS-safe render |
| I18N.md | Translator, catalogues, locale, ICU helpers |
| PROFILER.md | Web debug toolbar / per-request profiler |
| VIEW.md | path / asset / partial HTML helpers |
| SERIALIZER.md | JSON + optional TOON (agent context export) |
| MYFEED.md | Beginner demo: open public feed (examples/MyFeed) |
| CACHE.md | Cache pools, ArrayAdapter, RedisAdapter (redis-rs) |
| SESSION.md | Session bag, flash, SessionStore, cookie + HTTP middleware |
| SEARCH.md | Document index contracts, MemorySearchAdapter |
| MAILER.md | Email + Mime multipart, Null/File/SMTP transports, DI |
| NOTIFIER.md | SMS + push channels, Null/Memory transports, DI |
| STRING.md | Slug, case transforms, English Inflector helpers |
| EXPRESSION.md | Safe rule formulas for guards and access checks |
| WORKFLOW.md | Places, transitions, guards, marking store, ExpressionGuard |
| FILESYSTEM.md | Path helpers, dump/mirror, temp files |
| PROCESS.md | Child process spawn, timeout, exit/output |
| FINDER.md | Directory walk, name glob, type/depth filters |
| HTTP_CLIENT.md | Outbound HttpClient, mock + reqwest, DI |
| MESSENGER.md | Sync bus, in-memory transport, Redis wire frames |
| LOCK.md | Named locks, in-memory / filesystem / Redis, DI |
| RATE_LIMITER.md | Rate limiter policies, helpers, HTTP 429, DI |
| SCHEDULER.md | Scheduler triggers, handlers, console, DI |
| OBSERVABILITY.md | Tracing init, channels, var/log file sinks |
| OPENAPI.md | utoipa helpers; Swagger / Redoc / RapiDoc / Scalar |
| ERRORS.md | thiserror / Display / Debug / API error habits |
| BUNDLES.md | Bundle model; admin CRUD is not FrameworkBundle |
| ADMIN.md | Optional serenade-admin CRUD (MyFeed categories dogfood) |
| WASM.md | Wasm host plumbing (wasmtime CM + Wasmer WASIX) |
| PERSISTENCE.md | Adapter pattern, repository traits, UnitOfWork |
| RUSTASHOP.md | Illustrative RustaShop crate map (example, not locked) |
- Choice, not prescription - persistence, ORM, HTTP server for the application are application decisions. Serenade exposes contracts and adapters.
- Kernel vs product - Serenade owns cross-cutting infrastructure; products own domain (commerce, CMS, etc.).
- Bundles compose components - like Symfony bundles, not monolithic framework magic.
- Explicit extension points - events, tagged services, middleware; Wasm host plumbing in Serenade (WASM.md), WIT/sandbox ABI and fixtures at the product layer.
RustaShop documents its own HTTP house pattern (Actix kernel + Axum MCP) in docs-dev/FOUNDATIONS.md. That is a RustaShop choice, not a Serenade requirement.
| Epic | Focus |
|---|---|
| #1 | Meta: framework foundations |
| #2-#8 | Kernel, DI, events, HTTP, routing, config, console |
| #9-#16 | Cache, security, messenger, serializer, validator, contracts, bundles, testing |
| #17 | Cargo workspace and CI |
| #18-#20 | Starter tasks (workspace, bundles, Actix adapter) |
| #30 | Flex-like recipes and app scaffolding |
| #56 | Web Debug Toolbar / Profiler (logs + DB/query panels) |
| #57 | Observability / structured logging (Monolog-like) |
| #110 | Forms, CSRF, HTML escape |
| #111 | View helpers (path / asset / partials) |
| #122 | Admin generator stance (not in kernel / FrameworkBundle) |
| #177 | Implement optional serenade-admin CRUD bundle |
| #123 | Docs: lock admin generator as core non-goal |
| #124 | Parked: optional Admin CRUD bundle (EasyAdmin-shaped) |
Config packages prefer TOML; console is the bin/console analogue (optional ratatui for rich TUI). Composer maps to Cargo, not a second package manager.
Consumer: RustaShop #49.