Что это. Открытая ERP: бухгалтерия, склад, продажи, производство — на фреймворке Frappe. Сам проект описывает себя так: «Free and Open Source Enterprise Resource Planning (ERP)».
Возраст. Репозиторий на GitHub заведён 8 июня 2011 года. Проект ведёт компания Frappe.
Размер. 38 800 звёзд, 12 700 форков на сентябрь 2026. Форков к звёздам — треть: ERPNext ставят себе и правят под себя.
Правила ERPNext лежат в двух местах. В репозитории — короткий .github/CONTRIBUTING.md, и он только про задачи: как писать баг-репорт и запрос функции. Всё про правки — в вики: страницы Contribution-Guidelines, Pull-Request-Checklist, Coding-Standards.
Проект честно предупреждает, что правку придётся переделывать:
Most probably you might have to go back and change a few things… So be prepared for some back and forth.
Скорее всего, придётся вернуться и кое-что поправить… Так что готовьтесь к переписке туда-сюда.
Автоматические правки запрещены — и правило написано для чужих, не для своих:
Do NOT send pull requests based on changes generated using automated tools. … Using AI/LLMs/generative models for completely automated changesets that you have not seriously reviewed. … Exemption: This rule is not enforced on existing maintainers.
Не присылайте правки, сделанные автоматическими инструментами. … Включая сгенерированные ИИ изменения, которые вы сами всерьёз не просмотрели. … Исключение: на действующих мейнтейнеров правило не распространяется.
Новую функцию просят сначала обсудить, а потом переспать с ней:
Don't start developing on the same day. Prepare a note and sleep over your thoughts for at least one day.
Не начинайте писать код в тот же день. Набросайте заметку и дайте мыслям отлежаться хотя бы сутки.
Чинит случай, пока случай виден, и переходит к устройству, когда случаев набирается много: между первой точечной правкой (2021) и решением «свести все записи в одну точку» (2026) — пять лет и пятеро людей.
Правки под чужую базу делает так, чтобы не тронуть свою: «MariaDB code paths are byte-identical». Мёртвый код удаляет профилактически — не за то, что мешает, а за то, что может воскреснуть второй дверью. Имена функций правит так, чтобы они говорили, откуда берётся число.
Коммиты и заголовки PR — Conventional Commits. commitlint.config.js разрешает типы build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test; workflow semantic-commits.yml проверяет каждый коммит. Заголовок с chore, ci, style, test, refactor получает метку skip-release-notes и выпадает из релизных заметок.
Ветки: новое — только в develop, исправления — в старшую затронутую версию, бэкпорты — в version-16-hotfix и version-15-hotfix, по метке backport version-XX-hotfix. И:
Please don't send a Pull Request to all branches.
Пожалуйста, не шлите один PR во все ветки.
Линтеры — через pre-commit: ruff, prettier и eslint, запрет коммитов прямо в develop, свой скрипт против SQL, который сломается на Postgres; в CI сверху semgrep с правилами frappe/semgrep-rules. Отступы — табы: «Please don't ask why, this has been the legacy».
Метки ставит бот по каталогам (stock, accounts…), а needs-tests — на любой PR, где тронут Python без файлов test*.py. PR с организационных форков не принимают — там нельзя включить правки мейнтейнера.
Всё ниже — из вики ERPNext, файлов .github/ и задачи frappe/frappe#38145, на которую вики ссылается.
Сначала главное: дверь прикрыта. Вики открывается предупреждением:
NOTE: Some repositories have temporarily disabled community contributions.
Примечание: некоторые репозитории временно отключили приём правок от сообщества.
Это решение организации Frappe, не одного ERPNext; причины — поток PR, доля сгенерированных ИИ, нехватка ревьюеров. Обходной путь оттуда же:
We are still accepting small, easy to review/merge fixes. … Those who have enough such fixes are invited to the repository.
Мы по-прежнему принимаем небольшие, легко проверяемые исправления. … Кто накопил достаточно таких, того приглашают в репозиторий.
Порядок: подробный баг-репорт, вопрос, готовы ли мейнтейнеры принять исправление, ветка в своём форке — PR откроет мейнтейнер. Список «поручившихся» .github/VOUCHED.td есть только у фреймворка Frappe, в ERPNext его нет.
Кто смотрит: CODEOWNERS раздаёт каталоги по модулям. Что требуют: тесты; для feat — ссылку на документацию, иначе проверка Documentation Required красная; для интерфейса — GIF; при смене схемы — патч миграции.
Important to add test cases, even if its a very simple one that just calls the function. … If tests are failing due to your fixes, please fix your fixes.
Важно добавить тесты, пусть даже простейший, который просто вызывает функцию. … Если тесты падают из-за ваших исправлений — исправьте исправления.
Без рассмотрения — только стиль или только обновление зависимостей: «Contributions including Style only and Requirements update fixes will not be directly entertained».
Боты: через 15 дней тишины PR помечается inactive, ещё через 3 дня закрывается («it only takes a comment to keep a contribution alive»); черновики и hotfix не трогают. Закрытые треды запираются через 14 дней. Бэкпорты делает frappe/backport; вики ещё поминает mergify, но workflow уже другой. О CLA и DCO в скачанных файлах ни слова.
Люди, встреченные в наших разборах этого проекта. Черта называется только вместе с поступком — с датой и ссылкой. Ник — главный, имя — из профиля; нет имени в профиле — только ник.
Один из основных разработчиков.
11.08.2026 — PR #57980, первая фраза описания: «found while auditing every SLE/Bin write path». Не починил очередной случай, а обошёл все места записи.
В том же PR удалил мёртвую функцию, которую никто не вызывает, с обоснованием «would only invite accidental resurrection as a second Bin write path», и переименовал update_qty в update_qty_from_sle — чтобы имя само говорило, откуда берётся число.
- 05.07.2026 — закрыл гонки lock-then-read в подборке и резерве товара;
- 16.07.2026 — PR #57202: показал, что правильность держалась на побочном свойстве MariaDB и ломалась на Postgres. Отдельной строкой в описании: «MariaDB code paths are byte-identical» — починил чужую базу, не тронув свою.
20.12.2021 — починил остаток на движениях задним числом. Первый из пятерых, кто подошёл к этой трещине.
04.07.2022 — починила ту же трещину с другой стороны: не прошлое портит число, а пересчёт стоимости портит будущие остатки. Полтора года спустя после первого.
Со стороны пользователя, а не сопровождения. 25.08.2026 — PR #58362: удалили все движения, а число осталось. Закрыл последний известный случай пятилетней цепочки.
- «Пять лет до одной двери» — пятеро по очереди чинили одну трещину в складских остатках, и никто не ошибался, пока один не спросил, почему это вообще работает.
Карточка собрана 02.09.2026 из открытых источников: репозиторий, документация проекта, переписка в PR и задачах. Фотографий и личных данных здесь нет и не будет. Нашли неточность или хотите, чтобы вас убрали, — напишите, поправим без вопросов.