You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Convert the action from a Docker container action to a JavaScript (node24) action now that CLI v5 is a native binary #321
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/cli from 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.).
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 on PATH or a custom npm registry.
Ports entrypoint.sh to TypeScript using @actions/core, @actions/exec and Octokit. This replaces the bash, curl and jq steps 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) so v3 users aren't affected.
Dependencies come only from npm, which is easy to mirror.
Describe alternatives you've considered
A composite action that runs npm i -g @crowdin/cli and then the existing entrypoint.sh. This is a smaller change, but it still depends on bash, git, curl, jq and gpg being 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.
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.
@andrii-bodnar I opened #322 to try out the approach proposed here. It converts the action to a node24 JavaScript action, installs the native CLI from the @crowdin/cli-<platform> npm packages into the tool cache, and ports entrypoint.sh to 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 v4 beta first (for example v4.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.
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)