Contributing to DeepTutor

April 23, 2026 · View on GitHub

Thank you for your interest in contributing to DeepTutor! We welcome developers of all skill levels to help build the next-generation intelligent learning companion.

Discord  WeChat  Feishu


Table of Contents


Maintainer

@pancacake — Currently just me!


Branching Strategy

We use a multi-branch model to keep development organized:

BranchPurposeStability
devGeneral developmentMay have bugs or breaking changes
multi-userMulti-user scenario developmentExperimental, focused on multi-tenant features

Important

Please do not submit PRs directly to main. All contributions should target dev or multi-user.

Which Branch Should I Target?

Target dev if your PR includes:

  • New features or functionality
  • Refactoring that may affect existing behavior
  • Changes to APIs or configuration
  • General bug fixes

Target multi-user if your PR includes:

  • Multi-user / multi-tenant related features
  • Session isolation, user management, or permission changes
  • Collaborative or shared workspace functionality

Note

When in doubt, target dev — it is the default development branch.


Quick Start for Contributors

  1. Fork & Clone the repository.
  2. Sync with the target branch before starting:
git checkout dev && git pull origin dev
  1. Create your feature branch from the target branch:
git checkout -b feature/your-feature-name
  1. Develop your changes, following the coding standards below.
  2. Validate by running pre-commit checks:
pre-commit run --all-files
  1. Submit your Pull Request to the correct target branch (not main unless it's a hotfix or docs-only change).

Tip

Browse our Issues for tasks labeled good first issue to find a great starting point. Comment on the issue to let others know you're working on it.


Development Setup

Setting Up Your Environment

Step 1: Create a virtual environment

python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

Step 2: Install dependencies

pip install -e ".[all]"
Setting Up Pre-commit (First Time Only)

Step 1: Install pre-commit

pip install pre-commit
# Or: conda install -c conda-forge pre-commit

Step 2: Install Git hooks

pre-commit install

Step 3: Initialize the Secrets Baseline

If you encounter false-positive secrets (like API hash placeholders), update the baseline:

detect-secrets scan > .secrets.baseline

Common Commands

TaskCommand
Check all filespre-commit run --all-files
Check quietlypre-commit run --all-files -q
Update toolspre-commit autoupdate
Emergency skipgit commit --no-verify -m "message" (not recommended)

Code Quality & Security

We use automated tools (configured via pyproject.toml and .pre-commit-config.yaml) to maintain high standards:

ToolPurpose
RuffPython linting and formatting
PrettierFrontend & config file formatting
detect-secretsHardcoded secret scanning
pip-auditDependency vulnerability scanning
BanditSecurity issue analysis
MyPyStatic type checking
InterrogateDocstring coverage reporting

Important

Local pre-commit hooks may only show warnings, but CI will perform strict checks and automatically reject PRs that fail.


Coding Standards

Python

  • Use type hints for all function signatures.
  • Prefer f-strings for string formatting.
  • Follow PEP 8 (enforced by Ruff).
  • Keep functions small and focused on a single responsibility.

Documentation

  • Every new module, class, and public function should have a docstring (Google Python Style Guide format).
  • Update README.md if your change introduces new features or configuration.

Commit Message Format

<type>: <short description>

[optional body]
TypeDescription
featA new feature (MINOR version bump)
fixA bug fix (PATCH version bump)
docsDocumentation only changes
styleFormatting, no logic changes
refactorCode restructuring, no new features or fixes
testAdding or correcting tests
choreBuild process, tooling, or dependency updates

Security Best Practices

File Uploads

  • Size Limits: General files capped at 100 MB; PDFs capped at 50 MB.
  • Validation: Multi-layer validation (extension + MIME type + content sanitization).
  • Sanitization: All filenames are sanitized to prevent path traversal.

Development Standards

  • Subprocesses: Always use shell=False to prevent command injection.
  • Pathing: Use pathlib.Path for cross-platform compatibility.
  • Line Endings: LF (Unix) line endings enforced for critical scripts via .gitattributes.

Questions? Reach out on Discord. Let's build the future of AI tutoring together!