Vision
Serenade is a Symfony-oriented Rust application framework: kernel, components, and bundles. Products assemble them; Serenade does not ship a full vertical app.
What we copy from Symfony (conceptually)
Section titled “What we copy from Symfony (conceptually)”Serenade├── Kernel / application lifecycle├── Dependency injection├── Event dispatcher├── HTTP foundation / request lifecycle├── Routing├── Configuration (TOML-first packages)├── Console (bin/console analogue)├── Cache├── Security├── Messenger / async jobs├── Serializer├── Validator├── Contracts (interfaces)├── Extensibility / bundles└── Independent components (usable without full stack)Tooling map (concepts, not a PHP port)
Section titled “Tooling map (concepts, not a PHP port)”| Symfony | Serenade |
|---|---|
Composer (composer.json, Flex recipes) |
Cargo + Flex-like recipes (RECIPES.md, serenade CLI) |
php bin/console … |
Console application (clap; optional ratatui for rich TUI) |
config/packages/*.yaml |
config/packages/*.toml preferred; YAML still loaded |
.env |
.env / .env.local / .env.{env} via load_dotenv |
Do not invent a second package manager. Cargo owns dependencies; Serenade owns composition (bundles, recipes, console).
Symfony organizes its own features as bundles (FrameworkBundle, SecurityBundle, DebugBundle, …). Serenade follows the same composition idea: bundles register services, routes, config, and event subscribers into the kernel.
What Serenade is not
Section titled “What Serenade is not”| Not | Why |
|---|---|
| Rails / Django “batteries included” app server | No opinionated ORM + admin + templates in one box |
| A commerce product | That is RustaShop (or other apps) |
| A UI framework | Angular, rangular/Leptos, etc. stay in the application |
| A single HTTP crate mandate | Actix, Axum, or Tower-only apps integrate via HTTP foundation adapters |
| An admin CRUD generator in core | Same split as modern Symfony: framework owns Form / CSRF / security; back-office UIs are app-owned (see KERNEL.md) |
Persistence and HTTP: application choice
Section titled “Persistence and HTTP: application choice”Like Symfony with Doctrine or DBAL or custom storage:
Application persistence (pick one or adapter)├── SQLx├── SeaORM├── Diesel└── …
Application HTTP server (pick one)├── Actix-web├── Axum└── …Serenade defines contracts (repository traits, unit of work hooks, request/response abstractions) and optional bridge crates. It does not force one database layer.
PrestaShop / Symfony parallel
Section titled “PrestaShop / Symfony parallel”| PrestaShop / Symfony | Serenade / RustaShop |
|---|---|
| Symfony kernel + components | Serenade kernel + components |
| Symfony bundles | Serenade bundles + RustaShop bundles |
| PrestaShop domain (catalog, cart, …) | RustaShop domain modules |
| Merchant modules / hooks | Product extension story (WIT, events, bundles) |
RustaShop should feel “ Symfony-backed ” in architecture, not in PHP or in copying Symfony APIs literally.
Front modes and examples
Section titled “Front modes and examples”Serenade examples are structured as apps and libs across four front modes: HTML, SPA, SSG, and Universal. See FRONT-MODES.md for the locked examples tree, CLI contract, and phase status.
