stepper_motor

is a durable step workflow engine for Rails

class SignupJourney < StepperMotor::Journey
  step :after_signup do
    WelcomeMailer.welcome_email(hero).deliver_later
  end

  step :remind_of_tasks, wait: 2.days do
    ServiceUpdateMailer.two_days_spent_email(hero).deliver_later
  end

  step :onboarding_complete_, wait: 15.days do
    OnboardingCompleteMailer.onboarding_complete_email(hero).deliver_later
  end
end

Think of it at as a minimum viable subset of Temporal, just built using the concepts from Rails you already know and use daily. stepper_motor allows you to create journeys consisting of discrete steps. A step gets performed atomically, with fine-grained locks placed around its execution. A specific step from a specitic Journey will only be performing once and inside one thread. You can have as many Journeys as you need, attached to various models in your application - and run them concurrently.

Journeys are a perfect abstraction when you need to tackle irreversible steps in sequence, such as purchases, refunds, chargebacks… Attrition control (churn emails) and drip email campaigns are another perfect use of StepperMotor.

And best of all: the tech required to use it is alreay inside your majestic monolith. There is no network, gRPC, special daemon processes or extra Docker containers – just standard ActiveJobs and ActiveRecords.

Give it a spin

stepper_motor is a Rails engine. Install it like you would any other engine:

$ bundle add stepper_motor
$ bundle install
$ bin/rails g stepper_motor:install
$ bin/rails db:migrate

…and start defining your journeys.

Editions

  Basic Pro (coming 2025) Super (coming 2025)
Price Free 200$/y 2000$/y
License LGPL Commercial Commercial
Durable execution with partial locking Yes Yes Yes
No wrapping DB transaction Yes Yes Yes
ActiveJob integration Yes Yes Yes
Step execution records - Yes Yes
Concurrently running journeys Unlimited Unlimited Unlimited
Access to private repositories - - Yes
Assistance from founder Paid Paid 14 hours yearly
Admin UI - Yes Yes
 UI: Step validation - Yes Yes
 UI: Canceling / resuming a journey. - Yes Yes
 UI: Rescheduling a step - Yes Yes