From vanilla-rails
Use when writing background jobs or async operations - enforces thin job wrappers (3-5 lines) that delegate to models using _later/_now naming pattern
How this skill is triggered — by the user, by Claude, or both
Slash command
/vanilla-rails:jobsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**Jobs are thin wrappers (3-5 lines). ALL business logic lives in models.**
Jobs are thin wrappers (3-5 lines). ALL business logic lives in models.
# Model concern - WHERE THE LOGIC LIVES
module Card::ClosureNotifications
extend ActiveSupport::Concern
included do
after_update :notify_watchers_later, if: :just_closed?
end
def notify_watchers_later
Card::ClosureNotificationJob.perform_later(self)
end
def notify_watchers_now
watchers.each do |watcher|
CardMailer.closure_notification(watcher, self).deliver_now
Notification.create!(user: watcher, card: self, action: 'closed')
end
end
end
# Job - ONLY delegates (3 lines)
class Card::ClosureNotificationJob < ApplicationJob
def perform(card)
card.notify_watchers_now
end
end
Flow: Callback → _later → enqueue job → job calls _now → logic executes
_now synchronously — no job infrastructure needed_now in console, tests, anywhereMulti-model — primary model orchestrates:
class User::DigestJob < ApplicationJob
def perform(user); user.send_digest_now; end
end
Utility/cleanup — use class methods:
class Session::CleanupJob < ApplicationJob
def perform; Session.cleanup_expired_now; end
end
Error handling — ActiveJob retries + model errors:
class Card::SyncJob < ApplicationJob
retry_on ExternalAPI::Error, wait: 5.minutes
def perform(card); card.sync_to_external_system_now; end
end
| Red flag | Fix |
|---|---|
Job > 5 lines (excluding retry_on) | Move logic to model |
| Business logic in job | Move to _now method on model |
perform(card_id) then Card.find | perform(card) — let ActiveJob serialize |
No _later/_now naming | Add suffixes |
Missing _now method | Always create — needed for testing |
| Job sends emails directly | Model orchestrates, mailer delivers |
| Job has conditionals/loops | Domain logic goes in model |
_later method (enqueues)_now method (logic)npx claudepluginhub zemptime/zemptime-marketplace --plugin vanilla-railsCreates or refactors Rails Active Job background jobs using Rails 8 conventions, Solid Queue patterns, error handling, retry strategies, and design best practices.
Provides Laravel queue best practices: job structure, dispatch patterns, middleware, chaining, batching, retries, and error handling. Useful for reliable async task processing.
Implements background job processing with Bull/BullMQ (Node.js), Celery (Python), Sidekiq (Ruby), and cron. Covers prioritization, retries, dead letter queues, monitoring, rate limits, and shutdown for offloading tasks and pipelines.