Ga naar hoofdinhoud

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 Conduction 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 typeWhere
Report a bugCodeberg Issues (or GitHub Issues on legacy repos)
Suggest a featureCodeberg Issues (or GitHub Issues on legacy repos)
Improve documentationPR to the relevant repo
Translate contentPR to .github (docs site)
Review a pull requestCodeberg PR review (or GitHub PR review on legacy repos)
Answer questionsCodeberg / GitHub Discussions / Issues
Report a security issueSee Security Policy

First-Time Contributors​

New to open source or to Conduction? Look for issues labeled good first issue on Codeberg (primary) or via the legacy GitHub search — 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 issues on the repo's host — Codeberg (primary) or GitHub (legacy). 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)​

  1. Fork the repository
  2. Create a branch from development: git checkout -b feature/your-feature-name
  3. Make your changes and commit using Conventional Commits
  4. Sign off your commits (see DCO)
  5. Push to your fork and open a PR targeting the development branch
  6. Wait for CI to pass and request a review

Conduction team members (direct branch)​

  1. Create a branch from development: feature/*, bugfix/*
  2. Open a PR to development when 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, or patch (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)
TargetAllowed sourcesReviews requiredCI required
developmentfeature/*, bugfix/*1Quality CI
betadevelopment, hotfix/*1Quality CI
mainbeta, hotfix/*2Branch 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​

CheckTool
Syntaxphp -l
Code stylePHPCS (Conduction standard)
Static analysisPHPStan (level 5) + Psalm
Mess detectionPHPMD

Frontend​

CheckTool
JavaScript/VueESLint
CSS/SCSSStylelint

Dependencies​

  • License compliance (npm + composer)
  • Known vulnerability scan (npm audit + composer audit)

Run locally:

cs:check / cs:fix are PHPCS here, not php-cs-fixer. They are the script names nextcloud/coding-standard defines, and in this fleet they are aliases for phpcs / phpcbf. See CI/CD and Code Standards.

# 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 #123 in 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:

LabelEffect
major1.0.0 → 2.0.0
minor1.0.0 → 1.1.0
patch (default)1.0.0 → 1.0.1

See Release Process for full details.

Development Setup​

  1. Install PHP 8.1+ and Node.js 20+
  2. Install Composer
  3. Clone the repository (or your fork)
  4. Run composer install && npm install
  5. 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:

  1. Edit the relevant Markdown files under website/docs/
  2. For Dutch translations, edit the corresponding file under website/i18n/nl/
  3. 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).