No release in over 3 years
Own your errors. Own your stack. A fully open-source, self-hosted error dashboard for solo founders, indie hackers, and small teams. Professional error tracking with beautiful UI, multi-channel notifications (Slack, Email, Discord, PagerDuty), platform detection (iOS/Android/Web/API), and analytics. 5-minute setup, works out-of-the-box. Rails 7.0-8.1 compatible. โš ๏ธ BETA: API may change before v1.0.0. ๐ŸŽฎ Live demo: https://rails-error-dashboard.anjan.dev (gandalf/youshallnotpass)
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

Runtime

~> 6.0
~> 1.3.0, < 1.3.7
~> 6.0
~> 9.0
>= 7.0.0
~> 5.0
>= 0.24.0
 Project Readme

Rails Error Dashboard

Gem Version License: MIT Tests

Self-hosted Rails error monitoring โ€” free, forever.

Own your errors. Own your stack. Zero monthly fees.

A fully open-source, self-hosted error dashboard for solo founders, indie hackers, and small teams who want complete control without the SaaS bills.

gem 'rails_error_dashboard'

5-minute setup ยท Works out-of-the-box ยท 100% Rails + Postgres ยท No vendor lock-in

๐Ÿ“– Full Documentation ยท ๐ŸŽฎ Live Demo ยท ๐Ÿ’Ž RubyGems

๐ŸŽฎ Try the Live Demo

See it in action: https://rails-error-dashboard.anjan.dev

Username: gandalf ยท Password: youshallnotpass

Experience the full dashboard with 250+ realistic Rails errors, LOTR-themed demo data, and all features enabled.


โš ๏ธ BETA SOFTWARE

This Rails Engine is in beta and under active development. While functional and tested (935+ tests passing), the API may change before v1.0.0. Use in production at your own discretion.

Supports: Rails 7.0 - 8.0 (+ edge 8.1) | Ruby 3.2 - 3.4


๐ŸŽฏ Who This Is For

โœ“ 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


๐Ÿ’ฐ What It Replaces

Before After
Pay $29-99/month for error monitoring $0/month - runs on your existing Rails server
Send sensitive error data to third parties Keep all data on your infrastructure
Fight with SaaS pricing tiers and limits Unlimited errors, unlimited projects
Vendor lock-in with proprietary APIs 100% open source, fully portable
Complex setup with SDKs and external services 5-minute Rails Engine installation

๐Ÿš€ Why Choose Rails Error Dashboard

"Install once, own it forever"

  • โœ… Zero recurring costs - One-time setup, runs on your existing infrastructure
  • โœ… 5-minute installation - Mount the Rails Engine, run migrations, done
  • โœ… Works immediately - Automatic error capture from Rails controllers, jobs, models
  • โœ… Beautiful UI - Professional dashboard you can show to clients
  • โœ… Full control - Your data stays on your server, modify anything you want
  • โœ… No surprises - Open source MIT license, no hidden fees or limits

Built for developers who:

  • Want professional error monitoring without the SaaS tax
  • Need to debug production issues without paying per error
  • Value data privacy and server ownership
  • Prefer simple, Rails-native solutions

โœจ Features

Core Features (Always Enabled)

๐ŸŽฏ Complete Error Tracking

Automatic error capture from Rails controllers, jobs, and middleware. Frontend & mobile support for React, React Native, Vue, Angular, Flutter. Platform detection (iOS/Android/Web/API), user context tracking, full stack traces.

๐Ÿ“Š Beautiful Dashboard

Modern Bootstrap 5 UI with dark/light mode, responsive design, real-time statistics, search and filtering, fast pagination. Overview dashboard with critical alerts, error trend charts, and platform health summary.

๐Ÿ“ˆ Analytics & Insights

7-day trend charts, severity breakdown, spike detection, resolution rate tracking, user impact analysis. Comprehensive analytics page with hourly patterns, mobile vs API breakdowns, and top affected users.

๐Ÿ”ง Workflow Management

