From:To:
11¶ # Discourse
22
33 **Что это.** Движок форумов, разработка открытая. Сам проект описывает себя так: «A platform for community discussion. Free, open, simple».
44
55 **Возраст.** Репозиторий на GitHub заведён 12 января 2013 года. Проект ведёт компания Civilized Discourse Construction Kit; поддержка — на своём же форуме meta.discourse.org, где сотрудники отвечают в одних темах с администраторами чужих форумов, а администраторы — друг другу.
66
77 **Размер.** 47 800 звёзд, 9 000 форков на сентябрь 2026.
8+¶ ## Привычки, описанные им самим
9+
10+ В самом репозитории правил почти нет: [CONTRIBUTING.md](https://github.com/discourse/discourse/blob/main/CONTRIBUTING.md) умещается в экран и в основном отсылает на форум проекта — [Discourse Development Contribution Guidelines](https://meta.discourse.org/t/discourse-development-contribution-guidelines/3823). Discourse ведёт свои правила там же, где живёт его сообщество: на собственном форуме, а не в файлах у кода.
11+
12+ **Чистый рефакторинг не примут, а правки из одних тестов — с радостью** (с оговоркой: «Avoid mocking unless absolutely necessary»):
13+
14+ > Refactor-only contributions are NOT welcome … Avoid submitting refactor-only pull requests. Instead, fix a bug or implement a feature while improving the code.
15+
16+ *Правки только ради рефакторинга не приветствуются. Не присылайте такие PR — лучше почините баг или сделайте фичу и заодно улучшите код.*
17+
18+ **Как решается, что попадёт в ядро, — записано в отдельной теме, и там же честно сказано, кто решает:**
19+
20+ > 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.
21+
22+ *Если в обсуждении не сложилось настоящего согласия, команда Discourse оставляет за собой право принять произвольное обязательное решение и двигаться дальше.*
823¶ ## Привычки, видные по переписке
924
1025 Сначала делает узкое и честное (2020: слушать систему, своего хранилища нет), расширяет по накопленным жалобам, не по первой. Компоненты темы — площадка для проб, и сотрудники правят чужие компоненты наравне со своими: за пять лет хранилище кнопки переезжало четыре раза (localStorage → cookie → localStorage → cookie ядра → аккаунт), пока не сошлось достаточно причин перенести в ядро (+1065 строк). Устаревшее не бросает: компонент в тот же день стал недействующим с предупреждением админам.
1126
1227 Решения объясняются списком в описании PR, включая те, что потом окажутся неудачными (сброс выбора был объявлен возможностью за два месяца до первой жалобы на него). Сотрудники называют причину задолго до исправления (Крис, 2023 → Осама, 2025) и неудобное поведение своего кода записывают публично (Пенар, 2022). После переезда настройки доделывают со всех сторон: подпись, лишняя галочка, логотипы — в том числе руками сооснователя.
28+¶ ## Мелкие правила, по которым узнаётся свой
29+
30+ **Заголовок коммита начинается с префикса из закрытого списка:** `FIX`, `PERF`, `UX`, `SECURITY`, `FEATURE`, `A11Y`, `I18N`, `MT`, `DEV`. Причина названа прямо:
31+
32+ > It makes it easier for us to generate release notes.
33+
34+ *Так нам проще собирать заметки к релизу.*
35+
36+ Первая строка коммита — до 72 знаков, затем пустая строка и подробности. Перед отправкой ветку перебазируют на `origin/main` и склеивают мелкие правки в осмысленные коммиты.
37+
38+ **Линтеры стоят на 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 }`).
39+
40+ **Цвета в темах — только через CSS-свойства**, это следствие автоматической тёмной темы:
41+
42+ > Themes and plugins need to switch all the `$color` SCSS variables used in stylesheets to the `--color` CSS property equivalents.
43+
44+ *Темам и плагинам нужно заменить все SCSS-переменные `$color` на эквивалентные CSS-свойства `--color`.*
45+
46+ В `CODEOWNERS` всего две команды: `@discourse/dev-xp` (Block API, plugin API) и `@discourse/migrations-tooling`. Метки на PR ставит бот по каталогу плагина; бэкпорт запускается комментарием `@discoursebot backport`, но только от участников организации.
47+¶ ## Чего ждать, если придёте со своей правкой
48+
49+ Всё ниже — из CONTRIBUTING.md, темы с правилами на meta.discourse.org и файлов `.github/workflows` самого репозитория.
50+
51+ **Без CLA правку не примут — и это не вежливость, а юридическое ограничение:**
52+
53+ > The Discourse team is legally prevented from accepting any pull requests from users who have not signed the CLA first.
54+
55+ *Команде Discourse юридически запрещено принимать pull request от тех, кто не подписал CLA.*
56+
57+ **Issues на GitHub выключены.** Баги идут в категорию bug на форуме, и к ним относятся как к части кода:
58+
59+ > If you are capable, submit a pull request with a failing test that demonstrates the bug.
60+
61+ *Если умеете — пришлите pull request с падающим тестом, который показывает баг.*
62+
63+ **Линтеры прогоняет CI при каждом PR**, а тишина не прощается. Бот `stale-pr-closer` действует по расписанию:
64+
65+ > 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.
66+
67+ *Этот PR автоматически помечен как устаревший: он открыт 60 дней без активности. Чтобы сохранить его, снимите метку, запушьте код или напишите комментарий. Иначе он закроется через 14 дней.*
68+
69+ **Замечания — знак, что правку хотят влить:**
70+
71+ > - Be responsive to feedback and ready to implement suggested changes.
72+ > - Remember, feedback means your work is valued and intended for inclusion.
73+
74+ *Отвечайте на замечания и будьте готовы внести предложенное. Помните: обратная связь значит, что вашу работу ценят и собираются принять.*
75+
76+ Но не всякая фича попадёт в ядро — и на этот случай проект отвечает так:
77+
78+ > Discourse is open source software! Try to be the change you wish to see, via a plugin or pull request.
79+
80+ *Discourse — открытое ПО. Станьте той переменой, которую хотите увидеть: через плагин или pull request.*
1381¶ ## Кто в кадре
1482
1583 Люди, встреченные в наших разборах этого проекта. Черта называется только вместе с поступком — с датой и ссылкой. Ник — главный, имя — из профиля; нет имени в профиле — только ник.
1684
1785 ### pmusaraj — Penar Musaraj
1886
1987 В команде Discourse.
2088
2189 - 30.07.2020 — [PR #10341](https://github.com/discourse/discourse/pull/10341) «automatic dark mode»: сайт слушает `prefers-color-scheme`, своего хранилища нет;
2290 - 27.08.2020 — [PR #10544](https://github.com/discourse/discourse/pull/10544): выбор схемы в профиле, и сразу — где хранить: «in a cookie or in the `user_options` table». Верный ответ, который потом на четыре года потеряли;
2391 - 02.12.2022 — [PR #15](https://github.com/discourse/discourse-color-scheme-toggle/pull/15) в чужом компоненте: вернул хранение в localStorage и **объявил сброс возможностью**, пунктом списка в описании: «resets saved override when OS dark mode matches color scheme»;
2492 - 27.12.2022 — через двадцать пять дней [в теме поддержки](https://meta.discourse.org/t/dark-light-mode-toggle/215585/62) сам записал то же поведение как неудобство: «If a user toggles their OS appearance, this component's setting is reset».
2593
2694 Своё же решение, описанное публично с двух сторон с разницей в месяц.
2795
2896 ### jordanvidrine — Jordan Vidrine
2997
3098 Дизайнер в Discourse. 01.09.2020 — [заводит репозиторий](https://github.com/discourse/discourse-color-scheme-toggle/commit/6982b433dd2b70a8ef1b6e9d38e72766061bafbf) компонента «Dark/Light Mode Toggle» — кнопки, которую поставили тысячи форумов. В тот же день она работает и запоминает выбор в localStorage (`userToggledScheme`).
3199
32100 21.09.2020 — [меняет хранилище](https://github.com/discourse/discourse-color-scheme-toggle/commit/a4f11157fbe1e211a7f77ea4dba53b76b3c360c7) на cookie (`userSelectedScheme`): пробовал обе двери в первый же месяц — за два года до того, как вопрос «где хранить» стал больным.
33101
34102 ### awesomerobot — Kris
35103
36104 Дизайнер в Discourse; фамилии в профиле нет.
37105
38106 - 13.02.2023 — [пост 81](https://meta.discourse.org/t/dark-light-mode-toggle/215585/81): назвал причину и описал решение целиком за два года до того, как его сделали: «The client-side switch can provide the seamless transition, and changing the user preference can avoid the brief flash»;
39107 - 10.10.2025 — [PR #35324](https://github.com/discourse/discourse/pull/35324), семь строк: «Currently this color mode switcher has no accessible label or title, this adds both!»
40108
41109 ### OsamaSayegh — Osama Sayegh
42110
43111 В команде Discourse.
44112
45113 - 07.02.2025 — [PR #31086](https://github.com/discourse/discourse/pull/31086): перенёс компонент в ядро, 30 файлов, +1065/−111; localStorage → cookie `forced_color_mode`, чтобы сервер рисовал страницу сразу нужного цвета. В тот же день объявил старый компонент устаревшим и [объявил об этом](https://meta.discourse.org/t/dark-light-mode-toggle-now-available-in-core/350991) админам;
46114 - 31.07.2025 — [PR #33875](https://github.com/discourse/discourse/pull/33875): `user_options.interface_color_mode`, настройка наконец в аккаунте. Развилку «аккаунт или устройство» решил явно и написал об этом в описании: «It remains possible to set a color mode per device».
47115
48116 ### KrisKotlarek — Krzysztof Kotlarek
49117
50118 В команде Discourse. 12.08.2025 — [PR #34165](https://github.com/discourse/discourse/pull/34165): убрал отдельную галочку тёмного режима из профиля через две недели после того, как появился единый орган управления.
51119
52120 ### ZogStriP — Régis Hanol
53121
54122 Сооснователь Discourse. 09.01.2026 — [PR #37032](https://github.com/discourse/discourse/pull/37032): нашёл угол, где ответ 2020 года пережил все переезды, — логотип на серверных страницах: «the `<source>` media query was hardcoded to `(prefers-color-scheme: dark)`, ignoring the `forced_color_mode` cookie». Сооснователь, чинящий логотип на странице 404.
55123
56124 ### Сообщество в теме 215585
57125
58126 **jrgong** (имени в профиле нет; администратор форума) — 13.02.2023, [пост 79](https://meta.discourse.org/t/dark-light-mode-toggle/215585/79): принёс жалобу своих пользователей с шагами воспроизведения и ожидаемым поведением: «Expected behavior is that forum stays in dark mode due to users choice» — через два месяца после того, как сброс сделали намеренным.
59127
60128 **Sarah_Jane_Obligar** — Sarah Jane Obligar — 20.09.2023, [пост 115](https://meta.discourse.org/t/dark-light-mode-toggle/215585/115): вопрос из одной строки, в котором вся задача: «whenever I log in it will switch back to light mode». Закрыт PR #33875 через два года.
61129
62130 **Jagster** — Jakke Flemming — администратор из сообщества, отвечает в теме годами: 21.09.2023 ([пост 116](https://meta.discourse.org/t/dark-light-mode-toggle/215585/116)) отправил Сару к настройкам профиля; 11.12.2024 ([пост 158](https://meta.discourse.org/t/dark-light-mode-toggle/215585/158)) следующему с тем же вопросом: «It is always good policy to respect user's choises».
63131¶ ## Разборы, где встречается
64132
65133 - **«Где живёт настройка»** — выбор тёмной темы пять лет переезжал между localStorage, cookie и аккаунтом, пока не сошлось достаточно причин перенести его в ядро.
66134
67135 ---
68136
69− *Карточка собрана 02.09.2026 из открытых источников: репозиторий и переписка в PR и задачах. Правила проекта (CONTRIBUTING и подобные) в карточку ещё не разобраны — раздел «Привычки, описанные им самим» появится, когда будут. Фотографий и личных данных здесь нет и не будет. Нашли неточность или хотите, чтобы вас убрали, — напишите, поправим без вопросов.*
137+ *Карточка собрана 02.09.2026 из открытых источников: репозиторий, документация проекта, переписка в PR и задачах. Фотографий и личных данных здесь нет и не будет. Нашли неточность или хотите, чтобы вас убрали, — напишите, поправим без вопросов.*