How to Contribute

Canvas is actively developed and running in production. It's built and maintained by one person — so contributions are genuinely appreciated, not just tolerated. Every PR gets a personal review within 1-2 days. Requirements: PHP 8.2+ and Composer.

explanation

Repository Structure

Canvas lives in a monorepo alongside ObjectQuel and several supporting packages:

framework/
  packages/
    canvas/
    objectquel/
    dependency-injection/
    discover/
    signal-hub/
    ... and others

Development happens in the monorepo. Contributions may affect multiple packages, so pull requests should target the repository rather than a single package.

Quick Start

# Fork https://github.com/quellabs/framework on GitHub
git clone https://github.com/YOUR-USERNAME/framework.git
cd framework
git remote add upstream https://github.com/quellabs/framework.git
composer install

Contribution Workflow

# Create a feature branch
git checkout -b feature/your-feature-name

# Make changes and update docs

# Run style checks
./vendor/bin/php-cs-fixer fix

# Commit and push
git add .
git commit -m "feat: your feature description"
git push origin feature/your-feature-name

# Open a PR at https://github.com/quellabs/framework/pulls

Not sure whether your idea fits? Open a GitHub Discussion first. A quick conversation saves everyone time.

Code Style

Canvas follows PSR-12 with three deliberate modifications: tabs (not spaces), opening braces on same line, and strict types always declared. These are enforced automatically — just run the fixer before committing and you're done.

<?php

declare(strict_types=1);

namespace Quellabs\Canvas\Example;

class ExampleController {

	protected string $config;

	public function __construct(string $config) {
		$this->config = $config;
	}

	/**
	 * @Route("/users")
	 */
	public function getUsers(int $limit = 10): JsonResponse {
		if ($limit <= 0) {
			return $this->json(['error' => 'Invalid limit'], 400);
		}

		$users = $this->em()->findBy(User::class, [
			'active' => true,
			'deleted_at' => null,
		]);

		return $this->json(['data' => array_slice($users, 0, $limit)]);
	}
}
./vendor/bin/php-cs-fixer fix

Reporting Issues

Report bugs at github.com/quellabs/framework/issues

Helpful to include: expected vs actual behaviour, steps to reproduce, Canvas version, PHP version, and any error output. The more specific, the faster it gets fixed.

Code Review

You'll get feedback within 1-2 days. If something needs changing, push new commits to the same branch and the PR updates automatically — no need to close and reopen. When you're happy with the changes, leave a comment and I'll re-review.

Versioning

Canvas follows Semantic Versioning. Breaking changes are MAJOR, new backwards-compatible features are MINOR, bug fixes are PATCH. The main branch is always stable.