Discourse: проект и люди
Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам
miki/discourse-proekt-i-lyudi · v2
Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам
Что это. Движок форумов, разработка открытая. Сам проект описывает себя так: «A platform for community discussion. Free, open, simple».
Возраст. Репозиторий на GitHub заведён 12 января 2013 года. Проект ведёт компания Civilized Discourse Construction Kit; поддержка — на своём же форуме meta.discourse.org, где сотрудники отвечают в одних темах с администраторами чужих форумов, а администраторы — друг другу.
Размер. 47 800 звёзд, 9 000 форков на сентябрь 2026.
В самом репозитории правил почти нет: CONTRIBUTING.md умещается в экран и в основном отсылает на форум проекта — Discourse Development Contribution Guidelines. Discourse ведёт свои правила там же, где живёт его сообщество: на собственном форуме, а не в файлах у кода.
Чистый рефакторинг не примут, а правки из одних тестов — с радостью (с оговоркой: «Avoid mocking unless absolutely necessary»):
Refactor-only contributions are NOT welcome … Avoid submitting refactor-only pull requests. Instead, fix a bug or implement a feature while improving the code.
Правки только ради рефакторинга не приветствуются. Не присылайте такие PR — лучше почините баг или сделайте фичу и заодно улучшите код.
Как решается, что попадёт в ядро, — записано в отдельной теме, и там же честно сказано, кто решает:
In the event that there isn't any kind of real consensus in the discussion … the Discourse team reserves the right to make arbitrarily binding decisions and move forward.
Если в обсуждении не сложилось настоящего согласия, команда Discourse оставляет за собой право принять произвольное обязательное решение и двигаться дальше.
Сначала делает узкое и честное (2020: слушать систему, своего хранилища нет), расширяет по накопленным жалобам, не по первой. Компоненты темы — площадка для проб, и сотрудники правят чужие компоненты наравне со своими: за пять лет хранилище кнопки переезжало четыре раза (localStorage → cookie → localStorage → cookie ядра → аккаунт), пока не сошлось достаточно причин перенести в ядро (+1065 строк). Устаревшее не бросает: компонент в тот же день стал недействующим с предупреждением админам.
Решения объясняются списком в описании PR, включая те, что потом окажутся неудачными (сброс выбора был объявлен возможностью за два месяца до первой жалобы на него). Сотрудники называют причину задолго до исправления (Крис, 2023 → Осама, 2025) и неудобное поведение своего кода записывают публично (Пенар, 2022). После переезда настройки доделывают со всех сторон: подпись, лишняя галочка, логотипы — в том числе руками сооснователя.
Заголовок коммита начинается с префикса из закрытого списка: FIX, PERF, UX, SECURITY, FEATURE, A11Y, I18N, MT, DEV. Причина названа прямо:
It makes it easier for us to generate release notes.
Так нам проще собирать заметки к релизу.
Первая строка коммита — до 72 знаков, затем пустая строка и подробности. Перед отправкой ветку перебазируют на origin/main и склеивают мелкие правки в осмысленные коммиты.
Линтеры стоят на pre-commit: pnpm lefthook install, вручную — bin/lint --fix. JavaScript проверяют eslint и prettier, Ruby — RuboCop и Syntax Tree, SCSS — stylelint, шаблоны Ember — ember-template-lint. Из стиля: два пробела, без табов; хэши Ruby 1.9 ({ a: 1 }, а не { :a => 1 }).
Цвета в темах — только через CSS-свойства, это следствие автоматической тёмной темы:
Themes and plugins need to switch all the
$colorSCSS variables used in stylesheets to the--colorCSS property equivalents.
Темам и плагинам нужно заменить все SCSS-переменные $color на эквивалентные CSS-свойства --color.
В CODEOWNERS всего две команды: @discourse/dev-xp (Block API, plugin API) и @discourse/migrations-tooling. Метки на PR ставит бот по каталогу плагина; бэкпорт запускается комментарием @discoursebot backport, но только от участников организации.
Всё ниже — из CONTRIBUTING.md, темы с правилами на meta.discourse.org и файлов .github/workflows самого репозитория.
Без CLA правку не примут — и это не вежливость, а юридическое ограничение:
The Discourse team is legally prevented from accepting any pull requests from users who have not signed the CLA first.
Команде Discourse юридически запрещено принимать pull request от тех, кто не подписал CLA.
Issues на GitHub выключены. Баги идут в категорию bug на форуме, и к ним относятся как к части кода:
If you are capable, submit a pull request with a failing test that demonstrates the bug.
Если умеете — пришлите pull request с падающим тестом, который показывает баг.
Линтеры прогоняет CI при каждом PR, а тишина не прощается. Бот stale-pr-closer действует по расписанию:
This pull request has been automatically marked as stale because it has been open for 60 days with no activity. To keep it open, remove the stale tag, push code, or add a comment. Otherwise, it will be closed in 14 days.
Этот PR автоматически помечен как устаревший: он открыт 60 дней без активности. Чтобы сохранить его, снимите метку, запушьте код или напишите комментарий. Иначе он закроется через 14 дней.
Замечания — знак, что правку хотят влить:
- Be responsive to feedback and ready to implement suggested changes.
- Remember, feedback means your work is valued and intended for inclusion.
Отвечайте на замечания и будьте готовы внести предложенное. Помните: обратная связь значит, что вашу работу ценят и собираются принять.
Но не всякая фича попадёт в ядро — и на этот случай проект отвечает так:
Discourse is open source software! Try to be the change you wish to see, via a plugin or pull request.
Discourse — открытое ПО. Станьте той переменой, которую хотите увидеть: через плагин или pull request.
Люди, встреченные в наших разборах этого проекта. Черта называется только вместе с поступком — с датой и ссылкой. Ник — главный, имя — из профиля; нет имени в профиле — только ник.
В команде Discourse.
- 30.07.2020 — PR #10341 «automatic dark mode»: сайт слушает
prefers-color-scheme, своего хранилища нет; - 27.08.2020 — PR #10544: выбор схемы в профиле, и сразу — где хранить: «in a cookie or in the
user_optionstable». Верный ответ, который потом на четыре года потеряли; - 02.12.2022 — PR #15 в чужом компоненте: вернул хранение в localStorage и объявил сброс возможностью, пунктом списка в описании: «resets saved override when OS dark mode matches color scheme»;
- 27.12.2022 — через двадцать пять дней в теме поддержки сам записал то же поведение как неудобство: «If a user toggles their OS appearance, this component's setting is reset».
Своё же решение, описанное публично с двух сторон с разницей в месяц.
Дизайнер в Discourse. 01.09.2020 — заводит репозиторий компонента «Dark/Light Mode Toggle» — кнопки, которую поставили тысячи форумов. В тот же день она работает и запоминает выбор в localStorage (userToggledScheme).
21.09.2020 — меняет хранилище на cookie (userSelectedScheme): пробовал обе двери в первый же месяц — за два года до того, как вопрос «где хранить» стал больным.
Дизайнер в Discourse; фамилии в профиле нет.
- 13.02.2023 — пост 81: назвал причину и описал решение целиком за два года до того, как его сделали: «The client-side switch can provide the seamless transition, and changing the user preference can avoid the brief flash»;
- 10.10.2025 — PR #35324, семь строк: «Currently this color mode switcher has no accessible label or title, this adds both!»
В команде Discourse.
- 07.02.2025 — PR #31086: перенёс компонент в ядро, 30 файлов, +1065/−111; localStorage → cookie
forced_color_mode, чтобы сервер рисовал страницу сразу нужного цвета. В тот же день объявил старый компонент устаревшим и объявил об этом админам; - 31.07.2025 — PR #33875:
user_options.interface_color_mode, настройка наконец в аккаунте. Развилку «аккаунт или устройство» решил явно и написал об этом в описании: «It remains possible to set a color mode per device».
В команде Discourse. 12.08.2025 — PR #34165: убрал отдельную галочку тёмного режима из профиля через две недели после того, как появился единый орган управления.
Сооснователь Discourse. 09.01.2026 — PR #37032: нашёл угол, где ответ 2020 года пережил все переезды, — логотип на серверных страницах: «the <source> media query was hardcoded to (prefers-color-scheme: dark), ignoring the forced_color_mode cookie». Сооснователь, чинящий логотип на странице 404.
jrgong (имени в профиле нет; администратор форума) — 13.02.2023, пост 79: принёс жалобу своих пользователей с шагами воспроизведения и ожидаемым поведением: «Expected behavior is that forum stays in dark mode due to users choice» — через два месяца после того, как сброс сделали намеренным.
Sarah_Jane_Obligar — Sarah Jane Obligar — 20.09.2023, пост 115: вопрос из одной строки, в котором вся задача: «whenever I log in it will switch back to light mode». Закрыт PR #33875 через два года.
Jagster — Jakke Flemming — администратор из сообщества, отвечает в теме годами: 21.09.2023 (пост 116) отправил Сару к настройкам профиля; 11.12.2024 (пост 158) следующему с тем же вопросом: «It is always good policy to respect user's choises».
- «Где живёт настройка» — выбор тёмной темы пять лет переезжал между localStorage, cookie и аккаунтом, пока не сошлось достаточно причин перенести его в ядро.
Карточка собрана 02.09.2026 из открытых источников: репозиторий, документация проекта, переписка в PR и задачах. Фотографий и личных данных здесь нет и не будет. Нашли неточность или хотите, чтобы вас убрали, — напишите, поправим без вопросов.
Related lists
Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам
Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам
Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам
Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам
Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам
Как проект живёт и принимает чужие правки, и кто в нём встречался в разборах — по поступкам, датам и ссылкам
