Self-hosted Rails error monitoring — free, forever.
gem 'rails_error_dashboard'5-minute setup · Works out-of-the-box · 100% Rails + Postgres · No vendor lock-in
Full Documentation · Live Demo · RubyGems
rails-error-dashboard.anjan.dev — Username: gandalf · Password: youshallnotpass
Beta Software — Functional and tested (2,600+ tests passing), but the API may change before v1.0. Supports Rails 7.0-8.1 and Ruby 3.2-4.0.
Dashboard Overview — Real-time error stats, severity breakdown, and trend charts.
Error Detail — Full stack trace, cause chain, enriched context, and workflow management.
- Solo bootstrappers who need professional error tracking without recurring costs
- Indie SaaS founders building profitable apps on tight budgets
- Small dev teams (2-5 people) who hate SaaS bloat
- Privacy-conscious apps that need to keep error data on their own servers
- Side projects that might become real businesses
| Before | After |
|---|---|
| $29-99/month for error monitoring | $0/month — runs on your existing Rails server |
| Sensitive error data sent to third parties | All data stays on your infrastructure |
| SaaS pricing tiers and usage limits | Unlimited errors, unlimited projects |
| Vendor lock-in with proprietary APIs | 100% open source, fully portable |
| Complex SDK setup and external services | 5-minute Rails Engine installation |
| Pay extra for local variable capture (Sentry) | Local + instance variables included free |
| No tool detects silently rescued exceptions | Swallowed exception detection built in |
Error capture from controllers, jobs, and middleware. Beautiful Bootstrap 5 dashboard with dark/light mode, search, filtering, and real-time updates. Analytics with trend charts, severity breakdown, and spike detection. Workflow management with assignment, priority, snooze, comments, and batch operations. Security via HTTP Basic Auth or custom lambda (Devise, Warden, session-based). Exception cause chains, enriched HTTP context, custom fingerprinting, CurrentAttributes integration, auto-reopen on recurrence, and sensitive data filtering — all built in.
Breadcrumbs — Request Activity Trail
See exactly what happened before the crash — SQL queries, controller actions, cache operations, job executions, and mailer deliveries captured automatically via ActiveSupport::Notifications.
- Automatic capture — zero config beyond the enable flag
- N+1 query detection with aggregate patterns page
- Deprecation warnings with aggregate view
- Custom breadcrumbs via
RailsErrorDashboard.add_breadcrumb("checkout started", { cart_id: 123 }) - Safe by design — fixed-size ring buffer, thread-local, every subscriber wrapped in rescue
config.enable_breadcrumbs = trueSystem Health Snapshot
Know your app's runtime state at the moment of failure — GC stats, process memory, thread count, connection pool utilization, Puma thread stats, RubyVM cache health, and YJIT compilation stats captured automatically.
- Sub-millisecond total snapshot, every metric individually rescue-wrapped
- No ObjectSpace scanning, no Thread backtraces, no subprocess calls
- RubyVM.stat: constant cache invalidations, shape cache stats
- YJIT runtime stats: compiled iseqs, invalidation count, code region sizes
config.enable_system_health = trueN+1 Detection + Deprecation Warnings
Cross-error N+1 detection grouped by SQL fingerprint, and aggregate deprecation warnings with occurrence counts.
Requires breadcrumbs to be enabled.
Operational Health Panels — Jobs, Database, Cache
Job Health — Auto-detects Sidekiq, SolidQueue, or GoodJob. Per-error table with adapter badge, failed count (color-coded), sorted worst-first.
Database Health — PgHero-style live PostgreSQL stats (table sizes, unused indexes, dead tuples, vacuum timestamps) plus historical connection pool data from error snapshots.
Cache Health — Per-error cache performance sorted worst-first.
Source Code Integration + Git Blame
View actual source code directly in error backtraces with +/-7 lines of context. Git blame shows who last modified the code, when, and the commit message. Repository links jump to GitHub/GitLab/Bitbucket at the exact line.
config.enable_source_code_integration = true
config.enable_git_blame = trueError Replay — Copy as cURL / RSpec
Replay failing requests with one click. Copy the request as a cURL command or generate an RSpec test from the captured error context.
Notifications — Slack, Discord, PagerDuty, Email, Webhooks
Multi-channel alerting with severity filters, per-error cooldown, and milestone threshold alerts to prevent alert fatigue.
config.enable_slack_notifications = true
config.slack_webhook_url = ENV['SLACK_WEBHOOK_URL']Advanced Analytics
Seven analysis engines built in:
- Baseline Anomaly Alerts — Statistical spike detection (mean + std dev) with intelligent cooldown
- Fuzzy Error Matching — Jaccard similarity + Levenshtein distance to find related errors
- Co-occurring Errors — Detect errors that happen together within configurable time windows
- Error Cascade Detection — Identify chains (A causes B causes C) with probability and delays
- Error Correlation Analysis — Correlate errors with app versions, git commits, and users
- Platform Comparison — iOS vs Android vs Web health metrics side-by-side
- Occurrence Pattern Detection — Cyclical patterns (business hours, weekends) and burst detection
Local Variable + Instance Variable Capture
See the exact values of local variables and instance variables at the moment an exception was raised — the most valuable debugging context possible.
- TracePoint(
:raise) captures locals and ivars before the stack unwinds - Configurable limits: max variable count, nesting depth, string truncation length
- Sensitive data auto-filtered via Rails
filter_parameters— passwords, tokens, and PII never stored - Never stores Binding objects — values extracted immediately, Binding is GC'd
- Independent config flags: enable one or both
config.enable_local_variables = true
config.enable_instance_variables = trueSwallowed Exception Detection
Detect exceptions that are raised but silently rescued — the hardest bugs to find. No other error tracker does this.
- Uses TracePoint(
:raise) + TracePoint(:rescue) to track exception lifecycle - Identifies code paths where exceptions are caught but never logged or re-raised
- Dashboard page at
/errors/swallowed_exceptionsshows detection counts, locations, and patterns - Memory-bounded aggregation with background flush
- Requires Ruby 3.3+
config.detect_swallowed_exceptions = trueOn-Demand Diagnostic Dump
Snapshot your app's entire system state on demand — environment, GC stats, threads, connection pool, memory, job queue health, and more.
- Trigger via dashboard button or
rake rails_error_dashboard:diagnostic_dump - Dashboard page at
/errors/diagnostic_dumpswith full history - Useful for debugging intermittent production issues without reproducing them
config.enable_diagnostic_dump = trueRack Attack Event Tracking
Track Rack Attack security events (throttles, blocklists, tracks) as breadcrumbs attached to errors, with a dedicated summary page.
- Captures throttle, blocklist, and track events automatically
- Dashboard page at
/errors/rack_attack_summarywith event breakdown - Requires breadcrumbs to be enabled
config.enable_rack_attack_tracking = trueProcess Crash Capture
Capture unhandled exceptions that crash the Ruby process via an at_exit hook — the last line of defense.
- Disk-based fallback: writes crash data to disk because the database may be unavailable during shutdown
- Imported automatically on next boot
- Captures exception details, backtrace, uptime, GC stats, thread count, and cause chain
- A self-hosted only feature — impossible for SaaS tools
config.enable_crash_capture = truePlugin System
Event-driven extensibility with hooks for on_error_logged, on_error_resolved, on_threshold_exceeded. Built-in examples for Jira integration, metrics tracking, and audit logging.
class MyPlugin < RailsErrorDashboard::Plugin
def on_error_logged(error_log)
# Your custom logic
end
endgem 'rails_error_dashboard'bundle install
rails generate rails_error_dashboard:install
rails db:migrateThe installer guides you through optional feature selection — notifications, performance optimizations, advanced analytics. All features are opt-in.
http://localhost:3000/error_dashboard
Default credentials: gandalf / youshallnotpass
Change these before production! Edit config/initializers/rails_error_dashboard.rb
# In Rails console or any controller
raise "Test error from Rails Error Dashboard!"RailsErrorDashboard.configure do |config|
# Authentication
config.dashboard_username = ENV.fetch('ERROR_DASHBOARD_USER', 'gandalf')
config.dashboard_password = ENV.fetch('ERROR_DASHBOARD_PASSWORD', 'youshallnotpass')
# Or use your existing auth (Devise, Warden, etc.):
# config.authenticate_with = -> { warden.authenticated? }
# Optional features — enable as needed
config.enable_slack_notifications = true
config.slack_webhook_url = ENV['SLACK_WEBHOOK_URL']
config.async_logging = true
config.async_adapter = :sidekiq # or :solid_queue, :async
endComplete configuration guide →
Multi-App Support — Track errors from multiple Rails apps in a single shared database. Auto-detects app name, supports per-app filtering. Multi-App guide →
- Quickstart Guide — 5-minute setup
- Configuration — All configuration options
- Uninstalling — Clean removal
- Complete Feature List — Every feature explained
- Notifications — Multi-channel alerting
- Source Code Integration — Inline source + git blame
- Batch Operations — Bulk resolve/delete
- Real-Time Updates — Live dashboard
- Error Trends — Charts and analytics
- Multi-App Support — Track multiple applications
- Plugin System — Build custom integrations
- API Reference — Complete API documentation
- Customization — Customize everything
- Database Options — Separate database setup
- Database Optimization — Performance tuning
- Mobile App Integration — React Native, Flutter, etc.
- FAQ — Common questions answered
Built with CQRS (Command/Query Responsibility Segregation):
- Commands — LogError, ResolveError, BatchOperations (writes)
- Queries — ErrorsList, DashboardStats, Analytics (reads)
- Services — PlatformDetector, SimilarityCalculator (business logic)
- Plugins — Event-driven extensibility
2,600+ tests covering unit, integration, and browser-based system tests.
bundle exec rspec # Full suite
bundle exec rspec spec/system/ # System tests (Capybara + Cuprite)
HEADLESS=false bundle exec rspec spec/system/ # Visible browser- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Write tests, ensure all pass (
bundle exec rspec) - Commit and push
- Open a Pull Request
git clone https://github.com/AnjanJ/rails_error_dashboard.git
cd rails_error_dashboard
bin/setup # Installs deps, hooks, runs testsDevelopment guide → · Testing guide →
Available as open source under the MIT License.
Built with Rails · UI by Bootstrap 5 · Charts by Chart.js · Pagination by Pagy
Special thanks to @bonniesimon, @gundestrup, @midwire, and @RafaelTurtle. See CONTRIBUTORS.md for the full list.
If this gem saves you some headaches (or some money on error tracking SaaS), consider buying me a coffee. It keeps the project going and lets me know people are finding it useful.
Made with care by Anjan for the Rails community
One Gem to rule them all, One Gem to find them, One Gem to bring them all, and in the dashboard bind them.