Error assignment and status tracking, priority levels (critical/high/medium/low), snooze functionality, comment threads, batch operations (bulk resolve/delete), resolution tracking with references.

๐Ÿ”’ Security & Privacy

HTTP Basic Auth, environment-based settings, optional separate database for isolation. Your data stays on your server - no third-party access.

Optional Features (Choose During Install)

๐Ÿšจ Multi-Channel Notifications

  • Slack - Rich formatted messages with error context and direct dashboard links
  • Email - HTML formatted alerts with full error details
  • Discord - Embedded messages with severity color coding
  • PagerDuty - Critical error escalation with incident management
  • Webhooks - Custom integrations with any service (JSON payloads)

โšก Performance Optimizations

  • Async Logging - Non-blocking error capture using ActiveJob (Sidekiq/SolidQueue/Async)
  • Error Sampling - Reduce storage by sampling high-frequency errors
  • Backtrace Limiting - Save 70-90% storage with smart truncation
  • Separate Database - Isolate error data for better performance
  • Database Indexes - Composite indexes and PostgreSQL GIN full-text search

๐Ÿง  Advanced Analytics (7 Powerful Features)

1. Baseline Anomaly Alerts ๐Ÿ”” Automatically detect unusual error rate spikes using statistical analysis (mean + std dev). Get proactive notifications when errors exceed expected baselines with intelligent cooldown to avoid alert fatigue.

2. Fuzzy Error Matching ๐Ÿ” Find similar errors across different error hashes using Jaccard similarity (70%) and Levenshtein distance (30%). Discover related errors that share common root causes even when they manifest differently.

3. Co-occurring Errors ๐Ÿ”— Detect errors that happen together within configurable time windows (default: 5 minutes). Identify patterns where one error frequently triggers another, helping you prioritize fixes.

4. Error Cascade Detection โ›“๏ธ Identify error chains (A causes B causes C) with probability calculations and average delays. Visualize parentโ†’child relationships to understand cascading failures and fix root causes.

5. Error Correlation Analysis ๐Ÿ“Š Correlate errors with app versions, git commits, and users. Find problematic releases, identify users affected by multiple error types, and detect time-based patterns.

6. Platform Comparison ๐Ÿ“ฑ Compare iOS vs Android vs Web health metrics side-by-side. Platform-specific error rates, severity distributions, resolution times, and stability scores (0-100).

7. Occurrence Pattern Detection ๐Ÿ“ˆ Detect cyclical patterns (business hours, nighttime, weekend rhythms) and error bursts (many errors in short time). Understand when and how your errors happen.

Plus: Developer Insights Dashboard ๐Ÿ’ก Built-in analytics dashboard with severity detection, platform stability scoring, actionable recommendations, and recent error activity summaries (always available, no configuration needed).

๐Ÿ” Source Code Integration (NEW!)

View actual source code directly in error backtraces - no need to switch to your editor or GitHub.

  • Inline Source Code Viewer - Click "View Source" on any error frame to see the actual code with ยฑ7 lines of context
  • Git Blame Integration - See who last modified the code, when, and the commit message
  • Repository Links - Jump directly to GitHub/GitLab/Bitbucket at the exact error line
  • Smart Caching - Fast performance with 1-hour cache (configurable)
  • Security Controls - Only shows your app code by default (not gems/frameworks)

Perfect for debugging:

  • Understand the code context without leaving the dashboard
  • Identify code ownership with git blame
  • Quick navigation to your repository
  • See recent changes that might have caused the error
# Enable in config/initializers/rails_error_dashboard.rb
config.enable_source_code_integration = true
config.source_code_context_lines = 7
config.enable_git_blame = true
config.git_repository_url = "https://github.com/user/repo"

๐Ÿ“– Complete documentation โ†’

๐Ÿ”Œ Plugin System

Extensible architecture with event hooks (on_error_logged, on_error_resolved, on_threshold_exceeded). Built-in examples for Jira integration, metrics tracking, audit logging. Easy to create custom plugins - just drop a file in config/initializers/error_dashboard_plugins/.

