Apply best practices for Rails background jobs using simple orchestration, idempotency, and safe retries. Use when creating, refactoring, or debugging Active Job and queue-backed workflows.
Automate repetitive workflows and reduce manual effort
Example: Generate reports, summarize documents, draft communications
Save 3-5 hours per week on routine tasks
Learn new skills, understand complex topics, get expert guidance
Example: Explain concepts, provide examples, suggest learning resources
Accelerate learning and skill development by 2x
Enhance output quality through reviews, suggestions, and refinements
Example: Review drafts, suggest improvements, catch errors
Improve work quality by 30-40% with less effort
Time estimate: 15-45 minutes depending on use case complexity
Prerequisites
Submit your Claude Code skill and start earning
epx add marckohlbrugge/37signals-skills/rails-jobsCompatible with
Supported agents
| name | rails-jobs |
| description | Apply best practices for Rails background jobs using simple orchestration, idempotency, and safe retries. Use when creating, refactoring, or debugging Active Job and queue-backed workflows. |
| disable-model-invocation | true |
Use for background job design and review. Patterns from Campfire (Resque, 4 thin jobs) and Fizzy (Solid Queue, multi-queue).
def perform(card) = card.notify_recipients.RecordNotUnique in the domain op).ActiveJob::Base.enqueue_after_transaction_commit = true in app defaults — fixes job-before-data races at the root.SOLID_QUEUE_IN_PUMA) in small deployments._later enqueues, plain name does the work, _now when you need an explicit synchronous twin:def notify_recipients # the work — public API the job calls
def notify_recipients_later # enqueues NotifyRecipientsJob (often private, called from callbacks)
Mention::CreateJob.perform_later(self, mentioner: Current.user)) — don't rely on Current at perform time.Current.account at enqueue (as a GlobalID) and wraps perform_now in Current.with_account.default, backend, webhooks) with explicit priority order in queue config.due.in_batches { |batch| ActiveJob.perform_all_later(batch.map { DeliverJob.new(it) }) }.ActiveJob::Continuable: step :dispatch + find_each(start: step.cursor) + step.advance! — essential for fan-out (webhooks, broadcasts, backfills).limits_concurrency to: 1, key: ->(owner) { owner } (Solid Queue).RejectedExecutionError for backpressure.after_destroy_commit async work, snapshot needed associations in before_destroy — the parent rows may be gone when the job runs.command: "MagicLink.cleanup"), not dedicated job classes.delete_all on scopes (stale.delete_all) — skip callbacks on stale rows.spend calls reset_if_due), not a scheduled job.retry_on ..., wait: :polynomially_longer (timeouts, DNS, Net::SMTPServerBusy).:info severity (it's expected — bad address, full mailbox), and move on. Keep job queue resources for work that can succeed.ActionMailer::MailDeliveryJob.include SmtpDeliveryErrorHandling).perform_enqueued_jobs(only: Mention::CreateJob) { ... } and assert_enqueued_with(job: ...).Current.user/Current.account inside perform without serializing it at enqueue.perform_later in a loop where perform_all_later or Continuable iteration fits.suppressing_turbo_broadcasts).AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionrails-jobsExecute the skills CLI command in your project's root directory to begin installation:
epx add marckohlbrugge/37signals-skills/rails-jobsFetches rails-jobs from marckohlbrugge/37signals-skills and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
.cursor/skills/rails-jobs
Restart Cursor to activate rails-jobs. Access via /rails-jobsin your agent's command palette.
Learn more:View source on GitHubSkills CLI docsAbout CursorWhat are agent skills?
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ Use when
Use when skill capabilities match your task, clear ROI on time saved, and you can validate outputs. Best for repetitive tasks, learning, and quality improvement.
✗ Avoid when
Avoid when task requires deep expertise you can't validate, involves sensitive decisions, or when learning process is more valuable than speed of completion.
dhh
marckohlbrugge/37signals-skills · dhh · same repo
rails-best-practices-core
marckohlbrugge/37signals-skills · rails-best-practices-core · same repo
rails-migrations
marckohlbrugge/37signals-skills · rails-migrations · same repo
rails-webhooks
marckohlbrugge/37signals-skills · rails-webhooks · same repo
rails-security-multitenancy
marckohlbrugge/37signals-skills · rails-security-multitenancy · same repo
rails-testing
marckohlbrugge/37signals-skills · rails-testing · same repo
We added rails-jobs from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
rails-jobs is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
Useful defaults in rails-jobs — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
Solid pick for teams standardizing on skills: rails-jobs is focused, and the summary matches what you get after install.
Registry listing for rails-jobs matched our evaluation — installs cleanly and behaves as described in the markdown.
Registry listing for rails-jobs matched our evaluation — installs cleanly and behaves as described in the markdown.
rails-jobs reduced setup friction for our internal harness; good balance of opinion and flexibility.
rails-jobs reduced setup friction for our internal harness; good balance of opinion and flexibility.
Keeps context tight: rails-jobs is the kind of skill you can hand to a new teammate without a long onboarding doc.
rails-jobs has been reliable in day-to-day use. Documentation quality is above average for community skills.
showing 1-10 of 61