{"id":18303876,"url":"https://github.com/theopenlane/riverboat","last_synced_at":"2026-03-02T23:08:10.885Z","repository":{"id":257783328,"uuid":"859392262","full_name":"theopenlane/riverboat","owner":"theopenlane","description":"the openlane job queue server based on riverqueue","archived":false,"fork":false,"pushed_at":"2026-01-24T21:56:23.000Z","size":986,"stargazers_count":5,"open_issues_count":3,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-25T06:46:51.475Z","etag":null,"topics":["golang","hacktoberfest","jobqueue","openlane","river","riverqueue"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/theopenlane.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-09-18T15:27:11.000Z","updated_at":"2026-01-24T17:46:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"154b2df8-7b6d-484f-8705-f0fbd9ff939d","html_url":"https://github.com/theopenlane/riverboat","commit_stats":null,"previous_names":["theopenlane/riverboat"],"tags_count":51,"template":false,"template_full_name":null,"purl":"pkg:github/theopenlane/riverboat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theopenlane%2Friverboat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theopenlane%2Friverboat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theopenlane%2Friverboat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theopenlane%2Friverboat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/theopenlane","download_url":"https://codeload.github.com/theopenlane/riverboat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theopenlane%2Friverboat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28965436,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-01T02:14:24.993Z","status":"ssl_error","status_checked_at":"2026-02-01T02:13:55.706Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["golang","hacktoberfest","jobqueue","openlane","river","riverqueue"],"created_at":"2024-11-05T15:27:11.380Z","updated_at":"2026-02-01T03:07:37.590Z","avatar_url":"https://github.com/theopenlane.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Go Report Card](https://goreportcard.com/badge/github.com/theopenlane/riverboat)](https://goreportcard.com/report/github.com/theopenlane/riverboat)\n[![Build status](https://badge.buildkite.com/34ad31fe4231b2953cd3f2d116364d21a39b2a4dbf1eea539a.svg)](https://buildkite.com/theopenlane/riverboat?branch=main)\n[![Go Reference](https://pkg.go.dev/badge/github.com/theopenlane/riverboat.svg)](https://pkg.go.dev/github.com/theopenlane/riverboat)\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache2.0-brightgreen.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=theopenlane_riverboat\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=theopenlane_riverboat)\n\n# Riverboat\n\nRiverboat is the job queue used in openlane based on the\n[riverqueue](https://riverqueue.com/) project.\n\n## Usage\n\nJobs can be inserted into the job queue either from this server directly, or\nfrom any codebase with an\n[Insert Only](https://riverqueue.com/docs#insert-only-clients) river client. All\njobs will be processed via the `riverboat` server. Since jobs are committed to\nthe database within a transaction, and stored in the database we do not have to\nworry about dropped events.\n\n## Getting Started\n\nThis repo includes several [Taskfiles](https://taskfile.dev/) to assist with\ngetting things running.\n\n### Dependencies\n\n- Go 1.25.3+\n- Docker (used for running Postgres and the river-ui)\n- [task](https://taskfile.dev/)\n\n### Starting the Server\n\nThe following will start up postgres, the river-ui, and the riverboat server:\n\n```bash\ntask run-dev\n```\n\n### Test Jobs\n\nIncluded in the `test/` directory are test jobs corresponding to the job types\nin `pkg/jobs`.\n\n1. Start the `riverboat` server using `task run-dev`\n1. Run the test main, for example the `email`:\n\n   ```bash\n   go run test/email/main.go\n   ```\n\n1. This should insert the job successfully, it should be processed by `river`\n   and the email should be added to `fixtures/email`\n\n## Adding New Jobs\n\n1. New jobs should be added to the `pkg/jobs` directory in a new file, refer to\n   the [upstream docs](https://riverqueue.com/docs#job-args-and-workers) for\n   implementation details. The following is a stem job that could be copied to\n   get you started.\n\n   ```go\n   package jobs\n\n   import (\n      \"context\"\n\n      \"github.com/riverqueue/river\"\n      \"github.com/rs/zerolog/log\"\n   )\n\n   // ExampleArgs for the example worker to process the job\n   type ExampleArgs struct {\n      // ExampleArg is an example argument\n      ExampleArg string `json:\"example_arg\"`\n   }\n\n   // Kind satisfies the river.Job interface\n   func (ExampleArgs) Kind() string { return \"example\" }\n\n   // ExampleWorker does all sorts of neat stuff\n   type ExampleWorker struct {\n      river.WorkerDefaults[ExampleArgs]\n\n      ExampleConfig\n   }\n\n   // ExampleConfig contains the configuration for the example worker\n   type ExampleConfig struct {\n      // DevMode is a flag to enable dev mode so we don't actually send millions of carrier pigeons\n      DevMode bool `koanf:\"devmode\" json:\"devmode\" jsonschema:\"description=enable dev mode\" default:\"true\"`\n   }\n\n   // Work satisfies the river.Worker interface for the example worker\n   func (w *ExampleConfig) Work(ctx context.Context, job *river.Job[ExampleArgs]) error {\n      // do some work\n\n      return nil\n   }\n   ```\n\n1. Add a test for the new job, see `email_test.go` as an example. There are\n   additional helper functions that can be used, see\n   [river test helpers](https://riverqueue.com/docs/testing) for details.\n1. If there are configuration settings, add the worker to `internal/river/config.go`\n   `Workers` struct, this will allow the config variables to be set via the\n   `koanf` config setup. Once added you will need to regenerate the config:\n\n   ```bash\n   task config:generate\n   ```\n\n1. Register the worker by adding the `river.AddWorkerSafely` to the\n   `internal/river/workers.go` `createWorkers` function.\n1. Add a `test` job to `test/` directory by creating a new directory with a\n   `main.go` function that will insert the job into the queue.\n\n## FAQs\n\n1. When I run `go mod tidy` I get an error about `corejobs` repository not found.\nThis can be safely ignored if you are not running or building the binary with `tags=trustcenter`. This repository is only required when using that tag, however `go mod tidy` will attempt to pull all imports within the repo, including indirect ones. Using `go mod tidy -e` will allow things to continue while ignoring the error.\n\n## Contributing\n\nSee the [contributing](.github/CONTRIBUTING.md) guide for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheopenlane%2Friverboat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftheopenlane%2Friverboat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheopenlane%2Friverboat/lists"}