Repository navigation
Description
Is your feature request related to a problem? Please describe.
crowdin/github-action is a Docker container action (runs.using: docker, image: Dockerfile). The runner builds the image from crowdin/cli every time a job uses the action, which means:
- It only runs on Linux runners with a Docker daemon. It doesn't work on macOS or Windows runners (macOS Runner Support #160).
- On self-hosted runners in Kubernetes (Actions Runner Controller), it requires Docker-in-Docker. DinD needs privileged pods, which many organizations don't allow. ARC's Kubernetes container-hooks mode doesn't support container actions built from a Dockerfile.
- Every run pulls
crowdin/clifrom Docker Hub and installs packages from Alpine apk mirrors. This is slow, can hit Docker Hub rate limits, and is hard to allow in restricted or air-gapped networks, where npm is typically already proxied (Artifactory, Nexus, etc.). - Files written into the workspace are owned by root (Run action as non root user #284).
Describe the solution you'd like
Crowdin CLI v5 no longer needs Java. @crowdin/cli now installs a prebuilt standalone binary through platform packages (@crowdin/cli-linux-x64, -linux-arm64, -darwin-x64, -darwin-arm64, -win32-x64, and musl variants). That removes the main reason for shipping the action as a container.
Proposal: rewrite the action as a JavaScript action (runs.using: node24) that:
- Installs the requested CLI version from npm, or downloads the release binary, caching it with
@actions/tool-cache. Ideally it would also accept an optional input for an existing CLI onPATHor a custom npm registry. - Ports
entrypoint.shto TypeScript using@actions/core,@actions/execand Octokit. This replaces the bash,curlandjqsteps for PR creation, labels, assignees and reviewers. - Keeps the existing inputs and outputs so it's a drop-in replacement, released as a new major version (e.g.
v4) sov3users aren't affected.
Benefits:
- Works on Linux, macOS, Windows, x64 and arm64 (resolves macOS Runner Support #160).
- No Docker, DinD or privileged runners needed. Works with ARC in Kubernetes mode.
- Faster startup, because there's no image build on every run.
- Runs as the runner user, so there are no root-owned files (Run action as non root user #284).
- Dependencies come only from npm, which is easy to mirror.
Describe alternatives you've considered
- A composite action that runs
npm i -g @crowdin/cliand then the existingentrypoint.sh. This is a smaller change, but it still depends on bash,git,curl,jqandgpgbeing on the runner, and it doesn't help Windows. - Calling the CLI directly in workflow steps instead of using the action. That loses the action's PR and branch handling, which is the main value of the action.
- Publishing a prebuilt image and using
docker://. This avoids the per-run build but still requires Docker or DinD.
Additional context
Related: #160 (macOS runner support), #167 (ARM, closed as a duplicate of #160), #284 (root-owned files).
Happy to help test a pre-release on self-hosted ARC runners.
🤖 Generated by Claude Opus 5.5 (claude-opus-5.5)
Activity
andrii-bodnar commentedon Oct 22, 2026
Hi @minijus, thanks for the suggestion!
We've considered this before, and the benefits are real. We postponed it because of maintenance cost. The current action is easy to maintain because it doesn't depend on the Node runtime that GitHub Actions provides, so there are no forced node16 → node20 → node24 migrations. A JavaScript version would also mean rewriting
entrypoint.sh(branches, commits, GPG signing, PRs, labels, reviewers) and making it behave the same on every OS and architecture. That kind of rewrite would likely bring new bugs that we can't predict yet.We'll keep this issue open and revisit it later. Thanks for offering to help test; we'll ping you if we start on it.
minijus commentedon Oct 26, 2026
@andrii-bodnar I opened #322 to try out the approach proposed here. It converts the action to a
node24JavaScript action, installs the native CLI from the@crowdin/cli-<platform>npm packages into the tool cache, and portsentrypoint.shto TypeScript. All existing inputs and outputs are kept.Could you take a look when you have time? If you agree with the direction, it might be worth publishing it as a
v4beta first (for examplev4.0.0-beta.1), so people on macOS/Windows/arm64 or ARC runners can try it before a stable release. The behavior changes are listed in the PR description.So far only the PR title check has run. The test workflow, which runs the action on Linux, macOS and Windows, probably needs your approval since this is my first contribution here.
🤖 Generated by Claude Opus 5.5 (claude-opus-5.5)
feat!: convert to a node24 JavaScript action
andrii-bodnar commentedon Nov 3, 2026
Available in
v4.0.0-beta.0.