Skip to main content

Introduction to Forja

Forja (Spanish: forge) — an open-source multi-site CMS where you forge your content. Like a blacksmith shapes raw metal into something useful, Forja lets you shape, manage, and deliver content across multiple sites from a single powerful backend.

Forja is built with a Rust backend (Rocket 0.5.1), a React admin dashboard (Vite + MUI), and pluggable frontend templates (Astro, Next.js, etc.). It is designed for developers who want a fast, type-safe CMS they can self-host, extend, and integrate into their own stack.

Why Forja?

Most headless CMS platforms are either too heavy, too opinionated, or too expensive for developers who just need a solid API behind their portfolio or blog. Forja fills that gap:

  • Built in Rust -- the backend compiles to a single binary, starts in milliseconds, and handles thousands of requests per second with minimal resource usage.
  • Multi-tenant by design -- run multiple sites from a single instance, each with its own content, navigation, and settings.
  • Developer-first -- every resource is available through a RESTful JSON API with full OpenAPI (Swagger) documentation.

Key Features

AreaWhat you get
Multi-siteCreate and manage multiple independent sites from one installation
Content typesBlog posts, static pages, CV entries, legal pages, documents
Media libraryUpload, crop, and serve images with local or S3 storage
NavigationHierarchical navigation menus with drag-and-drop ordering
TaxonomyCategories and tags with full i18n support
InternationalizationLocalized content fields, navigation titles, and admin UI
AuthenticationDual auth -- API keys (X-API-Key) and Clerk JWTs (Authorization: Bearer)
RBACFour permission levels: Master > Admin > Write > Read
WebhooksEvent-driven webhook delivery with retry and delivery logs
Redirects301/302 URL redirect management per site
Audit loggingTrack who changed what, and when
Content schedulingPublish and unpublish content on a schedule
Block editorRich text editing with slash commands, tables, code highlighting, and media picker
AI Content AssistGenerate blog drafts, SEO metadata, excerpts, and translations via configurable LLM providers
Privacy-first analyticsPageview tracking without cookies or PII -- GDPR-friendly by design
Site modulesEnable only the features you need per site (blog, pages, CV, legal, documents, AI)
RSS feedsAuto-generated RSS 2.0 feeds for blog content
NotificationsIn-app notification system for admin users
TemplatesPluggable frontend templates (ships with an Astro blog template)

Architecture at a Glance

┌─────────────┐     ┌──────────────────┐     ┌───────────────┐
│ Frontend │────▶│ Rust Backend │────▶│ PostgreSQL │
│ (Astro, │ │ (Rocket 0.5) │ │ │
│ Next.js) │ │ /api/v1/* │ └───────────────┘
└─────────────┘ │ /api-docs │ ┌───────────────┐
│ │────▶│ Redis │
┌─────────────┐ │ │ │ (rate limit) │
│ Admin UI │────▶│ │ └───────────────┘
│ (React + │ └──────────────────┘ ┌───────────────┐
│ MUI) │ │ S3 / Local │
└─────────────┘ │ (media) │
└───────────────┘
  • Backend -- Rust with Rocket 0.5, SQLx, PostgreSQL. Serves the JSON API at /api/v1 and Swagger UI at /api-docs.
  • Admin -- React SPA built with Vite, Material UI, React Query, react-hook-form, and zod. Served at /dashboard in production, localhost:5173 in development.
  • Frontend templates -- Statically generated sites that consume the API. An Astro blog template ships out of the box at templates/astro-blog/.

Screenshots

Admin Dashboard -- System health, content stats, and setup checklist:

Admin dashboard

Swagger UI -- Interactive API documentation with all endpoints:

Swagger UI

Admin Login -- Clerk-powered authentication with social login support:

Admin login

License

Forja is released under the AGPL-3.0-or-later license. You are free to use, modify, and distribute it, provided that any modified versions you deploy as a network service also make their source code available under the same license.