How Monk migrated 100+ workflows from Inngest to Temporal

This post details Monk's incremental migration of over 100 Inngest workflows to Temporal. It outlines a four-step process: characterization with tests, scaffolding Temporal components, cutover via feature flags, and removal of the old system. Key technical insights include mapping Inngest's cron triggers, concurrency, and retries to Temporal's Schedules, Activity configurations (startToCloseTimeout, retry), and Workflow IDs. It highlights the critical difference between Inngest's step-based invocation and Temporal's event history replay, necessitating the refactoring of non-deterministic code (e.g., Date.now(), random picks) into Activities. The post provides a concrete example of migrating a scheduled drift check workflow, demonstrating how Inngest's `createFunction` with inline logic is transformed into a Temporal Workflow orchestrating thin Activities, with the Schedule object managing the cron trigger. It also details the correct mapping of Inngest retries to Temporal's `maximumAttempts` and the importance of using Workflow IDs for idempotency.