๐Ÿ“š View complete feature list with examples โ†’


๐Ÿ“ฆ Quick Start

1. Add to Gemfile

gem 'rails_error_dashboard'

2. Install with Interactive Setup

bundle install
rails generate rails_error_dashboard:install
rails db:migrate

The installer will guide you through optional feature selection:

  • Notifications (Slack, Email, Discord, PagerDuty, Webhooks)
  • Performance (Async Logging, Error Sampling, Separate Database)
  • Advanced Analytics (7 powerful features including baseline alerts, fuzzy matching, platform comparison)

All features are opt-in - choose what you need during installation, or enable/disable them later in the initializer.

This will:

  • Create config/initializers/rails_error_dashboard.rb with your selected features
  • Copy database migrations
  • Mount the engine at /error_dashboard

3. Visit your dashboard

Start your server and visit:

http://localhost:3000/error_dashboard

Default credentials:

  • Username: gandalf
  • Password: youshallnotpass

โš ๏ธ Change these before production! Edit config/initializers/rails_error_dashboard.rb

4. Test it out

Trigger a test error to see it in action:

# In Rails console or any controller
raise "Test error from Rails Error Dashboard!"

The error will appear instantly in your dashboard with full context, backtrace, and platform information.

๐Ÿ“˜ Full installation guide โ†’


๐Ÿ—‘๏ธ Uninstalling

Need to remove Rails Error Dashboard? We've made it simple with both automated and manual options:

# Automated uninstall (recommended)
rails generate rails_error_dashboard:uninstall

# Keep error data, remove code
rails generate rails_error_dashboard:uninstall --keep-data

# Show manual instructions only
rails generate rails_error_dashboard:uninstall --manual-only

The uninstaller will:

  • โœ… Show exactly what will be removed
  • โœ… Ask for confirmation before making changes
  • โœ… Remove initializer, routes, and migrations
  • โœ… Optionally drop database tables (with double confirmation)
  • โœ… Provide clear next steps

๐Ÿ“˜ Complete uninstall guide โ†’


โš™๏ธ Configuration

Opt-in Feature System

Rails Error Dashboard uses an opt-in architecture - core features (error capture, dashboard UI, analytics) are always enabled, while everything else is disabled by default.

Tier 1 Features (Always ON):

  • โœ… Error capture (controllers, jobs, middleware)
  • โœ… Dashboard UI with search and filtering
  • โœ… Real-time updates
  • โœ… Analytics and trend charts

Optional Features (Choose During Install):

  • ๐Ÿ“ง Multi-channel notifications (Slack, Email, Discord, PagerDuty, Webhooks)
  • โšก Performance optimizations (Async logging, Error sampling)
  • ๐Ÿ“Š Advanced analytics (Baseline alerts, Fuzzy matching, Platform comparison, and more)

Basic Configuration

Edit config/initializers/rails_error_dashboard.rb:

RailsErrorDashboard.configure do |config|
  # ============================================================================
  # AUTHENTICATION (Always Required)
  # ============================================================================
  config.dashboard_username = ENV.fetch('ERROR_DASHBOARD_USER', 'gandalf')
  config.dashboard_password = ENV.fetch('ERROR_DASHBOARD_PASSWORD', 'youshallnotpass')

  # ============================================================================
  # OPTIONAL FEATURES (Enable as needed)
  # ============================================================================

  # Slack notifications (if enabled during install)
  config.enable_slack_notifications = true
  config.slack_webhook_url = ENV['SLACK_WEBHOOK_URL']

  # Email notifications (if enabled during install)
  config.enable_email_notifications = true
  config.notification_email_recipients = ["dev@yourapp.com"]
  config.notification_email_from = "errors@yourapp.com"

  # Async logging for better performance (if enabled during install)
  config.async_logging = true
  config.async_adapter = :sidekiq  # or :solid_queue, :async

  # Advanced analytics features (if enabled during install)
  config.enable_baseline_alerts = true
  config.enable_similar_errors = true
  config.enable_platform_comparison = true
