What riverqueue/river shipped
Written by FoxPlug from the repository's own releases; not affiliated with Riverqueue. Paste your own repository in the box below and FoxPlug writes the same weekly update for your product. This page is an automatic summary of the releases, pull requests and commits in github.com/riverqueue/river; Riverqueue did not write it and does not use or endorse FoxPlug. Every line links to the change it describes.
Get a weekly update like this for your product, free
Week of November 2, 2026
What shipped
- An immediate stop during enqueuer startup could cancel the maintenance context and fail RunOnStart job inserts; this is now fixed across Go, JavaScript and Rust. Pull request #1577
- PollForSettingChanges now runs as a fallback when a notifier is configured, so queue pause and resume changes are not lost while a notifier reconnects. Pull request #1582
- JobListParams.Where no longer mutates the caller's named argument map when merging multiple sets of arguments. Pull request #1575
- A malformed batch peer no longer aborts the whole Java batch, and valid peers still reach the handler. Pull request #1586
- The Rust CLI now implements the river migrate-get subcommand for exporting migration SQL. Pull request #1584
- The Rust CLI migration output now matches the Go reference implementation, including migrate-list marking and progress output. Pull request #1580
- Ruby's
job_updateaccepts an output argument for setting job output immediately with an atomic metadata update. Pull request #1568 - Ruby ActiveRecord and Sequel database operations received performance optimizations. Pull request #1574
- Java adds a QUEUE_DEFAULT constant matching the other language clients. Pull request #1557
- Java job methods moved from Client to client.jobs(), with added updates and output limits; insert and insertMany keep their existing API. Pull request #1569
Why it matters
This week fixes a startup stop path that could fail enqueuer shutdown, and makes queue setting changes reliable when a notifier reconnects. It also adds missing parity features in Rust CLI, Ruby output updates and Java queue methods while aligning client APIs and performance.
Changelog entry
- Go, JavaScript and Rust: fix context canceled error when stopping during start. Pull request #1577
- Poll queue settings as a fallback when a notifier is configured. Pull request #1582
- Go: JobListParams.Where no longer mutates caller named arguments. Pull request #1575
- Java: isolate batch peer decoding failures so valid peers reach the handler. Pull request #1586
- Rust: implement river migrate-get subcommand. Pull request #1584
- Rust: align CLI migration output with the Go reference implementation. Pull request #1580
- Ruby:
job_updateaccepts output for immediate atomic metadata update. Pull request #1568 - Ruby: ActiveRecord and Sequel database optimizations. Pull request #1574
- Java: add QUEUE_DEFAULT constant. Pull request #1557
- Java: move job methods to client.jobs(), add updates and output limits. Pull request #1569
- Rust: fix race in resumable cursor checkpoint test. Pull request #1565
- Ruby: remove warning output from specs. Pull request #1563
This week: fixed enqueuer start-stop context cancellation; polling now backs up queue setting changes when a notifier is configured. Rust CLI gains migrate-get and Go-aligned output. Ruby job_update takes output atomically. Java adds QUEUE_DEFAULT and moves job methods to client.
This week in River: an immediate stop during enqueuer startup could fail RunOnStart job inserts, now fixed across Go, JavaScript and Rust. Queue pause and resume changes are no longer lost while a notifier reconnects, because polling now runs as a fallback. Rust CLI adds the river migrate-get subcommand and aligns migration output with the Go reference. Ruby job_update can set output atomically, and Ruby database operations received performance optimizations. Java adds a QUEUE_DEFAULT constant and moves job methods to client.jobs(), a breaking API change, while insert and insertMany keep their API. JobListParams.Where now leaves caller arguments untouched, and a malformed batch peer no longer aborts a full Java batch.
Week of October 26, 2026
What shipped
- River Go v0.51.0 adds JobDeleteManyParams.Where, an escape hatch for deleting jobs by an arbitrary SQL predicate. Release
- JobDeleteManyParams gained a Where predicate for cases its filters can't express, such as deleting queued jobs by a value in their args. Pull request #1570
- River for Java reached its first non-prerelease release with v0.1.0, distributed through GitHub-backed public Maven. Pull request #1554
- Java worker configuration and lifecycle moved to Client and a RunHandle with stop, stopAndCancel, and runtime queue and periodic controls. Pull request #1555
- River Go v0.50.0 was prepared with updated internal dependency requirements across nine go.mod files. Pull request #1552
- JavaScript v0.3.0 was prepared, including Node 24 support, Knex integration, and native Prisma transaction support. Pull request #1549
- Ruby v0.14.0 was prepared with updated public gemspecs and lockfiles. Pull request #1551
- Ruby gained river migrate-get, validate, and version subcommands, producing raw SQL for River migrations. Pull request #1560
- InsertManyFast and QueueUpdate no longer panic on drivers without listener support. Pull request #1558
- The notifier no longer hangs after a listen or unlisten times out. Pull request #1559
Why it matters
This week brought a new release across most of River's language packages, plus a first non-prerelease Java release. Go users get a Where escape hatch on job deletion for cases like removing jobs by a value in their args, and fixes for notifier timeouts and nil dereferences on drivers without listener support.
Changelog entry
- Add JobDeleteManyParams.Where for deleting jobs by an arbitrary SQL predicate. Release
- Add a Where escape hatch to JobDeleteManyParams. Pull request #1570
- Release River for Java v0.1.0, the first non-prerelease release. Pull request #1554
- Move Java worker configuration and lifecycle to Client and RunHandle. Pull request #1555
- Publish complete GitHub release assets for the Java Maven proxy. Pull request #1543
- Add river migrate-get, validate, and version subcommands to Ruby. Pull request #1560
- Fix InsertManyFast and QueueUpdate panics on drivers without listener support. Pull request #1558
- Fix notifier hanging after a listen or unlisten times out. Pull request #1559
- Fix intermittently failing TestJobCleaner/CustomizableInterval with a deterministic version. Pull request #1531
- Remove automatic global polyfilling from JavaScript library imports. Pull request #1548
- Prepare JavaScript v0.3.0 with Node 24 support, Knex integration, and native Prisma transactions. Pull request #1549
- Add a link to the Java subdirectory in the README. Pull request #1572
River Go v0.51.0 adds JobDeleteManyParams.Where for deleting jobs by a SQL predicate. Java v0.1.0 is out with worker lifecycle on Client and RunHandle. Ruby gained migrate-get, validate, and version subcommands, and Go and JavaScript fixes landed for notifier timeouts and listene
River Go v0.51.0 is out with JobDeleteManyParams.Where, an escape hatch for deleting jobs by an arbitrary SQL predicate, such as queued jobs whose args name a given customer. Java v0.1.0 is its first non-prerelease release, with worker configuration and lifecycle moved to Client and RunHandle. Ruby gained river migrate-get, validate, and version subcommands. Go also fixed the notifier hanging after a listen or unlisten timeout, and InsertManyFast and QueueUpdate no longer panic on drivers without listener support. Release prep continued across Go, Ruby, JavaScript, and Rust.
Week of October 19, 2026
What shipped
- Ruby now handles notifications like other languages, adding a Postgres LISTEN listener and a SQLite
river_notificationwatcher, plus apoll_onlymode that matches Go. Pull request #1496 - Resumable job progress was fixed across runtimes so retries no longer skip work that never committed or repeat work already done. Pull request #1521
- Java gained transactional checkpoints, dynamic periodic jobs and worker timeouts, closing gaps against the Ruby implementation. Pull request #1532
- Java replaced its broad Extension interface with specific hooks and middleware matching the approach used in Go and other languages. Pull request #1519
- Rust extension hooks were completed so peer job work hooks run for peers and insertion hooks see resolved options and unique duplicates. Pull request #1501
- The JavaScript Prisma adapter makes it easier to call transactional completion from inside a worker. Pull request #1517
- A new JavaScript package adds support for the Knex.js query builder without pulling Knex in as a dependency. Pull request #1516
- Ruby added a transactional job completion path,
job_complete_tx, matching the naming used in Rust and TypeScript. Pull request #1490 - Rust TLS certificate dependencies were updated to address a failing dependency advisory check. Pull request #1527
- The CI workflow default token scope was limited to contents read. Pull request #1426
Why it matters
This week brought Ruby notifications, transactional completion in Ruby, and a batch of Java features, so several languages are closer to feature parity. Resumable job progress fixes affect anyone relying on step and cursor checkpoints across retries. Users should update for the corrected behavior and the added driver options.
Changelog entry
- Ruby: handle notifications in Postgres and SQLite, add
poll_onlymode. Pull request #1496 - Fix resumable job progress across runtimes. Pull request #1521
- Java: add transactional checkpoints, dynamic periodic jobs and worker timeouts. Pull request #1532
- Java: standardize hooks and middleware with other languages. Pull request #1519
- Rust: complete extension hooks for peer jobs and insertions. Pull request #1501
- JavaScript: add Prisma adapter for completeTx. Pull request #1517
- JavaScript: add @riverqueue/driver-knex package. Pull request #1516
- Ruby: add transactional completion
job_complete_tx. Pull request #1490 - Rust: update TLS certificate dependencies to clear advisory check. Pull request #1527
- CI: limit default workflow token permissions to contents read. Pull request #1426
- SQLite: replace top-level metadata keys on merges like Postgres. Pull request #1533
- Reject nested resumable steps and missing cursor targets. Pull request #1534
This week: Ruby gets Postgres and SQLite notifications plus poll_only, resumable job progress fixes land across runtimes, Java adds transactional checkpoints and hooks aligned with other languages, and JavaScript gains Knex and easier Prisma completeTx.
This week in River: Ruby now handles notifications like other languages, with a Postgres LISTEN listener, a SQLite river_notification watcher, and a poll_only mode matching Go. Resumable job progress was fixed across runtimes so retries no longer skip uncommitted work or repeat finished work. Java gained transactional checkpoints, dynamic periodic jobs, worker timeouts, and hooks that match the pattern used elsewhere. Rust extension hooks were completed, Ruby added transactional job completion, and JavaScript gained a Knex.js driver and an easier Prisma completeTx path. Rust TLS dependencies were updated to clear an advisory check, and CI token permissions were tightened.
Week of October 12, 2026
What shipped
- Job deletion now goes through pilot hooks, with an optional PilotJobDeleter interface covering Client.JobDelete, Client.JobDeleteMany, their Tx variants, and the job cleaner. Pull request #1500
- The Rust and JavaScript clients now match River Go's behavior where they previously stored or handled the same job differently, so mixed fleets behave consistently. Pull request #1504
- River Ruby now preserves encoded job args on insert instead of decoding and re-serializing them in three of the four driver combinations. Pull request #1503
- River Ruby now generates its default client ID per process so preforking servers like Puma, Unicorn, and Pitchfork no longer share one client ID across worker processes. Pull request #1498
- Job deletion in the Rust and JavaScript clients now goes through pilot hooks, matching the Go behavior, with a pilot able to replace the deletion or write alongside it. Pull request #1502
- Added support for Node 24 in River for JavaScript. Pull request #1497
- Fixed a notifier that entered a hot loop, retried forever, and flooded logs when it connected after its context deadline. Pull request #1495
- Fixed intermittent failures in the graceful shutdown example caused by an unexpected scheduler error when shutdown interrupts a pgx query write. Pull request #1507
- Rust, JavaScript, Ruby, and Java client docs now describe their behavior on their own terms rather than by comparison with River Go. Pull request #1506
- Bumped rustls to 0.23.46 in River for Rust to address four security advisories failing the cargo deny check. Pull request #1505
Why it matters
This week brought the Rust and JavaScript clients in line with River Go on shared-schema behavior and job deletion pilot hooks, which matters for anyone running a mixed fleet. River Ruby gained fixes for job arg encoding and per-process client IDs under preforking servers. Several reliability fixes landed as well, including notifier backoff after a context deadline and the graceful shutdown example.
Changelog entry
- Add pilot hooks for job deletion in Go. Pull request #1500
- Match River Go's behavior in the Rust and JavaScript clients. Pull request #1504
- Preserve encoded job args on insert in River Ruby. Pull request #1503
- Generate River Ruby's default client ID per process. Pull request #1498
- Add pilot hooks for job deletion in the Rust and JavaScript clients. Pull request #1502
- Support Node 24. Pull request #1497
- Fix notifier retrying without backoff when the context reaches its deadline. Pull request #1495
- Fix graceful shutdown example flakiness. Pull request #1507
- Describe the non-Go clients without referring to River Go. Pull request #1506
- Bump rustls to 0.23.46 for security advisories. Pull request #1505
- Fix intermittent Rust test
poll_only_and_subscription_configuration. Pull request #1499 - Simplify scheduler cancellation checks. Pull request #1515
Job deletion now goes through pilot hooks in Go, Rust, and JavaScript. The Rust and JavaScript clients now match River Go's behavior on the shared schema, Ruby preserves encoded job args and gets a per-process client ID, Node 24 is supported, and the notifier no longer hot loops
This week River's clients moved closer together. Job deletion now goes through pilot hooks in Go, Rust, and JavaScript, so a pilot can replace the deletion or write alongside it. The Rust and JavaScript clients now match River Go's behavior where they previously stored or handled the same job differently, which matters if you run a mixed fleet. River Ruby now preserves encoded job args on insert and generates its default client ID per process, so preforking servers like Puma and Unicorn no longer share one across workers. Also this week: Node 24 support, a notifier fix so it backs off instead of hot looping after its context deadline, a fix for the graceful shutdown example's flakiness, client docs that no longer describe behavior by comparison with River Go, and a rustls bump for four sec
Week of October 5, 2026
What shipped
- Added a Java implementation of River. Pull request #1424
- Brought the Ruby client code into the main repository instead of its separate one. Pull request #1463
- Added River for JavaScript and TypeScript, a client that can run workers and take part in maintenance rather than only inserting jobs. Pull request #1443
- Added a Ruby equivalent of the Go WorkFunc so workers can be registered with a kind and a closure. Pull request #1486
- Released the first version of River for Rust, a typed Tokio-based client for Postgres through SQLx and SQLite sharing River's schema and job protocol. Release
- Fixed worker registration so a later alias collision leaves the registry unchanged. Pull request #1440
- Made port conformance fixtures generated from River's Go implementation, covering unique key hashes, state bitmasks, cron times, snooze counts, job state bits, retry delay bounds and notification payloads. Pull request #1451
- Brought the TypeScript conformance suite in line with the more exhaustive Rust one. Pull request #1460
- Changed the JavaScript license from LGPL-3.0-or-later to MPL-2.0 to match other languages. Pull request #1465
- Renamed Rust WorkerRegistry to Workers and register to add and
register_fntoadd_fnto match Go naming. Pull request #1469
Why it matters
This week adds two new language ports, Java and a full JavaScript and TypeScript client that can run workers, not just insert jobs, alongside Ruby and Rust. It also brings Ruby into the main repository and releases early versions of Rust and JavaScript. Runner registration, conformance fixtures and naming are converging across languages so a job inserted by one client can be worked by another in the same database.
Changelog entry
- Added a Java implementation of River. Pull request #1424
- Brought Ruby into the main repository from its separate repo. Pull request #1463
- Added River for JavaScript and TypeScript with worker support, job listing and cancellation, and maintenance. Pull request #1443
- Added a Ruby equivalent of Go's WorkFunc so workers can be registered with a kind and closure. Pull request #1486
- Released River for Rust v0.1.0, a typed Tokio-based client for Postgres through SQLx and SQLite. Release
- Released Rust v0.2.0, renaming
start_with_graceful_shutdowntostart_with_graceful_stop. Release - Released Rust v0.3.0, renaming WorkerRegistry to Workers, register to add, and
register_fntoadd_fn. Release - Released js/v0.2.0, the initial release of the fully functional JavaScript client. Release
- Released ruby/v0.13.0 with expanded conformance checks, CRON_TZ and TZ prefixes, wildcards and new source locations. Release
- Fixed worker registry staying unchanged on alias collision. Pull request #1440
- Changed the JavaScript license from LGPL-3.0-or-later to MPL-2.0. Pull request #1465
- Generated port conformance fixtures from River's Go implementation. Pull request #1451
River now has Java and a full JavaScript/TypeScript client that can run workers, not just insert jobs. Ruby moved into the main repo, Rust shipped its first release, and conformance fixtures now come from the Go implementation.
River grew this week: Java joins the language ports, and JavaScript/TypeScript now has a fully functional client that can run workers, list and cancel jobs, and take part in maintenance instead of only inserting jobs. Ruby moved into the main repository, and Rust shipped its first release, a typed Tokio-based client for Postgres through SQLx and SQLite that shares River's schema and job protocol. Conformance fixtures are now generated from River's Go implementation and cover cron schedules, snooze counters, state bitmasks, retry delay bounds and notification payloads, with TypeScript brought up to the Rust suite's coverage. Registration naming and license terms are also aligning across languages.
Week of September 28, 2026
What shipped
- River v0.48.0 released with database migration version 8 for SQLite, adding AUTOINCREMENT to primary keys to prevent edge case ID conflicts. Release
- SQLite primary keys now use AUTOINCREMENT to prevent ID collision when rows are deleted and new rows are inserted. Pull request #1390
- Fixed unique skip rewriting existing job kind under ExcludeKind, where jobs of different kinds can now properly share a unique key. Pull request #1421
- Fixed SQLite cleanup queue filtering that could stop permanently when excluded queues occupied the oldest batch. Pull request #1417
- Fixed UniqueOpts.ExcludeKind being silently ignored by isEmpty(), which now properly accounts for all unique options. Pull request #1404
- Fixed JobCancel returning stale pre-cancel state to the loser of concurrent cancel races. Pull request #1409
- Fixed JobRetry returning stale row to the loser of concurrent retry races. Pull request #1410
- Fixed SQLite batch unique-key handling where duplicate unique keys in a batch would incorrectly report multiple insertions. Pull request #1399
- Added client option FetchOnlyKnownKinds to fetch only job kinds registered with the client. Pull request #1396
- Added support for Yugabyte as a Postgres-compatible database target. Pull request #1347
Why it matters
V0.48.0 addresses several database correctness issues across SQLite and Postgres, fixes concurrent operation race conditions, and improves unique constraint handling. SQLite users need the migration to prevent ID collision edge cases. The release also adds Yugabyte support for users targeting that database.
Changelog entry
- Database migration version 8 for SQLite adds AUTOINCREMENT to
river_jobprimary key, preventing ID collision edge case Release - Fixed unique skip rewriting existing job kind under ExcludeKind Pull request #1421
- Fixed SQLite cleanup queue filtering stopping permanently when excluded queues occupy oldest batch Pull request #1417
- Fixed UniqueOpts.ExcludeKind being silently ignored by isEmpty() Pull request #1404
- Fixed JobCancel returning stale pre-cancel state in concurrent cancel races Pull request #1409
- Fixed JobRetry returning stale row in concurrent retry races Pull request #1410
- Fixed SQLite batch unique-key handling for duplicate keys in single batch Pull request #1399
- Fixed retry delay calculation to prevent float overflow on 310th+ error Pull request #1402
- Fixed job list cursor decoding to handle URL-safe base64 characters Pull request #1388
- Added FetchOnlyKnownKinds client option to fetch only registered job kinds Pull request #1396
- Added Yugabyte support as Postgres-compatible target Pull request #1347
- River v0.48.0 compatible with River Pro v0.31.0 Pull request #1416
River v0.48.0 is out. SQLite migration adds AUTOINCREMENT, concurrent cancel/retry races fixed, unique constraint handling improved, and Yugabyte support added.
River v0.48.0 released with important correctness fixes for SQLite and Postgres. SQLite gets AUTOINCREMENT to prevent ID collisions, concurrent cancel and retry operations now return correct job state, unique constraint handling improved, and Yugabyte is now supported as a Postgres-compatible target.
Week of September 21, 2026
What shipped
- Fixed a race condition where cancellations arriving between job claim and executor registration would be dropped, allowing jobs to run with uncancelled contexts. Pull request #1397
- SQLite now writes cancellation notifications to the outbox when cancelling running jobs, ensuring workers receive cancellation signals. Pull request #1398
- Fixed unique-by-args job deduplication to correctly handle JSON keys containing dots and other special characters. Pull request #1387
- Fixed UniqueOpts.ByPeriod to bucket scheduled jobs by their run time rather than insertion time, preventing duplicate jobs in the same period. Pull request #1377
- SQLite job cleaner now respects keep-forever retention settings (-1) and no longer deletes jobs configured to be kept indefinitely. Pull request #1389
- Fixed stuck job detection to log the worker-level timeout value instead of the client-level timeout when reporting jobs appear stuck. Pull request #1394
- Job rescue now guards against stale snapshots by verifying jobs remain in running state before applying rescue updates. Pull request #1373
- Improved job list query performance by restoring proper index usage when filtering finalized jobs. Pull request #1374
- Added LeaderElectionDisabled configuration option to prevent clients from participating in leader election and running maintenance services. Pull request #1382
- SQLite
river_notificationnow uses per-topic subscription cursors to avoid replaying old notifications after resubscription. Pull request #1381
Why it matters
This week addresses critical issues with job cancellation, unique job deduplication, and retention policies that could silently cause incorrect behavior. The fixes span both PostgreSQL and SQLite, with several addressing race conditions and edge cases that affect production reliability.
Changelog entry
- SQLite JobCancel now writes control notifications to the outbox in the same transaction as job updates to ensure workers receive cancellation signals Pull request #1398
- Fixed race condition where cancellations arriving between job claim and executor registration would be dropped Pull request #1397
- Stuck job detection now logs the worker-level timeout value instead of the client-level timeout Pull request #1394
- UniqueOpts.ByArgs now correctly handles JSON keys containing dots and other special characters Pull request #1387
- SQLite job cleaner now respects keep-forever retention settings (-1) for finalized states Pull request #1389
- Added LeaderElectionDisabled configuration option to prevent leader election participation and maintenance service execution Pull request #1382
- UniqueOpts.ByPeriod now buckets scheduled jobs by their run time instead of insertion time Pull request #1377
- Job rescue now verifies jobs remain in running state before applying updates to guard against stale snapshots Pull request #1373
- Improved job list query performance by restoring proper index usage when filtering finalized jobs Pull request #1374
River update: fixed cancellation race conditions, unique-by-args with special characters, scheduled job deduplication, keep-forever retention on SQLite, and stuck job logging accuracy.
New River updates improve reliability across job cancellation, deduplication, and retention. Fixed a race condition where cancellations could be dropped before workers were notified, corrected unique-by-args to handle special JSON key characters, and resolved scheduled job bucketing to prevent duplicates. Also improved SQLite's keep-forever retention handling, stuck job timeout reporting, and job list query performance.
More from riverqueue/river on GitHub
Merged pull requests
- Use bundled PostgreSQL for CLI CI (#1392, merged September 26, 2026 by bgentry) (source)
- Honor keep-forever retention in the SQLite job cleaner (#1389, merged September 25, 2026 by bgentry) (source)
- A few
river_notificationimprovements for SQLite (#1381, merged September 25, 2026 by brandur) (source) - Add configuration
LeaderElectionDisabled(#1382, merged September 25, 2026 by brandur) (source) - Avoid retries in subscription example (#1385, merged September 25, 2026 by bgentry) (source)
- Derive unique periods from UTC scheduled time (#1377, merged September 24, 2026 by bgentry) (source)
- Guard job rescue against stale snapshots (#1373, merged September 22, 2026 by bgentry) (source)
- Fix job list performance and SQLite pagination (#1374, merged September 22, 2026 by bgentry) (source)
- Prepare release v0.47.0 (#1370, merged August 31, 2026 by brandur) (source)
- Add hook to support Pro SQLite driver (#1369, merged August 31, 2026 by brandur) (source)
- Prepare release v0.46.0 (#1367, merged August 29, 2026 by brandur) (source)
- Add back more non-listener coverage for
riverdatabasesql(#1368, merged August 29, 2026 by brandur) (source)