All notable changes to Rover will be documented in this file.
This project adheres to Semantic Versioning.
<!-- # [x.x.x] (unreleased) - 2025-mm-dd > Important: x potentially breaking changes below, indicated by **❗ BREAKING ❗** ## ❗ BREAKING ❗ ## 🚀 Features ## 🐛 Fixes ## 🛠 Maintenance ## 📚 Documentation -->Fall back to an installed plugin when the registry is unreachable - @SharkBaitDLS PR #3362 fixes #1791 #1808
When Rover needs the latest supergraph or router plugin but can't reach the plugin registry (an outage, a network blip, or simply being offline), it now falls back to the newest compatible plugin already installed in ~/.rover/bin with a warning instead of failing outright. Exact version pins still return an error.
Extend the timeout for plugin downloads - @SharkBaitDLS PR #3358 fixes #1583 #1867
Downloading plugins no longer uses the API --client-timeout (30s by default) as a whole-request deadline. The plugin download path now has a 300s timeout and a 30s connection timeout so that it still fails-fast if the network is genuinely offline.
Read UTF-16 (and BOM-prefixed) schema files - @SharkBaitDLS PR #3351 fixes #653
Fs::read_file now detects a leading byte-order mark and transcodes the file to UTF-8, so schemas saved as UTF-16 — most commonly produced by Windows PowerShell > redirects, e.g. rover graph introspect ... > schema.gql — are read instead of failing with "stream did not contain valid UTF-8". A UTF-8 BOM is stripped; files with no recognized BOM are still read as UTF-8 (preserving prior behavior), and malformed input surfaces an error rather than being silently replaced. Decoding is handled by encoding_rs.
Restore the "pin your federation version" warning on supergraph compose - @SharkBaitDLS PR #3347
rover supergraph compose again warns when federation_version is not pinned to an exact version, reinstating the documented notice that future versions will require one. This nudge was added in #1524 and inadvertently dropped in v0.27.2 (#2411) during the supergraph-config resolution rewrite; composing against a floating 1/2 (or omitting the key) now once again warns and recommends pinning, to avoid pulling in breaking changes when a new federation release ships. rover dev and the language server remain silent. Fixes #1510.
Add rover schema search subcommand - @dotdat PR #3315
Wires the new rover schema search FILE TERMS... subcommand on top of the ParsedSchema::search engine added in PR #3262. Accept SDL from a file (or from stdin when FILE is -), render results as text or JSON via the standard CliOutput plumbing, and support --limit/-n and --include-deprecated.
Preserve auth and other reqwest helpers in the retry tower layer - @SharkBaitDLS PR #3327 fixes #3326
Rebuilds requests through reqwest::RequestBuilder inside the retry tower layer so the builder's helper logic (which extracts auth into headers, among other things) is preserved on retried requests. Previously the layer used reqwest::Request::try_from, which silently dropped those helpers. Also restricts retries to retriable HTTP status codes and skip gzip-decoding error responses so the underlying failure surfaces instead of manifesting as a hang.
Rewrite graph introspect to use apollo-compiler - @SharkBaitDLS PR #3317 fixes #3312
Moves graph introspect off the deprecated apollo-encoder crate and onto apollo-compiler to pick up upstream SDL-encoding fixes that Rover had been missing.
Batch supergraph.yaml subgraph changes on hot reload - @SharkBaitDLS PR #3304
Applies all subgraph additions and removals from a single supergraph.yaml edit as one batch before recomposing in rover dev. Previously each change was processed individually, so removing a subgraph whose fields were referenced via @external produced an intermediate composition failure that persisted as the final state without recovering.
Preserve --graph-ref subgraphs across hot reloads - @SharkBaitDLS PR #3288
Re-merges remote --graph-ref subgraphs on every supergraph.yaml reload when rover dev is run with both --graph-ref and a local supergraph file. Previously the watcher only re-read the YAML and dropped the graph-ref-only subgraphs that had been merged in at startup.
Fix release tagging workflow - @SharkBaitDLS PR #3309
Switches the release "refs exist" check to the exact-match GitHub tag API. Previously it used a fuzzy-matching API that incorrectly no-op'd when prior release-candidate tags existed. Also restores the original workflow names to preserve Marketplace URLs and SEO.
Retry artifact uploads in CI - @dotdat PR #3325
Adds retries to actions/upload-artifact so transient network failures during CI uploads no longer fail builds.
Drop unused variant-name querying - @sirdodger PR #3320
Removes the unused variants field from the graph query to improve performance for graphs with many variants.
Run cargo +nightly fmt --all at the end of mise run prep - @dotdat PR #3311
Add Docker image information to CI docs - @SharkBaitDLS PR #3318
Documents the published Docker images in the CI/CD docs and aligns action names with the links already used on the docs site.
Add rover client extract command - @dotdat PR #3223, #3224, #3225
New rover client extract command pulls GraphQL operations out of client code. Includes the core extraction logic, CLI wiring, and integration tests.
Add rover client check command - @dotdat PR #3120
New rover client check subcommand for validating client operations against a schema.
Add rover schema search - @dotdat PR #3262
New subcommand under rover schema for searching schema contents.
Add --check flag to rover graph publish - @joshuaoshields95 PR #3203
Runs graph check and graph publish as a single unit when --check is passed.
Add --use-example-schema flag to subgraph publish - @samaanghani PR #3218
Allows publishing a placeholder schema without needing to provide your own schema file. This is useful for setting up your graph structure before your actual schemas are ready. The placeholder schema is type Query { helloWorld: String } with a routing URL of https://example.com.
Respect --insecure-accept-invalid-certs in rover init --mcp - @dotdat PR #3234
rover init --mcp now honors --insecure-accept-invalid-certs when fetching templates.
Port axios no-proxy behavior - @SharkBaitDLS PR #3270
Restores no_proxy / NO_PROXY handling that was previously provided by axios before its removal in 0.38.0.
Fix path and formatting issues in client check/client extract - @dotdat PR #3285
Use --root-dir in client check fixture tests for cross-platform compatibility - @samaanghani PR #3219
Don't run the automated update check in Docker - @SharkBaitDLS PR #3245
Skips the rover version-update check when running inside a container so Docker users don't see spurious update prompts.
Workaround NPM 11 installation bug - @SharkBaitDLS PR #3230
Add canonical GitHub Actions for install / subgraph / persisted queries - @SharkBaitDLS PR #3264, #3269, #3278, #3279, #3280
New companion actions under apollographql-gh-actions/* for installing rover and wrapping common subgraph and persisted-queries subcommands.
Bump apollo-language-server to 0.8.0 - PR #3251
Restore retry-until-ready behavior for unavailable subgraphs - @dmallare PR #3187
rover dev would continue polling unavailable subgraphs until they came online.axios, axios-proxy-builder and console.table and introduces undici as a dependency. It also pins detect-libc to a fixed version with no further dependencies.rover install command - PR #3022
docs/source/commands/install.mdx covering installing Rover and plugins (supergraph, router, apollo-mcp-server) with --plugin, options (--force, --elv2-license), and navigation updates. The install command is now visible in rover --help.rover dev - @DaleSeo, PR #2784Remove claude_desktop_config.json from MCP template and update "Next Steps" UX - @gocamille, #2746 fixes apollographql/rover-init-starters#84
Updates the MCP template to be more flexible and AI-client agnostic. Removes the prescriptive claude_desktop_config.json file and provides more generic "Next Steps" guidance for connecting any AI client to the generated MCP server.
Remove mcp-claude shortlink - @gocamille, #2747
Removes the Claude Desktop-specific shortlink to align with the more flexible, AI-client agnostic approach to MCP server setup.
--mcp flag to rover init for Model Context Protocol support - @camillelawrence PR #2731
rover init --mcp. This enables two flows: creating new graphs with MCP server capabilities, or augmenting existing projects with MCP tooling.--mcp-collection option for rover dev - @Jephuff PR #2636rover init - @sanchezdale PR #2630
init were set to default to federation 2.10. Now, init sets the default to the federation version defined in the selected starter template.apollographql/federation-rs to v2.11.0 - PR #2627Log cause of introspection error - @pubmodmatt PR #2615
Introspection failures in rover dev were not logging the underlying cause of the failure. This has been fixed to help with debugging introspection problems.
eslint to v9.28.0 - PR #2616zip to v4 - PR #2618rand_regex to v0.18.1 - PR #2606slackapi/slack-github-action action to v2.1.0 - PR #2584duct to v1 - PR #2586npm to v11 - PR #2547quay.io/pypa/manylinux2014_x86_64 docker tag to v2025 - PR #2548Use the Streamable HTTP transport for MCP - @pubmodmatt PR #2607
rover dev --mcp will now use the Streamable HTTP transport instead of SSE. Specify the --mcp-port and/or --mcp-address options to rover dev --mcp to override the default values. The --mcp-sse-port and --mcp-sse-address options still work, but will configure the port and address for Streamable HTTP. Users should migrate to the new option names.
--mcp-directory was optional, but rover dev failed if it was not specified--mcp-sse-address to set the bind address for the MCP server started by rover devERROR or UNKNOWNrover dev would exit but leave the other process runningrover init will now emit the correct commands for Windows PowerShell - @sanchezdale PR #2595Add mcp to rover dev - @Jephuff, @pubmodmatt PR #2591
This release adds the ability to run the Apollo MCP Server in addition to the Apollo Router when running rover dev. Specify the --mcp option to start the MCP server. Additional options are provided to configure the MCP server. Use rover dev --help for details.
Add support for templates in the rover init command
This adds support for templates in the rover init command. You can now select a template to use when creating a new graph!
init flag to default features - @tayrriblestart_point_file to specify what file to use in output - @sanchezdalepq publish into docs - @lleadbetrover init resources - @Meschreiberactions/checkout@v4 in GitHub Actions example workflows - @DaleSeoAdding new command rover init
New rover init command to help set up a new project. It walks you through creating a graph, setting up files, and getting GraphOS credentials.
More information: <insert doc link here>
init flow when duplicate graph ID is providedrover_std librarydev command's descriptioninitconfiguring slug to docs link listinit commandinit Command with TypeState Patternrover initFix telemetry reporting for release builds - @pubmodmatt PR #2445
Telemetry was not working for release builds. This has been corrected. See the Rover privacy policy for information about anonymous usage data collection in Rover.
Default to Apollo Router 2.x for rover dev - @pubmodmatt PR #2433
The default version of Apollo Router used by rover dev is now 2.x instead of 1.x. The default can be overridden by
setting APOLLO_ROVER_DEV_ROUTER_VERSION, for example APOLLO_ROVER_DEV_ROUTER_VERSION=1.61.0.
Implement supergraph config schema command - @jonathanrainer PR #2418
Adds a new rover supergraph config schema command to output the JSONSchema for supergraph.yaml. This can be used
to configure editor support for the file.
rover config whoami - @pubmodmatt PR #2413Restore the ability to use environment or file references in the supergraph.yaml file - @jonathanrainer PR #2411
In v0.26.3 and older you could use references such as ${env.HOST} or similar in the supergraph.yaml file, there
was an oversight in the refactor and this was removed. This ability has now been restored.
apollographql/federation-rs to v2.10.0 - @jonathanrainer PR #2409thiserror to v2.0.1 - @jonathanrainer PR #2261If using Rover with Connectors, you will need to specify
APOLLO_ROVER_DEV_ROUTER_VERSION=2.0.0-preview.Xwhen usingrover dev
Create output parent directories if they do not already exist - @dotdat PR #2396
One small regression with release of v0.27.0 was that if an output directory to supergraph compose was specified,
but one of the parent directories did not exist, the command would fail. In previous versions the parent directories
would be created instead and the command would succeed. This is now corrected and the previous behaviour restored.
Clean up how default subgraphs are defined in rover dev - @dotdat PR #2397 fixes #2394
An issue has been reported where rover dev would prompt repeatedly for the subgraph name and URL despite the
user having given those values already. This was due to multiple factors, including not accounting for CLI args in
the default case and some faulty other faulty logic. This has now been restored.
Refine how composition produces artifacts for targets - @dotdat PR #2398 fixes #2393
Due to changes in the supergraph binary from 2.9+, writing directly to a file is now supported. However,
this feature is not available in earlier versions of supergraph. As such Rover should be responsible for
orchestrating how the output from supergraph binary ends up in a file, rather than delegating that responsibility
to the supergraph binary and thus being at the mercy of which version is used. This allowed a further refactor that
eliminated complexity around composition outputs.
Ensure credentials are checked when needed and not before - @jonathanrainer PR #2400 fixes #2399
Due to the rover dev refactor there were situations where credentials were being required when they were ultimately
not being used. As such we stopped supporting the use case where no profile was defined and no APOLLO_KEY env var
was provided, which is a very common pattern. This is now corrected.
Update apollographql/router to v1.60.1 - @jonathanrainer PR #2388
Update Node.js packages - @jonathanrainer PR #2390
Includes eslint to v9.20.0 and prettier to v3.5.0
Update node CircleCI orb to v7.1.0 - @jonathanrainer PR #2391
Pin dependencies - @jonathanrainer PR #2401
Update Rust and Node.js packages - @jonathanrainer PR #2402
Includes eslint to v9.20.1, mockito to v1.6.1, node to v20.18.3 and prettier to v3.5.1
Update CI node Docker Image to v20.18.3 - @jonathanrainer PR #2403
Update mockall to v0.13.1 - @jonathanrainer PR #24045
rover dev --help - @dylan-apollo PR #2395Important: 3 potentially breaking changes below, indicated by ❗ BREAKING ❗
If using Rover with Connectors, you will need to specify
APOLLO_ROVER_DEV_ROUTER_VERSION=2.0.0-preview.Xwhen usingrover dev
Make paths in supergraph.yaml resolve relative to the location of the supergraph.yaml file - @jonathanrainer PR #2119
To support the new Apollo Language Server it is now the case that any paths expressed in the supergraph.yaml file will
be resolved relative to the file's location on disk, not the location that Rover is running in, at the time.
Remove fed2 command - @aaronArinder PR #2222
This was a deprecated, hidden, unused command that was for early Federation 2.0 testing. This command has not been invoked for a very long time.
Remove ability to start multiple rover dev sessions - @jonathanrainer PR #2352
Now that Rover supports hot-reloading from supergraph.yaml files we've removed the ability to start multiple
rover dev sessions, in multiple terminal windows, and have them communicate with each other.
Remove ambiguity around which URL is used for query execution when using subgraph_url and --graph-ref flag
In previous versions of Rover, when the --graph-ref flag was used and a subgraph was specified in the
supergraph.yaml to override the values from GraphOS, the schema.subgraph_url was used for both schema fetching via introspection and query execution.
federation_version: 2.10.0
subgraphs:
subgraph_a:
schema:
subgraph_url: "http://localhost:4000/graphql"
This was a bug in earlier versions of Rover that has only recently been identified. Now if this same situation occurs, Rover will use
the given schema.subgraph_url (http://localhost:4000/graphql in the example above) to fetch the schema only. Query
execution will use the routing_url from GraphOS.
This is consistent with the documented behaviour since this feature launched and in addition is consistent with the
principle that the use of the supergraph.yaml will only override --graph-ref where you explicitly state that
should happen. To obtain the original behaviour again you simply need to override the routing_url in the
supergraph.yaml as well, so the example above would become:
federation_version: 2.10.0
subgraphs:
subgraph_a:
routing_url: "http://localhost:4000/graphql"
schema:
subgraph_url: "http://localhost:4000/graphql"
and this will use http://localhost:4000/graphql for query execution and schema fetching via introspection.