Rails Error Dashboard
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
⚠️ BETA SOFTWARE
This Rails Engine is in beta and under active development. While functional and tested (850+ tests passing), the API may change before v1.0.0. Use in production at your own discretion.
Supports: Rails 7.0 - 8.1 | Ruby 3.2+
🎯 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 (8 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.
8. Developer Insights 💡 AI-powered insights with severity detection, platform stability scoring, actionable recommendations, and recent error activity summaries.
🔌 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 (8 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.rbwith 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.
⚙️ 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 →
🚀 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']
📚 Documentation
Getting Started
- Quickstart Guide - Complete 5-minute setup
- Configuration - All configuration options
- Mobile App Integration - React Native, Flutter, etc.
Features
- Complete Feature List - Every feature explained
- Notifications - Multi-channel alerting
- Batch Operations - Bulk resolve/delete
- Real-Time Updates - Live dashboard
- Error Trend Visualizations - Charts & analytics
Advanced
- Plugin System - Build custom integrations
- API Reference - Complete API documentation
- Customization Guide - Customize everything
- Database Options - Separate database setup
- Database Optimization - Performance tuning
Development
- Testing - Multi-version testing
🏗️ 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:
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Write tests for your changes
- Ensure all tests pass (
bundle exec rspec) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - 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
- Built with Rails
- UI powered by Bootstrap 5
- Charts by Chart.js
- Pagination by Pagy
- Platform detection by Browser gem
💬 Support
- 📖 Documentation: docs/
- 🐛 Issues: GitHub Issues
- 💡 Discussions: GitHub Discussions
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. 🧙♂️