What it is. A testing tool for JavaScript. The project describes itself as: "Delightful JavaScript Testing".
Age. The GitHub repository was created on December 10, 2013; since 2022, the project is under the OpenJS Foundation, the repository is jestjs/jest.
Size. 45,500 stars, 6,700 forks as of September 2026.
The rules of Jest are in CONTRIBUTING.md at the root of the repository, the power structure is in the short GOVERNANCE.md. The first mainly covers assembly and tests, but there are a few paragraphs about how the project lives.
Core and outsiders go the same way:
Both core team members and external contributors send pull requests which go through the same review process.
Both core team members and external contributors send pull requests, and they go through the same review.
The main branch is honestly named unsafe:
We will do our best to keep
mainin good shape, with tests passing at all times. But in order to move fast, we will make API changes that your application might not be compatible with.
We will try to keep main in order so that tests always pass. But for the sake of speed, we will change the API in ways that your application may become incompatible.
One maintainer is listed in GOVERNANCE.md, and the path to this role is through the quantity and quality of work:
Promoting contributors to maintainers is done by a maintainer after a significant number of high-quality PRs.
A maintainer promotes a contributor to maintainer after a significant number of quality PRs.
Questions are answered substantively and with someone else's package.json in hand; they ask for reproduction and analyze it. But the task itself is led by a robot: thirty days of silence — the label "stale", another thirty — closure, another month — blocking discussion with a note that the tracker is not a support forum. The task was closed three months before the fix arrived.
There is no commit format for Jest — neither in CONTRIBUTING nor in the repository configs is such a rule recorded. However, a coding style is recorded, and the last item on the list is written in abbreviations:
- 2 spaces for indentation (no tabs).
- 80 character line length is strongly preferred. …
- Avd abbr wrds.
Two spaces for indentation, no tabs. 80 characters per line is strongly preferred. … Avoid abbreviated words.
Changelog is written by the author of the change, and checked by a machine:
All changes that add a feature to or fix a bug in any of Jest's packages require a changelog entry containing the names of the packages affected, a description of the change, and the number of and link to the pull request.
Any change that adds a feature or fixes a bug in any Jest package requires an entry in the changelog: affected packages, description, PR number, and a link to it.
The mechanics are in .github/workflows/require-changelog.yml: if the PR touches packages/, the bot adds the require-changelog label, and check-changelog.yml checks that there is a link to this PR in the ## main section of the CHANGELOG.md file.
PR template — two mandatory fields: Summary (what problem we are solving) and Test plan (exact commands and their output). Linter — yarn lint on ESLint, tests — yarn jest, yarn test runs both.
Everything below is from CONTRIBUTING.md, task templates, and workflow files in .github/ of the project itself.
First, CLA, and a bot will guide you:
In order to accept your pull request, we need you to submit a CLA. You only need to do this once… If you are submitting a pull request for the first time, a bot will verify and guide you on how to sign it.
To accept your PR, we need you to sign a CLA. This is done once… If you are submitting a PR for the first time, a bot will check and guide you on how to sign it.
No review deadlines are promised, but the lifespan without a response is known. According to close-stale.yml, a PR without activity for 90 days gets the stale label and a warning:
This PR is stale because it has been open 90 days with no activity. Remove stale label or comment or this will be closed in 30 days.
This PR is stale: it has been open for 90 days without activity. Remove the label or comment, otherwise it will be closed in 30 days.
Drafts and PRs with the Pinned label are excluded. Closed tasks and PRs are blocked from comments after 30 days (lock.yml).
A bug without reproduction will be closed, a question — too. Tasks without a template are disabled (blank_issues_enabled: false), and the bug template warns:
Bug reports without a minimal reproduction will be rejected.
Bug reports without minimal reproduction will be rejected.
The Needs Reproduction label automatically closes the task, the Question label does too:
The issue tracker is not a help forum.
The issue tracker is not a help forum.
Not every idea is suitable for the core. The proposal template lists in advance what is usually not accepted:
Common proposals that do not typically make it to core:
- New matchers…
- Changes to the default reporter…
- Changes to node/jsdom test environments…
What usually does not make it to the core: new matchers, changes to the default reporter, changes to node/jsdom test environments.
People encountered in our analyses of this project. The trait is named only together with the action — with the date and link. Nickname — main, name — from the profile; no name in the profile — only the nickname.
Three hundred PRs merged into Jest.
- 02.04.2023 — responded not with "lock it", but with an analysis of someone else's
package.json: showed theexportsfield, thereact-servercondition, and a ready pragma withcustomExportConditions; - the same day — suggested adding a
nodecondition to the package and crossed it out for himself, receiving a response from the package author: "UPDATE This can't work on React side". The suggestion remains visible; - at the same time — pointed out that the real breakage is not his: "Seems like this is a bug in Next.js", with a link to a neighboring task.
28.02.2023 — jest#13967: opened the task that started the story and immediately listed what he had already tried.
01–02.04.2023 — said that the workaround with the stub does not work for him, and at the request to provide an example brought a whole repository with reproduction.
14.03.2023 — first suggested a workaround: replace server-only with an empty module. A workaround that did not work for everyone and hid the cause.
- "A package that breaks on purpose" —
server-onlyfails in tests; the maintainer analyzes someone else'spackage.json, the robot closes the task three months before the fix.
The card was compiled on 02.09.2026 from open sources: the repository, project documentation, correspondence in PRs and tasks. There are no photographs or personal data here and there will be none. If you find an inaccuracy or want to be removed, please write, we will correct it without questions.