We'd be happy to accept pull requests. If you plan on working on something big, please first drop us a line!
To get started, first fork the project on GitHub and clone the project using Git.
This project uses Yarn 4 for dependency management. To install dependencies, run the following command from the project root:
yarn installTo check for updates, run:
yarn upgrade-interactiveIf you bump internal @transloadit/* versions (for example in packages/node/package.json),
run corepack yarn install and commit the updated yarn.lock. CI uses immutable installs and
release workflows will fail if the lockfile is out of date.
Local tooling (the TypeScript scripts in scripts/ and package tests) requires Node 22.18+ so node file.ts works without flags. The published packages still support Node 20+ at runtime.
This project is linted using Biome. You can lint the project by running:
yarn lint:jsThis project is formatted using Biome. You can format the project:
yarn fix:jsThis project is tested using Vitest. There are two kinds of tests.
Unit tests are in the test/unit folder of the project. You can run them using the following command:
yarn test:unitThis will also generate a coverage report in the coverage directory.
e2e tests are in the test/e2e folder. They require some extra setup.
Firstly, these tests require the Cloudflare executable. You can download this with:
curl -fsSLo cloudflared-linux-amd64 https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x cloudflared-linux-amd64They also require a Transloadit key and secret, which you can get from https://transloadit.com/c/credentials.
You can run the e2e tests with:
TRANSLOADIT_KEY='YOUR_TRANSLOADIT_KEY' TRANSLOADIT_SECRET='YOUR_TRANSLOADIT_SECRET' CLOUDFLARED_PATH='./cloudflared-linux-amd64' yarn test:e2eCoverage reports are:
- Generated locally in the
coveragedirectory - Uploaded to Codecov for tracking
- Enforced in CI (builds will fail if coverage drops below thresholds)
View the coverage report locally by opening coverage/index.html in your browser.
The packages/transloadit folder is a generated legacy wrapper. Tracked files under that package are refreshed by scripts/prepare-transloadit.ts, and CI verifies those tracked files stay in sync with @transloadit/node. If you need to validate the published legacy package contents, run:
yarn packOnly maintainers can make releases. Releases to npm are automated using GitHub Actions and Changesets (including the legacy transloadit package).
Release flow:
- Add a changeset in your PR:
yarn changeset
- Merge the PR to
main. - The
releaseworkflow opens a “Version Packages” PR with changelog + version bumps. - Review and merge the version PR. CI publishes automatically via npm trusted publishing (OIDC).
- Add release notes once the publish succeeds.
Changelog guidance:
- Treat changesets as the changelog source. Write them as release notes (short, user-facing, and accurate).
- Per-package
packages/*/CHANGELOG.mdfiles are generated/updated by Changesets during the “Version Packages” PR. Avoid editing them by hand. - The top-level
CHANGELOG.mdis historical (the oldv4.x.ytag series). Prefer GitHub releases and the package changelogs.
Manual fallback (maintainers only):
corepack yarn changeset publish
Notes:
- CI publishing requires npm trusted publishing (OIDC) configured for this repo.
- Scoped packages now publish to the default
latestdist-tag unless a workflow explicitly overrides it. - If this was a pre-release, remember to reset the npm
latesttag to the previous version (replacex.y.zwith previous version):npm dist-tag add transloadit@X.Y.Z latest
- Independent versions: Changesets are not fixed to a single version. Only packages listed in a changeset bump; internal dependency changes auto-bump dependents (patch) via
updateInternalDependencies. - Legacy wrapper sync: PR checks run
scripts/prepare-transloadit.tsand fail if tracked files inpackages/transloaditdrift from@transloadit/node. - Legacy parity:
yarn parity:transloaditremains available as a manual release/debug check when you need to compare the generated wrapper tarball against the recorded baseline. - Accepting intentional parity drift: run
node scripts/prepare-transloadit.tsbefore updating the parity baseline, then follow the parity tool instructions to regeneratedocs/fingerprint/*so the baseline reflects the latest build. - Scoped packages: Scoped packages publish to the default npm dist-tag unless a workflow or manual publish step overrides it. The unscoped
transloaditpackage remains stable. - Changelog visibility: the “Version Packages” PR is the single source of truth for what gets published. If something was published to npm without a corresponding GitHub release/tag, add the missing release/tag so users can discover the change history from GitHub.