MissionControl::Jobs::Theme
A drop-in visual theme for MissionControl::Jobs — emerald color palette, refined typography, and JSON syntax highlighting. No view overrides, no asset pipeline dependency — just Rack middleware that injects a stylesheet into HTML responses.
Screenshots
Jobs list
Job details
Worker overview
Requirements
- Ruby 3.4+
- Rails 8.1+
- mission_control-jobs >= 1.1
Note: Tested with Ruby 3.4, Rails 8.1, and mission_control-jobs 1.1. Earlier versions may work but are not part of the test matrix yet.
Installation
Add to your Gemfile:
gem "mission_control-jobs-theme"Then run:
bundle installThe theme is active immediately — no configuration required.
How it works
The gem inserts Rack middleware that intercepts HTML responses from the MissionControl::Jobs engine and injects a custom stylesheet (plus optional PrismJS syntax highlighting) before </head>. Assets are served via Rack::Static independently of the host app's asset pipeline — no Propshaft or Sprockets integration required. The CSS overrides Bulma variables and component styles, so the theme stays functional even if upstream markup changes.
Configuration
To customize the defaults, generate an initializer:
bin/rails generate mission_control:jobs:theme:installThis creates config/initializers/mission_control_jobs_theme.rb:
MissionControl::Jobs::Theme.configure do |config|
# Mount path for MissionControl::Jobs::Engine (auto-discovered by default)
# config.mount_path = "/jobs"
# PrismJS syntax highlighting for JSON blocks on detail pages
# config.syntax_highlighting = true
end| Option | Default | Description |
|---|---|---|
mount_path |
nil (auto-discovered) |
Override the path where MissionControl::Jobs::Engine is mounted. When nil, the gem walks Rails.application.routes to find it automatically, falling back to /jobs. |
syntax_highlighting |
true |
Enable PrismJS JSON syntax highlighting on job detail pages. Set to false to inject only the CSS theme. |
Compatibility
- Designed for MissionControl::Jobs 1.1+ which uses Bulma for its UI. The theme overrides Bulma variables and component styles.
- Works with Propshaft and Sprockets — the gem serves its own assets via
Rack::Staticand does not depend on the host app's asset pipeline. - Turbo Drive and Turbo Stream responses pass through without modification.
- Tested with Solid Queue. Resque should mostly work since the theme is CSS-only, but some adapter-specific views may not be fully styled yet.
Troubleshooting
Theme not appearing
- Verify the middleware is loaded — check that
MissionControl::Jobs::Theme::Middlewareappears inbin/rails middlewareoutput. - Check mount path detection in the console:
If it returns an unexpected path, set
MissionControl::Jobs::Theme::RouteDiscovery.discover(Rails.application.routes)
config.mount_pathexplicitly in the initializer. - Ensure the engine is mounted in
config/routes.rb:mount MissionControl::Jobs::Engine, at: "/jobs"
Apps served under a sub-URI
If your Rails app is deployed under a prefix such as /internal, the /mission_control/... asset URLs injected by the middleware will not include the prefix. Sub-URI support is not yet available.
Stale assets after upgrade
Theme assets are served with immutable cache headers (1-year max-age). After upgrading the gem, browsers may serve stale files. Hard-refresh (Ctrl+Shift+R) or clear the browser cache.
Contributing
Contributions of any kind are appreciated — whether it's a bug report, feature idea, or pull request. Feel free to open an issue or submit a PR.
bin/setup # Install dependencies
bundle exec rspec # Run the test suite
bundle exec rubocop # Run the linter
bin/console # Interactive promptLicense
The gem is available as open source under the terms of the MIT License.
This gem bundles the following third-party assets:
-
Albert Sans — SIL Open Font License 1.1 (
vendor/assets/mission_control/fonts/Albert_Sans/OFL.txt) -
Archivo Narrow — SIL Open Font License 1.1 (
vendor/assets/mission_control/fonts/Archivo_Narrow/OFL.txt) - PrismJS — MIT License


