Build on Rails

Build a control panel on Rails

The switches that run your product, feature flags, plan changes, account state, kill switches, in one place, where the safe levers are one click and the dangerous ones ask before they fire.

250+ paying companies · 2.7M downloads of the avo gem

01

01 · the hand-built version

What building a control panel by hand actually costs

A control panel is where you operate the product: flip a flag, change a plan, suspend an account. Built by hand, the risky part is what gets skipped.

  • 01

    The dangerous levers live in the console

    Flipping a feature flag or changing an account's plan is a rails runner one-liner, with nothing standing between a mistyped id and a change to every user on that account.

  • 02

    Destructive actions have no guardrails

    The same operator who toggles a harmless setting can purge an account, with no confirmation step, no second look, and no record that it happened. The blast radius is the whole database.

  • 03

    Settings are scattered across the stack

    Some flags in ENV, some in a table, some hardcoded behind a deploy. Changing operational behavior means finding where a given switch lives and, half the time, shipping a release to move it.

  • 04

    Everyone effectively has root

    There is no way to let support flip a safe toggle while keeping suspend, reset, and purge to a smaller group, so either too many people can do too much or every change routes through one engineer.

02

02 · the Avo version

Your models are already the hard part. Avo is the rest.

Avo makes each operational lever a real screen and each risky lever a real action. Toggles on your Setting and FeatureFlag models flip from the UI instead of a deploy, and anything irreversible runs through an Avo Action that shows a confirmation and checks your Pundit policy first. The flags, plan changes, and kill switches move out of the console into a control panel where the safe things are immediate and the dangerous things ask before they run.

Operational toggles without a deploy

Point a resource at your settings and feature-flag models and boolean fields flip inline from the edit form, so changing product behavior is a click, not a code change and a release.

Dangerous actions ask first

self.confirmation is on by default, so an Avo Action shows your self.message and a labeled confirm button before it runs. Suspend, reset, and purge stop being one keystroke away from happening by accident.

Fine-grained control over who can do what

Pundit policies decide who sees the panel, who can flip a flag, and who can pull the kill switch, so support gets the safe levers while the destructive ones stay with the people you trust with them.

Plan and account management as actions

Change a plan, extend a trial, or suspend an account through an Avo Action that calls the service objects you already have, so the panel drives your real logic rather than editing rows directly.

Scattered switches in one place

Group flags, limits, and operational toggles onto a dashboard so ops stops hunting across ENV, tables, and code to find the one switch they need to change.

Every change is attributable

Actions run as current_user, so a plan change or a suspension is tied to the operator who made it, which is exactly what you want the moment someone asks why an account went dark.

A destructive lever, gated by a confirmation and your Pundit policy, instead of a console one-liner:

class Avo::Actions::SuspendAccount < Avo::BaseAction
  self.name = "Suspend account"
  self.message = "Suspending blocks every user on this account from signing in. Continue?"
  self.confirm_button_label = "Suspend account"

  def fields
    field :reason, as: :textarea, required: true
  end

  def handle(query:, fields:, current_user:, **args)
    query.each do |account|
      account.suspend!(reason: fields[:reason], by: current_user)
    end

    succeed "Suspended #{query.count} account(s)."
  end
end
03

03 · the timeline

From first resource to the team running on it

Hour one

Generate resources for your Setting and FeatureFlag models and flip a real toggle from the UI. The switch that used to need a deploy or a console command is now a click.

Day one

Wrap the destructive levers, suspend, reset, purge, in Avo Actions with a confirmation and a Pundit policy, then put the whole panel behind your existing auth. In production.

End of the week

The operational toggles your team used to page an engineer for are self-serve for the people allowed to flip them, and the risky ones ask a question before they fire.

Prefer to prompt?

Hand this to Claude Code, Cursor, or whatever agent you build with, and review what it ships like any other pull request.

