NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Go modules · #432 by repository stars
Last release today
07 Oct 2026
Ships on a steady schedule
a new release about every 8 days
Most releases are documented
notes for 53 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
2426 releases · first in 2023
One column per quarter.
fix: partition v1_task_expression_eval
feat: lookup table migration
feat: schema + app changes
feat: dag to task
feat: dag data
fix: pk
chore: gen
fix: migration naming, diffs
feat: rework migrations
chore: rm comments
fix: create next month too
fix: clean up migrations
fix: more cleanup
fix: prune partitions
fix: couple more queries
fix: partition v1_task_expression_eval
fix: naming
fix: migration naming
fix: version compat
fix: hack for legacy migration
fix: greptile comment
fix: greptile comment
fix: migration versions
fix: primary key names
fix: partition v1_task_expression_eval
feat: lookup table migration
feat: schema + app changes
feat: dag to task
feat: dag data
fix: pk
chore: gen
fix: migration naming, diffs
feat: rework migrations
chore: rm comments
fix: create next month too
fix: clean up migrations
fix: more cleanup
fix: prune partitions
fix: couple more queries
fix: partition v1_task_expression_eval
fix: naming
fix: migration naming
fix: version compat
fix: hack for legacy migration
fix: greptile comment
fix: greptile comment
fix: migration versions
fix: primary key names
Nothing published for this version
fix: migration versions
fix: migration versions
Merge branch 'main' into mk/partition-core-tables
Merge branch 'main' into mk/partition-core-tables
Nothing published for this version
ix_v1_runs_olap_tenant_ins_at_status_wf (v1_0_158) has the same leading columns and order, so it serves every query the old index did. Dropping it rem
ix_v1_runs_olap_tenant_ins_at_status_wf (v1_0_158) has the same leading
columns and order, so it serves every query the old index did. Dropping
it removes one index write per v1_runs_olap insert and status update and
frees its disk.
Nothing published for this version
fix(engine): retry flood on CEL evaluation failures in DAG operator (…
fix(engine): retry flood on CEL evaluation failures in DAG operator (…
fix(frontend): hide Manage Billing button on legacy plans
fix(frontend): hide Manage Billing button on legacy plans (#5150)
fix: Consolidate entitlement logic
fix: Consolidate entitlement logic (#5149)
feat(engine): run NATS pub/sub handlers on a bounded per-subscription…
feat(engine): run NATS pub/sub handlers on a bounded per-subscription…
Nothing published for this version
perf(engine): requeue rate limited items without a transaction
Every queue loop tick wrapped RequeueRateLimitedQueueItems in BEGIN /
statement / COMMIT even though it almost always moves no rows, holding a
pooled connection for three round trips per queue per tick. Under high
queue fan-out that hold time saturates the scheduler's pool and the wait
shows up as queue latency. The statement is a single atomic CTE, so run it
in autocommit and only upsert the queue when rows were actually moved.
Skipping upsertQueues when no rows moved dropped the only thing keeping a
queue active while its pending work sits in v1_rate_limited_queue_items for
more than a day; the queue would fall out of ListQueues, lose its queuer,
and never be requeued. Run the (cache-gated) upsert every call as before,
still outside a transaction.
feat: add workflow pause to ruby, ts, and go
feat: add workflow pause to ruby, ts, and go
chore: versions, changelogs
fix: use snippets for doc page
fix: greptile comment
chore: gen
fix: ruby situation
chore: version
fix: mark field required
chore: gen
fix(ts-sdk): emit the v0 deprecation warning on use, not on import by @abelanger5 in #5039
Hatchet v0.110.5 ships a new dashboard overview page and onboarding flow. It also includes a set of security hardening fixes and a large batch of scheduler and engine performance work.
hatchet profile env: prints a shell export block of a profile's HATCHET_CLIENT_ variables, so credentials can be loaded into a shell without reading or pasting the token (#4972).is_dag_operator column to v1_dags_olap by @mrkaye97 in #4984try-assign-batch + disable JIT on a few queries by @mrkaye97 in #4947operatorclient by @mnafees in #5018OFF by @abelanger5 in #5053q.unacked by @abelanger5 in #5062-race flag, remove rampup test by @abelanger5 in #5091Note truncated.
fix: rename durable streams migration
fix: rename durable streams migration (#5134)
fix(engine): lock durable event log files before satisfying entries (…
fix(engine): lock durable event log files before satisfying entries (…
Nothing published for this version
perf(scheduler): merge the assignment flush into one statement
perf(scheduler): merge the assignment flush into one statement (#5064)
Nothing published for this version
Nothing published for this version
fix tests, add default cursor behavior
initial wip
fix tests, add default cursor behavior
rabbit publishes must be confirmed otherwise grpc error occurs, needs deslopping
forgot batch files
a variety of fixes/deslopping
some more fixes (first message race, tighten up sdk failures)
small generation fixes
fix lint
more linting and remove test that keeps failing
generate
refactors, etc
consolidate all pg reads into topic poller
retention stuff
more granular fixes
make partitions by tenantid so they can be dropped based on tenant retention
fix ordering bug
some validation changes etc
rabbit-ectomy, use direct to pg for grpc handlers
forgot some files
rework partitions etc
rework offset stuff
move migration
add feature flag
retention management
consolidate tests
clean up comments and fix load test
add changelog
add test files that were untracked
autovac settings
use default autovac for messages table
add reconnection
fix generate
fix v0config issue
Nothing published for this version
Nothing published for this version
fix(auth): clear password and sessions when an OAuth login first veri…
fix(auth): clear password and sessions when an OAuth login first veri…
GetWorkflowVersionById only filtered by version id, so a caller could read any tenant's workflow version by passing its id as ?version= on their own w
GetWorkflowVersionById only filtered by version id, so a caller could read any
tenant's workflow version by passing its id as ?version= on their own
workflow. Filter by tenant in the query and reject versions that do not
belong to the workflow in the path.
fix(engine): upsert task input on replay instead of UPDATE-only overw…
fix(engine): upsert task input on replay instead of UPDATE-only overw…
Nothing published for this version
fix(cel): bound runtime cost and duration of tenant-supplied expressi…
fix(cel): bound runtime cost and duration of tenant-supplied expressi…
Co-authored-by: Gabe Ruttner gabriel.ruttner@gmail.com
Co-authored-by: Gabe Ruttner gabriel.ruttner@gmail.com
Nothing published for this version
fix(engine): treat deadlocks in partition index reattach as lock conf…
fix(engine): treat deadlocks in partition index reattach as lock conf…
fix: fix rate limit deadlock, fix rate limit charge old window bug (#…
fix: fix rate limit deadlock, fix rate limit charge old window bug (#…
Proxy.Do dialed a new gRPC client for every proxied call and never closed it, so each request leaked an HTTP/2 connection and its read buffers and API
Proxy.Do dialed a new gRPC client for every proxied call and never closed
it, so each request leaked an HTTP/2 connection and its read buffers and
API memory grew steadily under replay/cancel traffic. GRPCClient now keeps
its ClientConn and exposes Close, and the proxy closes it when the call
returns.
Nothing published for this version
Nothing published for this version
fix(dashboard): more billing ui nits
fix(dashboard): more billing ui nits
lint
fix(dashboard): read daily limit alerts from the shard meter
The Autumn daily-limit balance does not refill, so the header toast was reporting lifetime usage against the daily cap.
The create button stays, and at the limit it opens an upgrade prompt for the current organization.
Members can still open the upgrade gate, but only organization owners can change the plan.
A known paid plan has nothing to self-serve in the modal, so the action opens the billing page.
Nothing published for this version
Nothing published for this version
The pay-as-you-go dialog z-index bump covered role selects and other menus that portal out of a dialog.
The pay-as-you-go dialog z-index bump covered role selects and other menus that portal out of a dialog.
fix: omit the tenant allowance from the header limit alert
Hitting the tenant cap still shows on the billing page, but it should not raise the header Limit reached banner.
A saved card updates the plan without a Stripe checkout, so dismiss the dialog when that succeeds.
These usage rows were live counts. Draw them against the current plan cap and open a per-tenant breakdown.
feat: expose tenant data retention and show upgrade banner
Write plan retention onto the tenant via UpdateTenant, expose
dataRetentionPeriod on the API, and show a billing upgrade banner
when the UI looks past the window. The API is not restricted.
Replace the post-query RetentionBanner with picker-native limits so out-of-bound ranges never apply.
Add upcoming and previous invoice history above plan history, using Autumn-hosted invoice links for past charges.
feat: show an upgrade card when member or tenant limits are reached
feat: name upgrade limits after the current plan tier
fix: drop the possessive from upgrade limit titles
feat: offer pay-as-you-go and a sales call on the upgrade page
Hide legacy plans from the selector, drop annual billing, and send welcome-modal upgrades to the new Pay as you Go plan.
Rebuild billing around Autumn balances and sparkline detail, and list the upcoming invoice as the first row of one invoices table.
Lead with the value of upgrading, send Upgrade straight to Stripe checkout, and keep Details as a secondary view of plan contents.
Color meters at 75% and 95%, sort by current usage, and open the Pay as you Go pitch instead of jumping straight to Stripe or a second details screen.
ToTask and ToTaskSummary left the required top-level createdAt at Go's zero
time, which serialized as 0001-01-01 and made the run page treat every
standalone task run as retention-expired. Also guard isBeforeRetention
against invalid or pre-epoch timestamps.
Rework the welcome modal around Pay as you Go, make SSO/audit/Prometheus
gates consistent, spell out Single Sign On, and add a cloud-only compliance
settings page with inactivity timeout and Trust Center links.
The Limit reached menu only knew about tenant engine caps, so org features like users never appeared. Surface those usage rows and persist dismissals in localStorage so they stay hidden after refresh.
Legacy subscriptions can no longer upgrade to Pay as you Go from the billing page; they get a Talk to sales CTA instead.
The new pricing language should match across welcome, upgrade gates,
and enterprise unlocks, and compliance settings should live on one page.
nits
gate yo
tool tip
cleanup meters
fix: satisfy prettier and eslint on PAYG billing UI
refactor
fix: build the usage table from shard counts
Autumn balances were the row source, so task runs could read 0 while the shard series already had usage.
colors and fixes
banner
caption
caption
remove ugly label
Rework the Pay as you Go upgrade gate.
Render the gate on the SetupCard dialog surface used by the onboarding,
welcome, and invoice dialogs, with small footer buttons. Titles are in
active voice and descriptions point at the upgrade instead of repeating
numbers. Below the header, two labelled tables compare Free with Pay as you
Go: metered usage (included per month, then overage priced from the plan
API) and plan limits. The table opens collapsed to the single gated row,
highlighted, with a "See full breakdown" toggle.
Pass the gated feature id from the usage meters so the usage gate can name
the resource. Give SetupCard dialogs a solid backing; the card's own fill is
translucent and page text bled through.
Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com
nits
fix: type tenant usage chart points so the frontend build compiles
The chart row was declared as { date: string } & Record<string, number>,
which no object literal can satisfy because date collides with the numeric
index signature. Widen the index signature to string | number via a shared
TenantChartPoint type.
fix: match review notes for plan codes, the upgrade gate, and SSO copy
fix: regenerate SDK clients for dataRetentionPeriod
fix: format the generated TypeScript client with Prettier 3.9.6
custom plan name
fix import
Co-authored-by: Alexander Belanger alexander@hatchet.run
Co-authored-by: Claude Fable 5.1 noreply@anthropic.com
Nothing published for this version
Nothing published for this version
fix: use smaller batches for child workflow writes
fix: use smaller batches for child workflow writes
fix: improve python caching, polling, etc. logic for durable fanouts
test: add caching, polling coverage
fix: improve hot path queries
fix: move header read timeout to only if we're not using insecure mode tls
fix: call register on worker status
chore: version, changelog
fix: greptile
fix: add a sleep on republish so we don't ddos ourselves
fix: changelogs, query cleanup
chore: fix type, what the heck
fix: rm one more noisy log
fix: rm one more noisy log (#5029)
fix(engine): look up satisfied durable entries by primary key
The old join filtered branch and node after reading every entry for the task.
Pass each task's inserted_at into ListSatisfiedEntries and plan with those values so daily partitions that do not contain them are not locked.
Replace the timestamp array with min/max bounds so the btree does not re-sort the array on every index rescan, and return to the plain primary-key join with materialized inputs instead of a lateral subquery.
simple feedback
drop plan stuff
fix(engine): pass task inserted_at on the operator action
The DAG operator reads inserted_at from the assigned action instead of looking the task up. Keep the satisfied-entry external id typed as uuid so sqlc still emits uuid.UUID.
Replace the timestamp array with min/max bounds so the btree does not re-sort the array on every index rescan, and return to the plain primary-key joi
Replace the timestamp array with min/max bounds so the btree does not re-sort the array on every index rescan, and return to the plain primary-key join with materialized inputs instead of a lateral subquery.
Pass each task's inserted_at into ListSatisfiedEntries and plan with those values so daily partitions that do not contain them are not locked.
Pass each task's inserted_at into ListSatisfiedEntries and plan with those values so daily partitions that do not contain them are not locked.
Nothing published for this version
export internal symbols for operatorclient
export internal symbols for operatorclient (#5018)
export internal symbols for operatorclient
export internal symbols for operatorclient (#5018)
fix: Dag operator cancels weren't cancelling children
fix: Dag operator cancels weren't cancelling children (#5001)
feat(engine): engine-side gRPC operator support for out-of-process op…
feat(engine): engine-side gRPC operator support for out-of-process op…
refactor(engine): require every service on the gRPC server, state com…
refactor(engine): require every service on the gRPC server, state com…
feat: add slot usage metrics to health check endpoints
feat: add slot usage metrics to health check endpoints
chore: version, changelog
feat: extend tests a bit
fix: changelog
fix: mypy
fix(engine): add unique constraints to individual payload partitions …
fix(engine): add unique constraints to individual payload partitions …
fix(engine): wait for trigger slots on idempotent runs
Idempotent triggers cannot fail-fast into Internal when the in-process
slot limit is saturated; wait for a slot or return ResourceExhausted.
fix(engine): probe v1_task by primary key when resolving an external …
fix(engine): probe v1_task by primary key when resolving an external …
Your coding agent can read these notes before it upgrades. Set up the MCP server →