Contributions are genuinely welcome, and that includes the ones that are not code. A bug report, a confusing docstring, a README paragraph that turned out to be wrong, a question that took you an hour to answer yourself — all of those are worth opening an issue for.
If you are unsure whether something is worth reporting, it probably is. Open the issue.
git clone https://github.com/openfluids/fftkit.git
cd fftkit
uv syncThat gives you the core package and the test tooling. The optional FFT backends
(pyfftw, mkl, torch, tensorflow, CUDA) are not needed to work on
fftkit — every backend is probed at import time and reports itself unavailable
rather than failing, so the test suite passes without any of them. If you are
working on backend code specifically:
uv sync --group backendsThe same three checks CI runs:
uv run pytest -v
uv run ruff check .
uv run mypy --strict src/fftkit/ --config-file mypy.iniIf one fails for a reason you think is unrelated to your change, say so in the pull request rather than working around it — that is useful information, and sometimes it is CI that is wrong.
CI additionally tests against Python 3.11 through 3.14. You do not need to run all four locally; the matrix will tell you.
- One thing at a time. A focused change gets reviewed quickly. A change that also reformats fifty unrelated lines is hard to read and slow to merge.
- Say what you verified. A pasted command and its output is worth more than "tested locally".
- Ask early. For anything substantial, open an issue first. It is much better to disagree about an approach before you have written it than after.
- Draft PRs are fine. Opening one early to ask "is this the right direction?" is welcome and costs nothing.
Reviews may take a few days — one maintainer, research alongside. A nudge on a quiet pull request is welcome, not annoying.
Only the ones that are actually enforced:
- Type annotations on public API;
mypy --strictmust pass forsrc/fftkit/. - Formatting and import order are handled by
ruff— do not hand-tune them. - New backends must degrade gracefully: probe at import, report unavailable, never raise on a missing optional dependency.
- Use
np.random.default_rng(seed), not the legacy module-levelnp.randomcalls.
Everyone taking part is asked to follow the openfluids Code of Conduct. It is short.
fftkit is licensed under Apache-2.0, and contributions are accepted under the
same licence. See LICENSE and NOTICE.
Found a security problem? Please do not open a public issue — see the security policy.