roadrunner
CLAUDE.md8.5k starsChanged 22 months agoMITView on GitHub
We split this CLAUDE.md into the rules it gives an agent
5 rules. About 0 are common, 0 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 5
Use Go 1.27 or later, as declared in go.mod, tests/go.mod, and go.work.
- Very specific: line 11
Every bundled plugin is a separate Go module and GitHub repository in the roadrunner-server organization with the import path …
- Very specific: line 15
Run a plugin's unit tests with go test ./...
- Very specific: line 20
When two plugins satisfy the same Init parameter, Endure sorts the candidates by Weight() in descending order and takes the first.
- Very specific: line 52
Do not rename or remove schemas/ or any path inside it.
≈ “Common” is an estimate: at least 1 in 5 of the 25,680 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Repository Instructions
Code Boundaries
- Use Go 1.27 or later, as declared in
go.mod,tests/go.mod, andgo.work. The workspace contains two modules: the root module andtests/. Rootgo test ./...does not include the E2E module. container.Plugins()incontainer/plugins.godefines the default plugin set for the Endure container. See Plugins And Endure below.- The CLI starts at
cmd/rr/main.goandinternal/cli/root.go. Lifecycle changes can affect three separate implementations:internal/cli/serve/command.go(non-Windows),internal/cli/serve/command_windows.go(Windows), andlib/roadrunner.go(embedding API).
Plugins And Endure
- Every bundled plugin is a separate Go module and GitHub repository in the
roadrunner-serverorganization with the import pathgithub.com/roadrunner-server/<name>/v6. The Temporal plugin isgithub.com/temporalio/roadrunner-temporal/v6. Rootgo.modpins every bundled plugin.tests/go.modpins only the plugins that the E2E tests import. - Organization repositories: plugins at
https://github.com/roadrunner-server/<name>, Endure athttps://github.com/roadrunner-server/endure, error kinds athttps://github.com/roadrunner-server/errors, cross-plugin contracts athttps://github.com/roadrunner-server/api-plugins, generated protobuf Go bindings athttps://github.com/roadrunner-server/api-go, protobuf sources athttps://github.com/roadrunner-server/api(not a Go module), the worker pool athttps://github.com/roadrunner-server/pool, example plugins athttps://github.com/roadrunner-server/samples, the build tool athttps://github.com/roadrunner-server/velox, and the user documentation athttps://github.com/roadrunner-server/docs. - The build compiles plugins from the module cache.
go.workcovers both modules, so Go resolves each plugin to the highest version thatgo.modortests/go.modrequires.go.modhas noreplacedirectives. To read a plugin's source at the pinned version, rungo list -m -f '{{.Dir}}' github.com/roadrunner-server/<name>/v6. Themasterbranch on GitHub can be ahead of that version. - To build or test against a local plugin checkout, write a
go.workfile outside this repository with absoluteusepaths for the repository root,tests, and the plugin directory. Run Go commands withGOWORK=<absolute path to that file>. Never commit areplacedirective or auseentry that points outside this repository. - Run a plugin's unit tests with
go test ./...from the plugin repository root. When the plugin has atests/module, run its E2E tests from that directory, as the plugin CI does. Thattests/go.modreplaces the plugin module with the parent directory. - Endure (
github.com/roadrunner-server/endure/v2) is the dependency injection container. Its source is athttps://github.com/roadrunner-server/endure/blob/master/:container.godeclares the plugin interfaces,edges.govalidatesInitand builds the graph,init.gocallsInit, handles disabled plugins, and registersProvidesvalues, andcollects.goruns theCollectscallbacks. Read them at the pinned version before you change a plugin'sInitparameters,Provides, orCollects. - Endure resolves dependencies by reflection over the
Initmethod parameters. Every registered struct needs anInitmethod. EachInitparameter must be an interface type, andInitmust return exactly oneerrorvalue. A missingInit, a struct parameter, or a primitive parameter stops the whole container. - These interfaces are optional:
Service(Serve() chan error,Stop(context.Context) error),Named(Name() string),Provider(Provides() []*dep.Out),Collector(Collects() []*dep.In), andWeighted(Weight() uint). Builddep.Outwithdep.Bindanddep.Inwithdep.Fits. Both accept only a pointer to an interface type, such as(*Middleware)(nil), and panic on other types. A method named inProvidestakes no arguments and returns exactly one value. - Endure calls
Stopof every activeServiceplugin concurrently, each with its own context that expires aftergrace_period(stop.goin the Endure repository).grace_periodis a per-plugin timeout, not an overall deadline. - When two plugins satisfy the same
Initparameter, Endure sorts the candidates byWeight()in descending order and takes the first.tests/mock/logger.goprovides theLoggerinterface with weight 100 to replace the real logger plugin in E2E tests. - A plugin declares the interfaces it consumes in its own package, usually near the top of
plugin.go.httpandgrpcdeclare most of them inapi/interfaces.go. Shared contracts live ingithub.com/roadrunner-server/api-plugins/v6, and plugins import itsjobs,kv, andstatuspackages. A plugin that needs a logger declares its own interface withNamedLogger(name string) *slog.Logger. - An HTTP middleware plugin implements
Middleware(http.Handler) http.HandlerandName() string. ItsInitparameters are its own dependencies:Init() errorin thegzipplugin,Init(cfg Configurer, log Logger) errorin thestaticplugin. Thehttpplugin collects every middleware plugin throughCollectsand wraps the handler with the names listed inhttp.middleware. The first listed name is the outermost and runs first. For an unknown name, thehttpplugin logs a warning and continues.https://github.com/roadrunner-server/gzip/blob/master/plugin.gois a complete example. - Other collection points work the same way:
rpccollectsRPCer(RPC() any,Name()),informercollectsInformer(Workers(),Name()),resettercollectsResetter(Reset() error,Name()), andjobsandkvcollect theConstructorcontracts fromapi-plugins. A plugin that does not implement the matching interface is absent fromrr workers,rr reset, or the RPC surface, and Endure reports nothing. - Endure disables a plugin when
Initreturnserrors.E(op, errors.Disabled)fromgithub.com/roadrunner-server/errors, or when no registered plugin satisfies one of itsInitparameters. It also disables the direct dependents that lose their only provider. A deeper dependent that loses its provider during theInitpass makes Endure panic withreflect: Call with too few input arguments. Return theDisablederror unwrapped:errors.Istype-asserts*errors.Error, so afmt.Errorfwrapper stops the container. Any otherIniterror stops the container. - Most config-gated plugins follow one pattern:
InitcallsConfigurer.Has(key), returns an error of kinderrors.Disabledwhen the key is absent, then callsUnmarshalKey(key, &cfg). A missing or misspelled section then disables the plugin without an error. Most HTTP middleware with config, such asheaders,static, orrate_limiter, reads the nested keyhttp.<name>and checkshttpfirst. - Endure logs disabled plugins at debug or warn level, with the Go type such as
*http.Pluginand not the config name. When a plugin does not start, setendure.log_level: debugin the config. Then search the output forplugin disabled. - Plugin repository layout:
plugin.goat the root, config inconfig.go,config/, or a driver subpackage such asamqpjobs/config.go, an optionalschema.json, and E2E tests in a separatetests/module, usually with YAML fixtures intests/configs/. https://github.com/roadrunner-server/plugin_templatetargets Endure v1:Stop() errorhas no context, andInittakes*zap.Logger, a struct pointer that Endure v2 rejects. Do not copy it. Use a bundled v6 plugin such asgziporhttpas the reference.container.Plugins()does not include the config plugin (github.com/roadrunner-server/config/v6).internal/cli/serveregisters it withRegisterAll(append(container.Plugins(), cfg)...),lib.NewRRappends it to the caller's plugin list, and most E2E tests registercfgplus a short explicit plugin list.container/config.goparses theendure:config section:grace_period,log_level, andprint_graphbecome container options, andwatchdog_secstarts the sdnotify watchdog ininternal/cli/serveonly.- Bundling a plugin touches
go.mod,go.sum,container/plugins.go,.rr.yaml,schemas/config/3.0.schema.json,CHANGELOG.md, a newtests/configs/.rr-*.yamlfixture, and an E2E test. Commit444e4bf4(rate limiter) is the reference.tests/go.modneeds no change when the test reaches the plugin throughcontainer.Plugins(). The user documentation goes to a separate PR in the docs repository. - Root
schemas/config/3.0.schema.jsoninlines a hand-maintained section for most plugins under a$idthat points at the plugin'sschema.jsononmaster.poolandmemorycome in through remote$refentries only. The inlined sections drift from the plugin files. A config change for an inlined plugin needs an edit in the root schema and in the plugin'sschema.jsonwhen that file exists.node test.jscannot validate an unmerged remote schema change. - Bump
go.modandtests/go.modtogether and keep the versions equal for every module that both files require. Recent plugin bumps are hand-written commits. Dependabot Go PRs update both modules through the workspace. - Velox (
https://github.com/roadrunner-server/velox) builds a customrrbinary from the plugin list invelox.toml. It generates its owncontainer/plugins.goand addsinformerandresetterfrom the upstreamgo.mod. A custom plugin must export aPlugintype from its module root.
Build And Checks
- From the root,
make buildcreates./rr. It setsCGO_ENABLED=0for the build only. Keep CGO enabled for race tests. - Root tests:
make testrunsgo test -v -race ./.... Focus on one package withgo test -v -race ./internal/rpc. Select one test withgo test -v -race ./internal/rpc -run '^TestNewClient_WithIncludes$'. - Root lint:
golangci-lint run -v --build-tags=race --timeout=10m, matching.github/workflows/tests.yml. Use golangci-lint v2 with.golangci.yml. - E2E setup matches
.github/workflows/e2e.yml: Ubuntu, PHP 8.5 with thesocketsextension, and Composer. Runcomposer update --prefer-dist --no-progress --ansifromtests/php_test_files/. The rootcomposer.jsonis only a metapackage; it does not install the worker dependencies. - From
tests/, rungo mod download, thengo test -timeout 15m -v -race -failfast ./.... For one E2E test, usego test -timeout 15m -v -race -run '^TestHTTPWithMiddleware$' .. Fixtures are intests/configs/andtests/php_test_files/. - RPC and E2E tests use fixed local TCP ports. Library tests share
os.TempDir() + "/.rr.yaml". Avoid simultaneous runs of the same tests.
Runtime Configuration
- Root
.rr.yamlis an options reference with placeholder worker commands, not a ready-to-run application config. Config files useversion: '3'. - The CLI changes to the config file's directory unless
-wis set. With-w, it resolves-cfrom that working directory. It loads dotenv after this directory change.DOTENV_PATHtakes precedence over--dotenv(internal/cli/root.go). make debugrefers to the missing.rr-sample-bench-http.yaml. Usedlv debug cmd/rr/main.go -- serve -c <config>with an existing configuration.
Public Schemas
- Do not rename or remove
schemas/or any path inside it. These are public schema URLs; seeschemas/readme.md. - From
schemas/, runnpm install, thennode test.jsto validate root.rr.yamlagainstconfig/3.0.schema.json.npm testis a placeholder that exits with failure. The validator resolves remote plugin schema references and needs network access.
Documentation
- User documentation is
https://github.com/roadrunner-server/docs(GitBook, published athttps://docs.roadrunner.dev). Therelease/v3branch is ahead ofmasterand holds the v6 plugin beta and v3 migration material. The docs repository has its ownCLAUDE.mdwith the Markdown conventions and a table of its directories. - Plugin authoring guides are in
https://github.com/roadrunner-server/docs/tree/release/v3/customization:plugin.md(includes the v6 import migration table),middleware.md,jobs-driver.md,build.md,embedding.md, andevents-bus.md. Plugin pages are grouped by area:plugins/,http/,queues/,kv/,grpc/,lab/,workflow/, andcommunity-plugins/. - A new page needs an entry in
SUMMARY.mdof the docs repository. Release notes arereleases/v{YYYY}-{major}-{patch}.mdthere. - A change to a plugin's behavior or configuration needs a separate PR in the docs repository. Update the matching page; one page can cover several plugins.
Contribution Requirements
.github/pull_request_template.mdrequires commit sign-off (git commit -s) andCHANGELOG.mdentries for user-facing changes.
Trending
Steady: 0 new projects took it in the last 4 weeks, none the 4 weeks before.thin data
Who's talking about roadrunner-server/roadrunner
- nextcloud/server“Add support for RoadRunner PHP webserver”GitHub · Jan 23, 2023 · 60 reactions
- @gurubase.bsky.social“Check out RoadRunner 🏎️ "High-performance PHP application server and process manager written in Go, …”Bluesky · Nov 21, 2024 · 3 likes
- @cxplay.sir.social.ap.brid.gy“Go 编写的 PHP 应用服务器和进程管理器: roadrunner-server/roadrunner (GitHub) #Software”Bluesky · Sep 2, 2025 · 2 likes
- roadrunner-server/config“feature: apply env expansion consistently by moving it into a decode hook”GitHub · Aug 21, 2024 · 2 reactions
- roadrunner-server/http“feature: proto transport”GitHub · Feb 28, 2024 · 2 reactions
The biggest 5 of 54 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 54
Talked about on GitHub and Bluesky (54 times).
On GitHub · 50
- Jan 23, 2023Add support for RoadRunner PHP webserver — nextcloud/server60 reactions · 32 comments
- Aug 21, 2024feature: apply env expansion consistently by moving it into a decode hook — roadrunner-server/config2 reactions · 8 comments
- Feb 28, 2024feature: proto transport — roadrunner-server/http2 reactions · 2 comments
- May 11, 2023[💡 FEATURE REQUEST]: Allow setting `routing_key` dynamically when publishing a job to a pipeline — roadrunner-php/issues2 reactions · 2 comments
- Dec 22, 2022[Pimcore 11]: Session Management by Symfony (RoadRunner vs FPM) — pimcore/pimcore2 reactions · 10 comments
45 more on GitHub
- Oct 27, 2022fix: NPE when not using the optional `package` statement — roadrunner-server/grpc2 reactions
- Feb 24, 2026fix: do not overwrite traces — roadrunner-server/jobs1 reaction · 2 comments
- Nov 3, 2025Add support for activity reset — temporalio/sdk-php1 reaction · 1 comment
- Jun 2, 2025fix: use 1 millisecond to emulate immediate call — roadrunner-server/lock1 reaction · 1 comment
- Apr 23, 2025feature: implement List grpc health_server method — roadrunner-server/grpc1 reaction · 1 comment
- Oct 16, 2024fix: use zap logger — roadrunner-server/velox1 reaction · 2 comments
- Jun 24, 2024Add support for ack, nack, and requeue methods — roadrunner-php/jobs1 reaction · 2 comments
- Nov 7, 2023feat: Jetstream API — roadrunner-server/nats1 reaction · 2 comments
- Oct 11, 2023New Feature: Metrics Namespaces — roadrunner-php/metrics1 reaction · 3 comments
- Sep 22, 2023feature: dynamic workers scaling — roadrunner-server/sdk1 reaction · 1 comment
- Sep 8, 2023feat(AMQP): Add Header constants for consistent AMQP header usage — roadrunner-php/jobs1 reaction · 1 comment
- Sep 1, 2023feature: allow setting `routing_key` dynamically — roadrunner-server/amqp1 reaction
- Aug 2, 2023Expose Replayer API — temporalio/sdk-php1 reaction · 1 comment
- Jun 27, 2023feature: new RPC options — roadrunner-server/service1 reaction
- Feb 4, 2023feature: interceptors plugins support — temporalio/roadrunner-temporal1 reaction · 4 comments
- Feb 2, 2023feature(interceptors): `gRPC` interceptors support — roadrunner-server/grpc1 reaction · 5 comments
- Nov 3, 2022feat: whole RR configuration by RPC — roadrunner-server/rpc1 reaction
- Jul 15, 2022New docs for embedding RR — roadrunner-server/roadrunner-docs1 reaction · 5 comments
- Apr 23, 2022[CHORE]: Readme inaccuracies — xepozz/symfony-temporal-demo1 reaction · 4 comments
- Feb 22, 2022bug(ttl): TTL should be in the RFC3339 time format — roadrunner-server/redis1 reaction
- Oct 28, 2026roadrunner: 3.1.0 -> 2025.1.15 — NixOS/nixpkgs0 reactions
- Oct 21, 2026AWS lambda support — temporalio/sdk-php0 reactions
- Oct 19, 2026Lower level for broken Pipe — roadrunner-server/http0 reactions · 2 comments
- Oct 16, 2026roadrunner 3.1.0 — Homebrew/homebrew-core0 reactions · 1 comment
- Oct 16, 2026roadrunner: 3.0.0 -> 3.1.0 — NixOS/nixpkgs0 reactions
- Oct 9, 2026Update module github.com/spiral/roadrunner to v3 — Meroje/rr-sf0 reactions · 1 comment
- Oct 9, 2026Update dependency spiral/roadrunner to v3 — rxcod9/laravel-grpc-microservice0 reactions · 1 comment
- Oct 9, 2026build(deps): bump github.com/roadrunner-server/api-plugins/v6 from 6.0.0-beta.2 to 6.0.0 — roadrunner-server/kv0 reactions · 2 comments
- Oct 9, 2026build(deps): bump github.com/roadrunner-server/api-plugins/v6 from 6.0.0-beta.2 to 6.0.0 — roadrunner-server/memcached0 reactions · 2 comments
- Oct 9, 2026build(deps): bump github.com/roadrunner-server/api-plugins/v6 from 6.0.0-beta.2 to 6.0.0 — roadrunner-server/redis0 reactions · 2 comments
- Oct 9, 2026build(deps): bump github.com/roadrunner-server/api-plugins/v6 from 6.0.0-beta.2 to 6.0.0 — roadrunner-server/amqp0 reactions · 1 comment
- Oct 4, 2026feat: support Redis Sentinel ACL usernames — roadrunner-server/redis0 reactions · 1 comment
- Aug 5, 2026[🐛 BUG]: Graceful shutdown can dispatch another Temporal task before polling stops — temporalio/roadrunner-temporal0 reactions · 2 comments
- Jun 30, 2026SIGSEGV when using with ionCube and Octane with RoadRunner — open-telemetry/opentelemetry-php0 reactions · 5 comments
- May 18, 2026[roadrunner] Add `max_depth` config option — crazy-goat/go-mesi0 reactions · 1 comment
- Oct 24, 2025chore(deps): bump spiral/roadrunner from 2.10.7 to 2025.1.0 in /plugins/roadrunner/examples — HiWay-Media/souin0 reactions
- Oct 24, 2025Bump spiral/roadrunner from 1.3.7 to 2025.1.0 — CBike1103/RR-Yii2-POC0 reactions
- Oct 24, 2025Bump spiral/roadrunner from 1.5.3 to 2025.1.0 — taras-by/roadrunner-usage0 reactions
- Jun 23, 2025Update spiral/roadrunner requirement from ^2024.1 to ^2025.1 — uzdevid/yii-runner-centrifugo0 reactions
- May 27, 2025Full-PHP Support — connerohnesorge/bufrnix0 reactions
- Nov 25, 2024roadrunner — guanhui07/blog0 reactions
- Aug 20, 2024Next update: v1.1 — ElefantOne/laravel-boilerplate0 reactions · 2 comments
- Apr 23, 2024musl detection — pact-foundation/composer-downloads-plugin0 reactions · 1 comment
- Feb 5, 2024Add Roadrunner Temporal metrics with dashboard — temporalio/samples-php0 reactions
- Oct 6, 2023[🧹 CHORE]: Add summary metric type — roadrunner-php/issues0 reactions
On Bluesky · 4
- Nov 21, 2024Check out RoadRunner 🏎️ "High-performance PHP application server and process manager written in Go, powered with plugins."… — @gurubase.bsky.social3 likes and reposts · 1 reply
- Sep 2, 2025Go 编写的 PHP 应用服务器和进程管理器: roadrunner-server/roadrunner (GitHub) #Software — @cxplay.sir.social.ap.brid.gy2 likes and reposts
- Jun 21, 2026roadrunner by @spiralphp (⭐️ 8473) 🤯 High-performance PHP application server, process manager written in Go and powered with plugins #go — @golangoss.bsky.social1 likes and repost
- Nov 28, 2024roadrunner by @spiralphp (⭐️ 7942) 🤯 High-performance PHP application server, process manager written in Go and powered with plugins #go — @golangoss.bsky.social1 likes and repost
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

