Rustelo

Acerca de Rustelo

Un framework web full-stack en Rust sobre Leptos y Axum, donde las rutas, los tipos de contenido y los idiomas de un sitio son configuración y las entrañas del framework nunca se bifurcan.

Qué es

Rustelo es un framework web en Rust para sitios y aplicaciones cuya forma se declara en lugar de programarse. Rutas, menús, tipos de contenido, temas e idiomas viven en configuración Nickel; el framework genera en tiempo de compilación el código Rust que los sirve.

Se organiza en tres capas: tu aplicación, una API de puertos estable (rustelo_web, rustelo_auth, rustelo_content) y la base que implementa configuración, i18n, RBAC, el servidor Axum, el cliente Leptos, los componentes y la generación de páginas.

Cada ruta se renderiza en uno de dos perfiles —HTMX-SSR, HTML renderizado en el servidor sin WebAssembly, o hidratación Leptos— elegido en la configuración, por sitio o por ruta.

Qué ofrece

  • ▸ Enrutado independiente del idioma: rutas por idioma en la configuración, idiomas descubiertos a partir de la configuración y del contenido.
  • ▸ Contenido en Markdown con metadatos estructurados, tipos de contenido y categorías, renderizado con resaltado de sintaxis.
  • ▸ Interfaz multilingüe con ficheros Fluent FTL incorporados al compilar.
  • ▸ Autenticación y autorización: JWT, OAuth2, segundo factor TOTP, contraseñas con Argon2 y políticas RBAC.
  • ▸ PostgreSQL y SQLite mediante SQLx, con migraciones separadas por base de datos.
  • ▸ Composición con features de Cargo —auth, content-db, content-static, email, tls, metrics, crypto— para que cada build lleve solo lo que usa.

Conceptos clave

Seis piezas, cada una declarada o elegida en la configuración.

Tres capas

Tu aplicación arriba, los puertos del framework en medio, la base debajo. Las implementaciones dependen de los puertos, nunca de las entrañas de la base.

Generación al compilar

build.rs lee la configuración Nickel y la convierte en rutas, páginas, menús y el registro FTL dentro de OUT_DIR, incluidos con include!(). El código generado nunca se edita a mano.

Enrutado

Un sistema de rutas propio dirigido por la configuración de rutas de cada idioma. Los patrones de URL salen de la configuración, no del código.

Perfiles de renderizado

Un eje tipado RenderingProfile: HtmxSsr o LeptosHydration, resuelto como ruta sobre espacio de trabajo sobre valor por defecto, para que un mismo binario sirva ambos.

Capas de sobrescritura

Local sobre Feature sobre Template sobre Framework: gana la primera capa que aporta un valor, y un sitio se personaliza en su capa local en lugar de editar el framework.

Plugins

Los traits ResourceContributor y PageContributor, registrados al arrancar y compilados dentro: extensión sin cargador de plugins en tiempo de ejecución.

Lo que nunca cambia

Cuatro compromisos se mantienen en todo el framework. Están registrados como invariantes y decisiones de arquitectura, no como recomendaciones.

Dirigido por configuración

Todo es configurable y nada está fijado en el código: ni rutas, ni rutas de ficheros, ni tipos de contenido como literales.

Independiente del idioma

Ningún idioma viene incorporado. El conjunto de idiomas se descubre a partir de la configuración y del contenido, y los patrones de URL salen de los ficheros de rutas de cada idioma.

Sin bifurcar el framework

Las implementaciones se amplían con sobrescrituras y plugins y nunca modifican las entrañas del framework, que así se puede actualizar sin riesgo.

Generado al compilar

La tabla de rutas, las páginas y los menús con los que se construye un binario se validan al compilar y quedan incorporados en él. Un sitio añade sus propias rutas encima al arrancar, nunca editando código generado.

Ver el framework completo

Las capas, los crates, las features de Cargo y la tecnología que hay debajo, en un solo sitio.