We welcome contributions! This guide will help you get up and running.
If you have questions, reach out on GitHub Discussions — we're happy to help.
Found a bug? Please open an issue.
Matorral is intentionally designed to be a simple, focused project management tool. We care deeply about keeping it approachable and avoiding unnecessary complexity — every feature we add is a feature every user has to understand, and every option we introduce is one more thing that can go wrong.
Because of this, we ask that you reach out before investing time in a new feature. Please open a GitHub Discussion or issue to share your idea and get feedback from the maintainers first. This conversation helps us align on whether the feature fits the project's direction — and it saves you from putting effort into a pull request that we may not be able to accept.
We genuinely appreciate every contribution, and we want to make sure yours lands. Talking first is the best way to ensure that happens.
Bug fixes and improvements to existing behavior are always welcome and generally don't need prior discussion.
- Docker and Docker Compose
- just command runner
- pre-commit (see below)
- Fork the repository on GitHub.
- Clone your fork locally:
git clone git@github.com:your-username/matorral.git
cd matorralCopy the example env file and review the values (at minimum, set SECRET_KEY):
cp .env.example .envThen run the init command, which builds containers, runs migrations, and seeds the database:
just initjust start # start all containers with logs
just start-detached # start in background
just logs # tail logsOpen http://localhost:8000. Create an admin account:
just createsuperuserTo stop:
just stopNote: Any change to
pyproject.tomlrequiresjust requirementsto rebuild the containers.
Tests run inside Docker via just. Use dotted module paths, not file paths:
# Run all tests
just test
# Run tests for a specific app
just test apps.issues
# Run a specific test module
just test apps.issues.tests.test_views
# Run a specific test class or method
just test apps/issues/tests/test_models.py::TestIssueModel::test_method
# Run tests with coverage and print report
just cov
# Run tests with coverage only (no report)
just test-cov
# Print coverage report from a previous run
just cov-reportYou can also run tests locally without Docker using uv:
uv run pytest apps/ -v --tb=short
uv run pytest apps/issues/ -vNote: Running locally requires a reachable PostgreSQL instance. The Docker setup is recommended.
We use pre-commit to run linters and code checks before every commit. Please set this up before making any changes — it's what CI will check too.
Install pre-commit (if you don't have it):
pip install pre-commit
# or via brew:
brew install pre-commitThen install the hooks in your local repo:
pre-commit installFrom now on, the following checks will run automatically on git commit:
- ruff — linter and formatter (line length: 120, double quotes)
- black — code formatter
- isort — import sorter (black profile)
- pyupgrade — upgrades syntax to Python 3.14
- codespell — spell checker
You can also run all hooks manually at any time:
pre-commit run --all-files- Create a branch for your work:
git checkout -b my-feature-or-fix-
Make your changes and write tests. We aim for good test coverage — please include tests for any new behavior or bug fixes.
-
Ensure all tests pass:
just test- Ensure pre-commit checks pass:
pre-commit run --all-files- Push your branch to your fork and open a pull request against
main.
We typically respond to pull requests within a few days. Pull requests are more likely to be accepted when they:
- Include tests covering the changes
- Follow the existing code style (enforced by pre-commit)
- Have a clear description of what the change does and why
If you are using an AI assistant (Claude, Copilot, Cursor, etc.) to help with contributions, point it at CLAUDE.md and AGENTS.md. These files contain architecture notes, patterns, and conventions that help the model understand the codebase correctly.
Django · PostgreSQL · Redis · Celery · HTMX · Alpine.js · Tailwind CSS · DaisyUI · Vite