Admin rewrite
Rewrite your old admin in less than a week.
Admin rewrites don't fail because they're hard. They fail because they can never be scheduled. Avo mounts inside the Rails app you already run and works beside your current admin, so you replace it one resource at a time: a proof of concept in an afternoon, in production on day one, the whole team working in the new admin by Friday. The timeline scales with how many models you register, not with the size of your app.
Hours
A working proof of concept on your real models
Day 1
In production, behind your own auth
Day 5
The whole team on the new admin
01 · why the rewrite never happens
The admin is load-bearing, so it never gets its turn.
Everyone agrees the old admin should be replaced. It still isn't, and the reasons are always the same three.
You can't take it offline to rebuild it
Support runs refunds through it. Ops changes plans in it. You reach for it to debug production. A tool that half your company depends on every day is the last thing you can pull down for a rewrite.
No customer ever asked for a nicer admin
The rewrite loses every planning meeting to work that ships revenue, and it should. No company ever won its market because the admin panel was great, so the admin panel never gets the sprint.
It's wired into every workflow
Every team has a bookmarked page, a memorized filter, a button they hit ten times a day. A rewrite that changes all of that at once is a rewrite nobody signs off on.
Notice that none of these say the work is hard. The blocker is that the rewrite can only be imagined as one big block that gets scheduled all at once, and it never will be. The fix is to make it not one big block.
02 · where Avo fits
Avo doesn't replace your app. It joins it.
Avo is a Rails engine you mount at its own path inside the app you already run. Same database, same models, same deploy. There's no new service to operate, no data to sync, and no second system to keep in step with the first.
Because it lives at its own path, it runs side by side with your current admin. The old one keeps working while you build the new one behind it, gated by the same authentication you already trust.
This is the whole reason a rewrite collapses into a week. You aren't migrating data or standing up infrastructure. You're describing models you already have, in an app that's already deployed, and cutting over one screen at a time when you're ready. Nothing about it is big-bang.
03 · what maps to what
Whatever you're replacing, most of the rewrite is translation.
Almost everything your old admin does has a direct Avo equivalent, so you're mostly re-describing screens you already understand, not redesigning them.
PostsController + index/show/new/edit views Avo::Resources::Post
One resource class replaces the controller and its four CRUD views, and you keep the same mental model.
table columns and form inputs in ERB field :title, as: :text
List the attributes once and they render across the Index, Show, New, and Edit views.
params[:status] handling in the controller filter Avo::Filters::Status
The same faceted filtering your team relies on, declared on the resource.
Post.published behind a query param scope Avo::Scopes::Published
Point a scope at a model scope you already trust, so you reuse the query logic instead of rewriting it.
a bespoke publish endpoint and button action Avo::Actions::Publish
Custom operations keep their own forms, confirmations, and permissions, so the safeguards move over with them.
authorize @post / PostPolicy your existing Pundit policies
Avo reads the Pundit policies you already wrote, so the rules move over, they don't get rebuilt. Coming from CanCanCan abilities, you port them to policies once and keep them.
A first resource is about as much code as it sounds. This is a full Index, Show, New,
and Edit for Post, the screen you would have hand-written or the Active Admin block you
would have ported:
class Avo::Resources::Post < Avo::BaseResource
def fields
field :id, as: :id
field :title, as: :text
field :published_at, as: :date_time
field :author, as: :belongs_to
end
end
An admin framework maps just as cleanly: Active Admin register blocks, filters, scopes, and member actions each have a one-line Avo equivalent, and dashboards and stats pages become Avo dashboards of cards. For a fuller side-by-side, see the Active Admin comparison or how Avo stacks up against the other admin frameworks.
04 · the week, day by day
A quarter's worth of dread, spent in five days.
Here's what the week actually looks like. It works because every step ships something real, and nothing is held back for a single cutover at the end.
A proof of concept on real data, before lunch
Add the gem, mount the engine, and point one resource at your busiest model. You're looking at a working admin on your production models the same afternoon. This is the moment the rewrite stops being hypothetical.
In production, behind your auth
Gate the mount point with the same authentication your current admin uses and deploy. The new admin is live, reachable only by your team, sitting quietly next to the old one. Nothing has been cut over, and you've already shipped.
Work down the list of resources
Port fields, filters, scopes, and actions model by model. Because each resource is independent, you ship them as you finish them, and your team can start using each new screen the moment it reaches parity with the old one.
Move the whole team over
The last workflow reaches parity and the team runs its day in the new admin. Keep the old one mounted for another week as a safety net, then remove its route and delete its code. The rewrite that could never be scheduled is done, and you finished it without ever taking the admin offline.
Prefer to prompt?
Hand this to Claude Code, Cursor, or whatever agent you build with, and review the port like any other pull request.
Replace the admin in my Ruby on Rails application with Avo 4 (https://avohq.io, docs at https://docs.avohq.io/4.0/), without ever taking the old one offline.
1. Add the avo gem, bundle, run bin/rails generate avo:install, and mount Avo at /avo, beside the existing admin, behind the same authentication.
2. List every model the current admin manages. For each one, run bin/rails generate avo:resource <model> and port the pieces one to one: columns and form inputs become field declarations, filters become Avo filters, scopes point at the model scopes that already exist, and custom operations become Avo Actions calling the same service objects.
3. Wire authorization through my existing Pundit policies; if the old admin used CanCanCan, port the abilities to policies once (https://docs.avohq.io/4.0/authorization.html).
4. Go resource by resource and ship each one as it reaches parity. Do not wait for a big-bang cutover; both admins run side by side on the same models.
5. Verify each ported resource against the old screen: same columns, same filters, same permissions for each role.
6. When the last workflow is over, keep the old admin mounted for a week as a safety net, then delete its routes and code.
05 · and it stays replaced
You did it once, and you don't own it forever.
The reason the rewrite kept slipping is the same reason it's worth handing off: the admin is pure overhead, no matter how well you build it. Once it runs on Avo, that overhead is ours.
Back to the real product
Every hour on the admin is an hour off the thing people pay for. On Avo you maintain one app instead of two.
No single point of failure
Avo is conventional and documented, so any Rails developer who knows it is productive on day one. The knowledge lives in the framework, not in one person's head.
Bugs in our back yard
When something breaks, it's our code in our domain. We fix it and ship the fix to everyone, instead of you debugging an admin you bolted together alone.
Frequently asked questions
- How long does it take to replace my old admin with Avo?
- A working proof of concept on your real models takes an afternoon, and the new admin can be in production behind your own authentication on day one. Most teams have everyone working in the new admin inside a week, keep the old one mounted for a little longer as a safety net, then delete it. The timeline tracks the number of models you register, not infrastructure work, because Avo runs inside the Rails app you already have.
- Can Avo run next to my existing admin during the migration?
- Yes. Avo is a Rails engine that mounts at its own path, so it runs side by side with Active Admin or a hand-rolled admin on the same database and models. Your current admin keeps working while you build the new one behind the same authentication, and you cut over whenever you are ready. See how Avo compares to Active Admin for a fuller breakdown.
- Do I have to migrate my database or move my data to use Avo?
- No. Avo reads and writes your existing tables through your existing Active Record models, so there is no data to migrate and nothing to keep in sync. It lives in your codebase and queries your database directly, which is why standing it up is a matter of hours rather than a project.
- What happens to my existing filters, scopes, and authorization?
- They carry over. The filters and scopes in your current admin have direct Avo equivalents, and an Avo scope can point at a model scope you already trust so you reuse the query logic. Your Pundit-style authorization policies plug straight in, so the rules you wrote move over instead of being rebuilt.
- Is replacing my admin a big-bang cutover, or can I switch one screen at a time?
- One screen at a time. Each Avo resource is independent, so you can port a model, ship it, and let your team start using that screen the moment it reaches parity. Nothing is a big-bang switch, and the old admin stays available until the last workflow has moved over.
- How much does Avo cost for a team?
- Avo 4 is priced per application with unlimited users, so you can add your whole team without the bill scaling by seat. That makes the cost a known line item rather than the open-ended estimate a rewrite-and-maintain project usually becomes. See the pricing page for current tiers.
Start the rewrite
Point Avo at your busiest model and see the first screen this afternoon.
The proof of concept costs you an afternoon, not a sprint. Start free, mount it beside your current admin, and decide from a working screen on your own data.