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
🎯 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.
📈 Analytics & Insights
7-day trend charts, severity breakdown, spike detection, platform comparison, resolution rate tracking, user impact analysis.
🚨 Multi-Channel Alerting
Slack, Email, Discord, PagerDuty, and custom webhooks. Beautifully formatted messages with rich context, direct links to errors, customizable per channel.
⚡ Performance & Scalability
Async error logging, backtrace limiting (70-90% storage reduction), error sampling, database optimization with composite indexes, PostgreSQL GIN indexes.
🔌 Plugin System
Extensible architecture with event hooks. Built-in examples for Jira, metrics tracking, audit logging. Easy to create custom integrations.
🔒 Security & Privacy
HTTP Basic Auth, environment-based settings, optional separate database for isolation.
📚 View complete feature list →
📦 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
🏗️ 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
bundle install
# Run tests
bundle exec rspec
# Run tests for all Rails versions
bundle exec appraisal rspec
📝 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. 🧙♂️