Crowdin synchronization uses the file-based project configured in crowdin.yml. Set CROWDIN_PROJECT_ID and CROWDIN_PERSONAL_TOKEN in a local .env file, then run the pinned CLI commands from the repository root:
npx --yes @crowdin/cli@4.15.0 upload sources --no-progress
npx --yes @crowdin/cli@4.15.0 status --no-progress
npx --yes @crowdin/cli@4.15.0 download translations --no-progressThe English source catalog is Language/GHRunner-en_GB.pot; translated catalogs are downloaded into Language when translations are available.
GH Runner Manager is a Docker Desktop extension for creating and managing GitHub self-hosted Actions runners inside a persistent Docker host container.
- Repository-level and organization-level self-hosted runners.
- Organization runner groups.
- Persistent runner configuration, labels, and startup preferences.
- Saved GitHub authentication methods with token replacement and deletion.
- Automatic runner startup after the extension backend and Docker host are ready.
- Runner status, start, stop, restart, host refresh, version information, and diagnostic logs.
- Docker Desktop with Docker Extensions enabled.
- A GitHub classic personal access token with:
repofor private repository runners.public_repofor public repository-only access.admin:orgfor organization runners and runner groups.
The release version is defined in metadata.json. Build the extension image with:
docker build --tag=mrtrilb/gh-runner-manager:latest .Install it in Docker Desktop with:
docker extension install mrtrilb/gh-runner-manager:latestFor an existing installation, use:
docker extension update mrtrilb/gh-runner-manager:latestThe equivalent Makefile targets are build-extension, install-extension, and update-extension.
Automatic startup requires both settings to be enabled:
- Enable Start runners on Docker startup in Settings.
- Enable Start on startup for each runner that should launch automatically.
The backend waits for the host container to be ready and retries startup during cold Docker Desktop initialization. Runner definitions are stored separately from the host container, so recreating the host container does not remove configured runners.
The extension uses these Docker volumes:
gh-runner-manager-datastores backend settings, saved GitHub authentication methods, and logs.gh-runner-manager-runnersstores runner installations and registration state.
Do not remove these volumes unless you intend to delete the associated data. The Tools settings provide explicit volume-clear actions.
Build the backend locally:
Set-Location backend
npm install
npm run buildBuild the UI locally:
Set-Location ui
npm ci
npm run buildBuild the complete extension image from the repository root:
docker build --tag=mrtrilb/gh-runner-manager:latest .To tag the local image with the version from metadata.json and push it to Docker Hub, run:
.\scripts\push-docker.ps1The script asks whether latest should also be updated and pushed. Use -Build when the source image has not been built yet:
.\scripts\push-docker.ps1 -BuildBy default, the script pushes only the selected version tag and optional latest tag. This prevents unrelated local tags from being published accidentally. Authenticate with Docker Hub using docker login before running it.
Before publishing a release:
- Confirm the version in
metadata.json. - Run the backend and UI builds.
- Build the Docker image from a clean checkout.
- Install or update the extension and verify the UI opens.
- Restart the extension service or Docker Desktop and confirm runners marked for startup become active.
- Confirm runner data and settings survive the restart.
Saved GitHub tokens are stored in the extension data volume and are not returned to the UI after saving. Access to the Docker Desktop extension data and Docker socket should be restricted to trusted users. Encryption at rest and key management are planned for a future security-focused release.
See the repository license and project documentation for licensing, support, and contribution information.