end

All features can be toggled on/off at any time by editing the initializer.

Environment Variables

# .env
ERROR_DASHBOARD_USER=your_username
ERROR_DASHBOARD_PASSWORD=your_secure_password
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URL
DASHBOARD_BASE_URL=https://yourapp.com

๐Ÿ“– Complete configuration guide โ†’


๐Ÿข Multi-App Support

Rails Error Dashboard supports logging errors from multiple Rails applications to a single shared database.

This is ideal for:

  • Managing errors across microservices
  • Monitoring production, staging, and development environments separately
  • Tracking different apps from a central dashboard
  • Organizations running multiple Rails applications

Automatic Configuration

By default, the dashboard automatically detects your application name from Rails.application.class.module_parent_name:

# BlogApp::Application โ†’ "BlogApp"
# AdminPanel::Application โ†’ "AdminPanel"
# ApiService::Application โ†’ "ApiService"

No configuration needed! Each app will automatically register itself when logging its first error.

Manual Override

Override the auto-detected name if desired:

# config/initializers/rails_error_dashboard.rb
RailsErrorDashboard.configure do |config|
  config.application_name = "MyCustomAppName"
end

Or use an environment variable:

# .env
APPLICATION_NAME="Production API"

This allows you to use different names for different environments:

# Production
APPLICATION_NAME="MyApp-Production"

# Staging
APPLICATION_NAME="MyApp-Staging"

# Development
APPLICATION_NAME="MyApp-Development"

Shared Database Setup

All apps must use the same error dashboard database. Configure your database.yml:

# config/database.yml
production:
  primary:
    database: my_app_production
    # ... other connection settings

  error_dashboard:
    database: shared_error_dashboard_production
    host: error-db.example.com
    # ... other connection settings

Then in your initializer:

# config/initializers/rails_error_dashboard.rb
RailsErrorDashboard.configure do |config|
  config.database = :error_dashboard  # Use the shared database
end

Dashboard UI Features

Navbar Application Switcher:

  • Quick dropdown to switch between applications
  • Shows "All Apps" by default
  • Only appears when multiple apps are registered

Filter Form:

  • Filter errors by specific application
  • Combine with other filters (error type, platform, etc.)
  • Active filter pills show current selection

Application Column:

  • Displays application name for each error
  • Only shown when viewing "All Apps"
  • Hidden when filtered to a single app

Per-App Error Tracking

Errors are tracked independently per application:

# Same error in different apps creates separate records
# App A: StandardError "Database timeout" โ†’ Error #1
# App B: StandardError "Database timeout" โ†’ Error #2

# Each has its own:
# - Occurrence counts
# - Resolution status
# - Comments and history
# - Analytics and trends

API Usage

When logging errors via API, specify the application:

RailsErrorDashboard::Commands::LogError.call(
  error_type: "TypeError",
  message: "Cannot read property 'name' of null",
  platform: "iOS",
  # ... other parameters
)
# Uses config.application_name automatically

Or override per-error (advanced):

# Create application first
app = RailsErrorDashboard::Application.find_or_create_by!(name: "Mobile App")

# Then create error
RailsErrorDashboard::ErrorLog.create!(
  application: app,
  error_type: "NetworkError",
  message: "Request failed",
  # ... other fields
)

Performance & Concurrency

Multi-app support is designed for high-concurrency scenarios:

โœ… Row-level locking - No table locks, apps write independently โœ… Cached lookups - Application names cached for 1 hour โœ… Composite indexes - Fast filtering on [application_id, occurred_at] โœ… Per-app deduplication - Same error in different apps tracked separately โœ… No deadlocks - Scoped locking prevents cross-app conflicts

Benchmark: Tested with 5 apps writing 1000 errors/sec with zero deadlocks.

Rake Tasks

Manage applications via rake tasks:

