Skip to content
Plutonium · The Rails RAD framework

The Rails framework for things you should never write again.

Convention over configuration, extended to everything you keep rebuilding.

CRUD. Auth. Authorization. Multi-tenancy. Wizards. Kanban. Admin portals. Search, filters, bulk actions. All generated. All customizable. All Rails.

$ rails g pu:pkg:portal admin
      create  packages/admin_portal/...
$ rails g pu:res:scaffold Post title:string body:text published_at:datetime --dest=main_app
      create  app/models/post.rb
      create  app/definitions/post_definition.rb
$ rails g pu:res:conn Post --dest=admin_portal
      ✓ Connected Post to AdminPortal
$ 

What you stop writing.

Same scaffold command. Two starting points. Very different surface area.

Rails scaffold
$ rails g scaffold Post title:string body:text published_at:datetime
Just CRUD
Plutonium
$ rails g pu:res:scaffold Post title:string body:text published_at:datetime --dest=main_app
Full CRUD+ Search+ Filters+ Custom actions+ Bulk actions

Scaffold a portal in minutes.

asciinema · scaffold a blog
Index
/admin/posts
Posts index
New
/admin/posts/new
New post form
Show
/admin/posts/1
Post show page

More than CRUD.

Five features other frameworks make you build yourself. All declarative. All policy-aware.

packages/blogging/app/definitions/blogging/post_definition.rb
class Blogging::PostDefinition < Blogging::ResourceDefinition
  scope :published
  scope :drafts
  scope :archived

  action :publish, interaction: Blogging::PublishPost
  action :archive, interaction: Blogging::ArchivePost
end

# packages/blogging/app/interactions/blogging/publish_post.rb
class Blogging::PublishPost < Blogging::ResourceInteraction
  presents label: "Publish Post", icon: Phlex::TablerIcons::Send

  attribute :resource

  def execute
    resource.update!(status: :published)
    succeed(resource).with_message("Post published successfully!")
  end
end

# packages/blogging/app/policies/blogging/post_policy.rb
class Blogging::PostPolicy < Blogging::ResourcePolicy
  def publish? = record.draft?
  def archive? = record.published?
end
Blog posts table with the row actions menu open — Publish Post appears on the draft row only
No publish? policy method, no button — it disappears, it doesn't disable.Read the guide →

Built on Rails. Wired for shipping.

Convention over configuration
Extended to resources, policies, portals, and tenancy — not just routes and views.
It's just Rails
Generated code lives in your repo. Edit it, override it, delete it. The “magic” is regular Ruby mixins you can read.
Multi-tenant ready
Path or domain tenancy. Scoped relations. Invites and memberships out of the box.
AI-readable
Predictable file layout and naming. Built-in skills teach AI assistants the patterns.
For Rails developers

The missing layer between Rails and the apps you keep building.

  • Convention extended to CRUD, policies, and portals
  • Generated code lives in your repo — edit anything
For founders & teams

Skip the SaaS template debate. Plutonium turns Rails into a SaaS toolkit.

  • Admin panel, signup, and invites on day one
  • Multi-tenant scoping when you need it

“Stop writing the parts of every Rails app you've already written. Plutonium is what should have been there all along.”

$ rails new my_app -a propshaft -j esbuild -c tailwind -m https://radioactive-labs.github.io/plutonium-core/templates/plutonium.rb

Released under the MIT License.