Installation
Table of contents
- Requirements
- Step 1: Add the Gems
- Step 2: Run the Install Generator
- Step 3: Mount the Engine (if not auto-mounted)
- Step 4: Configure Authentication
- Step 5: Create Your First Resource
- Step 6: Build CSS and Start the Server
- Tailwind CSS Setup
- Dependencies
Requirements
- Ruby >= 3.3 (tested on 3.3, 3.4, and 4.0)
- Rails >= 8.0.4 (tested on 8.0 and 8.1)
- tailwindcss-rails >= 4.3
- The default
rails newJavaScript setup: importmap with Stimulus. IronAdmin installsimportmap-railsitself; its layout loads the admin JavaScript withjavascript_importmap_tagsand registers its Stimulus controllers onwindow.Stimulus, whichbin/rails stimulus:installsets up.
On Rails 8.0, keep the json gem below 3.0 (gem "json", "< 3"). Active Support 8.0
passes quirks_mode: to JSON, which json 3.0 rejects with an ArgumentError. Rails 8.1
is not affected.
Step 1: Add the Gems
Add IronAdmin and tailwindcss-rails to your Gemfile:
gem "iron_admin"
gem "tailwindcss-rails"
Then run:
bundle install
Step 2: Run the Install Generator
rails generate iron_admin:install
This creates:
| File | Purpose |
|---|---|
config/initializers/iron_admin.rb |
Main configuration (title, auth, theme) |
app/iron_admin/resources/ |
Directory for resource definitions |
app/iron_admin/dashboards/ |
Directory for dashboard definitions |
app/iron_admin/dashboards/admin_dashboard.rb |
Default dashboard class |
It also:
- Mounts the engine at
/admininconfig/routes.rb - Adds the IronAdmin CSS import to
app/assets/tailwind/application.css
Step 3: Mount the Engine (if not auto-mounted)
In config/routes.rb:
Rails.application.routes.draw do
mount IronAdmin::Engine => "/admin"
end
Step 4: Configure Authentication
Edit config/initializers/iron_admin.rb:
IronAdmin.configure do |config|
config.title = "My App Admin"
config.authenticate do |controller|
unless controller.session[:user_id]
controller.redirect_to "/login"
end
end
config.current_user do |controller|
User.find_by(id: controller.session[:user_id])
end
end
Step 5: Create Your First Resource
rails generate iron_admin:resource User
This creates app/iron_admin/resources/user_resource.rb. IronAdmin automatically infers
fields from your model’s database schema.
Step 6: Build CSS and Start the Server
rails tailwindcss:build
bin/rails server
Visit /admin and your admin panel is ready.
For development with live CSS recompilation, use bin/dev (which runs
tailwindcss:watch alongside the Rails server via foreman).
There is a known issue in
tailwindcss-railsv4 wherebin/devexits immediately after starting. If this happens, editProcfile.devand change the CSS line tocss: bin/rails tailwindcss:watch[always].
Tailwind CSS Setup
IronAdmin uses Tailwind CSS v4 for all styling via the tailwindcss-rails gem.
Understanding how the CSS pipeline works will help you troubleshoot any styling issues.
How it works
-
IronAdmin ships with
@sourcedirectives atapp/assets/tailwind/iron_admin/engine.cssinside the gem. These tell the Tailwind compiler where to scan for CSS utility classes used by the engine’s views, components, and helpers. -
When
tailwindcss:buildruns, it first executestailwindcss:engines. This task detects IronAdmin’s engine CSS and creates a bridge file atapp/assets/builds/tailwind/iron_admin.csscontaining an@importthat points to the engine’s CSS. -
Your
app/assets/tailwind/application.cssmust import this bridge file:@import "tailwindcss"; @import "../builds/tailwind/iron_admin"; -
The Tailwind compiler processes
application.css, follows the imports, scans all the engine’s source files via the@sourcedirectives, and generates the finalapp/assets/builds/tailwind.csswith all necessary utility classes. -
The engine’s layout references
stylesheet_link_tag "tailwind", which serves this compiled CSS file.
Manual setup (without the generator)
If you didn’t use the install generator, or the import line is missing:
- Verify
tailwindcss-railsis in your Gemfile and installed -
Add the import to
app/assets/tailwind/application.css:@import "tailwindcss"; @import "../builds/tailwind/iron_admin"; -
Build the CSS:
rails tailwindcss:build -
Verify the build output:
ls -la app/assets/builds/tailwind.css # Should be ~30KB+ (not ~6KB which indicates no utility classes)
Troubleshooting
Styles not loading (unstyled admin panel)
This almost always means the Tailwind compiler didn’t scan IronAdmin’s source files. Check:
- The
@import "../builds/tailwind/iron_admin"line exists inapp/assets/tailwind/application.css - The bridge file exists at
app/assets/builds/tailwind/iron_admin.css(runrails tailwindcss:buildto regenerate it) - The compiled CSS at
app/assets/builds/tailwind.cssis large enough (~30KB+, not ~6KB)
Bridge file not generated
If app/assets/builds/tailwind/iron_admin.css doesn’t exist after running
rails tailwindcss:build:
- Ensure
tailwindcss-rails>= 4.3 is installed (bundle info tailwindcss-rails). Older versions have notailwindcss:enginestask, so they never write the bridge file. - Ensure
iron_adminis properly loaded (checkbundle info iron_admin) - Try running
rails tailwindcss:enginesdirectly
Styles disappear after bundle update
The bridge file uses an absolute path to the gem’s CSS. After updating the gem
(which changes the gem path), run rails tailwindcss:build to regenerate it.
Dependencies
IronAdmin depends on the following gems (installed automatically):
| Gem | Version | Purpose |
|---|---|---|
rails |
>= 8.0.4 | Framework |
view_component |
>= 4.0, < 5 | UI components |
turbo-rails |
>= 2.0.6 | Hotwire Turbo |
stimulus-rails |
>= 1.3 | Hotwire Stimulus |
importmap-rails |
>= 2.0 | Loads the admin JavaScript (javascript_importmap_tags) |
pagy |
>= 43.7.1, < 44 | Pagination |
haml-rails |
>= 2.0 | Template engine |
heroicon |
>= 1.0 | SVG icons |
csv |
>= 3.2.8 | CSV import and export (not a default gem since Ruby 3.4) |
ostruct |
>= 0.6 | Action event objects (not a default gem since Ruby 4.0) |
Peer dependency (must be added to your Gemfile manually):
| Gem | Version | Purpose |
|---|---|---|
tailwindcss-rails |
>= 4.3 | Tailwind CSS compilation (tailwindcss:engines writes the IronAdmin bridge file) |