Платформа, сервисы, оболочка, целые приложения и итоговая стратегия заимствования (исследование, 2026-10-04)
Область: MOffice ID и SSO, сервер лицензий, биллинг, установщики и обновления, отчёты о сбоях и телеметрия, системные крейты, облачные коннекторы, целые офисные пакеты и редакторы как источники, оболочка (лента, докинг, QML), иконки, справка, тестовые корпуса; собственный код владельца; итоговая стратегия. Правила и классы лицензий —
docs/research/BRIEF.md,docs/12-license-policy.md. Данные —oss-verified.tsv(проверено 2026-10-04). Отметка «(проверено 2026-10-04)» — дополнительная ручная проверка в этом отчёте, «(не проверено)» — по памяти/документации, требует подтверждения.
1. Выводы
- Стратегия — сценарий В (Rust-ядро + форки и порты классов 0–1 + код владельца): экономия ≈ 7,5–10,5 % (≈ 200–280 ч.-м., 2 660 → ≈ 2 380–2 460; сверено с итогами соседних отчётов), архитектура библии сохраняется. Публичные даты не менять, экономию обратить в буфер рисков и пик 73 → ≈ 67 FTE; «агрессивный» вариант (−4 недели для 1.5, 2.0, 3.0, 3.5, 4.0) — после gate фазы 2. Форк Apache OpenOffice (сценарий Б) отклонён: экспорта OOXML в нём нет, C++ 2000-х, к фазе 6 ядро пришлось бы переписать (2 800–3 300 ч.-м.).
- MOffice ID — свой
id-serviceна Rust, но начинать с порта сервера аккаунтов FlyType (Go, 8,3 тыс. строк, код владельца); SAML и SCIM — Ory Polis (Apache-2.0) отдельным контейнером; passkeys — порт проверки go-webauthn (BSD-3) вместо webauthn-rs (MPL). passkey-rs от 1Password — только клиент/аутентификатор, не замена серверной проверки. Keycloak 26.8 (SCIM, организации, passkeys) — эталон в CI и план Б; привязку refresh к устройству перевести на DPoP (RFC 9449). - keygen-api запрещён: Fair Core License
(source-available), в TSV ошибочно класс 1. Сервер лицензий — свой,
клиентский
meridian-licenseуже есть (1 914 строк). Биллинг — свой: Stripe Billing (async-stripe) для мира, свои адаптеры ЮKassa и CloudPayments (SDK CloudPayments без лицензии, SDK ЮKassa в архиве), Kill Bill — только образец, Lago — AGPL. - Обновления — velopack (MIT): дельты, каналы, поэтапная раскатка, откат, MSI, нотаризация; дописать подпись фида Ed25519 (6–8 ч.-м.). Официальный WiX ≥ 6 требует платы OSMF при выручке > 10 000 USD — MSI собирать через velopack.
- Сбои: crash-handler + minidump-writer +
rust-minidump + GlitchTip (MIT) ≈ 9 ч.-м.; Sentry и Symbolicator — FSL
(класс 3), в
08-roadmap.md«Sentry self-hosted» заменить. - Облака: OpenDAL (Apache-2.0: OneDrive, Google
Drive, Dropbox, Яндекс Диск, WebDAV, S3) внутри брокера +
rclone rcdотдельным процессом для синхронизируемых папок (7–10 ч.-м.); Google — толькоdrive.file+ Picker, иначе ежегодный CASA. - Оболочка: SARibbon — Qt Widgets, в QML-окно не встраивается → порт алгоритмов раскладки ленты (3–4 ч.-м.); докинг — свой на QML; иконки — Lucide (ISC) + Tabler (MIT) как основа MOffice Glyphs (6–8 ч.-м.), Fluent/Material — только образцы.
- Apache OpenOffice — выборочный порт: фильтр Word 97
(
ww8), функции Calc, StarMath, формулы фигур ODF, пресеты анимаций (4–7 ч.-м.); LibreOffice, OnlyOffice, Calligra, AbiWord, Gnumeric — чистая комната. - Код владельца — 24–37 ч.-м.: auth/биллинг/релизы/извлечение текста FlyType (Go), инструменты формул AXEL (RU↔︎EN, диагностика, сравнение книг, рассылки, ИНН/сумма прописью), крипто-конверт и синхронизация PasswordSafe (с исправлениями: ключ = сырой выход Argon2id, MAC только заголовка, нет потокового шифрования), помощники захвата ScreenPrompt (Windows на Rust, macOS на ScreenCaptureKit). Не переносить: запись через ffmpeg + libx264 (GPL), веса Silero (NC), edge-tts (LGPL).
- Права на код владельца: все человеческие коммиты — от учётных записей владельца; правообладатель в LICENSE — условная метка, много трейлеров ИИ (Cursor 1 735 в FlyType, Claude 224 в AXEL) → нужен документ владельца о правах и фиксация незакоммиченного кода (≈ 27 % Rust PasswordSafe).
- Мелкие ловушки: крейт
dirsтянет MPL-option-ext; mdBook кладёт MPL-тему в вывод (справка — Sphinx); тесты Ghostscript в корпусе К4 — заменить набором pdf.js.
2. Таблицы по подобластям
Обозначения: ★ — звёзды GitHub, dl — загрузки crates.io, дата —
последний коммит/выпуск по oss-verified.tsv; «ч.-м.» —
экономия в человеко-месяцах против базового плана
docs/08-roadmap.md (2 660 ч.-м.). Стратегии:
adopt / fork / port /
ref / avoid — по
BRIEF.md.
2.1 MOffice ID и SSO
| Кандидат | SPDX · класс | ★ / dl · дата | Язык | Что даёт MOffice | Стратегия | Что пишем сами, риски | ч.-м. |
|---|---|---|---|---|---|---|---|
| github.com/keycloak/keycloak | Apache-2.0 · 1 | 37 058★ · 2026-09-29 | Java | полный IdP: OIDC/SAML, организации (с 26.0), passkeys, SCIM-сервер — supported с 26.8 (проверено 2026-10-04) | ref + план Б; эталонный IdP в CI для проверки SSO | Java/Quarkus-стек, SPI на Java для наших требований; данные пользователей в чужой схеме | 0 (план Б: ≈ 8 нетто) |
| github.com/ory/kratos, ory/hydra | Apache-2.0 · 1 | 13 894★ / 17 547★ · 2026-07-29 | Go | аккаунты + сертифицированный OAuth2/OIDC-сервер | ref (Hydra — образец сервера авторизации) | организации, SAML, SCIM — только Ory Network или платная Ory Enterprise License (проверено 2026-10-04) | 0 |
| github.com/ory/polis (бывш. BoxyHQ SAML Jackson) | Apache-2.0 · 1 (проверено 2026-10-04) | нет в TSV | TypeScript | мост SAML 2.0 → OAuth/OIDC и синхронизация каталогов SCIM для организаций | adopt отдельным контейнером (фаза 6) | Node.js в составе сервисов; статус проекта после покупки Ory — следить | 3–4 |
| github.com/supertokens/supertokens-core | Apache-2.0 + ee/ под отдельной лицензией · 1* |
15 323★ · 2026-09-28 | Java | email/пароль, ссылки-вход, OAuth | avoid | MFA ($0,01/MAU), мультиарендность, связывание аккаунтов — платные даже при self-hosting (проверено 2026-10-04) | 0 |
| github.com/casdoor/casdoor | Apache-2.0 · 1 | 14 506★ · 2026-10-03 | Go | на бумаге всё: OIDC-провайдер, SAML IdP/SP, SCIM 2.0, WebAuthn, TOTP, организации (README, проверено 2026-10-04) | ref | зрелость и история уязвимостей (не проверено), сообщество в основном китайское | 0 |
| github.com/authelia/authelia | Apache-2.0 · 1 | 29 150★ · 2026-10-01 | Go | SSO-портал перед обратным прокси | avoid | нет самостоятельной регистрации, организаций, SAML — не CIAM | 0 |
| logto-io/logto · kanidm/kanidm | MPL-2.0 · 2 | 14 644★ / 5 426★ | TS / Rust | CIAM с организациями (Logto); IdM для инфраструктуры (kanidm) | ref (Logto — альтернатива класса 2 отдельным процессом) | решение владельца; см. раздел 4 | — |
| zitadel/zitadel · goauthentik/authentik | AGPL-3.0 · 3 / MIT + enterprise/ + CC-BY-SA · 3 |
15 113★ / 25 756★ | Go / Python | — | avoid | см. раздел 5 | — |
| crates.io/openidconnect 4.0.1 | MIT · 1 | 643★ · 14,4 млн dl · 2025-07 | Rust | вход через Google/Microsoft/Apple и корпоративный OIDC; типы discovery и ID-токенов для своего сервера | adopt | крейт не обновлялся с 2025-07 — закрепить версию | 1 |
| crates.io/oauth2 5.0.0 | MIT OR Apache-2.0 · 1 | 1 208★ · 54,9 млн dl | Rust | Яндекс ID (OAuth 2.0), VK ID (OAuth 2.1 + PKCE), клиент
meridian-id |
adopt | — | 0,5 |
| crates.io/samael 0.0.22 | MIT · 1 | 108★ · 0,75 млн dl · 2026-07 | Rust | SAML SP (подписи через xmlsec1) | ref / резерв к Polis | версия 0.0.x, атаки обёртывания XML-подписи — свой аудит обязателен | 0 |
| crates.io/webauthn-rs 0.5.5 | MPL-2.0 · 2 | 709★ · 7,4 млн dl · 2026-04 | Rust | проверка регистрации и входа passkeys (сторона сервера), аттестации | запасной вариант по решению владельца (раздел 4); по умолчанию — порт go-webauthn (BSD-3, класс 1) | без правок файлов MPL обязательства минимальны | (1,5) |
| github.com/go-webauthn/webauthn | BSD-3-Clause · 1 (по отчёту зависимостей FlyType; не проверено отдельно) | нет в TSV | Go | эталонная серверная проверка WebAuthn, уже работает в бэкенде FlyType | port логики проверки на Rust | тесты на векторах и программном аутентификаторе passkey-rs | 1 |
| github.com/1Password/passkey-rs | MIT OR Apache-2.0 · 1 | нет в TSV | Rust | только клиент и программный аутентификатор CTAP2, проверки на стороне сервера нет (проверено 2026-10-04) | adopt passkey-types + тестовый аутентификатор |
серверную проверку (подпись COSE, rpIdHash, флаги
UV/UP, счётчик) пишем сами: ≈ 1–1,5 тыс. строк; крейт
public-suffix несёт список Mozilla PSL (MPL-2.0) — не
тянуть |
0,5 |
| totp-rs 6.0.0 · argon2 0.6.0 · jsonwebtoken 11.1.0 · ed25519-dalek 3.0.0 · aes-gcm 0.11.1 · axum 0.8.9 | MIT / MIT-Apache / BSD-3 · 1 | 10,9 / 58,6 / 202,8 / 226,8 / 168,9 / 500,4 млн dl | Rust | TOTP, Argon2id, JWT EdDSA, подписи, шифрование секретов TOTP и
client_secret, HTTP |
adopt | — | 1,5 |
| crates.io/keyring 4.2.0 | MIT OR Apache-2.0 · 1 | 769★ · 28,8 млн dl · 2026-08 | Rust | токены в Keychain / Credential Manager / Secret Service
(meridian-id) |
adopt | в Linux без Secret Service — запасной файл, зашифрованный ключом устройства | 0,5 |
| coset, p256, rsa (RustCrypto, Google) | Apache-2.0 / MIT-Apache · 1 (не проверено) | нет в TSV | Rust | разбор ключей COSE и проверка подписей ES256/RS256/EdDSA для своей проверки passkeys | adopt (основа порта проверки go-webauthn) | — | — |
2.2 Лицензии и биллинг
| Кандидат | SPDX · класс | ★ / dl · дата | Язык | Что даёт MOffice | Стратегия | Что пишем сами, риски | ч.-м. |
|---|---|---|---|---|---|---|---|
kernel/crates/meridian-license (наш) |
собственный · ★ | 1 914 строк: key.rs 582, features.rs 589,
license.rs 478, sha256.rs 225 |
Rust | ключ MOFC-…, флаги функций, .mlic, сроки и
льготы, трейт Verifier |
own | дописать CBOR (ciborium), ed25519-dalek,
отпечаток, аренду; на сервере MAC ключей сравнивать за постоянное время
(hmac + subtle) |
— |
| github.com/keygen-sh/keygen-api | FCL-1.0-ALv2 (Fair Core License, «source-available») · 3 (проверено 2026-10-04; в TSV ошибочно класс 1) | 1 605★ · 2026-09-28 | Ruby | сервер лицензий: машины, активации, плавающие лицензии, релизы | avoid (код не читать); публичная документация API — только как чек-лист функций | запрет «конкурирующего использования» и обхода проверки ключа; переход в Apache-2.0 только через 2 года после выпуска каждой версии | 0 |
| crates.io/machine-uid 0.6.0 | MIT · 1 | 48★ · 3,8 млн dl · 2026-05 | Rust | идентификатор машины: MachineGuid (Windows),
IOPlatformUUID (macOS), /etc/machine-id
(Linux) |
adopt (или 60 строк своего кода) | клоны ВМ и образы sysprep дают одинаковые ID — правило «2 из 3»
(раздел 6.3 10-licensing-accounts.md) это покрывает |
0,2 |
| github.com/killbill/killbill | Apache-2.0 · 1 | 5 764★ · 2026-09-28 | Java | каталог, подписки, счета, повторы списаний, состояния просрочки, плагины платёжных шлюзов | ref (модель подписок и дэнинга); adopt — только если владелец захочет готовую админку Kaui | JVM + своя БД; плагины ЮKassa/CloudPayments пришлось бы писать на Java; акты/УПД/ЭДО, реселлеры, Education всё равно свои | 0 (adopt: 1–3 нетто) |
| github.com/getlago/lago | AGPL-3.0 · 3 | 10 572★ | Go | — | avoid | — | — |
| crates.io/async-stripe 0.41.0 | MIT OR Apache-2.0 · 1 | 749★ · 5,5 млн dl · 2026-09 | Rust | Checkout, Billing, Tax, Customer Portal, вебхуки — мировой регион | adopt (только нужные фичи крейта) | большой объём генерированного кода; закрепить версию API Stripe | 0,7 |
| SDK ЮKassa: github.com/yoomoney/yookassa-sdk-python, -php, -java | MIT · 1 | 50–75★ · архив на GitHub с 2022 (проверено 2026-10-04) | Python/PHP/Java | эталон запросов API v3: платежи, receipt 54-ФЗ,
автоплатежи, возвраты, вебхуки |
ref (port отдельных моделей с уведомлением MIT) | Rust-SDK нет: свой адаптер REST (Basic
shopId:secretKey, Idempotence-Key, проверка
вебхуков по IP-списку) |
0,3 |
| SDK CloudPayments: github.com/cloudpayments/* | лицензии нет (None/NOASSERTION), всё в архиве (проверено 2026-10-04) | 10–16★ | разные | — | avoid код (без лицензии = нельзя копировать); только документация API | свой адаптер: Basic Public ID:API Secret, подпись
вебхуков HMAC-SHA256 (Content-HMAC) |
0 |
2.3 Установщики и обновления
| Кандидат | SPDX · класс | ★ / dl · дата | Язык | Что даёт MOffice | Стратегия | Что пишем сами, риски | ч.-м. |
|---|---|---|---|---|---|---|---|
| github.com/velopack/velopack (клон) | MIT · 1 | 2 354★ · крейт 1.2.161, 0,11 млн dl · 2026-09-29 | Rust + C# (vpk) |
установщик и обновление Windows/macOS/Linux; дельты (zstd
--patch-from), каналы, поэтапная раскатка, откат при сбое
применения, MSI per-user/per-machine |
adopt (библиотека velopack + CLI
vpk в CI) |
подписи фида нет (только SHA-256 пакетов) → свой
UpdateSource с Ed25519; Linux — только AppImage; политики
организаций — свои |
6–8 |
| github.com/sparkle-project/Sparkle | MIT (+BSD-3, Zlib) · 1 | 9 797★ · 2026-09-28 | Obj-C | macOS: appcast с подписью EdDSA, дельты | ref / запасной вариант для macOS | второй механизм обновлений — только если velopack не справится с universal-сборкой | 0 |
| github.com/vslavik/winsparkle | MIT · 1 | 1 479★ · 2026-08-10 | C++ | Windows: appcast, подписи | avoid | нет дельт, слабее velopack | 0 |
| github.com/crabnebula-dev/cargo-packager | Apache-2.0 OR MIT · 1 | 485★ · крейт 0.11.8 (2025-11) | Rust | пакеты NSIS/WiX/DMG/AppImage/deb/pacman + апдейтер с подписью (не проверено) | ref (deb/rpm собираем штатными средствами) | крейт не выпускался с 2025-11 | 0 |
| github.com/wixtoolset/wix | MS-RL · 2 (инструмент; DLL пользовательских действий попадают в MSI) | 1 149★ · 2026-09-30 | C# | MSI для GPO и тихой установки | adopt как инструмент или MSI из velopack | двоичные сборки WiX ≥ 6 — под EULA «Open Source Maintenance Fee»: при выручке > 10 000 USD/год обязательно спонсорство, WiX 7 блокирует команды до принятия EULA (проверено 2026-10-04); velopack собирает MSI своим форком WiX и OSMF не применяется | — |
| github.com/jrsoftware/issrc (Inno Setup) | собственная разрешительная · 1 (коммерческое использование бесплатно, проверено 2026-10-04) | 5 648★ | Pascal | EXE-установщик | ref | не нужен при MSIX/MSI/velopack | 0 |
| create-dmg · appimagetool | MIT · 1 | 2 644★ / 430★ | Shell / C | DMG; AppImage | adopt (инструменты CI) | — | 0,3 |
| flatpak-builder | LGPL-2.1 · 2 (инструмент, в продукт не входит) | 178★ · 2026-09-15 | C | Flatpak для Flathub — главный канал Linux | adopt как инструмент | обновления Flatpak делает сама ОС (OSTree), velopack не нужен | — |
github.com/indygreg/apple-platform-rs (rcodesign) |
MPL-2.0 · 2 (инструмент) | 851★ · 2026-09-12 | Rust | подпись и нотаризация macOS с Linux-раннеров | ref; по умолчанию codesign + notarytool на
macOS-раннерах |
— | 0 |
2.4 Отчёты о сбоях и телеметрия
| Кандидат | SPDX · класс | ★ / dl · дата | Язык | Что даёт MOffice | Стратегия | Что пишем сами, риски | ч.-м. |
|---|---|---|---|---|---|---|---|
| crates.io/crash-handler 0.8.1 (EmbarkStudios/crash-handling) | MIT OR Apache-2.0 · 1 | 192★ · 3,3 млн dl · 2026-09-25 | Rust | перехват сигналов, SEH-исключений, Mach-исключений | adopt | обработчик минимальный: дамп пишет внешний процесс (брокер) | 1,5 |
| crates.io/minidump-writer 0.13.0 | MIT · 1 | 90★ · 2,9 млн dl · 2026-07-20 | Rust | запись minidump для Windows/macOS/Linux из стороннего процесса | adopt | — | 1,5 |
crates.io/minidump 0.27.0 + minidump-processor,
breakpad-symbols (rust-minidump) |
MIT · 1 | 512★ · 1,2 млн dl · 2026-08-11 | Rust | разбор дампов, раскрутка стека, символикация по
.sym |
adopt на сервере
(telemetry-service) |
символы из PDB/dSYM/DWARF — dump_syms (Mozilla,
Apache-2.0/MIT, не проверено) |
2 |
| github.com/google/breakpad | BSD-3-Clause (основная) + сторонние файлы · 1 (в TSV класс 0 ошибочен) | 2 902★ | C++ | формат .sym, эталон поведения |
ref | — | 0 |
| crates.io/sentry 0.49.3 (sentry-rust) | MIT · 1 | 753★ · 55,8 млн dl · 2026-09-21 | Rust | SDK событий: паники Rust, ошибки, хлебные крошки — протокол Sentry, принимается GlitchTip | adopt (только транспорт и протокол; без автосбора ПДн) | SDK класс 1, хотя сервер Sentry — FSL | 0,5 |
| gitlab.com/glitchtip/glitchtip-backend | MIT · 1 (проверено 2026-10-04 по LICENSE на GitLab) | 131★ (зеркало) | Python/Django | сервер ошибок, совместимый с SDK Sentry; группировка, уведомления; GlitchTip 6 — приём minidump и символов PDB/dSYM/ELF (по обзору, проверено 2026-10-04, нужен пилот) | adopt (self-hosted в РФ и ЕС) | проверить, не тянет ли нативная символикация Sentry Symbolicator (FSL); если тянет — дампы обрабатываем своим сервисом на rust-minidump | 3 |
| github.com/getsentry/sentry, getsentry/symbolicator | FSL-1.1 (+Apache части) / FSL-1.1-MIT · 3 (проверено 2026-10-04) | 44 867★ | Python / Rust | — | avoid | в 08-roadmap.md (1.3, 3.1, 5.4) стоит «Sentry
self-hosted» — заменить на GlitchTip |
— |
| github.com/bugsink/bugsink | PolyForm-Noncommercial-1.0.0 · 3 | 2 095★ | Python | — | avoid | — | — |
| crates.io/opentelemetry 0.33.0 + tracing 0.1.44 | Apache-2.0 / MIT · 1 | 2 722★ · 280,6 / 897,4 млн dl | Rust | трассировка, метрики, логи сервисов → Tempo/Prometheus/Loki | adopt | — | 0,5 |
| github.com/PostHog/posthog | MIT, кроме ee/ (отдельная коммерческая лицензия) и
сторонних частей · 1 только для FOSS-части (проверено 2026-10-04) |
39 966★ · 2026-09-27 | Python/TS | продуктовая аналитика, воронки | ref (тяжёлый стек: ClickHouse, Kafka) | для opt-in-метрик достаточно своего эндпоинта
telemetry-service + ClickHouse/PostgreSQL |
0 |
| github.com/umami-software/umami | MIT · 1 | 39 079★ · 2026-09-29 | TS | аналитика сайта и портала без cookie | adopt (сайт, портал) | не для десктопа | 0,3 |
2.5 Системные крейты
| Кандидат | SPDX · класс | dl · дата | Что даёт MOffice | Стратегия | Замечания |
|---|---|---|---|---|---|
| interprocess 2.4.4 | 0BSD OR Apache-2.0 · 0 | 15,4 млн · 2026-09 | локальные сокеты (именованные каналы Windows / Unix-сокеты) — транспорт брокера | adopt | без обязательств |
| ipc-channel 0.23.0 (servo) | MIT OR Apache-2.0 · 1 | 6,5 млн · 2026-09 | передача дескрипторов и общей памяти — песочные процессы кодеков | adopt (кодек-хост) | — |
| tarpc 0.38.0 | MIT · 1 | 10,1 млн · 2026-08 | RPC поверх любого транспорта | ref | свой протокол кадров (serde + postcard/CBOR) проще и стабильнее для FFI |
| keyring 4.2.0 | MIT OR Apache-2.0 · 1 | 28,8 млн · 2026-08 | SecretStore (03-architecture.md) |
adopt | см. 2.1 |
| arboard 3.6.1 (1Password) · clipboard-rs 0.3.5 | MIT-Apache / MIT · 1 | 50,3 / 0,6 млн | буфер: текст, изображения, HTML | adopt только в брокере и инструментах | в окнах приложений — QClipboard/QMimeData
(любые MIME, форматы Windows через QWinMime) |
| notify 8.2.0 | CC0-1.0 · 0 | 163,9 млн · 2026-08 | слежение за файлами: Hub (недавние), папки синхронизации | adopt | — |
| notify-rust 4.18.1 | MIT OR Apache-2.0 · 1 | 15,5 млн · 2026-09 | уведомления ОС из брокера (Linux/macOS) | adopt | Windows Toast — через windows (AUMID) |
| global-hotkey 0.8.0 · tray-icon 0.26.0 · muda 0.21.0 (tauri-apps) | Apache-2.0 OR MIT · 1 | 5,9 / 32,4 / 38,4 млн | глобальные клавиши брокера (в Qt их нет) | adopt global-hotkey; трей и меню — Qt |
— |
| dirs 7.0.0 | MIT OR Apache-2.0 · 1, но транзитивно
dirs-sys → option-ext (MPL-2.0, найдено в
Cargo.lock PasswordSafe) |
348,7 млн · 2026-09 | папки ОС из Rust | avoid без исключения в deny.toml; в
оболочке — QStandardPaths, в ядре — свои 60 строк
(SHGetKnownFolderPath / NSFileManager / XDG)
или etcetera (MIT-Apache, не проверено) |
репозиторий на GitHub в архиве (2025-01) |
| sysinfo 0.39.6 · open 5.4.4 | MIT · 1 | 214,2 / 57,3 млн | сведения о системе в отчёте о сбое; открыть URL/файл обработчиком ОС | adopt | без серийных номеров и имён пользователей в отчётах |
| windows 0.62.2 · objc2 0.6.4 | MIT-Apache / MIT-Zlib-Apache · 1 | 347,6 / 124,5 млн | системные API Windows и macOS | adopt | — |
| fluent 0.17.0 | Apache-2.0 OR MIT · 1 | 14,7 млн | строки ядра и сервисов | ref | интерфейс — Qt .ts через Weblate (план 7.1); второй
формат только для сервисов |
| rfd, winit, accesskit, egui, iced, tauri, gtk4, enigo | MIT/Apache · 1 | — | диалоги, окна, доступность, UI-тулкиты, эмуляция ввода | avoid | выбран Qt 6 (библия, раздел 4); автоввод — свой код PasswordSafe |
Все крейты — Rust, звёзды см. oss-verified.tsv. Экономия
по группе ≈ 2–3 ч.-м. (транспорт брокера, слежение за файлами,
уведомления, глобальные клавиши, сведения о системе); при подключении
каждого — cargo deny check, транзитивные MPL встречаются
(пример — dirs).
2.6 Облачные коннекторы
| Кандидат | SPDX · класс | ★ / dl · дата | Язык | Что даёт MOffice | Стратегия | Что пишем сами, риски | ч.-м. |
|---|---|---|---|---|---|---|---|
| github.com/apache/opendal 0.59.3 | Apache-2.0 · 1 (проверено 2026-10-04 по
core/Cargo.toml) |
нет в TSV | Rust | единый API хранилищ внутри процесса: onedrive,
gdrive, dropbox, yandex-disk,
webdav, s3, pcloud,
koofr, seafile, sftp,
fs |
adopt для «Открыть/Сохранить из облака» в Hub | OAuth-вход и обновление токенов — наш meridian-id;
сервисы облачных дисков в OpenDAL моложе S3/WebDAV — интеграционные
тесты на каждого провайдера |
4–6 |
| github.com/rclone/rclone | MIT · 1 | 60 023★ · 2026-09-30 | Go | 70+ бэкендов, зрелая синхронизация, повторы, лимиты API, проверка хэшей | adopt отдельным процессом rclone rcd
(rc-API по локальному сокету) для фоновой синхронизации папок |
librclone (c-shared) — «экспериментальный» API; в Windows только
динамическая загрузка без FreeLibrary (проверено
2026-10-04) → не встраивать в процесс; Go-зависимости сборки проверить
go-licenses; размер бинарника (не проверено) |
3–4 |
PasswordSafe passwordsafe-sync,
passwordsafe-cloud (наши) |
собственный · ★ | см. 3.5 | Rust | сквозное шифрование, WebDAV/S3, авторизация устройств | own (перенос) | см. 3.5 | см. 3.5 |
2.7 Целые приложения и редакторы
| Кандидат | SPDX · класс | ★ · дата | Язык | Что даёт MOffice | Стратегия | Риски | ч.-м. |
|---|---|---|---|---|---|---|---|
| github.com/apache/openoffice | Apache-2.0 · 1 | 1 244★ · 2026-09-22; выпуск 4.1.16 — 2025-11-10, 4.2.0 «в 2026» (проверено 2026-10-04) | C++ (UNO, VCL) | фильтры бинарных форматов (sw/source/filter/ww8,
sc/source/filter/excel), функции sc (финансы,
статистика), пресеты анимаций Impress, парсер StarMath, автофигуры |
ref + port выборочно (см. 3.6) | код 2000-х, модель UNO; OOXML в AOO только читается — экспорта docx/xlsx нет; порт ≠ форк | 4–7 |
| github.com/LibreOffice/core | MPL-2.0 / LGPLv3+ / GPL (смешанная история) · 3 по TSV | 4 439★ | C++ | только тестовые документы (*/qa/*, MPL-2.0) — в корпус,
не в продукт |
avoid код (чистая комната) | — | — |
| ONLYOFFICE, Calligra, AbiWord, Gnumeric, CKEditor 5 | AGPL/GPL · 3 | — | — | — | avoid | см. раздел 5 | — |
| ProseMirror (prosemirror-model, -transform) | MIT · 1 | 340★ · репозиторий на GitHub в архиве (TSV) | TS | шаги транзакций, отображение позиций (Mapping), схема
узлов, ReplaceStep |
ref (идеи модели правок
text-model) |
— | 0,5 |
| Lexical · Slate · Quill · Tiptap | MIT / MIT / BSD-3 / MIT · 1 | 23 901★ / 31 752★ / 47 363★ / 38 572★ | TS | Lexical: ключи узлов, двойной буфер «черновик/зафиксировано»; Quill Delta — компактный OT-формат правок; Slate — операции над деревом | ref | веб-редакторы, раскладки страниц у них нет | 0,5 |
| github.com/dream-num/univer | Apache-2.0 · 1 | 21 936★ · 2026-09-29 | TS | архитектура «команда → мутация → операция», движок формул (порт
функций — отчёт oss-formats-sheets-data.md) |
ref + port функций | часть возможностей — в закрытом Univer Pro (не проверено) | см. отчёт Sheets |
| github.com/gristlabs/grist-core | Apache-2.0 · 1 | 11 880★ · 2026-09-29 | TS/Python | «таблица-БД», формулы по столбцам, правила доступа по строкам | ref для Base и Forms | grist-ee — отдельная закрытая часть (не проверено) |
0,5 |
| github.com/ether/etherpad-lite | Apache-2.0 · 1 | 18 558★ | JS | Easysync: changesets, пулы атрибутов — компактный журнал правок | ref (формат журнала операций MOP
history/) |
— | 0,3 |
| xi-editor · lapce/floem · zed | Apache-2.0 · 1 (только файлы под Apache; в zed часть крейтов — GPL/AGPL) | 19 815★ / 38 862★ / 91 173★ | Rust | канаты (xi-rope), якоря, sum_tree |
ref | в zed проверять лицензию каждого крейта — GPL-части класса 3 | 0 |
2.8 Оболочка
| Кандидат | SPDX · класс | ★ · дата | Язык | Что даёт MOffice | Стратегия | Риски | ч.-м. |
|---|---|---|---|---|---|---|---|
| github.com/czyt1988/SARibbon (клон) | MIT · 1 | 1 447★ · 2026-09-30 | C++ / Qt Widgets | ≈ 35 тыс. строк src/SARibbonBar: раскладка панелей с
адаптивным сворачиванием, контекстные вкладки, галереи, панель быстрого
доступа, диалог настройки ленты, менеджер действий; QML нет |
port алгоритмов раскладки и модели настройки в QML-ленту (не fork виджетов) | QWidget нельзя вставить в QML-окно; QWindowKit
(сабмодуль, Apache-2.0 — не проверено) не нужен |
3–4 |
| github.com/githubuser0xFFFF/Qt-Advanced-Docking-System (клон) | LGPL-2.1 · 2 | 2 525★ · 2026-09-10 | C++ / Widgets | ≈ 23 тыс. строк; QML нет | ref (поведение, сохранение раскладки) | копирование — только по решению владельца; переносить незачем | 0 |
| KDDockWidgets (KDAB) | GPL-2.0/3.0 + коммерческая · 3 (не проверено) | — | C++ / Widgets + QtQuick | докинг для QtQuick | avoid (или покупка — класс 4) | — | — |
| github.com/zhuzichu520/FluentUI | MIT · 1 | 4 601★ · 2026-04-07 | C++ / QML | безрамочное окно, акрил/Mica, анимации, навигация, тосты на QML | ref, точечный fork приёмов (безрамочное окно) | стиль Fluent ≠ MDS; активность падает | 1 |
| PyQt-Fluent-Widgets | GPL-3.0 · 3 | 8 112★ | Python | — | avoid | — | — |
| cxx-qt 0.10.0 · qmetaobject 0.2.10 | MIT-Apache / MIT · 1 | 1 547★ / 735★ | Rust | мост Rust↔︎Qt (выбран cxx-qt) | adopt cxx-qt; qmetaobject — ref (крейт не выпускался с 2023) | — | — |
| egui, iced, Flutter, Avalonia, Tauri, Electron, wxWidgets (LGPL-искл.), Slint (GPL/royalty-free) | разные | — | — | альтернативные тулкиты | avoid (решение библии — Qt 6) | — | — |
2.9 Иконки
| Набор | SPDX · класс | ★ · дата | Объём и стиль (не проверено) | Роль в MOffice Glyphs | Стратегия |
|---|---|---|---|---|---|
| Lucide | ISC (+MIT для иконок, унаследованных от Feather) · 1 | 24 797★ · 2026-09-29 | ≈ 1 600, сетка 24, линия 2 px, скругления | основа общего интерфейса | fork → перерисовка под сетку MDS |
| Tabler Icons | MIT · 1 | 21 875★ · 2026-10-02 | ≈ 5 900, 24 px, линия 2 px, близка к Lucide | офисные метафоры: таблицы, текст, макет, диаграммы | fork (дополнение) |
| Phosphor (core) | MIT · 1 | 380★ · 2026-01-06 | ≈ 1 500 × 6 начертаний | образец системы весов (тонкий/обычный/жирный/заливка) | ref |
| Material Symbols | Apache-2.0 · 1 | 54 046★ · 2026-09-25 | ≈ 3 800, вариативный шрифт | ref (метафоры, оси веса) | ref |
| Fluent System Icons | MIT · 1 | 10 875★ · 2026-09-29 | тысячи, богатые офисные метафоры Microsoft | только ref: узнаваемый стиль Microsoft — риск «похожести» на Office | ref |
| Heroicons · Feather | MIT · 1 | 23 846★ / 26 003★ | ≈ 300 / 287 (Feather не развивается с 2025-03) | ref | ref |
| RemixIcon | собственная «Remix Icon License v1.0» (2026), не OSI · 9 | 8 390★ | — | — | avoid |
| Breeze · Papirus | LGPL-2.1 · 2 / GPL-3.0 · 3 | 282★ / 8 122★ | — | — | avoid |
Формат всех наборов — SVG; экономия 6–8 ч.-м. дизайнера иконок (разбор в 3.7).
2.10 Справка и корпуса
| Кандидат | SPDX · класс | ★ · дата | Что даёт MOffice | Стратегия | Риски |
|---|---|---|---|---|---|
| github.com/rust-lang/mdBook | MPL-2.0 · 2 (инструмент) | 22 179★ · 2026-10-01 | Markdown → HTML, поиск, темы | adopt как инструмент только со своей темой | тема по умолчанию (JS/CSS, MPL-2.0) копируется в вывод — тогда в справке окажутся файлы MPL |
| github.com/mkdocs/mkdocs | BSD-2-Clause · 1 | 22 480★ · 2025-10-20 | сайт документации | ref (активность низкая) | будущее экосистемы тем — (не проверено) |
| github.com/sphinx-doc/sphinx | BSD-3-Clause · 1 | 8 031★ · 2026-09-21 | многоязычная справка (gettext), PDF, .qch |
adopt для онлайн-справки и документации API | Python в CI |
Qt Help (qhelpgenerator, модуль QtHelp) |
в составе Qt (LGPL-3.0 / коммерч.) · 2 | — | офлайн-справка F1 по контексту (план 7.2) | adopt (решение по Qt) | — |
| GovDocs1 (digitalcorpora.org) | общественное достояние (документы госорганов США) · 0 | — | ≈ 1 млн файлов doc/xls/ppt/pdf/html для фаззинга и корпуса К1–К4 | adopt (вне продукта) | отдельные файлы могут содержать чужие материалы — только тесты |
| DocBank | Apache-2.0 (датасет, проверено 2026-10-04) · 1 | 636★ · 2024-08 | 500 тыс. страниц с разметкой блоков (arXiv) | adopt для тестов раскладки PDF→Write | обучение моделей: статьи arXiv под своими лицензиями — юристу |
| PubLayNet | CDLA-Permissive-1.0 (аннотации) · 1 | 1 061★ · 2025-07 | 360 тыс. страниц PMC с разметкой | adopt для тестов | изображения — статьи PMC OA под CC-лицензиями статей |
| DocLayNet (IBM) | CDLA-Permissive-1.0 (не проверено) | — | 80 тыс. страниц отчётов, инструкций, патентов — ближе к офисным документам | adopt для тестов | — |
Тестовые файлы Apache POI (test-data/) |
Apache-2.0 · 1 | — | тысячи doc/xls/ppt/docx/xlsx, включая «ломаные» и зашифрованные | adopt в корпус | — |
Тестовые файлы LibreOffice (sw/qa, sc/qa,
sd/qa) |
MPL-2.0 · 2 (только тесты) | — | регрессионные документы | adopt в корпус, не в установщик | код тестов LibreOffice не читать (чистая комната) |
Экономия: инструменты справки ≈ 1 ч.-м.; источники корпусов уже заложены в план 5.1, сверх плана экономии нет.
3. Глубокие разборы
3.1 MOffice ID: Keycloak, свой сервер на Rust или другой IdP
Требования взяты из docs/10-licensing-accounts.md §8 и
§10.2: e-mail + Argon2id с pepper, ссылка-вход с
client_nonce и кодом из 6 цифр, вход через
Google/Apple/Microsoft/Яндекс ID/VK ID, корпоративный OIDC и SAML 2.0 с
маршрутизацией по домену и JIT, TOTP + passkeys + коды восстановления,
refresh-ротация с отзывом «семьи», привязка refresh к ключу устройства,
JWT EdDSA + JWKS, организации с 7 ролями, SCIM 2.0, аудит с хэш-цепочкой
и выгрузкой в SIEM, регионы ru/eu с каталогом
email_hash → region, экспорт и удаление по 152-ФЗ/GDPR,
on-prem в docker compose.
| Требование | Keycloak 26.8 | Свой Rust (axum + крейты) | Ory Kratos + Hydra | SuperTokens | Casdoor | Logto (класс 2) |
|---|---|---|---|---|---|---|
| Лицензия, класс | Apache-2.0, 1 | наш код + MIT/Apache, 1 | Apache-2.0, 1 (ядро) | Apache-2.0 + ee/, 1* |
Apache-2.0, 1 | MPL-2.0, 2 |
| OIDC-сервер для своих клиентов (код + PKCE, loopback) | да, сертифицирован | свой узкий сервер (≈ 3 ч.-м.) | Hydra, сертифицирован | частично (единый вход — платно) | да | да |
| Google/Apple/Microsoft · Яндекс/VK | встроенные + расширения для Apple, Яндекс, VK (не проверено) | openidconnect + oauth2 |
общий OIDC-провайдер | да | да | да |
| SAML 2.0 SP (вход сотрудников) | да, зрелый | через Ory Polis (Apache-2.0) | только платная OEL | платно (не проверено) | да (IdP и SP) | да |
| SCIM 2.0 | да, входящий, supported с 26.8 (проверено 2026-10-04) | свой (≈ 1,5 ч.-м.) или Polis | только платная OEL | нет (не проверено) | да | (не проверено) |
| TOTP, коды, passkeys | да | totp-rs; passkeys — порт go-webauthn (класс 1), запасной — webauthn-rs (класс 2) | да | MFA платно | да | да |
| Организации и 7 ролей | организации да; роли — наш слой | наша модель (DDL уже есть) | только OEL | мультиарендность платно | да | да |
| Привязка refresh к устройству | DPoP RFC 9449 (версия — не проверено) или SPI на Java | свой заголовок или DPoP | нет | нет | нет | нет |
| Аудит с хэш-цепочкой, регионы, экспорт/удаление | слушатель событий (SPI) + наш сервис | своё | своё | своё | частично | своё |
| Ссылка-вход с nonce и кодом | свой аутентификатор (SPI) | своё | да (code) | да | да | да |
| Стек и вес on-prem | Java/Quarkus, ≈ 1 ГБ ОЗУ на узел (не проверено) | один Rust-бинарник | Go, лёгкий | Java + SDK | Go + React | Node.js |
| Стоимость владения за 4 года | 18–22 ч.-м.: темы входа (Keycloakify) и SPI 6–8, наш сервис устройств/аудита/регионов 6, сопровождение 0,2 FTE | 26–30 ч.-м. с нуля: ядро 10–12, соцвход 1,5, MFA/passkeys 1–2, организации 2, SSO OIDC 1,5, SCIM 1,5, Polis 1, аудит/регионы/удаление 3, пентест и OpenID conformance 2,5; ≈ 21–25 с портом auth из FlyType | 20–24 + платная OEL | не подходит | 16–20 | 18–22 |
| Главный риск | SPI ломаются при квартальных обновлениях; пользователи в чужой схеме, рядом с license-service — синхронизация по событиям | безопасность своего сервера авторизации | B2B-функции платные | ключевые функции платные по MAU | зрелость и аудит безопасности (не проверено) | MPL + Node; решение владельца |
Рекомендация. Оставить решение библии — свой
id-service на Rust — но не писать с нуля опасные
части: 0. Основа — порт сервера аккаунтов FlyType
(backend/internal/auth, Go, 8,3 тыс. строк, код владельца):
пароль, ссылка-вход, OAuth Google/Яндекс, SSO, passkeys, TOTP, вход с
устройства, refresh, JWKS уже работают в продукте (3.9; экономия 3–5
ч.-м. учтена там). Это снимает большую часть стоимости «своего» столбца
таблицы.
- Клиентская сторона входа (Google, Microsoft, Apple, корпоративный
OIDC) —
openidconnect; Яндекс ID и VK ID —oauth2; свой сервер авторизации — только для своих клиентов (десктоп, портал, cloud): код + PKCE, loopback-redirect, refresh-ротация; без динамической регистрации клиентов и чужих приложений. Проверка: OpenID conformance suite (бесплатный инструмент OpenID Foundation) и внешний пентест к вехе L1.2 (2027-09-17). - SAML 2.0 и SCIM для Business/Enterprise (фаза 6) — Ory
Polis (Apache-2.0) отдельным контейнером: он принимает
SAML-ответы и отдаёт нашему сервису OAuth-код, а каталоги SCIM
синхронизирует в наши
org_members. Своего кода XML-подписей нет — исчезает главный рискsamael0.0.x. - Passkeys — порт серверной проверки из go-webauthn
(BSD-3-Clause, класс 1; уже используется в бэкенде FlyType) на Rust
поверх
passkey-types+coset+p256/ed25519-dalek(≈ 1–1,5 тыс. строк, ≈ 1 ч.-м.); программный аутентификаторpasskey-authenticator— в интеграционные тесты. По политике класс 2 берём, только если нет замены 0–1, а она есть, поэтому webauthn-rs (MPL-2.0) — запасной вариант по решению владельца (раздел 4). Замечание: passkey-rs — не замена webauthn-rs «один к одному», серверной проверки в нём нет (проверено 2026-10-04). - Привязку refresh к устройству перевести с собственного заголовка
X-Meridian-Device-Proofна стандарт DPoP (RFC 9449): та же криптография Ed25519 (ключ устройства в Keychain/DPAPI/Secret Service), но совместимо с Keycloak и сторонними клиентами. Это же делает Keycloak реальным планом Б: если к вехе L3.1 (2028-07-07, SSO OIDC) свой сервер не прошёл пентест, переходим на Keycloak, сохранив наши сервисы устройств, аудита и лицензий. - Keycloak сразу нужен как эталонный IdP в CI (тесты SSO с Entra ID, Google, Яндекс 360 и Keycloak — критерий релиза 3.5).
Экономия против плана: крейты 3,5 ч.-м. + Polis 3–4 + порт go-webauthn вместо проверки с нуля 1 = 7,5–8,5 ч.-м. (плюс 3–5 ч.-м. от порта кода FlyType в 3.9). Полный переход на Keycloak дал бы ≈ 8 ч.-м. сверх «своего с нуля», но при наличии кода FlyType преимущество почти исчезает, а цена — Java-стек и чужая модель данных.
3.2 Лицензии и биллинг
keygen-api — нельзя. Репозиторий распространяется
под Fair Core License 1.0 (FCL-1.0-ALv2): разрешено внутреннее
использование, но запрещено «конкурирующее использование» и обход
проверки ключа, а в Apache-2.0 каждая версия переходит только через 2
года (проверено 2026-10-04). Для нас это «source-available» — класс 3:
код не подключаем и не читаем. Скрипт проверки отнёс проект к классу 1,
потому что нашёл в тексте слово «Apache» — запись в
oss-verified.tsv нужно исправить. Публичная документация
Keygen (машины, «сердцебиения», плавающие пулы, политики) — допустимый
чек-лист идей: идеи не охраняются, текст кода — охраняется.
Свой meridian-license уже есть (1 914
строк, без внешних зависимостей, тест-векторы ключа): формат ключа и
контрольный символ, флаги функций, структура лицензии со сроками,
льготами и сравнением отпечатка, трейт Verifier. Что
добавить: CBOR .mlic (ciborium, Apache-2.0 —
не проверено), проверку Ed25519 (ed25519-dalek), сбор
отпечатка (machine-uid + серийник диска/платы через
windows/IOKit//sys), аренду плавающих
лицензий. На сервере MAC ключей проверять за постоянное время
(hmac + subtle), собственный
sha256.rs оставить только для отпечатков и тестов. Сервер
лицензий (включая on-prem и плавающий режим) — свой
license-service: открытых аналогов класса 0–1 с нужной
моделью нет.
Биллинг. Свой billing-service с трейтом
PaymentProvider (уже описан в §9.2) — правильный выбор:
- мир — Stripe Billing через
async-stripe: подписки, прорация, дэнинг и налоги делает Stripe, наш сервис только зеркалит статусы вебхуков в права (§9.7); альтернатива — Paddle как продавец-посредник (решение владельца, план §12); - РФ — свои адаптеры ЮKassa и CloudPayments по
документации API: SDK ЮKassa (MIT) лежат на GitHub в архиве с 2022 и
годятся только как эталон моделей; у репозиториев CloudPayments лицензии
нет вовсе (проверено 2026-10-04). У владельца уже есть рабочие
обработчики платежа и вебхука ЮKassa (TermitPro
site/api, PHP) и Stripe (FlyTypebilling, Go) — их логику портируем на Rust (3.9). Расписание автосписаний и дэнинг §9.5 для РФ — наш планировщик (≈ 1,5–2 ч.-м.); чеки 54-ФЗ формирует провайдер; - Kill Bill (Apache-2.0) — только как образец модели подписок и состояний просрочки: JVM, своя БД и Java-плагины для ЮKassa/CloudPayments не окупаются, а акты/УПД/ЭДО, реселлеры и Education всё равно наши. Lago — AGPL, запрещён.
Экономия: async-stripe 0,7 + перенос подписочной логики
мира на Stripe Billing 2 + эталоны ЮKassa/Kill Bill 0,5 +
machine-uid 0,2 = ≈ 3,4 ч.-м.
3.3 Установщики и обновления
velopack (MIT; клон, коммит 2026-09-29, версия 1.2) закрывает большую часть модуля MOffice Update:
| Возможность | Как в velopack (по коду клона) | Что дописываем мы |
|---|---|---|
| Каналы | канал задаётся при упаковке (vpk pack --channel beta),
переключение — UpdateOptions.ExplicitChannel; в Windows
канал можно «вшить» в подпись Authenticode установщика
(windows_channel_tag.rs) |
маппинг на nightly/beta/stable/lts, ограничение
update_channel_max из политики (§8.7) |
| Дельты | zstd-патчи с базовым пакетом (commands/patch.rs), до 10
дельт подряд, затем полный пакет
(MaximumDeltasBeforeFallback) |
цель плана «≤ 15 МБ» проверить на реальных сборках Qt + Skia |
| Целостность | SHA-256 каждого пакета из фида
(verify_package_checksum) |
подпись фида Ed25519 (своя реализация трейта
UpdateSource: скачать releases.{channel}.json
+ .sig, проверить ключом из бинарника) |
| Поэтапная раскатка | staged_user_id в локаторе |
проценты раскатки и отсрочка до 30 дней для организаций — в
update-service |
| Windows | Setup.exe и Update.exe на Rust, ярлыки,
реестр, пререквизиты (VC++), MSI per-user/per-machine через форк WiX 7
(Packaging.Windows/Msi), подпись signtool / Azure Trusted
Signing |
MSIX для Store и предприятий — штатными средствами Windows SDK; там обновляет магазин или App Installer |
| macOS | .app + .pkg, codesign +
notarytool (OsxBuildTools.cs) |
проверка universal-сборки; запасной вариант — Sparkle (MIT, EdDSA, дельты) |
| Linux | только AppImage (runtime type2, MIT; squashfs через backhand, MIT/Apache) | Flatpak (Flathub) и deb/rpm обновляет сама система |
| Публикация | GitHub, Gitea, S3, Azure, HTTP, локально
(Velopack.Deployment) |
наш update-service + зеркало on-prem |
Вывод: adopt velopack для прямой загрузки на трёх ОС; MSIX/Flatpak/deb/rpm — штатные механизмы. Экономия 6–8 ч.-м. (дельта-движок, установщики, апдейтер, откат при сбое применения). Риски: подпись фида — наша; vendor-бинарники velopack (signtool — лицензия Windows SDK, zstd — BSD/GPLv2 по выбору → BSD) используются только при сборке. WiX: официальные сборки WiX ≥ 6 требуют оплаты Open Source Maintenance Fee при выручке > 10 000 USD/год, WiX 7 не работает без принятия EULA (проверено 2026-10-04); MSI из velopack собирается их форком WiX и под OSMF не попадает. Если нужен «чистый» MSI для GPO собственной сборки — оплатить спонсорство WiX (решение владельца, раздел 4). DLL пользовательских действий WiX внутри MSI — MS-RL: исходники этих файлов публичны, достаточно текста лицензии в NOTICE.
3.4 Сбои и телеметрия
Конвейер сбоев целиком на классе 1:
- В каждом процессе приложения —
crash-handler(только сигнал брокеру поinterprocess); дамп пишет брокер черезminidump-writer(вне упавшего процесса — надёжнее); Qt-сообщения и паники Rust идут вsentry-SDK. - При следующем запуске и только с согласия
(
telemetry: off | crash_only | full, §8.7) дамп уходит вtelemetry-service; пути с именем пользователя вычищаются, содержимого документов нет. - На сервере —
minidump-processor+ символы из нашего хранилища (CI генерирует.symиз PDB/dSYM/DWARF); результат как событие отправляется в GlitchTip (MIT) по протоколу Sentry: группировка, уведомления, трекер. Если пилот покажет, что встроенная обработка minidump в GlitchTip 6 работает без Sentry Symbolicator (FSL-1.1-MIT, класс 3) — можно отдать дампы ему напрямую; иначе символикация остаётся нашей. - KPI «crash-free sessions» (план 3.x) — свои события сеанса в
ClickHouse/PostgreSQL + Grafana; сервисы — OpenTelemetry. PostHog —
только как образец (FOSS-часть MIT,
ee/закрыта, тяжёлый стек); Umami (MIT) — сайт и портал.
Экономия: перехват и запись дампов 3, разбор и символикация 2, сервер
ошибок 3, SDK и OpenTelemetry 1, сайт 0,3 = ≈ 9 ч.-м.
Поправка к плану: 08-roadmap.md 1.3 («Sentry self-hosted» в
инструментах), 3.1 (риск «автогруппировка (Sentry)») и 5.4 — Sentry под
FSL (класс 3), заменить на GlitchTip.
3.5 Облачные коннекторы и код PasswordSafe
Схема для Hub (по 03-architecture.md:
сеть есть только у брокера/Hub; docs/apps/hub.md
HUB-06):
- «Открыть/Сохранить из облака», обзор папок, автономный кэш —
OpenDAL внутри брокера (Rust, Apache-2.0): сервисы
webdav(Nextcloud, ownCloud, SharePoint по WebDAV),onedrive,gdrive,dropbox,yandex-disk,s3,sftpза одним API. OAuth-вход через системный браузер + PKCE + loopback делаетmeridian-id, токены — вkeyring. - «Синхронизируемые папки» (книжки Notes в папке облака,
docs/apps/notes.md) — rclone отдельным процессом: брокер запускаетrclone rcdс доступом только по локальному адресу и паролю, управляет заданиямиsync/copyчерез rc-API, передаёт rclone наши OAuth-токены. librclone внутри процесса не берём: API помечен экспериментальным, Go-рантайм в адресном пространстве Qt-приложения, в Windows библиотеку нельзя выгрузить (проверено 2026-10-04). - Совместное редактирование файлов OneDrive «как в Office» недоступно (закрытые протоколы) — только MOffice Cloud (фаза 6).
Регистрация OAuth-клиентов (организационная задача фаз 1–2, решение 26 библии):
| Провайдер | Что нужно | Условие без лишних аудитов |
|---|---|---|
| Google Drive | проект Google Cloud, экран согласия, верификация бренда | только scope drive.file + Google Picker (страница
выбора на нашем домене, открывается в браузере) — без проверки
ограниченных scope и без ежегодного аудита CASA; полный
drive = CASA каждый год, ≈ 500–4 500 USD (проверено
2026-10-04) |
| OneDrive / SharePoint (Microsoft Graph) | приложение в Entra ID (мультиарендное + личные аккаунты),
делегированные Files.ReadWrite,
offline_access |
верификация издателя (Partner Center) — иначе во многих организациях согласие пользователя запрещено (не проверено) |
| Dropbox | приложение в App Console | заявка на production-статус после лимита пользователей в режиме разработки (не проверено) |
| Яндекс Диск | приложение на oauth.yandex.ru, права
cloud_api:disk.* |
модерация приложения (не проверено) |
| WebDAV / Nextcloud | не нужно | Nextcloud Login Flow v2 (пароль приложения); Basic-пароль только по HTTPS |
Экономия: OpenDAL 4–6 + rclone 3–4 = 7–10 ч.-м. против своих клиентов шести API (загрузка частями, повторы, лимиты, обновление токенов).
PasswordSafe → MOffice (разбор кода рабочего дерева,
2026-10-04; 15,4 тыс. строк Rust, из них 12,5 тыс. без тестов, 88
тестов). Переносится в основном проект и ≈ 2–2,5 тыс.
строк (крипто-конверт, движок синхронизации, брокер) плюс
образцы облачного API и клиппера, а не все 4,8 тыс. строк
passwordsafe-core, как сказано в
docs/11-open-source-reuse.md: большая часть ядра —
хранилище паролей на SQLite, импорт CSV, генератор, «здоровье»
паролей.
| Модуль PasswordSafe (строк без тестов) | Куда в MOffice | Что исправить при переносе | ч.-м. |
|---|---|---|---|
passwordsafe-core: crypto.rs 241,
vault/envelope.rs 187, field_cipher.rs 144,
secure_mem.rs 92, шаблон формата vault/file.rs
505 |
meridian-crypto: «Файл → Защитить паролем» для MOP,
ключ восстановления (для Business — депонирование у организации),
шифрование отдельных частей пакета с контекстом AAD |
ключ = сырой выход Argon2id → разделять через HKDF; заголовок и
версию включить в AAD данных (сейчас MAC покрывает только 82 байта
заголовка); верхние границы параметров KDF из файла (иначе DoS);
потоковое AEAD кусками по 64 КиБ для больших пакетов (сейчас весь файл
одним блоком); mlock/VirtualLock для всех
ключей на всех ОС; не держать пароль в сессии; эталонные векторы RFC
9106 / NIST GCM / RFC 5869; fsync перед
переименованием |
1,5–2 |
passwordsafe-sync: engine.rs 420,
provider.rs 121, manifest.rs 39,
local_state.rs 61 |
Hub: синхронизация файлов MOP с WebDAV/S3/«свой сервер»; модель
«манифест + rev + SHA-256», конфликт «сохранить обе
копии» |
транспорт заменить на OpenDAL (своя SigV4 без тестов, с ошибкой
host:port, продублирована в двух крейтах); условная запись
(ETag/If-Match); подписанный манифест против отката; не
записывать файл раньше манифеста; офлайн-очередь; ложные конфликты от
перешифрования с новым nonce |
1 |
passwordsafe-daemon: protocol.rs 122,
handlers.rs 543, server.rs 121,
client.rs 100 |
meridian-broker: кадры JSON, диспетчер методов, лимит
частоты |
TCP 127.0.0.1 + общий токен → локальные сокеты
interprocess с проверкой учётных данных процесса;
единственный экземпляр; служба автозапуска; версия протокола и лимит
длины кадра; фоновые таймеры вместо «ленивой» блокировки; Argon2 вне
потоков tokio |
0,5 |
passwordsafe-cloud: auth.rs 70,
state.rs 1 037, routes.rs 514,
store.rs 449 |
id-service / cloud-service: токен на
устройство (хранится SHA-256, ротация, список, отзыв), миграции
PostgreSQL с advisory lock, запись манифеста по
If-Match: "rev-N" |
ключи устройств/DPoP (сейчас голый bearer без срока), лимиты на вход
и регистрацию, TLS к PostgreSQL, асинхронный драйвер (sqlx)
вместо блокирующего в async |
1 |
passwordsafe-ui/src-tauri: secret_store.rs
266, biometric/* ≈ 330 |
SecretStore в meridian-id; разблокировка
защищённых документов по Touch ID/Windows Hello (P2) |
secret_store.rs не в git; в Linux —
открытый JSON → Secret Service через keyring; Windows Hello
сейчас лишь диалог согласия, ключ к нему криптографически не
привязан |
0,3 |
browser-extension (MV3) +
natmsg-proxy |
Notes: веб-клиппер (план 3.1, Notes P1) через native messaging → брокер | список разрешённых методов в хосте, лимит размера сообщения | 0,5–1 |
totp.rs, passwordsafe-autotype |
— | TOTP брать из totp-rs (своя реализация игнорирует
SHA-256/512); автоввод офису не нужен |
0 |
Итого по PasswordSafe ≈ 5–6 ч.-м. (учтено в 3.9). Перед переносом: закоммитить рабочее дерево (≈ 27 % Rust-кода, включая весь облачный сервер, нет в истории git) и добавить файл LICENSE — см. юридическое замечание в 3.9.
3.6 Целые офисные пакеты и модели документов
Apache OpenOffice (Apache-2.0, класс 1) — единственный полный офисный пакет, код которого можно и читать, и переносить в закрытый продукт. Проект жив, но медленный: 4.1.16 вышел 2025-11-10, 4.2.0 обещан «в 2026» (проверено 2026-10-04). Что реально стоит портировать на Rust (с уведомлением «основано на Apache OpenOffice, Apache-2.0» и записью в NOTICE):
| Источник в AOO | Что берём | Куда в MOffice | ч.-м. |
|---|---|---|---|
sw/source/filter/ww8/* |
чтение и запись Word 97–2003: поля, таблицы, стили, исправления, колонтитулы — заметно полнее HWPF из Apache POI | codecs/msbinary (.doc), дополняет порт POI |
2–3 |
sc/source/filter/excel/*,
sc/source/core/tool/interpr*.cxx,
scaddins/source/analysis/* |
разбор формул BIFF8; численно выверенные функции (финансы, распределения, XIRR, купонные, Бессель) | meridian-calc: функции, которых нет в IronCalc |
1–1,5 |
sd/xml/effects.xml, transitions.xml (не
проверено по клону) |
пресеты анимаций и переходов как данные | Slides: библиотека эффектов | 0,5 |
starmath/source/parse.cxx |
синтаксис StarMath ({a} over {b}) |
импорт формул ODF с аннотацией StarMath в MOffice Math | 0,5 |
svx/source/customshapes/* |
вычисление draw:enhanced-geometry (формулы фигур
ODF) |
meridian-scene: импорт фигур ODF |
0,5 |
xmloff/* |
полнота покрытия элементов ODF | ref для codecs/odf |
— |
Цена старого C++: модель UNO и VCL, сборка dmake/gbuild, в OOXML AOO умеет только читать (экспорта docx/xlsx нет), Windows-сборки 4.1.x 32-битные (не проверено). Порт алгоритма ≈ 30–50 % стоимости написания с нуля, но даёт выверенные граничные случаи. Итого 4–7 ч.-м. экономии; форк целиком — сценарий Б (3.10), не рекомендуется.
LibreOffice — новые файлы под MPL-2.0, унаследованные — LGPLv3+, часть — GPL; по политике это «чистая комната»: код не читаем, тестовые документы (не код тестов) — только в корпус. OnlyOffice (AGPL), Calligra, AbiWord, Gnumeric (GPL) — запрет.
Модели документа — источник идей транзакций (MIT/BSD, только ref):
- ProseMirror: шаг (
ReplaceStep,AddMarkStep) + карта позиций (StepMap,Mapping) — позиции курсоров, комментариев и undo переносятся через чужие правки; срез с «открытой глубиной» (Slice) — вставка фрагментов с незакрытыми абзацами. Это прямо ложится на CRDT-совместимый журналtext-model(решение 18 библии). - Lexical: стабильные ключи узлов и двухфазное обновление «черновик → фиксация» — удобно для моста с Yrs и для QML-вида.
- Slate: минимальный набор операций над деревом
(
insert/remove/split/merge/move/set_node,insert/remove_text) + нормализация — эталон закрытого набора операций для записи макросов. - Quill Delta и Easysync (Etherpad, Apache-2.0): компактные форматы
правок с пулом атрибутов — для
history/в MOP и буфера обмена. - Univer (Apache-2.0): разделение «команда (намерение) → мутация (сохраняемая, синхронизируемая) → операция (состояние вида)» — та же граница нужна recorder'у MOffice Script, CRDT и undo. Grist (Apache-2.0): формулы по столбцам и правила доступа по строкам — образец для Base и Forms.
Экономия на идеях — проектирование, а не код: ≈ 1,5 ч.-м. (меньше переделок модели правок в фазах 1 и 6).
3.7 Оболочка: лента, докинг, QML
- SARibbon (MIT) написан на Qt Widgets (≈ 35 тыс.
строк, QML нет), а библия и план (E0.4, M0.5) требуют QML-ленту с тремя
режимами плотности.
QWidgetнельзя поместить в QML-окно, поэтому стратегия — port, не fork: переносим в C++-модель ленты для QML (QAbstractItemModel+ свойQQuickItem-раскладчик) алгоритмыSARibbonPanelLayout(колонки по три строки, адаптивное сворачивание крупных кнопок в средние, затем в значки, затем всей группы в одну кнопку-меню),SARibbonCategoryLayout(размещение и прокрутка групп), модель пользовательской настройкиSARibbonCustomizeData(сериализация скрытых/добавленных вкладок, групп и команд), реестр командSARibbonActionsManager(он же источник для командной палитры), контекстные вкладки и галереи. Экономия 3–4 ч.-м. против ленты с нуля (≈ 6–8 ч.-м.). Если спайк M0.2 покажет, что оболочку выгоднее делать на Widgets с холстом вQQuickWidget/QRhiWidget, SARibbon становится fork «как есть» (экономия ≈ 6 ч.-м.), но это пересмотр решения библии — только с владельцем. - Докинг: Qt-ADS — LGPL и только Widgets → ref;
KDDockWidgets поддерживает QtQuick, но GPL/коммерческая. Свой докинг на
QML (
SplitView, вкладки панелей, плавающие окна как отдельныеQQuickWindow, оверлей «куда пристыковать», сохранение раскладки в JSON) — ≈ 3–4 ч.-м., заимствований нет. - Безрамочное окно (заголовок 36 px по MDS): FluentUI для QML (MIT) — образец; кандидат на adopt — QWindowKit (Apache-2.0, поддерживает и Widgets, и Qt Quick, включая Snap Layouts Windows 11 — не проверено). Экономия ≈ 1 ч.-м.
- Иконки MOffice Glyphs (план: 60 к M0.5 → ≈ 900–1 000 к 4.0, один дизайнер иконок): основа — Lucide (ISC) для общих глифов + Tabler (MIT) для офисных метафор; оба — сетка 24, линия 2 px, скруглённые концы, т.е. совместимы. Перерисовка под сетку MDS (16/20/24/32 px, цветные варианты крупных кнопок ленты) с сохранением уведомлений ISC/MIT в NOTICE. Fluent System Icons и Material Symbols — только образцы метафор: их стиль узнаётся как Microsoft/Google. Экономия 6–8 ч.-м. дизайнера (≈ половина из 900 глифов — общие: стрелки, файлы, правка, выравнивание).
3.8 Справка и тестовые корпуса
Справка. Рекомендация — Sphinx
(BSD-3) с Markdown-источниками: один источник даёт сайт документации,
офлайн-справку Qt Help (встроенный сборщик qthelp →
qhelpgenerator → .qch для F1 по контексту,
план 7.2), PDF и переводы через gettext (.po → Weblate, тот
же процесс, что и для интерфейса). mdBook (MPL-2.0) допустим как
инструмент только со своей темой: стандартная тема копируется в
результат и принесла бы файлы MPL в установщик; встроенного вывода Qt
Help и зрелого i18n у него нет. MkDocs (BSD-2) — активность низкая.
Поиск по справке в приложении — tantivy (уже в карте компонентов).
Экономия на инструментах ≈ 1 ч.-м.; содержание (105 ч.-м. писателей) от
выбора не зависит, кроме каталога функций AXEL (3.9).
Корпуса (план 5.1: К1 1 000 → К5 60 000+ файлов, хранение вне продукта — политика §6):
- GovDocs1 (общественное достояние, ≈ 1 млн файлов) — объём doc/xls/ppt/pdf и фаззинг;
- тестовые файлы Apache POI (Apache-2.0) — граничные и зашифрованные бинарные документы;
- тестовые документы LibreOffice (MPL-2.0) — только файлы, без кода тестов (чистая комната);
- DocBank (Apache-2.0), PubLayNet и DocLayNet (CDLA-Permissive) — эталоны раскладки страниц для метрик PDF → Write; для обучения моделей нужна отдельная юридическая проверка: исходные статьи arXiv/PMC под своими лицензиями;
- в плане К4 упомянуты наборы Ghostscript: тесты Ghostscript (AGPL-проект) допустимы только для внутренних прогонов без распространения — лучше заменить наборами pdf.js (Apache-2.0) и собственными «ломаными» PDF.
3.9 Собственный код владельца
Разбор только на чтение (2026-10-04): PasswordSafe, ScreenPrompt,
FlyType, voice-agent, TermitPro/TermitProCore — локальные клоны;
Formulник/AXEL — ~/AXEL (292 коммита) и развёрнутая копия
root@sagr:/opt/projects/axel (без git). Qt/QML-кода нет ни
в одном проекте; Rust — ≈ 15 тыс. строк в PasswordSafe и ≈ 9,5 тыс. в
FlyType/ScreenPrompt; остальное — Go, Swift, Python, C#, TS, т.е.
перенос = порт логики на Rust или вынос во внешний процесс-помощник.
| Модуль владельца (язык, строк) | Модуль MOffice | Как | ч.-м. |
|---|---|---|---|
| PasswordSafe — крипто-конверт, синхронизация, брокер, облачный API, хранилище секретов, клиппер (Rust; см. 3.5) | meridian-crypto, Hub-синхронизация,
meridian-broker,
id-service/cloud-service, Notes-клиппер |
fork с исправлениями из 3.5 | 5–6 |
ScreenPrompt native/windows/src (Rust
2,4 тыс.: capture.rs 711 — Windows Graphics Capture через
windows-capture (MIT) и системный кодер;
audio.rs 498 — WASAPI loopback + микрофон;
policy.rs, protocol.rs,
mux_plan.rs, timing.rs) |
meridian-capture (Windows): Paint → «Снимок», Slides →
«Запись экрана», Notes → вырезка |
fork | 2–3 |
ScreenPrompt native/macos (Swift ≈ 1,4 тыс.:
ScreenCaptureKit, системный звук и микрофон раздельно, H.264 через
AVAssetWriter — платформенный кодер, как требует библия) |
помощник захвата macOS (Swift-процесс или порт на
objc2) |
fork / port | 1–1,5 |
ScreenPrompt capture/linux_portal.py 548 (XDG
ScreenCast + PipeWire) и NDJSON-протокол помощников с версией и
рукопожатием |
захват в Linux (порт на Rust через ashpd), протокол
всех внешних помощников (кодек-хост, захват) |
port | 0,5 |
FlyType crates/ (Rust 2,5 тыс.:
flytype-core — правила «полировки», пунктуация по паузам,
фильтры эха и галлюцинаций STT, трейт движка и маршрутизатор
облако/локально; flytype-ffi — C ABI;
flytype-protocol — WS-диктовка) |
«Диктовка» в Write/Notes/Mail (см. также
oss-pim-collab-script.md 3.6) |
adopt как крейты | 1–1,5 |
FlyType backend/internal/auth (Go 8,3 тыс.: e-mail и
пароль, ссылка-вход, OAuth Google/Яндекс, SSO, passkeys на go-webauthn,
TOTP, вход с устройства, refresh, JWKS) |
id-service — проверенные потоки и модель данных;
проверка passkeys портом логики go-webauthn (BSD-3-Clause — по отчёту
зависимостей FlyType) вместо webauthn-rs (MPL) |
port на Rust | 3–5 |
FlyType billing (Stripe) 627,
clientreleases 552, telemetry 562,
objstore 509 (Go) |
billing-service, update-service
(манифесты), telemetry-service, S3-слой
cloud-service |
port | 1–2 |
FlyType mind/extract (Go 4,3 тыс., без внешних утилит:
docx, xlsx, pptx, odt, pdf, epub, fb2, mobi, djvu, msg) |
индексатор Hub (tantivy) и импорт epub/fb2/mobi в Write | port | 1,5–2 |
FlyType клиенты: LoopbackAuthServer.cs,
TokenStore.cs (DPAPI), AuthTokenStorage.swift
(Keychain), DeviceLoginService, Notes на SwiftUI (20,7
тыс.) |
meridian-id (вход через loopback), образец UX
Notes |
ref | 0,5–1 |
| voice-agent (Python 11 тыс.: рантайм агента, MCP-сервер, хранилище сеансов SQLite, инструменты) | MOffice Assist (фаза 7) — образцы | ref | 0,5–1 |
TermitPro / TermitProCore (Swift, Python, PHP):
LocalToolWorker.swift и FileSystemGuard.swift
(белый список, защита от traversal/symlink), компакция контекста,
CommandPalette.swift; site/api — проверка
лицензии, Stripe и ЮKassa (платёж + вебхук, PHP);
secret_redaction.py, CrashReporter.swift |
Assist и песочница Script; командная палитра; адаптер ЮKassa; очистка отчётов о сбоях | ref / port логики | 1,5–3 |
AXEL engine/formula (Python:
tokenizer.py 332, translate.py 342,
dictionary.py 81 + словарь функций RU↔︎EN,
diagnose.py 413, catalog.py 429,
execvote.py 614) |
Sheets: русские имена функций и перевод формул RU↔︎EN (разделители
;), «Почему формула не работает», описания функций для
мастера и справки; Assist «формула по описанию» с проверкой
исполнением |
port + данные | 3–4,5 |
AXEL engine/xlsx (audit.py 329,
diff.py, tools.py 478, patcher.py
729, шаблоны ≈ 1 тыс.) |
Sheets: «Проверить книгу», «Сравнить книги», шаблоны учёта; идея точечной правки OOXML без пересохранения | port / ref | 1,5–2 |
AXEL engine/docx (merge.py 280,
review.py 361, forms.py 180,
documents.py 764, money.py — сумма прописью и
НДС, requisites.py — проверка ИНН/КПП/ОГРН) |
Write: рассылки (слияние с таблицей), запись исправлений, элементы управления содержимым, российские шаблоны и функции | port | 1,5–2 |
AXEL engine/pdf + xlsx/fromgrid.py,
сервисы OCR (RapidOCR + PP-OCRv5, Apache-2.0) и голоса (onnx-asr +
GigaAM-v3, MIT) |
PDF → Sheets (таблицы счетов с проверкой сумм), «фото таблицы → Sheets»; офлайн-распознавание русской речи для «Диктовки» | port | 1–1,5 |
AXEL engine/vba/analyzer.py,
data/ru_calendar.py |
анализ опасных вызовов при импорте макросов VBA; производственный календарь РФ для функций рабочих дней | port | 0,5 |
Итого код владельца: ≈ 24–37 ч.-м. Не переносить ни
при каком варианте: запись через ffmpeg с libx264 и
GPL-библиотеки в бандле ScreenPrompt; веса Silero TE (CC BY-NC-SA,
пунктуация FlyType); poppler, ffmpeg-GPL и LibreOffice из
Docker-помощников FlyType; edge-tts (LGPL-3.0) и неофициальные Google
Web Speech / Edge TTS (voice-agent, TermitPro); копию Apple mlx-examples
в TermitPro/backend/mlx_sd (не нужна); некоммерческие
модели FLUX.1-dev и sdxl-turbo.
Юридическое замечание (не заключение юриста).
Владелец как автор вправе включить свой код в закрытый MOffice под EULA,
даже если раньше опубликовал его под MIT: MIT — неисключительная
лицензия другим лицам, она не ограничивает самого правообладателя (но
уже опубликованные версии остаются доступными всем на условиях MIT).
Проверка соавторства по git shortlog -sn --all:
| Проект | Коммиты и авторы | LICENSE | Что сделать до переноса |
|---|---|---|---|
| PasswordSafe | 15, один автор (Alexey Oros), 2026-07-13 … 07-16 | нет файла; license = "MIT" в Cargo.toml |
закоммитить ≈ 27 % Rust-кода (облачный сервер,
secret_store.rs); фрагмент из
security-framework (MIT/Apache) в
biometric/store/macos.rs — сохранить уведомление |
| ScreenPrompt | 70: Linx 59, Alexey Oros 8, анонимная учётка «ScreenPrompt contributors» 3; вложенный репозиторий — ещё 18 (в т.ч. «Sites Publisher») | MIT, «ScreenPrompt contributors» | подтвердить, что анонимные учётки — инструменты владельца; закоммитить 68 + 94 файла |
| FlyType | 2 040: Alexey Oros 2 039, Linx 1; трейлеры Co-authored-by: Cursor 1 735, Claude 150, Codex 1 | MIT, «FlyType»; при этом EULA Windows-установщика — «All rights reserved» | устранить противоречие лицензий; около 6,4 тыс. незафиксированных изменений |
| voice-agent | 49: Linx 46, Alexey Oros 3 | нет | — (код владельца, «все права защищены») |
| TermitPro / TermitProCore | 443: Alexey Oros 420, Linx 23 (Cursor — 91 трейлер) / 4 (Linx); вложенный TermitProPrototype — 23 коммита «Codex Sites» | MIT, «TermitPro contributors» / нет | не переносить mlx_sd (Apple, MIT) и чужие «skills» из
незатреканных папок |
| AXEL | 292, Linx; трейлеры Co-Authored-By: Claude — 224 | нет | — |
Выводы для юриста: (1) все человеческие коммиты — от учётных записей владельца (Alexey Oros, Linx/Linx72), сторонних людей-соавторов не найдено; (2) правообладатель в LICENSE указан условной меткой («… contributors», «FlyType») — нужен короткий документ владельца о принадлежности исключительного права и его передаче юрлицу MOffice со списком репозиториев; (3) ИИ-инструменты (Cursor, Claude, Codex) не являются правообладателями, условия их сервисов оставляют права на результат пользователю, но охраноспособность сгенерированного кода в разных юрисдикциях ограничена — это не мешает использованию, но ослабляет защиту от копирования, поэтому код MOffice держим закрытым (коммерческая тайна) и сохраняем человеческие проектные документы и ревью.
3.10 Стратегия: сценарии А, Б, В
База — 2 660 ч.-м., 48 месяцев, релизы 1.0 (2027-12-14) … 4.0
(2030-12-10) по 08-roadmap.md. База уже предполагает
платформенные библиотеки библии (Qt, Skia, HarfBuzz/rustybuzz, pdfium
как временный рендер, SQLite, Yrs, QuickJS), поэтому экономия ниже
считается против «пишем остальное сами». Цифры по чужим областям взяты
из итогов соседних отчётов (oss-formats-sheets-data.md,
oss-text-render-lingo-math.md,
oss-graphics-pdf-charts.md,
oss-pim-collab-script.md, сверено 2026-10-04); пересечения
(лента — 1,5–2 ч.-м. в отчёте по тексту, FlyType/voice-agent — в отчёте
PIM) вычтены.
| А. Всё своё + точечные библиотеки | Б. Форк Apache OpenOffice как ядра | В. Гибрид: Rust-ядро + форки и порты классов 0–1 | |
|---|---|---|---|
| Суть | план как есть: свои модели, раскладка, движок формул, кодеки; библиотеки только уровня Skia/Qt/pdfium | берём AOO (Writer/Calc/Impress/Draw/Math/Base) целиком, меняем оболочку на ленту, добавляем облако и лицензирование | своё ядро на Rust; fork IronCalc → meridian-calc; порт
POI/AOO-фильтров, formulajs/Univer, SSF, jackcess, Pinta; adopt pdfium,
libmypaint, Stalwart mail-*, velopack, GlitchTip, OpenDAL/rclone;
перенос кода владельца |
| Трудоёмкость | 2 660 ч.-м. | 2 800–3 300 ч.-м.: Qt-бэкенд VCL (≈ 15–25 ч.-м.), экспорт OOXML с нуля (в AOO его нет), 64-бит/arm64, укрепление C++-парсеров, CRDT поверх модели UNO — фактически переписывание ядра к фазе 6 | ≈ 2 380–2 460 ч.-м. (экономия 230–305, минус ≈ 2–3 на пересечения и ≈ 25 на интеграцию, сопровождение форков и NOTICE/SBOM) |
| Экономия по областям, ч.-м. | — | — | форматы, Sheets, данные 44–58 · текст, рендер, правописание, формулы 25–40 · графика, PDF, диаграммы 45–65 · PIM, CRDT, скрипты ≈ 40 · платформа и сервисы (этот отчёт) 52–65 · код владельца 24–37 |
| Первый релиз | 1.0 «Write» 2027-12-14 | «весь пакет» раньше (≈ 2027-09), но с точностью docx ниже цели 85 % и без экспорта OOXML | 1.0 — без изменений (критический путь — раскладка текста и docx) |
| Риски | наибольший объём, найм | старый C++ без безопасности памяти, мало специалистов по коду OOo, невозможность WASM и CRDT без переписывания, продукт «ещё один OpenOffice» | расхождение форка IronCalc с апстримом, качество портов (тесты на эталонных файлах), дисциплина атрибуции |
| Лицензионная чистота | максимальная | Apache-2.0 — допустимо, но огромный NOTICE и чужая архитектура | всё классов 0–1 (класс 2 — только инструменты сборки и данные корпуса) — продукт целиком под EULA |
Рекомендация — сценарий В. Он сохраняет архитектуру библии и даёт ≈ 7,5–10,5 % экономии (≈ 0,8–1,1 млн USD ФОТ по ставкам РФ или 2,2–3,1 млн USD по международным). Экономия сосредоточена в фазах 2, 4, 5, 6 (готовые движок формул, кисти, PDF, почта, CRDT, сервисы), поэтому даты меняются так:
| Релиз | План | В, агрессивно (люди те же) | В, рекомендовано |
|---|---|---|---|
| 1.0 «Write» | 2027-12-14 | 2027-12-14 | 2027-12-14 |
| 1.5 «Sheets» | 2028-04-18 | 2028-03-21 (−4 нед.: движок и xlsx уже есть) | 2028-04-18 |
| 2.0 «Slides+Draw» | 2028-10-17 | 2028-09-19 (−4 нед.) | 2028-10-17 |
| 2.5 «Paint+PDF+Math» | 2029-02-13 | 2029-02-13 (заморозка кода попала бы на 1–10 января; выигрыш уходит в 2.6) | 2029-02-13 |
| 3.0 «Notes/Mail/Base/Forms» | 2029-10-16 | 2029-09-18 (−4 нед.) | 2029-10-16 |
| 3.5 «Cloud» | 2030-04-16 | 2030-03-19 (−4 нед.) | 2030-04-16 |
| 4.0 «Экосистема» | 2030-12-10 | 2030-11-12 (−4 нед.) | 2030-12-10 |
Рекомендовано не сдвигать публичные даты, а обратить экономию в буфер рисков (пессимистичный сценарий плана 3 300 ч.-м. → ≈ 3 000) и снизить пик численности с 73 до ≈ 67 FTE в H5–H6. Сдвиг «агрессивного» варианта — только после gate фазы 2, когда форк IronCalc подтвердит точность формул ≥ 99,5 % на корпусе К3.
4. Класс 2 — решения владельца
| Компонент | Лицензия | Зачем | Как связан с продуктом | Альтернатива класса 0–1 | Рекомендация |
|---|---|---|---|---|---|
| webauthn-rs 0.5.5 | MPL-2.0 | серверная проверка passkeys в id-service |
крейт без правок, статически в сервисе (не в десктопе) | порт проверки из go-webauthn (BSD-3, уже в бэкенде FlyType) на
passkey-types + coset + p256 (≈ 1
ч.-м.) |
по умолчанию не нужен — замена класса 1 есть;
одобрить исключение в deny.toml только если порт не пройдёт
аудит к L1.2 |
| WiX ≥ 6 (официальные сборки) | MS-RL + EULA OSMF | MSI для GPO | инструмент; DLL пользовательских действий внутри MSI | MSI из velopack (их форк WiX, OSMF не применяется) | использовать velopack; если нужен отдельный MSI — оплатить OSMF (спонсорство WiX) |
| flatpak-builder, rcodesign (apple-platform-rs), mdBook | LGPL-2.1 / MPL-2.0 / MPL-2.0 | сборка Flatpak, подпись macOS с Linux, справка | только инструменты CI | codesign + notarytool на macOS; Sphinx
(BSD-3) |
закрепить в политике правило «инструменты, не попадающие в продукт, — без решения»; mdBook — только со своей темой |
| Тестовые документы LibreOffice | MPL-2.0 | корпус регрессий | только вне продукта (LFS корпуса) | GovDocs1, Apache POI | одобрить как данные корпуса, код тестов не читать |
| Logto (если владелец захочет готовый CIAM вместо своего) | MPL-2.0 | аккаунты, организации, enterprise SSO | отдельный сервис | свой id-service + Ory Polis; Keycloak (Apache-2.0) |
не требуется при рекомендации 3.1 |
| Qt-ADS, Breeze | LGPL-2.1 | докинг, иконки | — | свой QML-докинг; Lucide/Tabler | не брать — решение не нужно |
| Qt 6 и модуль QtHelp | LGPL-3.0 / коммерческая | оболочка, офлайн-справка | динамическая линковка | — | решение библии (раздел 4) и отчёта
oss-text-render-lingo-math.md |
5. Запрещено и замены
| Запрещено (класс 3) | Почему | Замена |
|---|---|---|
| keygen-api | FCL-1.0-ALv2 — source-available, запрет конкурирующего использования | свой license-service + meridian-license;
идеи — из публичной документации |
Zitadel; Authentik (enterprise/, CC-BY-SA-части) |
AGPL-3.0; смешанная с закрытой частью | свой id-service + Ory Polis; Keycloak — план Б |
Ory Enterprise License, SuperTokens ee/, PostHog
ee/ |
коммерческие/закрытые каталоги внутри открытых проектов | не подключать эти каталоги; брать только Apache/MIT-части |
| Lago | AGPL-3.0 | свой billing-service + Stripe Billing; Kill Bill как
образец |
| Sentry (сервер), Sentry Symbolicator | FSL-1.1 / FSL-1.1-MIT | GlitchTip (MIT) + rust-minidump; SDK sentry (MIT)
можно |
| Bugsink | PolyForm-Noncommercial | GlitchTip |
| LibreOffice (GPL/LGPL-части), OnlyOffice, Calligra, AbiWord, Gnumeric, CKEditor 5 | GPL/AGPL | порт выборочно из Apache OpenOffice, свой код, чистая комната |
| KDDockWidgets, PyQt-Fluent-Widgets | GPL | свой QML-докинг; FluentUI (MIT) как образец |
| Papirus; RemixIcon (своя лицензия 2026, не OSI) | GPL-3.0; неясные условия | Lucide + Tabler |
| GPL/AGPL-крейты в репозитории zed | GPL-3.0 / AGPL-3.0 | только крейты под Apache-2.0 и только как образец |
| SDK CloudPayments | без лицензии = все права защищены | свой адаптер по документации API |
| Тесты Ghostscript в корпусе К4 | AGPL-проект | корпус pdf.js (Apache-2.0), свои «ломаные» PDF |
6. Что переносим кодом
| Источник (файлы) | Лицензия | Куда в MOffice | Способ | Обязательство |
|---|---|---|---|---|
SARibbon src/SARibbonBar/SARibbonPanelLayout.*,
SARibbonCategoryLayout.*,
SARibbonCustomizeData.*,
SARibbonActionsManager.*,
SARibbonGallery* |
MIT (© 2020 czyt1988) | shell/src/ribbon/ (C++-модель + QML) |
port | заголовок «основано на SARibbon (MIT)», текст MIT в NOTICE |
velopack: крейт velopack, CLI vpk |
MIT (© 2021 Caelan Sayler, © 2024 Velopack Ltd.) | kernel/crates/meridian-update (зависимость), CI |
adopt | MIT в «О программе» |
Apache OpenOffice: sw/source/filter/ww8/*,
sc/source/core/tool/interpr*.cxx,
scaddins/source/analysis/*,
starmath/source/parse.cxx,
svx/source/customshapes/*,
sd/xml/effects.xml |
Apache-2.0 | codecs/msbinary, meridian-calc,
meridian-math, meridian-scene, пресеты
Slides |
port | заголовок «Portions derived from Apache OpenOffice»; перенести содержимое NOTICE AOO в наш NOTICE |
| Lucide, Tabler (SVG) | ISC / MIT | assets/glyphs/ (MOffice Glyphs) |
fork с перерисовкой | уведомления ISC и MIT в NOTICE |
| crash-handler, minidump-writer, rust-minidump; sentry (SDK) | MIT / MIT-Apache | meridian-broker, telemetry-service |
adopt | «О программе» |
| GlitchTip; Ory Polis | MIT; Apache-2.0 | серверные контейнеры; профиль sso on-prem |
adopt | NOTICE в on-prem комплекте |
| OpenDAL; rclone (бинарник) | Apache-2.0; MIT + лицензии Go-зависимостей | meridian-broker (облака); процесс рядом с брокером |
adopt | NOTICE + отчёт go-licenses для rclone |
| go-webauthn (логика проверки) | BSD-3-Clause (проверить) | services/id-service/src/webauthn/ |
port | заголовок и текст BSD-3 в NOTICE |
| SDK ЮKassa (модели запросов) | MIT | services/billing-service/src/providers/yookassa.rs |
port отдельных моделей | заголовок MIT |
PasswordSafe crypto.rs, vault/envelope.rs,
field_cipher.rs, secure_mem.rs,
vault/file.rs |
★ (владелец) | kernel/crates/meridian-crypto |
fork с исправлениями 3.5 | сохранить уведомление security-framework (MIT/Apache)
для biometric/store/macos.rs, если он переносится |
PasswordSafe
passwordsafe-sync/src/{engine,provider,manifest,local_state}.rs;
passwordsafe-daemon/src/{protocol,handlers,server}.rs;
passwordsafe-cloud/src/{auth,state,routes}.rs;
browser-extension/, natmsg-proxy/ |
★ | Hub-синхронизация, meridian-broker,
id-service/cloud-service, клиппер Notes |
fork / port | — |
ScreenPrompt native/windows/src/*,
native/macos/Sources/ScreenPromptCapture/* |
★ (MIT владельца) | kernel/crates/meridian-capture, помощник захвата
macOS |
fork | зависимость windows-capture (MIT) — в «О
программе» |
FlyType crates/flytype-core, flytype-ffi,
flytype-protocol |
★ (MIT владельца) | kernel/crates/meridian-dictation |
adopt | — |
FlyType
backend/internal/{auth,billing,clientreleases,telemetry,objstore},
mind/extract (Go) |
★ | id-service, billing-service,
update-service, telemetry-service, индексатор
Hub |
port | зависимости Go (go-webauthn, stripe-go) — по их лицензиям |
AXEL engine/formula/*,
engine/xlsx/{audit,diff,tools}.py,
engine/docx/{merge,review,forms,money,requisites}.py,
engine/pdf/*, engine/vba/analyzer.py,
data/ru_calendar.py + словарь функций RU↔︎EN |
★ | meridian-calc (локализация, диагностика),
Sheets-инструменты, Write-рассылки, PDF → Sheets, Script |
port + данные | — |
TermitPro site/api (ЮKassa, Stripe, проверка лицензии),
TermitProCore/Sources/TermitProCore/{LocalToolWorker,FileSystemGuard}.swift |
★ | billing-service, песочница Script/Assist |
port логики | — |
Корпуса: GovDocs1, Apache POI test-data, DocBank,
PubLayNet, DocLayNet, документы LibreOffice */qa/* |
PD / Apache-2.0 / CDLA-Permissive / MPL-2.0 | corpus/ (LFS, вне продукта) |
данные | реестр источников корпуса (план 5.1) |
7. Предложения в библию и план
| № | Документ, раздел | Предложение |
|---|---|---|
| 1 | 12-license-policy.md §5–6 |
Явное правило: инструменты сборки и CI, не попадающие в установщик и сервисы (WiX, flatpak-builder, rcodesign, mdBook, компиляторы), допустимы в классах 0–2 без отдельного решения; но всё, что инструмент копирует в результат (тема mdBook, DLL пользовательских действий WiX), оценивается как часть продукта |
| 2 | 12-license-policy.md §2 |
FSL/FCL («fair source») — класс 3 даже для версий старше 2 лет, ставших MIT/Apache: правило проще, чем учёт дат по каждой версии |
| 3 | oss-verified.tsv |
keygen-sh/keygen-api → FCL-1.0-ALv2, класс 3; google/breakpad →
BSD-3-Clause, класс 1; supertokens-core, posthog → пометка
«ee/ закрыт»; добавить ory/polis, apache/opendal
(Apache-2.0), go-webauthn/webauthn (BSD-3, проверить),
1Password/passkey-rs (только клиент); крейт dirs → пометка
«транзитивно MPL option-ext» |
| 4 | component-map.md |
MOffice ID: «свой id-service (порт auth FlyType) + Ory
Polis (SAML/SCIM) + порт проверки go-webauthn (BSD-3); Keycloak — эталон
в CI и план Б»; лента: SARibbon — port, не fork;
облака: «OpenDAL в брокере + rclone отдельным процессом»; сбои:
«GlitchTip без Sentry Symbolicator»; обновления: «velopack + подпись
фида Ed25519»; лицензии: keygen запрещён |
| 5 | 00-foundation.md §4 «Установка» |
«автообновление — свой модуль» → «MOffice Update = velopack (MIT) + наша подпись фида Ed25519 и политики; MSIX/Flatpak/deb/rpm — штатные механизмы; MSI — из velopack или WiX ≥ 6 с оплатой OSMF» |
| 6 | 00-foundation.md §9.4,
10-licensing-accounts.md §10.1, §10.9 |
telemetry-service = свой приёмник minidump + GlitchTip;
контейнер polis (фаза 6) и профиль sso в
on-prem compose |
| 7 | 10-licensing-accounts.md §8.3 |
заголовок X-Meridian-Device-Proof заменить на DPoP (RFC
9449) с тем же ключом Ed25519 устройства |
| 8 | 10-licensing-accounts.md §8.2,
08-roadmap.md E0.7 |
id-service начинать с порта
backend/internal/auth FlyType (Go → Rust); passkeys — порт
проверки go-webauthn (BSD-3) на passkey-types +
coset, webauthn-rs (MPL) — только запасной вариант;
программный аутентификатор passkey-rs — в интеграционные тесты |
| 9 | 08-roadmap.md 1.3, 3.1 (риск «автогруппировка
(Sentry)»), 5.4 |
«Sentry self-hosted» → GlitchTip (Sentry — FSL, класс 3) |
| 10 | 08-roadmap.md E1.12 |
«MSI (WiX 4)» → «MSI из velopack (или WiX ≥ 6 + OSMF)»; в статьях бюджета — строка OSMF, если выбран официальный WiX |
| 11 | 08-roadmap.md 5.1 (К4) |
«наборы Ghostscript» → «наборы pdf.js (Apache-2.0) и свои «ломаные» PDF»; для обучения моделей на DocBank/PubLayNet — юридическая проверка |
| 12 | 03-architecture.md (облака),
docs/apps/hub.md |
OneDrive/Google Drive/Яндекс Диск/Dropbox — через OpenDAL; Google —
только drive.file + Picker (без CASA); синхронизируемые
папки — rclone rcd под управлением брокера |
| 13 | 08-roadmap.md 7.2 |
инструмент справки — Sphinx (BSD-3): сайт + .qch для Qt
Help + PDF + gettext/Weblate из одного источника |
| 14 | 08-roadmap.md E0.4/M0.5 |
лента на QML с портом алгоритмов SARibbon; безрамочное окно — оценить QWindowKit (Apache-2.0) в спайке M0.2 |
| 15 | 08-roadmap.md 1.3 |
при сценарии В: публичные даты не менять, пессимистичный сценарий 3 300 → ≈ 3 000 ч.-м., пик 73 → ≈ 67 FTE; пересмотр дат — после gate фазы 2 |
| 16 | docs/11-open-source-reuse.md §4 |
PasswordSafe: переносится проект и ≈ 2–2,5 тыс. строк (крипто-конверт, движок синхронизации, шаблоны брокера и облачного API), а не 4,8 тыс. строк ядра целиком; добавить AXEL-модули из 3.9 |
8. Непроверенное
Проверено вручную 2026-10-04 (≈ 23 веб-запроса; авторство — по
локальным git-клонам): лицензии keygen-api (FCL), glitchtip-backend
(MIT), PostHog (ee/), SuperTokens (ee/,
платные функции), Ory Polis (Apache-2.0), Sentry Symbolicator
(FSL-1.1-MIT), Inno Setup, SDK ЮKassa и CloudPayments (GitHub API),
OpenDAL (core/Cargo.toml); функции passkey-rs, Casdoor,
librclone; SCIM/организации/passkeys в Keycloak 26.7–26.8; B2B-функции
Ory; EULA OSMF у WiX; CASA у Google; статус Apache OpenOffice; лицензия
DocBank.
Требует проверки до решений:
- Обработка minidump в GlitchTip 6 — пилот: работает ли без Sentry Symbolicator (FSL); если нет — свой символикатор на rust-minidump.
- Поддержка DPoP (RFC 9449) в Keycloak 26.x и точная версия — важно для плана Б в 3.1.
- Расширения Keycloak для Apple, Яндекс ID, VK ID — лицензии и сопровождение (для плана Б).
- Casdoor — история уязвимостей и качество кода (если его когда-либо рассматривать).
- Лицензии и активность:
coset,p256,ciborium,etcetera, QWindowKit (сабмодуль SARibbon),dump_syms(Mozilla), KDDockWidgets (GPL/коммерческая), DocLayNet (CDLA-Permissive), Material for MkDocs и будущее MkDocs. - Объёмы наборов иконок (Lucide ≈ 1 600, Tabler ≈ 5 900, Phosphor ≈ 1 500 × 6, Material ≈ 3 800) — по памяти.
- Условия Microsoft (верификация издателя), Dropbox (production-статус), Яндекс (модерация OAuth-приложения).
- Apache OpenOffice: наличие
sd/xml/effects.xml/transitions.xmlи разрядность Windows-сборок 4.1.x — сверить по исходникам при старте порта; клон AOO вoss-src/не делался. - cargo-packager: формат подписи апдейтера и поддержка rpm.
- rclone: размер бинарника и лицензии Go-зависимостей сборки
(
go-licenses report); поддержка rc-API на Unix-сокете. - Univer Pro и
grist-ee— какие функции закрыты (влияет только на ожидания от «референса»). - Суммы по чужим областям в 3.10 взяты из выводов соседних отчётов (сверено 2026-10-04); при их правке пересчитать итог.
- go-webauthn — лицензия BSD-3-Clause взята из отчёта о зависимостях FlyType; сверить файл LICENSE перед портом.
- Модели в коде владельца: GigaAM-v3 и onnx-asr (MIT — по комментарию
в
requirements.txtAXEL), веса Silero TE (CC BY-NC-SA — по апстриму), FLUX/SDXL-модели TermitPro — сверить карточки моделей. - Цифры по коду владельца сняты с рабочих деревьев с большими незакоммиченными изменениями (PasswordSafe, ScreenPrompt, FlyType, TermitPro) — после фиксации могут измениться; юридические выводы 3.9 — не заключение юриста.