Thank you for your interest in contributing to EnvProxy.
Install mise for toolchain management:
curl https://mise.jdx.dev/install.sh | shThen install all tools:
mise installThis installs:
- Rust (latest)
- Python 3.12
- Node.js 22
- Java 21
# Build all Rust crates
mise run build
# Build release binaries
mise run build:release
# Build the Java agent JAR
mise run build:java# Run Rust unit tests
mise run test
# Run clippy
mise run lint
# Full CI pipeline (format check + lint + test)
mise run ci# Terminal 1: start the agent
mise run agent
# Terminal 2: run a demo
mise run demo:python
mise run demo:java
mise run demo:node
mise run demo:c| Directory | Language | Description |
|---|---|---|
crates/envproxy-proto |
Rust | Wire protocol (shared between .so and agent) |
crates/libenvproxy |
Rust | LD_PRELOAD shared library (cdylib) |
crates/envproxy-agent |
Rust | Local daemon with pluggable backends |
crates/envproxy-cli |
Rust | CLI tool (envproxy run, get, status) |
support/python |
Python | sitecustomize.py hook for os.environ patching |
support/java |
Java | javaagent for System.getenv() patching |
k8s/injector |
Go | Mutating admission webhook |
k8s/chart/envproxy |
Helm | Kubernetes Helm chart |
examples/ |
Multi | Per-language demo scripts |
- One concern per PR — keep PRs focused on a single change
- Run the CI checks locally before submitting:
mise run ci - Add tests for new functionality where applicable
- Update documentation if you change behavior or add features
- Follow existing code style — Rust code must pass
cargo clippy -D warnings
Use clear, descriptive commit messages:
Add file watcher backend for hot-reloading secrets
The file backend now watches for mtime changes on each resolve()
call and reloads the secrets file when it changes. This enables
live secret rotation without restarting the agent.
Be respectful and constructive. We follow the Rust Code of Conduct.
By contributing, you agree that your contributions will be licensed under the same dual MIT/Apache-2.0 license as the project.