Skip to content

Changelog

Every release since 2.8. Versions follow semver; anything under Changed may need a line of your attention.

  1. v2.14.0

    Concurrency keys accept expressions

    • Added
    • Pass a function to concurrency.key, e.g. (input) => `tenant:${input.orgId}`.
    • Limits can be changed from the dashboard without a deploy.
    • Lane view shows queued runs per key.
  2. v2.13.2

    Lease renewal during long GC pauses

    • Fixed
    • Workers on Node 22 could lose a lease during a stop-the-world pause over 4 s. Renewal now runs on a separate timer thread.
  3. v2.13.0

    Go SDK: typed step results

    • Added
    • Changed
    • sp.Run is generic over its return type; no more interface{} casts.
    • sp.RunAny kept for one release, then removed in 3.0.
  4. v2.12.0

    Event history export

    • Added
    • Nightly export of spindrel.events to Parquet in your own bucket.
    • Export includes step payloads up to 4 MB; larger payloads are written as references.
  5. v2.11.1

    Signal ordering

    • Fixed
    • Two signals sent within 3 ms to the same run could be delivered out of order. They are now sequenced by the engine, not the client clock.
  6. v2.11.0

    Python 3.13

    • Added
    • Python 3.13 supported. The free-threaded build works in our test suite; we label it experimental until it has run in production for a quarter.
  7. v2.10.0

    Postgres 17 for self-hosting

    • Added
    • Changed
    • The engine runs on Postgres 15, 16 or 17.
    • Default history retention for self-hosted installs changed from forever to 30 days. Set history.retention to keep the old behaviour.
  8. v2.9.3

    Token scope for CI

    • Security
    • Deploy tokens can no longer read step payloads. Create a read token if your CI inspects runs.
  9. v2.9.0

    step.waitForSignal timeouts

    • Added
    • waitForSignal takes a timeout and returns false when it expires, instead of throwing.
  10. v2.8.0

    Replay a run against new code

    • Added
    • spindrel replay <runId> --local runs a recorded history against your working tree and reports the first step where the code diverges.