# List all registered applications
rails error_dashboard:list_applications

# Backfill application for existing errors
rails error_dashboard:backfill_application APP_NAME="Legacy App"

Migration Guide

If you have existing errors before enabling multi-app support:

  1. Run migrations: rails db:migrate
  2. Backfill existing errors:
    rails error_dashboard:backfill_application APP_NAME="My App"
  3. All existing errors will be assigned to "My App"
  4. New applications will auto-register on first error

Zero downtime - Errors can continue logging during migration.


๐Ÿš€ Usage

Automatic Error Tracking

Rails Error Dashboard automatically tracks errors from:

  • Controllers (via Rails error reporting)
  • Background jobs (ActiveJob, Sidekiq)
  • Rack middleware (catches everything else)

No additional code needed! Just install and it works.

Manual Error Logging

For frontend/mobile apps or custom error logging:

# From your Rails API
RailsErrorDashboard::Commands::LogError.call(
  error_type: "TypeError",
  message: "Cannot read property 'name' of null",
  backtrace: ["App.js:42", "index.js:12"],
  platform: "iOS",
  app_version: "2.1.0",
  user_id: current_user.id,
  context: {
    component: "ProfileScreen",
    device_model: "iPhone 14 Pro"
  }
)

Frontend Integration

// React Native example
try {
  // Your code
} catch (error) {
  fetch('https://yourapp.com/api/errors', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      error_type: error.name,
      message: error.message,
      backtrace: error.stack.split('\n'),
      platform: Platform.OS, // 'ios' or 'android'
      app_version: VERSION
    })
  });
}

๐Ÿ“ฑ Mobile app integration guide โ†’


๐Ÿ”” Notifications

Set up multi-channel notifications in minutes:

Slack

config.enable_slack_notifications = true
config.slack_webhook_url = ENV['SLACK_WEBHOOK_URL']

Discord

config.enable_discord_notifications = true
config.discord_webhook_url = ENV['DISCORD_WEBHOOK_URL']

PagerDuty (Critical Errors Only)

config.enable_pagerduty_notifications = true
config.pagerduty_integration_key = ENV['PAGERDUTY_INTEGRATION_KEY']

Custom Webhooks

config.enable_webhook_notifications = true
config.webhook_urls = ['https://yourapp.com/hooks/errors']

๐Ÿ”• Notification setup guide โ†’


๐Ÿ“š Documentation

Getting Started

Features

Advanced

Development

๐Ÿ“– View all documentation โ†’


๐Ÿ—๏ธ Architecture

Built with Service Objects + CQRS Principles:

  • Commands: LogError, ResolveError, BatchOperations (write operations)
  • Queries: ErrorsList, DashboardStats, Analytics (read operations)
  • Value Objects: ErrorContext (immutable data)
  • Services: PlatformDetector, SimilarityCalculator (business logic)
  • Plugins: Event-driven extensibility

Clean, maintainable, testable architecture you can understand and modify.


๐Ÿค Contributing

We welcome contributions! Here's how to get started:

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Write tests for your changes
  4. Ensure all tests pass (bundle exec rspec)
  5. Commit your changes (git commit -m 'Add amazing feature')
  6. Push to the branch (git push origin feature/amazing-feature)
  7. Open a Pull Request

Development Setup

git clone https://github.com/AnjanJ/rails_error_dashboard.git
cd rails_error_dashboard

# Automated setup (installs deps, hooks, runs tests)
bin/setup

# Or manual setup
bundle install
bundle exec lefthook install  # Installs git hooks
bundle exec rspec

Git Hooks: We use Lefthook to run quality checks before commit/push. This ensures CI passes and saves GitHub Actions minutes!

๐Ÿ”ง Development guide โ†’ | ๐Ÿงช Testing guide โ†’


๐Ÿ“ License

Rails Error Dashboard is available as open source under the terms of the MIT License.


๐Ÿ™ Acknowledgments


โ“ Frequently Asked Questions

Is this production-ready?

