How I run Renovate locally
Posted on Saturday 23 May 2026 .
This post explains how I run Renovate locally. I have a separate post on why I run Renovate locally.
I have found running Renovate locally tricky; I think because Renovate:
- Requires a token to authenticate access to GitHub 1
- Should be run under a specific version of Node.js2
- Can use two different, incompatible, regular expression syntaxes depending on the installation 3
- Versions are not always available from NPM4
- The project releases a new version several times per day
The Renovate GitHub repository includes a document with advice how to run Renovate locally for development. Jamie Tanna, the community manager for Renovate, also publishes a guide. This post is different, it strives to be "fast and simple" 5.
The cloud service uses the latest version of Renovate 6. From time to time, I intend to update this post to the latest release of Renovate. For that, two pieces of information are required:
- The latest version number; today 43.195.6 and
- A supported engine; today Node.js 24.16.0 — the version pinned in .nvmrc.
Script to keep this post up to date
#!/usr/bin/env -S uv run --script
"""Query and write version numbers relating to Renovate."""
# /// script
# requires-python = ">=3.13"
# dependencies = [ "httpx" ]
# ///
import re
from argparse import ArgumentParser
from enum import Enum
from pathlib import Path
import httpx
PATTERN = re.compile(r"\d+[.]\d+[.]\d+")
README = Path("README.md")
Mode = Enum("Mode", ["query", "write"])
def _main(arg_list: list[str] | None = None) -> int:
parser = ArgumentParser()
parser.set_defaults(mode=Mode.query)
subparsers = parser.add_subparsers()
help_ = "query versions from GitHub"
subparsers.add_parser("query", help=help_).set_defaults(mode=Mode.query)
help_ = f"write versions to {README}"
subparsers.add_parser("write", help=help_).set_defaults(mode=Mode.write)
args = parser.parse_args(arg_list)
response = httpx.get("https://github.com/renovatebot/renovate/releases/latest")
if not response.is_redirect or response.next_request is None:
return 1
renovate = str(response.next_request.url).rsplit("/", maxsplit=1)[1]
response = httpx.get(
"https://raw.githubusercontent.com/renovatebot/renovate/"
f"refs/tags/{renovate}/.nvmrc",
)
node = response.text.strip()
if args.mode == Mode.query:
print(renovate)
print(node)
return 0
text = README.read_text()
matches = PATTERN.finditer(text)
renovate_before = next(matches)[0]
node_before = next(matches)[0]
README.write_text(
text.replace(renovate_before, renovate).replace(node_before, node),
)
return 0
if __name__ == "__main__":
raise SystemExit(_main())
These instructions assume the following pre-requisites are installed 7 and that the GitHub CLI has been authenticated:
| Prerequisite | Executable | Fedora Linux 43 package |
|---|---|---|
| GitHub CLI | gh |
gh |
| Git | git |
git |
| keyring | keyring |
python3-keyring |
| Fast Node Manager | fnm |
None available |
Command to download a recent copy of the Renovate git repository:
git clone https://github.com/renovatebot/renovate.git
Command to install the correct version of Node.js, install dependencies from NPM,
build the project, set and export environment variables and configure an alias for
both renovate and renovate-config-validator:
cd renovate \
&& git checkout 43.195.6 \
&& eval "$(fnm env)" \
&& fnm install 24.16.0 \
&& fnm exec --using=24.16.0 npm --no-git-tag-version version 43.195.6 \
&& fnm exec --using=24.16.0 npm exec --yes pnpm install \
&& fnm exec --using=24.16.0 npm exec --yes pnpm build \
&& RENOVATE_GITHUB_COM_TOKEN="$(keyring get gh:github.com "")" \
&& RENOVATE_PLATFORM=local \
&& LOG_LEVEL=debug \
&& export RENOVATE_GITHUB_COM_TOKEN RENOVATE_PLATFORM LOG_LEVEL \
&& alias \
renovate="fnm exec --using=24.16.0 node $PWD/lib/renovate.ts" \
renovate-config-validator="fnm exec --using=24.16.0 node $PWD/lib/config-validator.ts" \
&& cd ..
Example usage
Command to check the renovate version:
renovate --version
Expected output:
43.195.6
Command to validate a repository configuration file:
renovate-config-validator --no-global ~/github.com/maxwell-k/dotfiles/.renovaterc.json
Expected output:
✂
INFO: Validating /home/maxwell-k/github.com/maxwell-k/dotfiles/.renovaterc.json as repo config
INFO: Config validated successfully
Command to run Renovate against the current working directory with debug output
shown on-screen and written to log.txt:
renovate | tee log.txt
Command to dry-run Renovate against a remote GitHub repository:
renovate --dry-run maxwell-k/dotfiles | tee log.txt
-
Depending upon the repository configuration, if Renovate is run without a GitHub access token it will either display a warning or fail. A example warning message is:
WARN: GitHub token is required for some dependencies (repository=local)
For me, the easiest way to securely retrieve and store an access token for GitHub is to use the command line interface (CLI). The GitHub CLI stores a token for its own use in the system keyring.
Command to check status of the token used by the GitHub CLI:
gh auth status --show-tokenCommand to retrieve the token used by the GitHub CLI:
keyring get gh:github.com "" -
Renovate needs a specific version of Node.js; using an older version of Node.js can force an older version of Renovate. The version of Node.js must match the engines key in
package.json. For example for [local development] the Renovate developers:… recommend you use the version of Node.js defined in the repository's .nvmrc
-
Renovate uses re2 syntax for regular expressions. If the re2 NPM package is not installed Renovate will fall back to the incompatible "RegExp" syntax. Running Renovate in an environment with or without re2 available will give different results; less than desirable if you are trying to reproduce or debug behaviour! The relevant lines in logs are:
DEBUG: Using RE2 regex engineorWARN: RE2 not usable, falling back to RegExp. ↩ -
In 2025, the NPM registry blocked the project from publishing as it has "too many versions". While publishing to NPM restarted after older versions were unpublished, in 2026 the issue re-occurred and is currently ongoing. At the time of writing the Renovate repository contains 11,698 tags. ↩
-
A phrase I'm borrowing from Fast Node Manager. ↩
-
The Mend Renovate Community Cloud uses the latest version of Renovate, with a short delay before upgrades. Logs for a job will show the version number:
INFO: Renovate started { "renovateVersion": "«version number»" }↩ -
Command to install the packages other than
fnmon Fedora Linux 43:dnf install --assumeyes gh git python3-keyring