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, mute/unmute (notification suppression), 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 · Docs theme by Jekyll VitePress Theme by @crmne
Special thanks to @bonniesimon, @gundestrup, @midwire, @RafaelTurtle, and @j4rs. 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 ❤️ by Anjan
One Gem to rule them all, One Gem to find them, One Gem to bring them all, and in the dashboard bind them.











