Madmin alternative
Madmin alternative: Avo vs Madmin for your Rails admin
Madmin and Avo both put your admin in your Rails repo as Ruby classes. Here's where each one fits, and when you should keep Madmin.
Madmin is Chris Oliver's admin gem, the one that ships with Jumpstart Pro. It's free, it feels like Rails scaffolds, and it gets a lot right. If you're looking for a Madmin alternative, it's usually because your admin has turned into the place your team runs the business from, and you're now writing actions, permissions and dashboards by hand. That's the job Avo is built for.
credit where it's due
What Madmin gets right
Madmin is a well-made gem with an active maintainer. Before you replace it, here's what you'd be giving up.
It's free, all of it
Madmin is MIT-licensed with no paid tier. Search, scopes, column filters, nested forms, direct uploads and dark mode all come in the one gem.
It feels like Rails scaffolds
Its stated goal is "less DSL". Resources are short classes, and when a screen needs to change you generate its ERB views into your app and edit them like any other view. If your team thinks in scaffolds, there's very little to learn.
It's already in your Jumpstart Pro app
Jumpstart Pro builds its admin area on Madmin, with access limited to staff users, a Login As User button and a dashboard of revenue, users and active subscriptions. If you bought Jumpstart Pro, you have a working admin today, maintained by the same person who maintains your template.
It's light and it's moving fast
Madmin runs on Turbo, Stimulus and import maps with no Node or build step, on Propshaft or Sprockets. Version 3.0 shipped on September 30, 2026, and 3.4.1 followed on November 2, adding read-only resources and pagination that skips the row count on very large tables.
the real difference
Same repo, different amount already built
This isn't a hosted tool against a gem. Both are Rails engines, both are configured in Ruby you review in pull requests, and both read your own models. The difference is what happens after the CRUD screens: with Madmin you write the rest yourself, and with Avo your team starts from parts that are already built, documented and maintained.
Madmin
The CRUD screens, then your code
- Member and collection actions are buttons that link to routes and controllers you write.
- Authentication is a
before_actionyou fill in. Authorization is yours to wire up. - The stock dashboard is a placeholder page for you to fill in. Jumpstart Pro fills it with revenue, users and active subscriptions.
Avo
The CRUD screens, plus what comes next
- Actions are classes with their own form fields and a confirmation step, run on one record or many.
- Pundit policies decide which records, fields and actions each person sees.
- Dashboards with cards and charts, from the Dashboards add-on.
where the time goes
The scaffold is the easy part. Your team lives in what comes after it.
Refunds, approvals, the support person who should see accounts but not billing, the weekly numbers someone keeps asking for. On Madmin each of those is a controller, a view and a policy you write and maintain. On Avo it's a short Ruby class on a foundation already running in hundreds of apps.
where Avo comes in
What your team gets with Avo
You add the gem and write resources in app/avo, the same way you'd write them in app/madmin. Then the parts you'd otherwise build are a few lines each.
-
01
Actions your team can run on their own
Refund a charge, approve a batch of orders, resend an invite. An action asks for the inputs it needs, confirms before it runs, and works on one record or a selection. No extra route or controller.
-
02
Permissions written once
With the Authorization add-on, a Pundit policy decides which rows a person loads, which fields they see and which actions they can run. The same rule holds in the API and the MCP server, so your agents work inside the limits your team does.
-
03
Finding the record in seconds
Search and filters come with Avo. Dynamic Filters let support combine conditions on any column, and Global Search finds a customer from one box, across every resource.
-
04
Agents that already know it
More than 30 agent skills ship inside the gem, pinned to the version you run, and every feature is documented on a versioned docs site. Your coding agent writes a short resource instead of a stack of controllers you then have to review.
Here's a refund action. It's the whole thing: the form field, the confirmation and the bulk run come with it.
# app/avo/actions/refund_charge.rb
class Avo::Actions::RefundCharge < Avo::BaseAction
self.name = "Refund charge"
self.message = "Refund the selected charges?"
def fields
field :reason, as: :textarea
end
def handle(query:, fields:, **)
query.each { |charge| charge.refund!(reason: fields[:reason]) }
succeed "Refunded #{query.count} charges"
end
end
side by side
Avo vs Madmin, in one view
| Madmin | Avo | |
|---|---|---|
| Price | Free, MIT-licensed, every feature | Community is free; paid plans priced per app with unlimited users |
| Where the admin is defined | Ruby resource classes in your repo | Ruby resource classes in your repo |
| Changing a screen | Generate its ERB views into your app and edit them | Options in the resource first, then eject a view or component when you need to |
| Fields | 25 built-in types, including rich text, JSON, arrays and nested forms | 30+ types, including badges, key-value, tags, files and rich text |
| Search and filters | Search, scopes and column filters on index pages | Search and filters built in; Dynamic Filters and Global Search add-ons |
| Actions | Buttons linking to routes and controllers you write | Action classes with form fields, confirmation and bulk runs |
| Authorization | A before_action you fill in; wire up Pundit yourself | Pundit policies for records, fields and actions, with the Authorization add-on |
| Dashboards | A placeholder page you build (Jumpstart Pro ships one with revenue metrics) | Cards and charts with the Dashboards add-on |
| API, MCP, CLI | Not part of Madmin | Add-ons that follow the same policies as the UI |
| Docs | README and guides in the GitHub repo | Versioned docs site, plus agent skills in the gem |
| Jumpstart Pro | The built-in admin | A ready-made blueprint of Avo resources |
to be fair
When we'd point you to Madmin instead
Avo isn't the right call for every app. Keep Madmin, or pick it, when:
You're on Jumpstart Pro and the admin is mostly for you
If the admin is where you look up a user, log in as them and check revenue, the Madmin admin that came with your template already does that. Moving it buys you little.
The budget is zero and the needs are CRUD
Madmin gives you filters, scopes and nested forms for free. Avo Community is free too, but dashboards, dynamic filters and authorization are paid.
You want to own every view
If your plan is to generate the views and rewrite them in your own markup, Madmin's plain ERB gets out of your way. Avo's value is in the parts you don't have to write.
Your app is tiny and will stay that way
A handful of models that only developers touch doesn't need actions, policies or dashboards. Madmin is the smaller dependency.
Once support, ops or finance work in the admin every day, the trade flips. On Jumpstart Pro you don't have to choose all at once: start from the Jumpstart Pro blueprint, mount Avo beside Madmin, and move one resource at a time.
Frequently asked questions
- Is Avo a good Madmin alternative?
- Yes, when your admin is growing past CRUD. Both keep the admin in your Rails repo as Ruby classes. Avo adds what you'd otherwise write yourself on Madmin: actions with forms and confirmation, Pundit-based permissions on records, fields and actions, dashboards, and an API and MCP server that follow the same rules. For a small admin only developers use, Madmin is a fine choice.
- Is Madmin free?
- Yes. Madmin is MIT-licensed and has no paid tier. Avo Community is free and open source too; Avo's paid plans add features like dashboards, dynamic filters and authorization, and are priced per app with unlimited users. See what each plan includes.
- I'm on Jumpstart Pro. Should I replace Madmin?
- Not by default. Jumpstart Pro's admin is built on Madmin and works well for looking up and managing users. Switch when your team needs actions, permissions or reporting in the admin. The Jumpstart Pro blueprint gives you Avo resources for accounts, subscriptions and charges, plus a revenue dashboard, so you start from a working setup.
- Can Madmin and Avo run in the same app?
- Yes. Each lives under its own path in your routes, so you can add Avo next to Madmin, move one resource at a time, and remove Madmin when nothing uses it. We've written up that approach in how to rewrite your admin.
- Does Madmin have authorization?
-
Madmin leaves it to you. Its docs show authentication through a
before_action, a Deviseauthenticatedroute block or HTTP basic auth, and you can hook Pundit into its controllers yourself. Avo's Authorization add-on applies Pundit policies to records, fields and actions out of the box. - Is Madmin still maintained?
- Yes, actively. Version 3.0 shipped on September 30, 2026 with filters, dark mode and built-in pagination, and 3.4.1 followed on November 2, 2026. Pace isn't a reason to leave Madmin; scope is.
- How do I move from Madmin to Avo?
-
The shapes map closely. A Madmin resource becomes an Avo resource, each
attributebecomes afield, and each member action becomes an Avo action class. Views you generated and edited are the part to redo: start with Avo's defaults and eject only what still needs to look different.
Give your team the admin after the scaffold.
Start free, write your first resource in Ruby, and add actions, permissions and dashboards when your team asks for them. Priced per app, with unlimited users.