Thank you for your interest in contributing! This document explains how to get started, what standards we follow, and how to get your changes merged.
- Code of Conduct
- How to Contribute
- Development Setup
- Commit Message Convention
- Pull Request Process
- Coding Standards
- Adding Screenshots
This project follows the Contributor Covenant Code of Conduct. By
participating you agree to uphold it. Report unacceptable behaviour to
devlprnitish@gmail.com.
- Search existing issues first.
- If none matches, open a Bug Report using the issue template.
- Include: Frappe version, Python version, steps to reproduce, expected vs actual behaviour, and a screenshot if relevant.
Open a Feature Request issue. Describe the problem you want solved and your proposed solution. Discuss before opening a PR for large changes.
- Bug fixes and documentation improvements: open a PR directly.
- New features: open an issue first and wait for maintainer feedback.
# 1. Fork & clone inside your bench
cd /path/to/bench
git clone https://github.com/<your-fork>/frappe-theme apps/frappe_theme
# 2. Install the app
bench --site <dev-site> install-app frappe_theme
bench build --app frappe_theme
# 3. Install pre-commit (run once)
cd apps/frappe_theme
pip install pre-commit
pre-commit install
# 4. Create a feature branch
git checkout -b feat/my-improvementWe follow Conventional Commits:
<type>(<scope>): <short summary>
[optional body]
[optional footer]
Types: feat, fix, docs, style, refactor, test, chore
Examples:
feat(sidebar): add icon hover animation
fix(js): prevent duplicate buttons after clear_custom_buttons
docs: add screenshot to README
chore: bump pre-commit hooks
- Ensure
pre-commit run --all-filespasses with no errors. - If you changed the DocType JSON, export it:
bench --site <dev-site> export-fixtures --app frappe_theme
- Update
CHANGELOG.mdunder the[Unreleased]section. - Fill in the PR template completely.
- Link the related issue with
Closes #<number>. - A maintainer will review within a few business days.
- Formatter: ruff format (tab indentation, double quotes, line length 110)
- Linter: ruff check (see
pyproject.tomlfor active rules) - Type annotations encouraged for all new public functions
- No bare
except:— catch specific exceptions
- Formatter: Prettier (via pre-commit)
- Linter: ESLint (see
.eslintrc) - Use
var/functiondeclarations consistent with the existing IIFE pattern - CSS injection: add new
<style>IDs to theSTYLE_*constants at the top of each file - Avoid jQuery except where Frappe events require it
- Always export using
bench export-fixtures— never edit JSON by hand after initial creation - Keep
"modified"timestamp in sync
Screenshots make the project much more approachable. To add them:
- Take a screenshot showing the settings form or a themed Desk.
- Place the image in
docs/screenshots/(create the folder if needed). - Reference it in the README table under Screenshots.
- Submit the PR — we will merge screenshot-only PRs quickly.