Человек, чей код загружал ваши виртуалки последние ~20 лет (SeaBIOS — дефолтный BIOS QEMU/KVM примерно с 2010-го), сегодня единолично решает, что попадёт в Klipper — прошивку, на которой печатает добрая половина 3D-принтеров планеты, от самосборов до заводских машин. И это не метафора про «духовное лидерство». Это буквально таблица из одной строки в официальной документации.
Я контрибьючу в опенсорс не «по выходным». Апстрим-контрибуции — часть моей работы, за это мне платят деньги: я занимаюсь инфраструктурными CNCF-проектами, и заносить код в мейнлайн — мой производственный процесс. А то, что начиналось как пет-проекты, местами уже используется компаниями в продакшне — то есть и хобби-код у меня живёт по взрослым правилам. Так что дальше будет не «пользователь обиделся, что его фичу не приняли», а взгляд человека, для которого экономика опенсорса — рабочая повседневность. И я хочу поговорить про Klipper. Не про код — код прекрасен, снимаю шляпу. Про то, как проект устроен как организация. Спойлер: никак.
Дисклеймер
Kevin O’Connor — выдающийся инженер. SeaBIOS, Klipper — это действительно фундаментальные вещи, сделанные в основном одним человеком. Всё, что ниже, — не про качество кода и не про личность. Это про процессы. Точнее, про их отсутствие и про то, во что это обходится всем остальным.
И второе: несмотря на упоминания моей работы и Cozystack по тексту, всё написанное — моё личное мнение как активного участника опенсорса, а не официальная позиция Aenix или проекта Cozystack.
Таблица из одной строки
Откройте CONTRIBUTING.md Klipper. Там есть таблица «The Klipper “maintainers” are»:
Name | GitHub name |
|---|---|
Kevin O’Connor |
Всё. Одна строка. Ревьюеров четверо (включая самого Кевина), но право коммита в master — только у мейнтейнера. Проект с 11+ тысячами звёзд, тысячами форков и, вероятно, миллионами инсталляций (практически каждый серьёзный самосбор и куча вендорских машин) имеет bus factor, равный единице.
Для сравнения: это не «маленький пет-проект, который внезапно выстрелил». Klipper — де-факто индустриальный стандарт хост-прошивки для FDM. На нём строят продукты компании с сотнями миллионов выручки.
И чтобы было понятно: сама по себе модель «проект одного человека» — легитимна. Эталонный пример — Valetudo, прошивка, отрезающая роботов-пылесосов от облака производителя: пылесос перестаёт стучать на серверы вендора и слушается только вас — такая облачная лоботомия во благо. Его автор, Sören Beye, прямо на главной странице объявляет, что Valetudo — хобби случайного чувака из интернета, что коммерциализировать проект и растить его аудиторию он не собирается, — больше того, явно намерен этого не делать. Модель распространения он определяет как «Freeware with source available», а секция на главной так и называется: «Valetudo is a garden». Думайте о проекте, пишет он, как о частном саде, открытом для публики: приходите бесплатно, гуляйте, приводите друзей, оставляйте чаевые на входе, уносите идеи в собственный сад — но помните, что вы в гостях на чужой земле, власти над которой у вас нет, и сам вход сюда — подарок. Можно спорить о тоне, но это честно: контракт объявлен до того, как ты вложил в проект хоть минуту. Klipper живёт ровно по тем же правилам — только нигде их не написал, при этом являясь фундаментом чужих бизнесов и имея CONTRIBUTING.md, который выглядит как приглашение к коллаборации. Претензия не к диктатуре — к несоответствию заявленного и фактического контракта при индустриальном масштабе.
Правило ста юзеров
Там же, в CONTRIBUTING.md, есть замечательный пункт: сабмишн должен иметь «noteworthy target audience», rule of thumb — минимум 100 реальных пользователей. Звучит разумно? Мне тоже так казалось, пока я не увидел, как это правило работает на практике.
Разбор кейса. PR #6826: дать klippy возможность слушать TCP-сокет вместо (точнее, в дополнение к) Unix domain socket. Строго opt-in, дефолтное поведение не меняется. Зачем: контейнерные и распределённые сетапы, слабое железо принтера, где хочется вынести Moonraker и UI на отдельную машину. Кевин отвечает в PR: у долгосрочных контрибьюторов есть опасения, «I’d be inclined to hold off on this until there’s a clear audience of a notable size… we typically aim for a minimum of at least a 100 users».
Окей, правило объявлено — играем по правилу. Я приношу цифры: неофициальный Docker-образ mkuf/moonraker — 50 тысяч загрузок. Делим на 120 тегов в заведомо абсурдном предположении, что каждый пользователь скачал каждый тег ровно по разу, — получаем 400+ пользователей по самой консервативной оценке из возможных. Каждому из них нужна эта фича, потому что весь контейнерный сетап Klipper строится вокруг шаринга Unix-сокета между контейнерами. Вчетверо выше объявленного порога.
Ответ: тишина. Не «отказ с аргументацией», не «цифры не убеждают, потому что…», не «доработайте вот это». Тред просто закончился.
И вот это ключевая проблема правил, которые исполняет один человек: правило есть, а контракта нет. Ты можешь выполнить все документированные условия — и это не гарантирует даже ответа. Решение всё равно принимается по внутренним, нигде не описанным критериям одного человека. Оспорить которые некому и негде.
Именно за этим, кстати, существуют фонды. Смысл CNCF не в том, что он пишет код — код пишут люди. Смысл в том, что над мейнтейнером есть инстанция: документированный governance как обязательное условие приёма проекта, технический комитет, процедура эскалации. Ты можешь проиграть спор — но тебе есть куда прийти со спором, а проиграть по правилам — нормальная часть процесса. В Klipper проиграть невозможно: спор просто не происходит.
GitHub, которого нет
У репозитория Klipper на момент написания открыт один issue. И знаете какой? #6804 — «This GitHub issue tracker is no longer used», открыт самим Кевином в феврале 2025-го. То есть даже этот единственный issue — не баг, а прибитая к двери табличка «трекер закрыт, все на форум». При 200+ висящих pull request’ах. Нет, это не потому что багов нет — багтрекинг как явление в проекте отсутствует, всё уводится на klipper.discourse.group.
Форум — это нормальный инструмент для обсуждений. Но когда он заменяет трекер, исчезает главное: статус. У issue есть lifecycle — open, triaged, assigned, closed с причиной. У треда на форуме есть только один статус: «Кевин ответил» или «Кевин не ответил». Молчание — как мы выяснили на примере PR #6826 — тоже ответ.
Отдельный привет — внутреннему API. Python-модули в klippy/extras не имеют никакого контракта стабильности. Любой рефакторинг может сломать все внешние интеграции и аддоны, и это считается нормой: хотите стабильности — вливайтесь в ядро. В которое не вливается ничего. Круг замкнулся.
Что вырастает на этом месте: даунстримы
Когда в апстрим нельзя занести ничего существенного, физика опенсорса берёт своё: код начинает жить в форках. Не потому что все хотят форкать, а потому что деваться некуда.
Тулченджеры — принтеры, которые сами меняют печатающие головы, как станок с ЧПУ меняет фрезы. В mainline Klipper их поддержки нет. Вообще. Community-стандарт — сторонний аддон klipper-toolchanger, который живёт на честном слове поверх нестабильного внутреннего API.
Snapmaker U1. Первый по-настоящему массовый тулченджер-принтер. 30 марта 2026 года — в последний день перед дедлайном соблюдения GPL — Snapmaker выложил свои форки Klipper, Moonraker и Fluidd. По их собственной оценке, они модифицировали около 20% кодовой базы Klipper ради параллельной мультитулхед-системы. Двадцать процентов! Это не «патчик сбоку», это параллельная ветка эволюции. И винить их особо не в чем: все знают, что если Кевину не нужен тулченджер — в ядре его не будет. А слой совместимости может сломаться в любую пятницу. Так что живите на своём форке.
Sovol M1D. Только что анонсированный принтер: IDEX плюс тулченджер на шесть голов, до семи материалов. Делаю проверяемое предсказание: это будет ещё один вендорский форк Klipper с ещё одной собственной, ни с чем не совместимой реализацией tool switching. Проверим через год.
Creality и прочие вендоры везут свои форки Klipper, замороженные на древних версиях, потому что вендорские патчи не переживают ребейз. Пользователь получает «Klipper», которому три года, и никакого пути обновления.
Итого: вместо одной реализации мультитула в ядре, отревьюенной и поддерживаемой сообща, индустрия имеет N несовместимых реализаций, каждую из которых тащит один вендор. Это и есть цена отсутствия governance, выраженная в человеко-годах.
Здесь важно проговорить экономику, потому что «жадные вендоры не хотят делиться» — популярное, но неверное объяснение. Всё ровно наоборот. Форк — это не актив, а пассив: вендор платит за него вечно. Каждый ребейз, каждый бэкпорт security-фикса, каждая несовместимость с экосистемой аддонов — это фонд оплаты труда, который капает, пока живёт продукт. Апстрим-контрибуция — это разовая (пусть и дорогая) инвестиция, которая конвертирует вечные издержки в разделяемые: код ревьюят чужие глаза, поддерживает сообщество, совместимость с экосистемой получается бесплатно. Я это знаю не из учебника — заносить код в апстрим входит в мои рабочие обязанности ровно потому, что моему работодателю так дешевле.
Это симбиоз в чистом виде. Контрибьюторы чинят свою боль — фиксами и фичами. Мейнтейнеры делают это возможным — и это тоже работа, за которую справедливо платить. У одних получается живой проект, который можно монетизировать, у других — работающая community-версия. И Кевин уже монетизирует: BIGTREETECH — official mainboard sponsor, Obico — спонсор, плюс личные донаты через Patreon/Ko-fi. Это нормально и правильно: мейнтейнер никому не обязан работать бесплатно, и никто не вправе требовать от него ни строчки кода. Вопрос не в том, должен ли он брать деньги, — он берёт. Вопрос в форме: деньги в проект текут, а обязательств не возникает ни одного. Спонсорство без места за столом, без комитета, без процедуры. Симбиоз выгоден всем участникам, включая мейнтейнера, — при одном условии.
Условие: мейнлайн должен уметь этот поток принимать, не захлебнувшись. Для этого и существуют процессы — иерархия мейнтейнеров, деление на подсистемы, документированные критерии приёма, делегирование ревью. (Про то, что происходит с этим условием в эпоху ИИ-генерируемых контрибуций, у меня есть отдельные мысли — если интересно, напишите в комментах, будет повод для следующего поста.) Правило ста юзеров само по себе — разумный фильтр. Но фильтр без пропускной способности — это не фильтр, это стена. У Klipper пропускная способность равна одному человеку, и поэтому единственная экономически рациональная стратегия для вендора — форк. Не потому что хочется, а потому что альтернативы физически нет.
И поверьте: компании были бы счастливы принести этот код в апстрим и сказать «возьми, поддерживай не сам». Больше того — они могли бы взять на себя владение отдельными подсистемами: вот вам maintainer тулченджер-модуля от Snapmaker, вот CI на нашем железе, ревьюйте нас, спрашивайте с нас. Ровно так это работает в ядре Linux, где за подсистемами стоят Intel, Red Hat, Google и десятки других. Но приносить некуда и владеть нечем. Ни фонда, ни технического комитета, ни roadmap, ни процедуры, по которой заинтересованная компания может купить себе хотя бы рассмотрение фичи. Не одобрение — просто рассмотрение. Коллаборация не продаётся даже за деньги.
«Ну так форкните всем миром»
Пробовали. Kalico (бывший Danger-Klipper; отдельное спасибо за нейминг — Calico из мира Kubernetes передаёт привет, я путаюсь до сих пор) — живой, симпатичный форк. Но посмотрите, что он несёт: россыпь относительно небольших патчей и отклонённых PR. Затащить туда что-то масштаба тулченджер-подсистемы Kalico не может — у него нет ресурса вести полноценную параллельную разработку, он обречён вечно ребейзиться на апстрим, где код может измениться так, что чужие патчи перестанут прикладываться.
А «большой форк всем сообществом» — это не про код, это про менеджмент. И вот тут показателен свежий кейс MinIO: когда из community-версии выпилили админку, появился форк OpenMaxIO — и заглох практически сразу после создания. За MinIO стояли деньги, пользователи, хайп на HN — и не взлетело. Форк проекта масштаба Klipper — это титанический труд, упирающийся ровно в то, чего у сообщества Klipper нет: в организацию.
Плюс работает вечное «работает — не трогай». Klipper печатает. Хорошо печатает. Мотивации на революцию у среднего пользователя ноль, а мелочи можно и в Kalico занести.
Даже Линус
Контрпример возьму намеренно самый неудобный из возможных. Linux kernel — это не уютный проект с Code of Conduct на первой странице. Туда патчи в 2026 году до сих пор носят почтой: plain-text email, как деды завещали (да, я в этом году носил — диффы NAND-драйвера). А его создатель — человек, чья репутация в коммуникациях… скажем так, задокументирована: LKML, рассылка разработчиков ядра, хранит всё открытым текстом уже тридцать лет.
И вот смотрите. Линусу Rust не нужен. Он на нём не пишет и хайпа не разделяет. Но в ядре есть машина: иерархия лейтенантов, мейнтейнеры подсистем, документированные правила, публичный процесс. Когда один из лейтенантов попытался единолично заблокировать Rust-биндинги в своей подсистеме — машина, с Линусом в роли арбитра, переехала лейтенанта, а не контрибьюторов. Rust в ядре. Через боль, через драму, через уход части людей — но процесс существует, и он способен переехать даже мнение самых авторитетных участников, включая, при необходимости, самого Линуса.
ДАЖЕ Линус, самый архетипический BDFL индустрии, построил систему, которая больше него. Кевин построил систему, которая в точности равна ему. В этом вся разница.
Выводы
Опенсорс — это не лицензия в корне репозитория. Лицензия у Klipper безупречная — и в этой конфигурации почти бесполезная. Смотрите: GPL сработала, Snapmaker честно выложил гору кода. Что изменилось для мира? Ничего. Смержить этот код некуда, ребейзить его никто не будет, жить он будет ровно столько, сколько Snapmaker продаёт U1. GPL-комплаенс без работающего канала приёма производит не коллаборацию, а мёртвые дампы — бюрократический налог, уплаченный в последний день отчётного периода. Для контраста: FreeBSD с её пермиссивной лицензией никого ни к чему не обязывает — Sony строит на ней операционную систему PlayStation, Apple десятилетиями тянет её код в ядро macOS, практически ничего не принося обратно в апстрим, и это законно. И при этом Netflix добровольно годами вкладывается в сетевой стек фряхи — потому что там есть куда вкладываться и это выгодно. Код в апстрим возвращает не лицензия. Код возвращает работающий канал приёма. (Холивар про GPL vs BSD оставим за кадром — здесь важен только этот частный случай.)
Опенсорс — это процессы: контракт между проектом и контрибьюторами, предсказуемость, возможность у сообщества влиять на направление. По всем этим пунктам Klipper — опенсорс только формально.
Что с этим делать? Ответ, вообще говоря, индустрии известен: вендорский форк под нейтральным фондом. Так сделали OpenTofu (форк Terraform), Valkey (форк Redis), OpenSearch: коммерческие игроки с общей болью скидываются инженерами, фонд даёт нейтралитет и governance, и никто ни у кого проект не «отжимает». Механизм существует и работает. Проблема в том, что у OpenTofu за спиной была экосистема, где такие консорциумы — привычка: фонды, юристы, готовые процедуры. А вендоры 3D-печати — вчерашние стартапы, у которых культуры коллаборации нет вообще. Не со зла — просто никогда так не делали. Имеем что имеем: Kalico, у которого есть код, но нет ни денег, ни устава, — и Кевина, которому я искренне желаю почётной пенсии и памятника при жизни за код, который он написал.
Может, есть путь, которого я не вижу. Что делать сообществу, чей стандарт де-факто заперт в bus factor = 1? Давайте в комментариях — мне правда интересно.
А пока — если вы вендор и делаете тулченджер, у меня для вас плохие новости: добро пожаловать в клуб, ваш форк уже ждёт вас.
Что делать лично вам
Чтобы статья не заканчивалась чистым нытьём — практическая часть. Если у вас есть личная боль, её стоит нести в мейнлайн. Там, где канал приёма работает, это окупается несоразмерно затратам. Свежий пример из моей практики: драйвер SPI-NAND HeYangTek в ядре Linux. Основную логику драйвера написал инженер Keenetic в их даунстриме — классическая судьба вендорского кода, обречённого протухнуть. Моя работа — причесать его под требования mainline и донести до mtd-мейнтейнеров: пара десятков собственных строк, немного переписки и чашка кофе. Результат: чип теперь поддержан в ядре навсегда, OpenWrt разблокирован на Keenetic KN-3411 и других роутерах с этой NAND — независимо от того, что дальше случится с вендором, его прошивкой или его отделом разработки. Да, патчи в ядро носят почтой. Да, это архаика. Но это архаика с работающим контрактом: я выполнил условия — код в дереве. ROI, который не снился ни одному форку.
Для симметрии — признание: мы и сами нередко делаем «странное». В экосистеме Cozystack живёт blockstor — control plane для LVM/ZFS-хранилища с DRBD-репликацией, который говорит на LINSTOR-совместимом REST API, но внутри переписан с нуля в кубернетес-нативной парадигме: CRD и реконсайлеры вместо центрального контроллера с собственной базой. И cozyplane — мультитенантный eBPF CNI, заменяющий связку Cilium и kube-ovn. Чем это отличается от вендорских форков Klipper? Одним словом: выбор. Занести в LINSTOR смену архитектурной парадигмы через PR невозможно в принципе — это не фича, это другой проект. Мы посчитали и осознанно взяли бремя поддержки на себя, зная его цену. Реимплементация — легитимный инструмент, когда донести в мейнлайн действительно дороже. Проблема Klipper не в том, что вендоры форкают, а в том, что у них нет момента, где можно было бы посчитать и выбрать иначе.
И раз уж я тут агитирую: я мейнтейню Cozystack (CNCF Sandbox) и лично готов принимать ваши PR — а если не умеете, подскажу и научу. Потому что единственный честный ответ на «у проекта X плохие процессы» — строить проекты с хорошими.
«Опенсорс — это когда у шиза есть проект, а кто-то ему с этим помогает». Klipper — это когда помогать не разрешают.
