Contributing to shim

August 30, 2026 ยท View on GitHub

What is open, and what is not

Everything outside ee/ is Apache-2.0 and open to contributions. The gateway itself, the privacy detectors, the provider transports, the tests and the documentation all live there.

Files under ee/ are source-available under the Elastic License 2.0. They are public so that a customer can read what runs in their own deployment, but they are not open to outside contributions and a pull request touching ee/ will be declined. Taking an outside contribution into a commercially licensed layer would need a rights assignment we deliberately do not ask for.

There is no CLA. Apache-2.0 already grants the patent licence a project this size needs, and a CLA would add friction without adding protection.

Sign your commits off

Every commit carries a Signed-off-by line, the Developer Certificate of Origin. Git writes it for you:

git commit --signoff

It states that you wrote the change, or have the right to submit it. Commit signing with a key is required of maintainers only.

Getting set up

shim needs Python 3.13 exactly and uv 0.12.5 or newer.

git clone https://github.com/GetSHIM/shim && cd shim
uv sync --locked --all-packages

Verification

Run this before opening a pull request. Continuous integration runs the same commands, plus the container builds.

uv lock --check
uv sync --locked --all-packages
uv run --locked ruff format --check src ee/src tests ee/tests scripts ee/scripts ee/alembic
uv run --locked ruff check src ee/src tests ee/tests scripts ee/scripts ee/alembic
uv run --locked ty check
uv run --locked python -m pytest -q
uv run --locked --package shim-gateway python scripts/export_openapi.py --profile community --check
uv run --locked --package shim-enterprise python scripts/export_openapi.py --profile enterprise --check

The enterprise tests need PostgreSQL and a Redis with the search and JSON modules. docker compose up brings both up.

Read the developer guide and the current architecture before you change a public contract or a dependency that crosses the package boundary. Both are enforced by tests under tests/architecture, so a boundary violation fails the build rather than reaching review.

The name

The name is shim, lowercase, everywhere including the start of a sentence. It is a word, not an acronym. Environment variables such as SHIM_API_KEY and headers such as X-Shim-Tag keep their own casing, and the licence files keep the licensor's registered name.

Where things go

  • A question, or an idea you want to talk through: Discussions.
  • A bug or a piece of work: Issues.
  • A security problem: do not open an issue. Use the security policy, which routes to a private advisory.

A note on the Cyber Resilience Act

The Cyber Resilience Act places its obligations on the manufacturer who puts a product on the European market. It does not place them on a person who contributes to someone else's open-source project. Contributing here does not make you answerable for shim's compliance, and we are not asking you to take on any part of it.

Tests come with the change

New functionality arrives with tests for it in the same pull request, and a bug fix arrives with a test that fails without the fix. This is the rule, not a preference: a change that cannot be tested is a design question to raise in the pull request rather than something to skip.