Skip to main content
Jobs run outside the request cycle, pinned to the exact app version that enqueued them. Declare the service and each job in marina.json; the handler names a function in your app’s jobs map.
marina.json
marina.jobs.get(runId) returns the run’s state (queued, running, succeeded, or failed) with attempt and timing metadata.

Delivery

  • Delivery is at least once: a handler can run more than once for the same work, so make its effects idempotent using context.runId.
  • A dedupeKey makes an enqueue idempotent for the caller: repeating the same key returns the original run instead of creating another.
  • Handlers retry up to the declared retries on failure, within timeoutSeconds per attempt.

Schedules

schedule is a five-field cron expression, evaluated in UTC. *, comma lists, ranges, and / steps are supported. If the app was down over an interval, at most one catch-up run fires, then the schedule advances. Publishing a new version atomically replaces the previous version’s schedules. Runs already enqueued finish against the version that created them.

Limits

Local development

Under marina dev, enqueued jobs run immediately in-process so you can watch them work; schedules fire only with --schedules.