Contributing to Conduction
Thank you for your interest in contributing! Conduction builds open-source components for digital government infrastructure. Every contribution — code, documentation, translation, issue report, or idea — helps us move toward our goal: ensuring every resident of the Netherlands automatically receives the government services they are entitled to.
This document applies to all repositories under the ConductionNL organization.
Code of Conduct
This project is governed by our Code of Conduct(ion). By participating, you are expected to uphold this code. Please report unacceptable behavior to info@conduction.nl.
Ways to Contribute
You don't need to write code to contribute:
| Contribution type | Where |
|---|---|
| Report a bug | GitHub Issues |
| Suggest a feature | GitHub Issues |
| Improve documentation | PR to the relevant repo |
| Translate content | PR to .github (docs site) |
| Review a pull request | GitHub PR review |
| Answer questions | GitHub Discussions / Issues |
| Report a security issue | See Security Policy |
First-Time Contributors
New to open source or to Conduction? Look for issues labeled good first issue — these are scoped to be approachable without deep context.
If you're unsure where to start, open a discussion or leave a comment on an issue you're interested in. We'll help you get oriented.
Reporting Bugs
Before filing a bug report, check existing issues — it may already be reported. When creating a report, include:
- A clear, descriptive title
- Exact steps to reproduce the problem
- Expected vs actual behavior
- Screenshots, logs, or error messages where relevant
- Version of the app and Nextcloud (if applicable)
For security issues, do NOT open a public issue. See Security Policy.
Suggesting Enhancements
Enhancement suggestions are tracked as GitHub Issues. Include:
- A clear, descriptive title
- The problem you are trying to solve (not just the solution)
- Current behavior vs desired behavior
- Why this would be useful to others
Contributing Code
External contributors (fork & PR)
- Fork the repository
- Create a branch from
development:git checkout -b feature/your-feature-name - Make your changes and commit using Conventional Commits
- Sign off your commits (see DCO)
- Push to your fork and open a PR targeting the
developmentbranch - Wait for CI to pass and request a review
Conduction team members (direct branch)
- Create a branch from
development:feature/*,bugfix/* - Open a PR to
developmentwhen ready
PR checklist
Before opening a PR:
- CI quality checks pass locally (
composer cs:check,composer phpstan,npm run lint) - New code has tests where applicable
- Documentation updated if behavior changes
- PR labeled with
major,minor, orpatch(controls version bump) - DCO sign-off on all commits (
git commit -s)
Branch Model
All branches are protected via organization-wide rulesets. Direct pushes are not allowed. Every change flows through a pull request with peer review and CI.
feature/* ──┐
bugfix/* ──┼──→ development ──→ beta ──→ main
hotfix/* ──┘ ↑
└── (hotfix can target beta or main directly)
| Target | Allowed sources | Reviews required | CI required |
|---|---|---|---|
development | feature/*, bugfix/* | 1 | Quality CI |
beta | development, hotfix/* | 1 | Quality CI |
main | beta, hotfix/* | 2 | Branch Protection CI |
All rulesets enforce: no force pushes, no branch deletion, stale reviews dismissed on new pushes, all threads resolved before merge.
Quality Workflow
Every PR triggers automated quality checks. All must pass before merge.
PHP
| Check | Tool |
|---|---|
| Syntax | php -l |
| Code style | PHPCS (PSR-12) |
| Static analysis | PHPStan (level 5) + Psalm |
| Mess detection | PHPMD |
Frontend
| Check | Tool |
|---|---|
| JavaScript/Vue | ESLint |
| CSS/SCSS | Stylelint |
Dependencies
- License compliance (npm + composer)
- Known vulnerability scan (npm audit + composer audit)
Run locally:
# PHP
composer cs:check
composer cs:fix
composer phpstan
composer psalm
composer phpmd
# Frontend
npm run lint
npx stylelint "src/**/*.{css,scss,vue}"
Commit Messages
We use Conventional Commits:
feat: add proactive service matching
fix: resolve null pointer in namespace parser
docs: update contributing guide
chore: upgrade PHPStan to v2
refactor: extract classifier into own class
- Use the imperative mood ("add" not "added")
- Keep the first line under 72 characters
- Reference issues with
Closes #123in the body where applicable
Developer Certificate of Origin (DCO)
All contributions must be signed off. This certifies that you wrote the code or have the right to submit it:
git commit -s -m "feat: your commit message"
This adds a Signed-off-by: Your Name <your@email.com> trailer. By signing off, you agree to the Developer Certificate of Origin.
If you forget, amend your last commit: git commit --amend -s
Release Process
Releases are fully automated via GitHub Actions on merge to beta (nightly) or main (stable). Version numbers are calculated from PR labels:
| Label | Effect |
|---|---|
major | 1.0.0 → 2.0.0 |
minor | 1.0.0 → 1.1.0 |
patch (default) | 1.0.0 → 1.0.1 |
See Release Process for full details.
Development Setup
- Install PHP 8.1+ and Node.js 20+
- Install Composer
- Clone the repository (or your fork)
- Run
composer install && npm install - Configure your Nextcloud development environment
Documentation
Documentation source lives in website/ (this repo) and is published to docs.conduction.nl.
To contribute to the docs:
- Edit the relevant Markdown files under
website/docs/ - For Dutch translations, edit the corresponding file under
website/i18n/nl/ - Test locally:
cd website && npm install && npm run start
Community
License
By contributing, you agree that your contributions will be licensed under the same license as the project (EUPL-1.2 unless stated otherwise in the repository).