Thank you for your interest in contributing to Kreuzberg! Whether you're fixing a typo, adding a feature, or improving documentation, every contribution makes a difference.
Welcome! We're glad you're here. Start by choosing an issue that matches your experience level:
- Good first issue — small, well-scoped tasks ideal for newcomers
- Help wanted — tasks where we'd especially appreciate community help
Tip: Pick an issue you feel confident about. If you're unsure about scope or approach, leave a comment on the issue and we'll help you get started.
Want to work on something bigger or propose a new feature? Open a discussion with maintainers first.
Quick fixes (typos, small doc improvements):
- Edit the file directly on GitHub
- Submit a pull request — that's it!
Larger contributions (features, new bindings, bug fixes):
- Read the full Contributing Guide on our docs site
- Set up your development environment (see below)
- Follow our workflow: branch → code → test → PR
Kreuzberg is a polyglot project with many areas where you can help:
| Area | Description |
|---|---|
| Rust core | Parser implementations, extraction pipeline, performance |
| Language bindings | Python, TypeScript, Ruby, Go, Java, C#, PHP, R, Elixir, WASM |
| Documentation | Guides, API references, examples, tutorials |
| Testing | Unit tests, E2E test fixtures, cross-language coverage |
| Plugins | New extraction plugins, plugin system improvements |
| CI/CD | Build pipeline, cross-architecture support, release automation |
Required for all contributions:
- Git
- Task — our task runner for all build and test workflows
- Rust stable (via
rustup) — thewasm32-unknown-unknowntarget is configured automatically viarust-toolchain.toml
Required for WASM builds (tree-sitter, tesseract, and pdfium compile C/C++ to wasm):
- WASI SDK — install to
$HOME/wasi-sdkor setWASI_SDK_PATH
Language-specific toolchains (only install what you need):
| Language | Version | Tool |
|---|---|---|
| Python | 3.10+ | uv |
| Node.js | 20+ | pnpm |
| Ruby | 3.2+ | rbenv or rvm |
| Go | 1.26+ | Official installer |
| Java | 25+ | JDK (via sdkman) |
| .NET | 10+ | dotnet |
| PHP | 8.1+ | composer |
| Elixir | 1.14+ | mix (OTP 25+) |
| R | 4.1+ | CRAN |
task setupThis installs all toolchains and dependencies across every language. Safe to re-run anytime.
| Command | What it does |
|---|---|
task setup |
Install all dependencies (idempotent) |
task build |
Build all language bindings |
task test |
Run all test suites |
task lint |
Run all linters (with auto-fix) |
task format |
Format all code |
task check |
Combined lint + format check (no modifications) |
For language-specific commands, use the namespace pattern: task rust:test, task python:build, task node:format, etc.
For the complete development workflow, build profiles, coding standards, and PR guidelines, see the full Contributing Guide.
We use Conventional Commits. Prefix your commit messages with a type:
feat:— new featurefix:— bug fixdocs:— documentation changesperf:— performance improvementchore:— maintenance, dependencies, CItest:— adding or updating testsrefactor:— code restructuring without behavior change
- Star the repo: Give us a star on GitHub — it helps others discover Kreuzberg!
- Documentation: docs.kreuzberg.dev
- Discord: Join our community
- Issues: GitHub Issues
- License: Elastic License 2.0 (ELv2)
Thank you for helping make Kreuzberg better!