Umbral
Back to the blog
Community Jul 9, 2026 8 min read

Building the Umbral website with Umbral

The best proof that a framework can build a real, content-heavy site is to build one. This site — directory, reviews, discussions, admin, forms — is an Umbral project using the same apps, migrations, and plugins it documents.

There's a temptation, when you build a web framework, to ship a thin marketing page and call it a day. We did the opposite: this website is a full Umbral project, and the important sections prove the framework rather than describe it.

Apps, not a monolith

The site is scaffolded with umbral startapp into focused plugin crates, each owning its own models and migrations:

umbral_website/plugins/
  site_content/      # blog, pages, FAQ, navigation, contact messages
  features/          # the framework feature catalog
  plugin_directory/  # community + official plugins, comments, submissions
  reviews/           # developer reviews of the framework
  showcase/          # sites built with Umbral
  security_reports/  # malicious-plugin reporting + advisories
  community/         # social links + newsletter config
  public/            # the landing page

main.rs stays small. It wires settings, plugins, routes, and startup — and contains no website data models. Every model lives in its app's models.rs.

Everything is database-backed

The homepage stat strip, the plugin cards, the reviews, the discussion notes — all live. When the database is empty, the page renders an honest em-dash () or an empty state, never a fabricated 0 or a made-up testimonial.

// The homepage's curated reviews — pulled live, featured first.
let reviews = reviews::featured_reviews(2).await.unwrap_or_default();

Forms are real forms

Contact, plugin submission, plugin reports, plugin comments, and reviews all use Umbral Forms: server-side validation, friendly errors, and a clear moderation state where it matters. Submitted content doesn't appear publicly until it's approved.

The admin maintains it

Maintainers manage features, plugins, comments, blog posts, social links, reviews, showcase entries, and security reports from the admin — without touching templates. The dashboard widgets read straight from the directory data.

Real-time, where it helps

Post a note on a plugin page and other readers see a live banner over SSE — no refresh. The comment data model is designed so a future SSE/WebSocket layer can stream replies and moderation changes without a redesign.

Building the site this way kept us honest. Every rough edge in the framework showed up immediately, because we were the first serious user.