v0.14.2 Security: the default-credentials guard could be bypassed

Errors caught.
Bills uncaught.

Self-hosted error tracking for Rails. Local variables, breadcrumbs, system health snapshots, N+1 detection, swallowed exception tracking — running in your own process. Zero recurring cost.

49,454 downloads 92 ★ on GitHub 30+ features MIT licensed
rails-error-dashboard.anjan.dev/red

Production overview

Live · last updated 3s ago
Error rate
4.2/min
↑ 12% vs yesterday
Unresolved
31
3 critical
Resolution rate
87%
avg 2.4h
Affected users
1,847
↑ 18% vs yesterday
critical
Redis::TimeoutError
Connection timed out after 5.0s
1,203
↑ 156%
critical
NoMethodError
undefined method 'balance' for nil:NilClass
847
↑ 23%
high
ActiveRecord::RecordNotFound
Couldn't find Order with 'id'=98432
234
↑ 8%
high
Net::OpenTimeout
execution expired connecting to api.stripe.com
89
↑ 4%
medium
ActionController::ParameterMissing
param is missing or the value is empty: user
56
↓ 12%
Trusted by the indie Rails community
49,454
RubyGems downloads
$0
Monthly cost, forever
11
Dashboard languages
5min
From gem install to running

Why developers pick RED.

All three [self-hosted alternatives] had an issue with error backtrace when using Turbo — RED did fix it… solid_errors and Faultline are not very active projects, RED is very active and @AnjanJ is very responsive in fixing issues. So, RED was my final choice.

// the case for self-hosting

Same depth.
Different price tag.

Hosted error tracking is excellent — and excellent at extracting recurring revenue. RED gives you the same instrumentation, running in your own process.

Rollbar
$49
per month
Honeybadger
$26
per month
Sentry
$26
per month
Airbrake
$19
per month
RED
$0
forever
Even $26/month adds up to $936 over 3 years. RED costs $0.

Instrumentation you'd actually pay for.

Every feature opt-in, production-safe, and zero overhead when off.

// local variable capture

See exactly what your code was holding when it failed.

Most error trackers give you a stack trace. RED gives you the entire local scope at the moment of `raise` — captured via `TracePoint(:raise)` without storing a single Binding object.

  • Configurable depth, string length, array & hash limits
  • Sensitive params auto-filtered via filter_parameters
  • Zero overhead when disabled — single config flag
# PaymentsController#create — line 47
@user nil
amount BigDecimal('149.99')
params { plan_id: "pro_monthly" }
@subscription #<Subscription id: 4521>
stripe_customer [FILTERED]
# → NoMethodError on @user.balance
// swallowed exception detection

Find the bugs that never reach your tracker.

Every codebase has them: exceptions raised, silently rescued, and forgotten. RED uses dual `TracePoint(:raise)` + `TracePoint(:rescue)` to surface them with hourly bucketing and raise/rescue ratios.

  • Dedicated dashboard page with raise/rescue ratio chart
  • Hourly bucketing — see when the leak started
  • Requires Ruby 3.3+ for the rescue event
14:23:01 RAISE JSON::ParserError in WebhookHandler#parse
14:23:01 RESCUE rescue StandardError => _ # silent
14:23:47 RAISE Net::OpenTimeout in StripeClient#call
14:23:47 RESCUE rescue Net::OpenTimeout # logged
summary PATTERN 23 silent rescues in last hour — never reached error tracker
// copy for llm

One click. Clean Markdown. Pasteable into any AI session.

Copy the entire error context — backtrace, cause chain, local variables, breadcrumbs, environment, related errors — formatted for Claude, ChatGPT, Cursor, or whatever assistant you use. App frames only. Sensitive data still filtered.

  • Framework frames stripped, only your code shown
  • Conditional sections — only includes data that exists
  • Includes related errors with similarity %
