Hatchet v0.90.13 is a stability-focused release. It keeps long-running deployments healthy by bounding session-table growth, reduces scheduling latency under load, fixes a duration-parsing bug that could silently shorten your timeouts, and ships a batch of dashboard fixes.
Highlights
- The
UserSessiontable no longer grows unbounded: an hourly cleanup job now removes expired and orphaned sessions automatically. See Upgrade Notes for an optional one-time bulk cleanup to run before upgrading. - Multi-unit duration strings such as
42m30sare now parsed correctly and enforce their full value, rather than silently truncating to a shorter duration. See Upgrade Notes for the related behavior and validation changes. - Reduced engine cold-start latency when moving runs from
QUEUEDtoASSIGNED_TO_WORKERunder load, and stale concurrency state is now cleaned up automatically so it can no longer build up and slow scheduling. - Fixed a dashboard race that could return a 500 when triggering a run, alongside several quality-of-life improvements: a system theme option in account settings, a scrollable workflow settings page, persisted sidebar scroll position across navigation, a tooltip for long tenant names, and CodeEditor theming and border fixes in light mode.
- The Go SDK now retries bodyless
GETandHEADreads with backoff on transient failures, which can be disabled via theHATCHET_CLIENT_NO_RETRYenvironment variable. - Durable execution is sturdier: dead-lettered callback messages are now handled gracefully instead of erroring, and a failing child task correctly raises an error in its durable parent, matching the behavior of regular tasks.
- Hatchet Cloud now has self-serve support for tenant-scoped Prometheus metrics and an audit logs API available on the Scale plan.
Upgrade Notes
Stricter duration validation
Registration now rejects duration strings that were previously accepted and silently coerced: signed values, bare numbers, sub-millisecond units (ns/us), and mixed forms using d/w/y. If you register durations in any of these forms, they'll now fail at registration — check your workflow definitions before upgrading.
UserSession bulk cleanup
This update includes an additional cleanup job for the UserSession table to correctly remove expired/invalid user sessions from the table -- addressing unbounded growth. However, you can optionally run the following query as many times as needed against your Postgres instance to ensure a bulk-cleanup prior to upgrade:
DELETE FROM "UserSession"
WHERE ctid IN (
SELECT ctid
FROM "UserSession"
WHERE NOT (
("userId" IS NOT NULL AND "expiresAt" >= NOW())
OR
("userId" IS NULL AND "createdAt" >= NOW() - INTERVAL '24 hours')
)
LIMIT 10000
);Note: the 10000 limit can be adjusted as needed.