Contributing
July 4, 2026 · View on GitHub
Thanks for choosing to contribute!
Before making any changes, read INVARIANTS.md — it lists non-negotiable constraints.
Code Of Conduct
This project adheres to the Adobe code of conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to Grp-opensourceoffice@adobe.com.
Have A Question?
Start by filing an issue. The existing committers on this project work to reach consensus around project direction and issue solutions within issue threads (when appropriate).
Contributor License Agreement
All third-party contributions to this project must be accompanied by a signed contributor license agreement. This gives Adobe permission to redistribute your contributions as part of the project. Sign our CLA. You only need to submit an Adobe CLA one time, so if you have submitted one previously, you are good to go!
Code Reviews
All submissions should come in the form of pull requests and need to be reviewed by project committers. Read GitHub's pull request documentation for more information on sending pull requests.
Lastly, please follow the pull request template when submitting a pull request!
From Contributor To Committer
We love contributions from our community! If you'd like to go a step beyond contributor and become a committer with full write access and a say in the project, you must be invited to the project. The existing committers employ an internal nomination process that must reach lazy consensus (silence is approval) before invitations are issued. If you feel you are qualified and want to get more deeply involved, feel free to reach out to existing committers to have a conversation about that.
Security Issues
Security issues shouldn't be reported on this issue tracker. Instead, file an issue to our security experts.
Development Setup
Prerequisites:
- Java 25 (compile/run; JVM target 17 with Kotlin language/api 2.2, per Spring Boot 4.x guidance)
- Maven 3.9+ (use make targets)
- Docker (for Docker build and integration tests)
Build and verify:
make install # Full build with Docker
make skip-docker # Skip Docker (faster, for unit tests only)
make integration-tests # Run integration tests
make format # Format Kotlin code
Adding a New S3 Operation
See the full implementation checklist in server/AGENTS.md § Implementation Flow — it is the authoritative step-by-step guide (DTO → Store → Service → Controller → IT → docs).
Code Review Focus
In priority order:
- AWS API correctness (XML names, status codes, error codes)
- Layer violations (logic in controllers, HTTP in services)
- Locking correctness (all filesystem writes acquire the appropriate lock)
- Constraint violations (SDK v1, JUnit 4, legacy Jackson annotations)
- Test quality (mocked SDK clients in
*IT.kt, shared state between tests)
Architecture
S3Mock follows a Controller - Service - Store layered architecture. For detailed architecture documentation, code style guidelines, and project conventions, see the AGENTS.md in the project root.
Module-specific documentation:
- Server Module - core implementation
- Integration Tests - test patterns
- Test Support - framework integrations
Code Style
- Kotlin: Enforced by ktlint — run
make formatbefore submitting - XML/Java: Enforced by Checkstyle — configuration in
etc/checkstyle.xml - Key conventions: Constructor injection, data classes for DTOs, backtick test names,
valovervar - See the DO / DON'T section in AGENTS.md for the full list
Code Reviews
All submissions should come in the form of pull requests and need to be reviewed by project committers. Read GitHub's pull request documentation for more information on sending pull requests.
Testing
All submissions must include tests for any new functionality or bug fixes.
S3Mock uses three test levels:
- Unit tests (
*Test.kt) - Spring Boot tests with@MockitoBeanfor mocking, inserver/src/test/ - Spring Boot tests - component-level coverage with Spring context
- Integration tests (
*IT.kt) - end-to-end tests against the Docker container using real AWS SDK v2 clients, inintegration-tests/src/test/
Ensure your code has coverage from at least one of these test types.
Submitting Changes
- Ensure all CI gates pass (build, tests, ktlint, checkstyle, Docker)
- Update CHANGELOG.md under the current version section for user-facing changes
- Update documentation if applicable (README.md, AGENTS.md)
- Follow the pull request template when submitting
For Agents
What you can do without approval
- Edit any file in
server/,integration-tests/,testsupport/,docs/,AGENTS.md,INVARIANTS.md,CHANGELOG.md - Run
make test,make lint,make format,make typecheck,make check - Create branches, stage files, draft commit messages
What requires human approval
git pushor creating a PR- Modifying
.github/workflows - Changing
pom.xmldependency versions - Deleting files (check with the human first)
- Any change that touches the Docker image build or CI configuration
Escalation checklist
Before flagging a blocker, verify:
-
make lintpasses (ktlint + Checkstyle) -
make typecheckpasses (no compilation errors) -
make testpasses (unit tests) - The change you're making is within the scope requested
If make integration-tests fails, first verify Docker is available: run docker info. If that command fails, Docker is not running — escalate to the human rather than debugging the test failure. Do not claim success based on compilation alone.
What not to do without approval
- Do not modify
INVARIANTS.mdconstraints - Do not add or remove dependencies in
pom.xml - Do not change port numbers or storage layout
- Do not add authentication, authorization, or real encryption
- Do not push to remote or open PRs
Security
To report security vulnerabilities, see the Security Policy.