# NoMethodError **Message:** undefined method 'balance' for nil ## Backtrace (app frames only) - `app/controllers/payments_controller.rb:47` → @user.balance.debit(amount) - `app/services/payment_processor.rb:23` ## Local Variables - `@user`: nil - `amount`: BigDecimal('149.99') - `stripe_customer`: [FILTERED] ## Related (94% similarity) - NoMethodError: undefined method 'credit' for nil
// system health snapshots

Know what your app was doing when it broke.

Every error captures a sub-millisecond runtime snapshot. GC stats, memory pressure, file descriptors, TCP states, system load, Puma worker/thread saturation, DB pool stress. No subprocess calls. All under 1ms budget.

  • 13 metric groups, color-coded danger thresholds
  • FD utilization, load ratio, TCP state breakdown
  • YJIT enablement & compilation %
Memory 487 MB / 1024 MB
DB pool 14 / 16 (87%)
Puma threads 12 / 16
System load 2.84, 1.92, 1.41
GC runs 142
YJIT enabled · 98.2% compiled

Everything else.

🏷

Environment awareness

Every error records whether it came from production, staging, uat — any name your deploys use. Filter the index by it, see it as a badge and in every notification, and keep staging out of your pager with notification_environments. The same error in two environments is two rows with their own status.

v0.11.0
🤖

AI crawler tracking

Rack::Attack track rules now name the client — GPTBot, ChatGPT-User, ClaudeBot, Claude Code, PerplexityBot, Bytespider, CCBot and more, told apart from ordinary crawlers like Googlebot. Per-rule AI agent totals and a top-agent column, without blocking or throttling anything.

v0.10.0
🌐

11 languages

Dashboard, emails and notification payloads translated — German, Spanish, French, Portuguese, Italian, Polish, Russian, Ukrainian, Japanese, Simplified Chinese. Switch from the navbar. Your app's I18n is never touched.

v0.9.0
⚡

Storm protection

Circuit breaker + adaptive sampling. When a bad deploy throws 50k errors/min, the gem degrades itself first — exact counts, zero DB amplification.

v0.8.2
⌬

Smart deduplication

Auto-groups by stack fingerprint. Counts occurrences instead of spamming you with duplicates.

⊹

N+1 query patterns

Cross-error SQL fingerprinting. Auto-extracted table name with eager-loading suggestion.

↻

Auto-reopen

Resolved errors that recur reopen automatically with a "Reopened" badge. Never miss a regression.

◈

Multi-channel alerts

Slack, Email, Discord, PagerDuty, custom webhooks. Per-error cooldown. Severity filters.

v0.5
◊

GitHub/GitLab issues

Auto-create on first occurrence. Two-way webhooks with HMAC. Lifecycle sync.

v0.5.8
⏑

Cause chains

Full root-cause traversal. SocketError caused RuntimeError caused ServiceError. Never guess again.

◬

Release tracking

"New in this release" detection. Stability indicators. Release-over-release deltas. Zero config.

v0.5.10
⌖

User impact scoring

Rank by unique users affected, not occurrence count. 1000 users x 1 hit beats 1 user x 1000.

◐

Code path coverage

See which lines were executed in production. Ruby Coverage API, oneshot mode. Zero overhead when off.

v0.5.11
⊞

Multi-app support

Track multiple Rails apps in one dashboard. Auto-registration, data isolation, easy switching.

⏧

Sensitive data filtering

Passwords, tokens, secrets, API keys auto-scrubbed before storage. Lambda-based custom rules.

⌬

BRIN indexes

72KB vs 676MB B-tree on occurred_at. 70x faster time-range queries on large datasets.

Three steps. Five minutes.

1

Add to Gemfile

gem "rails_error_dashboard", "~> 0.14.2"
$ bundle install
2

Run installer

rails generate rails_error_dashboard:install
rails db:migrate
3

Open the dashboard

rails server
# → :3000/red

Stop paying
for error tracking.

Try the live demo. See all 30+ features in action. No signup. Walk away in 60 seconds — or stay forever.

Launch live demo → ★ Star on GitHub