Make your Rails CLI output beautiful. Railbow enhances migrations, routes, stats, notes, and more with colorful, emoji-rich, information-dense formatting.
- Migrations - colorful
db:migrateoutput with readable millisecond timing - Migration Status - rich
db:migrate:statuswith git authors, calendar view, table detection, landing dates, and time filtering - Routes - color-coded HTTP verbs and highlighted parameters in
rails routes - Stats - beautiful
rails statstables - Notes -
rails noteswith git blame, author colors, date filtering, and sorting - About - polished
rails aboutoutput - Git Integration - authors, diffs, branch origin, landing dates, uncommitted file indicators
- Calendar View - month separators and week tick markers for migration timelines
- Smart Defaults - auto-disables in CI, piped output,
NO_COLOR, and LLM agents
gem "railbow", group: :developmentbundle installgem install railbow
railbow rake db:migrate:status
railbow rails routesThe CLI creates a temporary wrapper so Railbow loads automatically without modifying your project's Gemfile.
Railbow works automatically once installed. Every example below works with both rails and rake commands.
Before:
== CreateProducts: migrating =================================================
-- create_table(:products)
-> 0.0028s
== CreateProducts: migrated (0.0028s) ========================================
After:
π CreateProducts: migrating...
β create_table(:products) β 2.8ms
β
CreateProducts: migrated (2.8ms total)
This is Railbow's flagship feature. The plain Rails output:
Status Migration ID Migration Name
--------------------------------------------------
up 20260202145343 Add weight field to animals
up 20260203134528 Create vaccination records
up 20260210183902 Create pet tags
up 20260303120000 Add breed restrictions to adoption policies
up 20260313132325 Create veterinary appointments
becomes a rich, information-dense dashboard (with default config):
Feb 2026 W06
ββ β 20260202145343 β 2026-02-02 14:53:43 β Add weight field to animals β animals
ββ β 20260203134528 β 2026-02-03 13:45:28 β Create vaccination records β vaccination_records
ββ β 20260210183902 β 2026-02-10 18:39:02 β Create pet tags β€» Mar 04 β pet_tags
ββββββββΌβββββββββββββββββΌββββββββββββββββββββββΌββββββββββββββββββββββββββββββ
Mar 2026 W10
ββ β 20260303120000 β 2026-03-03 12:00:00 β Add breed restrictions toβ¦ β€» Mar 13 β adoption_policies
ββ β 20260313132325 β 2026-03-13 13:23:25 β Create veterinary appointmβ¦ β PS-142 β veterinary_appointments
Out of the box you get:
- Calendar separators β month + ISO week headers to orient you in time
- Status aliases β
ββ/ββinstead ofup/down(customizable) - Created At β timestamp parsed from the migration ID
- Landing dates β
β€» Mar 04badge when a migration was merged to main after its creation - Branch badges β
β PS-142showing the source branch/ticket - Affected tables β color-coded table names extracted from migration files
- Time filtering β only the last 70 days shown by default (
since: 70d) - Your migrations highlighted β rows authored by you are visually distinct
βͺ CreateProducts: reverting...
β drop_table(:products) β 1.2ms
β
CreateProducts: reverted (1.2ms total)
HTTP verbs are color-coded (GET=green, POST=yellow, PATCH/PUT=cyan, DELETE=red), route parameters (:id, *splat) are highlighted, and controller#action pairs stand out.
Code statistics rendered as a colorful table with highlighted totals and code-to-test ratio.
Annotations enriched with git blame data β author names, commit dates, and color-coded tags (TODO=yellow, FIXME=red, OPTIMIZE=cyan, HACK=red, NOTE=green).
Railbow works with zero configuration, but everything is customizable.
Config is loaded in layers (each overrides the previous):
- Built-in defaults
- Global:
~/.config/railbow/config.yml - Project:
.railbow.yml(commit to git) - Local:
.railbow.local.yml(gitignored, personal overrides)
Generate a config interactively:
railbow init
# or, within a Rails project:
rake railbow:initsince: 70d
date: rel
git: "author:me,diff,mask:auto"
view: "calendar,tables"
calendar: wticks
compact: "maxw:120"
aliases:
columns:
Status: Live
values:
Status:
up: "ββ"
down: "ββ"Every option can also be set via RBW_* environment variables, which override config files:
| Variable | Example | Description |
|---|---|---|
RBW_PLAIN |
1 |
Disable all formatting |
RBW_SINCE |
2mo, 70d, 1y, all |
Filter migrations by time period |
RBW_DATE |
full, rel, short, custom(%b %d) |
Date display format |
RBW_GIT |
author:me,diff,mask:auto |
Git integration options |
RBW_VIEW |
calendar,tables |
Enable calendar view and table detection |
RBW_CALENDAR |
wticks |
Show week tick markers |
RBW_COMPACT |
oneline,dense,noheader,maxw:80 |
Compact display options |
RBW_VERB |
GET,POST |
Filter routes by HTTP method |
RBW_SORT |
file, date |
Sort order for notes |
RBW_HELP |
1 |
Show help messages |
# Last 2 months, calendar view
RBW_SINCE=2mo rake db:migrate:status
# Relative dates, highlight your migrations
RBW_DATE=rel RBW_GIT=author:me rake db:migrate:status
# Full git context with table detection
RBW_GIT=author:all,diff RBW_VIEW=tables rake db:migrate:status
# Only GET routes
RBW_VERB=GET rails routes
# Notes sorted by commit date
RBW_SORT=date rails notesRailbow integrates through a Rails Railtie β it prepends formatter modules onto existing Rails classes without modifying your code:
ActiveRecord::Migration- migration outputActiveRecord::Tasks::DatabaseTasks- migration statusActionDispatch::Routing::ConsoleFormatter::Sheet- routesRails::Info- aboutRails::SourceAnnotationExtractor- notes
Formatting auto-disables when:
RBW_PLAIN=1orNO_COLORis set- Running in CI (
CIenv var) - Output is piped or redirected (non-TTY)
- Running inside an LLM agent (
CLAUDECODEenv var)
- Ruby >= 3.1.0
- Rails >= 7.2 (including 8.x)
bin/setup # Install dependencies
bundle exec rake # Run tests + linting (RSpec + Standard)
bin/console # Interactive promptBug reports and pull requests are welcome at github.com/amberpixels/railbow.
MIT License. See LICENSE.txt.