Rails-native observability and control plane for the Solid Trifecta — Solid Queue, Solid Cache, and Solid Cable.
A mountable Rails engine that gives you a real-time dashboard and management UI with zero JavaScript dependencies.
Get SolidOps running in a fresh Rails app in under two minutes:
# 1. Add the gem
bundle add solid_ops
# 2. Run the installer (installs Solid Queue/Cache/Cable if missing)
bin/rails generate solid_ops:install --all
# 3. Update config/database.yml for multi-database (see "Database setup" below)
# 4. Create databases and run migrations (safe for existing apps — never drops data)
bin/rails db:prepare
# 5. Start your app and visit the dashboard
bin/rails server
# → http://localhost:3000/solid_opsThe dashboard works immediately — enqueue a job, write to cache, or broadcast on Cable, then refresh the SolidOps dashboard to see events flowing in.
Observability — automatic event capture via ActiveSupport instrumentation:
- Job lifecycle tracking (enqueue, perform_start, perform)
- Cache operation monitoring (read, write, delete with hit/miss rates)
- Cable broadcast tracking
- Correlation IDs across request → job → cache flows
- Configurable sampling, redaction, and retention
Queue Management (Solid Queue):
- Queue overview with pause/resume controls
- Job inspection, retry, and discard
- Failed jobs dashboard with bulk retry/discard
- Process monitoring (workers & supervisors)
- Recurring task browser
Cache Management (Solid Cache):
- Browse and search cache entries
- Inspect individual entries
- Delete entries or clear all
Channel Management (Solid Cable):
- Channel overview with message counts
- Message inspection per channel
- Trim old messages
Add to your Gemfile:
gem "solid_ops"Run the install generator:
bundle install
bin/rails generate solid_ops:installThe generator will ask if you want to install all Solid components. Say yes and it handles everything — adds the gems, runs their installers, and migrates all databases.
# Interactive — asks what you want
bin/rails generate solid_ops:install
# Install everything at once (no prompts)
bin/rails generate solid_ops:install --all
# Pick specific components
bin/rails generate solid_ops:install --queue # just Solid Queue
bin/rails generate solid_ops:install --queue --cache # Queue + CacheThe generator will:
- Create
config/initializers/solid_ops.rbwith all configuration options - Mount the engine at
/solid_opsin your routes - Add selected Solid gems to your
Gemfileand run their installers - Configure
development.rbandtest.rbwithconnects_tofor Solid Queue & Cache - Configure
cable.ymlto usesolid_cableadapter in development/test - Print
database.ymlchanges you need to apply (see below)
The Solid gem installers only configure database.yml for production. You need to update
your development and test sections to use multi-database so the Solid tables have their
own SQLite files.
Replace your development: and test: sections in config/database.yml.
SQLite:
development:
primary:
<<: *default
database: storage/development.sqlite3
queue:
<<: *default
database: storage/development_queue.sqlite3
migrations_paths: db/queue_migrate
cache:
<<: *default
database: storage/development_cache.sqlite3
migrations_paths: db/cache_migrate
cable:
<<: *default
database: storage/development_cable.sqlite3
migrations_paths: db/cable_migratePostgreSQL:
development:
primary:
<<: *default
database: myapp_development
queue:
<<: *default
database: myapp_development_queue
migrations_paths: db/queue_migrate
cache:
<<: *default
database: myapp_development_cache
migrations_paths: db/cache_migrate
cable:
<<: *default
database: myapp_development_cable
migrations_paths: db/cable_migrateMySQL:
development:
primary:
<<: *default
database: myapp_development
queue:
<<: *default
database: myapp_development_queue
migrations_paths: db/queue_migrate
cache:
<<: *default
database: myapp_development_cache
migrations_paths: db/cache_migrate
cable:
<<: *default
database: myapp_development_cable
migrations_paths: db/cable_migrateApply the same pattern for test:. Only include the queue:, cache:, and/or cable: entries for the components you installed.
Then create and prepare all databases:
bin/rails db:prepareAll options are documented in the generated initializer (config/initializers/solid_ops.rb):
SolidOps.configure do |config|
# Enable/disable event capture
config.enabled = true
# Sampling rate: 1.0 = everything, 0.1 = 10%
config.sample_rate = 1.0
# Auto-purge events older than this
config.retention_period = 7.days
# Maximum metadata payload size before truncation
config.max_payload_bytes = 10_000
# Strip sensitive data from metadata before storage
config.redactor = ->(meta) { meta.except(:password, :token, :secret) }
# Multi-tenant support
config.tenant_resolver = ->(request) { request.subdomain }
# Track which user triggered each event
config.actor_resolver = ->(request) { request.env["warden"]&.user&.id }
# Restrict access to the dashboard (nil = open to all)
config.auth_check = ->(controller) { controller.current_user&.admin? }
endImportant: If no auth_check is configured, SolidOps logs a prominent warning at boot:
[SolidOps] WARNING: No auth_check configured — the dashboard is publicly accessible.
Use auth_check to restrict access:
# Devise admin check
config.auth_check = ->(controller) { controller.current_user&.admin? }
# Basic HTTP auth
config.auth_check = ->(controller) {
controller.authenticate_or_request_with_http_basic do |user, pass|
user == "admin" && pass == Rails.application.credentials.solid_ops_password
end
}Old events are not purged automatically. Set up a recurring job or cron:
# In config/recurring.yml (Solid Queue)
solid_ops_purge:
class: SolidOps::PurgeJob
schedule: every day at 3am
# Or via rake
# crontab: 0 3 * * * cd /app && bin/rails solid_ops:purge- Authentication — configure
auth_checkin your initializer. Without it the dashboard is open to anyone who can reach the mount path. A boot-time warning is logged if unconfigured. - Running jobs — the Running Jobs page uses
COUNT(*)for the total and caps the displayed list at 500 rows to avoid loading thousands of records into memory. - Bulk operations —
Retry Allprocesses failed jobs in batches of 100.Clear All(cache) deletes in batches of 1,000. Neither locks the table for the full duration. - Availability checks —
solid_queue_available?,solid_cache_available?, andsolid_cable_available?are memoized per-process (one schema query at boot, not per request). - Event recording — all
record_event!calls are wrapped inrescueand will never crash your application. A warning is logged on failure. - CSS isolation — all styles are scoped to
.solid-opsvia Tailwind'simportantselector strategy with Preflight disabled. No global CSS leaks into your host app.
- Ruby >= 3.2
- Rails >= 7.1
- At least one of:
solid_queue,solid_cache,solid_cable
SolidOps gracefully handles missing Solid components — pages for unconfigured components show a clear message instead of erroring.
The engine mounts at /solid_ops by default. Available pages:
| Path | Description |
|---|---|
/solid_ops |
Main dashboard with event breakdown |
/solid_ops/dashboard/jobs |
Job event analytics |
/solid_ops/dashboard/cache |
Cache hit/miss analytics |
/solid_ops/dashboard/cable |
Cable broadcast analytics |
/solid_ops/events |
Event explorer with filtering |
/solid_ops/queues |
Queue management (pause/resume) |
/solid_ops/jobs/running |
Currently executing jobs |
/solid_ops/jobs/failed |
Failed jobs (retry/discard) |
/solid_ops/processes |
Active workers & supervisors |
/solid_ops/recurring-tasks |
Recurring task browser |
/solid_ops/cache |
Cache entry browser |
/solid_ops/channels |
Cable channel browser |
git clone https://github.com/h0m1c1de/solid_ops.git
cd solid_ops
bin/setup
rake specThe dashboard UI is styled with Tailwind CSS, compiled at release time into a single static stylesheet. The gem ships pre-built CSS — no Node.js, Tailwind, or build step is needed at deploy time.
If you modify any view templates, rebuild the CSS before committing:
npm install # first time only
./bin/build_css # compiles app/assets/stylesheets/solid_ops/application.cssRequires Node.js (for npx tailwindcss@3). The compiled CSS is checked into git so consumers of the gem never need Node.
Bug reports and pull requests are welcome on GitHub at https://github.com/h0m1c1de/solid_ops. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.
The gem is available as open source under the terms of the MIT License.