Plutonium
The Rails framework for things you should never write again.
Convention over configuration, extended to everything you keep rebuilding: CRUD. Auth. Authorization. Multi-tenancy. Admin portals. Search, filters, bulk actions. All generated. All customizable. All Rails.
Quick Start
rails new myapp -a propshaft -j esbuild -c tailwind \
-m https://radioactive-labs.github.io/plutonium-core/templates/plutonium.rb
Then scaffold a resource, create a portal, and connect them:
cd myapp
# Scaffold a resource — model, migration, definition, policy
rails g pu:res:scaffold Post title:string body:text published_at:datetime --dest=main_app
rails db:prepare
# Create a portal (web interface) and connect the resource to it
rails g pu:pkg:portal app --public
rails g pu:res:conn Post --dest=app_portal
bin/dev
Visit http://localhost:3000/app/posts — you have a complete CRUD interface.
What You Stop Writing
Same scaffold command you already know. A very different surface area.
rails g scaffold Post ... # Rails: just CRUD
rails g pu:res:scaffold Post ... # Plutonium: full CRUD + search + filters + bulk actions
And it doesn't stop at scaffolds:
Resource-oriented architecture — models, policies, definitions, and controllers that work together:
# Policy controls WHO can do WHAT
class PostPolicy < ResourcePolicy
def create? = user.present?
def update? = record. == user || user.admin?
def permitted_attributes_for_create
%i[title body]
end
end
# Definition controls HOW it renders
class PostDefinition < ResourceDefinition
input :body, as: :markdown
search { |scope, q| scope.where("title ILIKE ?", "%#{q}%") }
scope :published
scope :drafts
end
Packages and portals — split your app into feature engines and themed web interfaces:
rails g pu:pkg:package blogging # Business logic
rails g pu:pkg:portal admin # Web interface
rails g pu:res:conn Post --dest=admin_portal
Built-in authentication via Rodauth:
rails g pu:rodauth:install
rails g pu:rodauth:account user
Multi-tenancy with entity scoping:
# In a portal engine
scope_to_entity Organization, strategy: :path
# Routes become /organizations/:organization_id/posts
Custom actions with interactions:
class PublishInteraction < ResourceInteraction
attribute :resource
attribute :publish_at, :datetime
def execute
resource.update!(published_at: publish_at)
succeed(resource).("Published!")
rescue ActiveRecord::RecordInvalid => e
failed(e.record.errors)
end
end
Why Plutonium
- 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, plus built-in Claude Code skills that teach AI assistants the patterns.
Documentation
Full documentation at radioactive-labs.github.io/plutonium-core
Requirements
- Ruby 3.2.2+
- Rails 7.2+ (Rails 8 recommended)
- Node.js 18+
Contributing
See CONTRIBUTING.md for development setup and guidelines.
License
MIT License — see LICENSE.txt.