Build a brand-new Ruby on Rails application whose operator control panel is Avo 4 (https://avohq.io, docs at https://docs.avohq.io/4.0/). There is no existing app or schema, so scaffold everything from scratch.

1. Run rails new with the default stack, then generate authentication with Rails' built-in bin/rails generate authentication so operators sign in before they reach anything. Add the avo gem, bundle, run bin/rails generate avo:install, and mount Avo at /avo behind that authentication so only signed-in staff reach the panel.
2. Work out the data this control panel operates on before writing a single migration. A panel like this needs the product's own records to act on plus the levers that steer them, so reason from first principles about the entities involved: the accounts and users the product serves, the feature flags and settings that change behavior, and any plan or subscription the account sits on. Give each account a lifecycle state (active, suspended, closed) modeled as an enum or its own status table, and decide how flags and settings associate, whether they are global or scoped per account. Sketch the associations end to end, then write the migrations. Treat the flags, plan changes, and kill switches the panel promises as behavior your schema has to support, not as a fixed list of tables to copy.
3. Generate an Avo resource per model with bin/rails generate avo:resource, and fill in the API rather than leaving the defaults. Set self.title to whatever reads as the record's name, list the columns worth matching on in self.search, add self.includes for the associations each Index touches so the grid does not run N+1 queries, and match field types to the columns you chose: as: :boolean for a flag or setting toggle so it flips inline from the edit form, as: :select backed by the lifecycle enum for account state, as: :belongs_to for the account a flag or plan hangs off.
4. Turn the panel's verbs into Avo Actions: suspend an account, reset a password or data, purge records, change a plan, extend a trial. Since the app is new, put the real work in the model or a small service object (Account#suspend!, a PlanChange service) and have each action call it rather than editing rows inline. Keep self.confirmation on, write a self.message that names the blast radius, set self.confirm_button_label, and require a reason as a textarea field. Actions run as current_user, so each change is attributable to the operator who ran it.
5. Add filters and scopes so operators can narrow to suspended accounts, accounts on a given plan, or flags that are currently on, and build an Avo dashboard that gathers the flags, limits, and toggles onto one screen with a few metric cards for account state (https://docs.avohq.io/4.0/dashboards.html).
6. Authorize with Pundit so support can flip the safe toggles while suspend, reset, and purge stay with a smaller admin group: policies decide who sees the panel, who can edit a flag, and who can run each destructive action (https://docs.avohq.io/4.0/authorization.html).
7. Seed realistic sample data, a spread of accounts across every lifecycle state, users under them, and a set of flags and settings in mixed on and off positions, so every resource, filter, and dashboard card has something to show on first boot.
8. Boot the app, open /avo, flip one feature flag from the UI with no deploy, then run the suspend-account action and confirm it asks before it fires and moves the account into the suspended state.

04 · start today

Stand up a control panel this week

Avo is per app with unlimited users, so the whole team works from it without the bill scaling with headcount. When you hit an edge Avo doesn't cover, you drop to plain Rails instead of filing a feature request.

More things teams run from their Rails app

Frequently asked questions

What is an admin control panel in a Rails app?
A control panel is the internal screen where staff operate the product rather than manage records: turning features on and off, changing account state, adjusting limits, and running the occasional destructive action. It is distinct from a CRUD admin because the point is the levers and their guardrails, not just editing rows.
Can I manage feature flags from a Rails admin panel?
Yes. If your flags live in the database, point an Avo resource at that model and flip them with boolean fields from the UI. If you use a gem like Flipper, you can drive it from an Avo Action that calls its API, so toggling a flag is a click behind your authorization rules instead of a console session.
How do I gate a dangerous admin action behind a confirmation?
In Avo, confirmation is on by default for an action: set self.message to the warning you want operators to read and self.confirm_button_label to the button text, and the action shows a modal before it runs. Set self.confirmation to false only for the levers that are safe to fire immediately.
Can I let support flip some toggles but not others?
Yes, that is what the Pundit policy is for. A policy decides who can see the control panel, who can flip a given flag, and who can run a destructive action, so support gets the safe switches while suspend and purge stay with a smaller group. There is no per-seat cost to adding people, since Avo is priced per app.
Does a control panel need to be a separate application?
No. Avo runs inside your Rails app, so the control panel operates on your real models and data with no third-party service in the path. When you hit something Avo does not cover, you drop to plain Rails in the same codebase rather than filing a request with a vendor and waiting.
How much does a Rails control panel cost with Avo?
Avo is priced per application with unlimited users, so the operations, support, and engineering people who need the panel are all included. A per-seat tool charges you for exactly the internal users a control panel exists to serve.