This is currently in beta but actively tested with 935+ passing tests across Rails 7.0-8.0 and Ruby 3.2-3.4. Many users are running it in production. See production requirements.

How does this compare to Sentry/Rollbar/Honeybadger?

Similar: Error tracking, grouping, notifications, dashboards Better: 100% free, self-hosted (your data stays with you), no usage limits, Rails-optimized Trade-offs: You manage hosting/backups, fewer integrations than commercial services

See full comparison.

What's the performance impact?

Minimal with async logging enabled:

  • Synchronous: ~10-50ms per error (blocks request)
  • Async (recommended): ~1-2ms (queues to background job)
  • Sampling: Log only 10% of non-critical errors for high-traffic apps

See Performance Guide.

Can I use a separate database?

Yes! Configure in your initializer:

RailsErrorDashboard.configure do |config|
  config.database = :errors  # Use separate database
end

See Database Options Guide.

How do I migrate from Sentry/Rollbar?
  1. Install Rails Error Dashboard
  2. Run both systems in parallel (1-2 weeks)
  3. Verify all errors are captured
  4. Remove old error tracking gem
  5. Update team documentation

Historical data cannot be imported (different formats).

Does it work with API-only Rails apps?

Yes! The error logging works in API-only mode. The dashboard UI requires a browser but can be:

  • Mounted in a separate admin app
  • Run in a separate Rails instance pointing to the same database
  • Accessed via SSH tunnel

See API-only setup.

How do I track multiple Rails apps?

Automatic! Just set APP_NAME environment variable:

# App 1
APP_NAME=my-api rails server

# App 2
APP_NAME=my-admin rails server

All apps share the same dashboard. See Multi-App Guide.

Can I customize error severity levels?

Yes! Configure custom rules in your initializer:

RailsErrorDashboard.configure do |config|
  config.custom_severity_rules = {
    /ActiveRecord::RecordNotFound/ => :low,
    /Stripe::/ => :critical
  }
end

See Customization Guide.

How long are errors stored?

Forever by default (no automatic deletion). Manual cleanup with rake task:

# Delete resolved errors older than 90 days
rails error_dashboard:cleanup_resolved DAYS=90

# Filter by application name
rails error_dashboard:cleanup_resolved DAYS=30 APP_NAME="My App"

Or schedule with cron/whenever. See Database Optimization.

Can I get Slack/Discord notifications?

Yes! Enable during installation or configure manually:

RailsErrorDashboard.configure do |config|
  config.enable_slack_notifications = true
  config.slack_webhook_url = ENV['SLACK_WEBHOOK_URL']
end

Supports Slack, Discord, Email, PagerDuty, and custom webhooks. See Notifications Guide.

Does it work with Turbo/Hotwire?

Yes! Includes Turbo Streams support for real-time updates. Errors appear in the dashboard instantly without page refresh.

How do I report errors from mobile apps (React Native/Flutter)?

Make HTTP POST requests to your Rails API:

// React Native example
fetch('https://api.example.com/error_dashboard/api/v1/errors', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Basic ' + btoa('admin:password')
  },
  body: JSON.stringify({
    error_class: 'TypeError',
    message: 'Cannot read property...',
    platform: 'iOS'
  })
});

See Mobile App Integration.

Can I build custom integrations?

Yes! Use the plugin system:

class MyCustomPlugin < RailsErrorDashboard::Plugin
  def on_error_logged(error_log)
    # Your custom logic
  end
end

RailsErrorDashboard::PluginRegistry.register(MyCustomPlugin.new)

See Plugin System Guide.

What if I need help?

๐Ÿ’ฌ Support


๐Ÿ™ Contributors

Thank you to everyone who has contributed to Rails Error Dashboard!

Contributors

Special thanks to:

See CONTRIBUTORS.md for the complete list of contributors and their contributions.

Want to contribute? Check out our Contributing Guide!


Made with โค๏ธ 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. ๐Ÿง™โ€โ™‚๏ธ