Project

bugstack

0.0
A long-lived project that still receives updates
Capture, report, and auto-fix production errors with BugStack. Zero runtime dependencies. Framework integrations for Rails, Sinatra, and more.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

~> 13.0
~> 3.12
~> 1.50
~> 3.18
 Project Readme

bugstack-ruby

Official Ruby SDK for BugStack — capture, report, and auto-fix production errors.

Gem Version License: MIT

Installation

gem "bugstack"

Or install directly:

gem install bugstack

Quick Start

require "bugstack"

Bugstack.init(api_key: "bs_live_...")

begin
  risky_operation
rescue => e
  Bugstack.capture_exception(e)
end

Block Configuration

Bugstack.init do |config|
  config.api_key = "bs_live_..."
  config.environment = "production"
  config.auto_fix = true
  config.debug = true
end

Framework Integrations

Rails

Add to your Gemfile:

gem "bugstack"

Create an initializer:

# config/initializers/bugstack.rb
Bugstack.init do |config|
  config.api_key = Rails.application.credentials.bugstack_api_key
  config.environment = Rails.env
  config.auto_fix = true
end

The Railtie automatically inserts Rack middleware for exception capture.

Sinatra

require "sinatra"
require "bugstack"
require "bugstack/integrations/sinatra"

Bugstack.init(api_key: "bs_live_...")

class MyApp < Sinatra::Base
  register Bugstack::Integrations::Sinatra

  get "/" do
    "Hello!"
  end
end

Generic (at_exit hook)

require "bugstack"
require "bugstack/integrations/generic"

Bugstack.init(api_key: "bs_live_...")
Bugstack::Integrations::Generic.install!

Configuration

Bugstack.init do |config|
  config.api_key = "bs_live_..."        # Required
  config.environment = "production"     # Default: "production"
  config.auto_fix = true                # Enable AI-powered auto-fix
  config.debug = false                  # Log SDK activity
  config.dry_run = false                # Log without sending
  config.enabled = true                 # Kill switch
  config.deduplication_window = 300     # Seconds (default: 5 min)
  config.timeout = 5.0                  # HTTP timeout in seconds
  config.max_retries = 3                # Retry attempts
  config.ignored_errors = [             # Errors to skip
    SystemExit,
    SignalException,
    "expected error message",
  ]
  config.before_send = ->(event) {      # Inspect/modify/drop events
    event  # return nil to drop
  }
end

Data Transparency

before_send Hook

Bugstack.init do |config|
  config.api_key = "bs_live_..."
  config.before_send = ->(event) {
    # Drop health check errors
    return nil if event.request&.dig(:route)&.include?("/health")

    # Redact sensitive data
    event.metadata.delete("secret")

    event
  }
end

dry_run Mode

Bugstack.init(api_key: "bs_live_...", dry_run: true)
# Prints: [BugStack DryRun] Would send: { ... }

What Gets Sent

{
  "apiKey": "bs_live_...",
  "error": {
    "message": "undefined method 'foo' for nil",
    "stackTrace": "NoMethodError: undefined method...",
    "file": "app/controllers/users_controller.rb",
    "function": "show",
    "fingerprint": "a1b2c3d4e5f6g7h8"
  },
  "environment": {
    "language": "ruby",
    "languageVersion": "3.2.0",
    "framework": "rails",
    "frameworkVersion": "7.1.0",
    "os": "x86_64-linux",
    "sdkVersion": "1.0.0"
  },
  "timestamp": "2026-01-15T08:30:00Z"
}

Zero runtime gem dependencies. No cookies, IP addresses, or user data.

License

MIT — see LICENSE.