A lightweight, mountable admin interface for Ruby on Rails 8 — no code generation, no Sprockets, no Devise.
Several of my personal projects — sortirauresto.com, voices.live, planango.com, and bookscovery.com — need an admin interface. The obvious candidates were ActiveAdmin and Administrate, but both bring more than I wanted: heavy dependency trees, assumptions about your asset pipeline, and in ActiveAdmin's case a hard tie to Sprockets — which is no longer the recommended way to compile assets in Rails 8. I wanted something that would drop in cleanly with Propshaft and import maps, configure itself from a single YAML file, and stay out of the way of whatever authentication I already had.
So I built one.
config/backstage.ymlcurrent_user method you already have
The guiding principle is that configuration should be declarative and the gem should be
invisible. You register a model in YAML and it works. If you need more control, you add
a resource file in config/backstage/. If you need custom actions, you subclass
Backstage::ResourcesController. There are no generators that scatter files through your
app, no mandatory initializers, no stylesheet overrides.
Authentication is deliberately out of scope. Backstage calls a configurable method on
current_user to decide whether to grant access — that's it. If your app uses
Devise, Sorcery, a hand-rolled session, or anything else, it works.
The gem was designed using the BMAD product development process. A full specification was written before a line of implementation code was produced; the spec is available in the repository. Implementation was then carried out with Claude Code, working from the spec.
Backstage is experimental — use it at your own risk. That said, it is running in
production across my own projects, and the public API (the YAML keys, the Ruby DSL
methods, and the Turbo Stream helpers on ResourcesController) follows semantic
versioning. Internal classes are not part of the public API and may change between
minor versions.
Contributions are welcome.