MOffice

Повторное использование открытого кода: что берём, куда и как всё остаётся под лицензией MOffice

Версия 1.0 · 2026-10-04 · основание: проверка 669 компонентов (docs/research/oss-verified.tsv), чтение кода 33 ключевых проектов, пять отчётов по областям (docs/research/oss-*.md), политика docs/12-license-policy.md. Макеты сборки — mockups/oss.html, реестр с фильтрами — docs/research/oss-registry.html на сайте.

1. Короткий ответ

Код «совсем без лицензии» использовать нельзя. По закону код без лицензии означает «все права защищены»: его нельзя ни копировать, ни встраивать. Поэтому цель «всё под нашей лицензией» достигается иначе — выбором только таких источников, которые не накладывают на наш продукт никаких обязательств:

Что берём Что это значит для MOffice
Класс 0 — Public Domain, CC0, Unlicense, 0BSD берём как своё, ничего никому не должны
Класс 1 — MIT, BSD, ISC, Zlib, Apache-2.0, OFL (шрифты) берём, меняем, продаём в закрытом продукте; единственное обязательство — строка с именем автора в окне «О программе → Лицензии открытого ПО» (так делают Microsoft Office, Adobe, Apple)
Собственный код владельца — PasswordSafe, ScreenPrompt, FlyType, Formulник уже ваш, переносится без условий
Класс 2 — MPL, LGPL, EPL только по вашему отдельному решению; для каждого случая найдена замена класса 0–1
Класс 3 — GPL, AGPL, SSPL, BUSL, некоммерческие запрещено; только «чистая комната» (своя реализация по описанию)

Итог: весь MOffice остаётся под вашей лицензией (EULA), исходный код закрыт, продавать можно без ограничений. Чужой код класса 0–1 после переноса становится частью нашего кода; от авторов остаётся только упоминание в списке лицензий.

2. Как проверяли

Результат по классам (669 позиций; после ручных уточнений по отчётам часть позиций перешла в класс 3 — например, веса моделей OCR и bpmn-js):

Класс Количество
0 — без обязательств 15
1 — только атрибуция 572
2 — решение владельца 40
3 — запрещено 35
? — проверка по языкам/файлам 7

3. Главные находки

  1. Движок таблиц почти готов. Форк IronCalc (MIT OR Apache-2.0) даёт 492 работающие функции из 518 нашего каталога: для P0 это 99,4 % (не хватает AGGREGATE и GETPIVOTDATA). В нём есть парсер A1/R1C1 с локалями, LET/LAMBDA, spill, структурированные ссылки, импорт и экспорт xlsx, 2 768 тестов и 211 эталонных книг. Своими остаются граф зависимостей и многопоточный пересчёт (образец — formualizer, MIT/Apache), 3D- и внешние ссылки. Это снимает главный риск фазы 2: 500 функций «с нуля» стоили бы 28–35 чел.-мес. при 21 заложенном.
  2. Microsoft сама выпустила чтение PST на Rust под MIT (outlook-pst, ≈15 тыс. строк, ANSI и Unicode), а jetdb (MIT/Apache) читает базы Access. Импорт Outlook и Access больше не нужно писать с нуля.
  3. Бинарные форматы Office — порт Apache POI (Apache-2.0): doc ≈36,7 тыс. строк, xls ≈28,8 тыс., ppt ≈21,3 тыс.; порт 15–17 чел.-мес. против 30–37 с нуля.
  4. PDF целиком на разрешительных лицензиях: просмотр — pdfium, собственный рендер этапа B — hayro (MIT/Apache, с декодерами JBIG2, JPEG 2000, CCITT), правка и инкрементальное сохранение — lopdf, экспорт PDF/A и PDF/UA — krilla, подписи PAdES и формы — порт из PDFBox на RustCrypto cms. MuPDF, Poppler и iText не нужны.
  5. Paint получает готовые сильные стороны: движок кистей libmypaint (ISC) и 196 кистей (CC0), 37 эффектов и 9 коррекций Pinta (MIT) со 125 эталонными картинками для тестов, стабилизатор пера ink-stroke-modeler.
  6. Draw: ≈3,5 тыс. общих фигур в 28 наборах draw.io (Apache-2.0; запрет для продуктов Atlassian переносится в наши трафареты), раскладки и коннекторы из mxGraph, dagre, WebCola, d3-force. Обход препятствий — свой.
  7. Почта и календарь собираются из крейтов Stalwart (MIME, DKIM, iCalendar/vCard с RRULE — calcard), imap-codec, libdav (CalDAV/CardDAV), rPGP.
  8. Формулы: раскладка переносится из typst (Apache-2.0), озвучивание и Брайль с русским языком — MathCAT (MIT).
  9. Платформа: velopack (установка, дельта-обновления, MSI), crash-handler + minidump + сервер GlitchTip, облака через OpenDAL и rclone, CRDT на Yrs с сервером на основе y-sweet, поиск tantivy.
  10. Ваш код закрывает целые модули: шифрование и синхронизация из PasswordSafe, захват экрана из ScreenPrompt, диктовка и сервер аккаунтов из FlyType, инструменты формул и OCR из Formulник.

Что важно знать о правописании: все движки Hunspell идут под MPL/LGPL, поэтому движок проверки пишем свой (7,5–9,5 чел.-мес.), а в комплект без ваших решений входят только словари ru, en (4 варианта), pl, nl и tr.

4. Ваш собственный код — лучший источник

Код ваших проектов уже принадлежит вам и переносится в MOffice без условий. Все коммиты, сделанные людьми, — от ваших учётных записей. Перед переносом нужны две формальности: короткий документ о правах на код (в файлах LICENSE правообладатель записан условной меткой, а в истории много коммитов, сделанных с помощью ИИ-инструментов) и фиксация незакоммиченного кода (в PasswordSafe это ≈27 % Rust).

Ваш проект Что переносим Модуль MOffice Экономия, чел.-мес.
PasswordSafe (Rust) шифрованный «конверт» Argon2id + AES-256-GCM, защищённая память, TOTP — ≈2–2,5 тыс. строк; при переносе исправить: ключ выводить через HKDF, MAC на весь файл, добавить потоковое шифрование MOffice Crypto: «Файл → Защитить паролем», шифрование пакетов MOP 3–5
сквозное шифрование и синхронизация через WebDAV и S3 облачные хранилища Hub, «свой сервер» 2–3
фоновый IPC-сервис, протокол клиент-сервер MOffice Broker 1–2
ScreenPrompt (Rust + Tauri) захват экрана (Windows Graphics Capture, macOS ScreenCaptureKit), звук, пауза, политика источников, протокол помощника, управление записью; не переносим склейку через FFmpeg + libx264 (GPL) Paint → «Снимок», Slides → «Запись экрана», Notes → вырезка 3–4
FlyType (Go, Rust, Swift) сервер аккаунтов (Go, ≈8,3 тыс. строк), биллинг и выпуск релизов, правила «полировки» диктовки RU/EN, маршрутизатор облако/локально; не переносим веса Silero (некоммерческие) и edge-tts (LGPL) — замена Whisper (MIT) MOffice ID, «Диктовка» в Write/Notes/Mail, расшифровка аудио в Notes 8–12
Formulник / AXEL инструменты формул (перевод RU↔︎EN, диагностика, сравнение книг, рассылки, ИНН, сумма прописью), OCR счетов, извлечение таблиц из PDF Sheets → «Проверка формул», PDF → «Преобразовать в Sheets» 5–8
voice-agent, TermitPro ядро ассистента, инструменты и права доступа, MCP, плагины MOffice Assist, расширения 2–3
Итого 24–37

5. Итоговая карта: что берём и куда

Класс: ★ — ваш код, 0 — без обязательств, 1 — только атрибуция, 2 — ваше решение. Стратегия: adopt — зависимость как есть, fork — копия в наш репозиторий с правками, port — переписать на Rust с уведомлением об авторстве, ref — только образец. Подробности по каждому пункту — в отчётах docs/research/oss-*.md.

Модуль MOffice Что берём Класс Стратегия
Шейпинг, шрифты, Unicode harfrust, skrifa/read-fonts, fontique, ICU4X (icu_segmenter, сортировка, числа), unicode-bidi 1 adopt
Раскладка абзаца parley (образец), Кнут–Пласс из typst inline/linebreak 1 ref + port
Переносы форк hypher + TeX-шаблоны с проверкой лицензии каждого языка 1 fork
Сравнение документов imara-diff, similar 1 adopt
Рендер и геометрия Skia (skia-safe), tiny-skia, kurbo, lyon, i_overlay, resvg/usvg 1 adopt
Цвет Little-CMS 2 (lcms2) 1 adopt
Экспорт PDF krilla (PDF/A-1…4, PDF/UA-1, теги, субсеты шрифтов), pdf-writer, subsetter 1 adopt
Правописание и грамматика свой meridian-spell (формат Hunspell), словари ru/en/pl/nl/tr; Harper для английской грамматики; русская грамматика и тезаурус — свои ★ / 1 own / adopt
Формулы Sheets форк IronCalc → meridian-calc; граф и параллельный пересчёт по образцу formualizer; formulajs и Univer — как тесты 1 fork / ref
Числовые форматы порт SheetJS SSF (+ ≈2,4 млн эталонных проверок) 1 port
Данные и поиск решения Polars, DuckDB, Arrow/Parquet, csv, encoding_rs, chardetng; HiGHS + good_lp (только highs), Clarabel, argmin; statrs, nalgebra 0–1 adopt
Бинарные doc/xls/ppt порт Apache POI (HWPF, HSSF, HSLF, DDF, HPSF); быстрый импорт — calamine 1 port / adopt
xlsx-запись, шифрование Office rust_xlsxwriter; office-crypto, ms-offcrypto-writer, msoffcrypto-tool 1 adopt / port
iWork numbers-parser, iWorkFileFormat, litchi — образцы IWA 1 ref
Access jetdb + порт Jackcess 1 fork / port
Outlook outlook-pst (Microsoft) + compressed-rtf; msg-parser 1 adopt
OneNote своя реализация по [MS-ONESTORE]/[MS-ONE] (решение владельца 2026-10-04: класс 2 не используем); pyOneNote (Apache) — образец ★ / 1 own
Base SQLite, rusqlite, SQLCipher, sqlparser-rs, tokio-postgres, mysql_async, tiberius, odbc-api; полосы отчётов — по образцу FastReport 0–1 adopt / ref
Paint libmypaint + mypaint-brushes, ink-stroke-modeler, порт эффектов Pinta, «Удалить фон» — ort + IS-Net/U-2-Net (Apache) или BiRefNet (MIT); кодеки image, png, zune-jpeg, image-webp, ravif, exr, tiff, gif, psd 0–1 port / adopt
Снимки и запись экрана ScreenPrompt (ваш), windows-capture, xcap (только Windows/Linux), ashpd + PipeWire ★ / 1 own / adopt
Draw общие трафареты draw.io → .mvs; раскладки mxGraph, dagre, WebCola, d3-force; петли графов — petgraph; импорт синтаксиса Mermaid 1 fork / port
PDF pdfium (pdfium-render) на этапе A, hayro — основа своего рендера, lopdf — правка и инкрементальное сохранение, PDFBox — образец подписей и форм, RustCrypto cms/x509-* 1 adopt / fork / port
OCR и конвертация PDF Tesseract 5 + tessdata, PP-OCRv5 (ONNX, кириллица); LAParams из pdfminer.six, таблицы из pdfplumber, модели раскладки Docling 1 adopt / port
Chart d3-scale, d3-array, d3-shape, d3-hierarchy; палитры ColorBrewer и viridis 0–1 port
Math раскладка формул typst, MathCAT (озвучивание, Брайль), Temml/latex2mathml 1 port / adopt
Slides и медиа Lottie через Skottie (Skia); видео — кодеры ОС, WebM — rav1e/libvpx; аудио — hound, lewton, claxon, minimp3 (без symphonia) 0–1 adopt
Mail mail-parser, mail-builder, mail-auth, imap-codec + imap-next, lettre, calcard, libdav, rPGP, RustCrypto cms (S/MIME); санитайзер HTML — свой на html5ever 1 adopt
Notes ink-stroke-modeler, perfect-freehand, tantivy; ENEX — свой парсер 1 adopt / port
Forms survey-library (MIT) — образец схемы и выражений 1 ref
Script QuickJS-ng + rquickjs, oxc, tree-sitter, wasmtime + Extism; VBA — ovba, грамматика VB6 (grammars-v4), семантика из oletools/ViperMonkey 1 adopt / ref
Sync и поиск Yrs + сервер на основе y-sweet; tantivy 1 adopt
MOffice ID свой сервис на Rust с переносом сервера аккаунтов FlyType; SAML и SCIM — Ory Polis; passkeys — порт проверки go-webauthn; openidconnect, oauth2, totp-rs, argon2; Keycloak — эталон в CI и план Б ★ / 1 own / adopt
Лицензии и биллинг свой meridian-license (уже в репозитории), machine-uid; Stripe через async-stripe, свои адаптеры ЮKassa и CloudPayments; Kill Bill — образец ★ / 1 own / adopt
Установка и обновления velopack (дельты, каналы, откат, MSI, нотаризация) + своя подпись фида Ed25519 1 adopt
Сбои и телеметрия crash-handler, minidump-writer, rust-minidump, сервер GlitchTip; OpenTelemetry 1 adopt
Облака OpenDAL в брокере + rclone rcd для синхронизируемых папок; Google Drive — только drive.file 1 adopt
Оболочка своя QML-лента по алгоритмам SARibbon (MIT), свой докинг, cxx-qt; иконки — Lucide + Tabler, перерисованные в MOffice Glyphs ★ / 1 port / adopt
Справка Sphinx (mdBook кладёт MPL-тему в вывод) 1 adopt
Целые приложения Apache OpenOffice — выборочный порт: фильтр Word 97, функции Calc, StarMath, формулы фигур, пресеты анимаций 1 port

6. Экономия и что меняется в плане

Оценки отчётов независимы: каждый считал разницу «сделать самим» минус «перенос и встраивание» по составу команд и длительности эпиков из плана. Итоги сходятся с общим расчётом стратегии.

Область Экономия, чел.-мес.
Форматы, движок таблиц, данные, Base 44–58
Графика, Draw, PDF, OCR, Chart, медиа 40–60
Текст, рендер, язык, шрифты, Qt, формулы 35–48
Почта, заметки, формы, скрипты, CRDT, поиск ≈40
Платформа: установка, сбои, облака, ID, оболочка, иконки, порт из OpenOffice 35–50
Ваш собственный код 24–37
Минус дополнительные работы из-за политики (своё правописание, русская грамматика и тезаурус) −(15–19)
Итого ≈200–280

Это 7,5–10,5 % плана: 2 660 → ≈2 380–2 460 чел.-мес. В деньгах по ставкам-ориентирам плана: ≈0,8–1,1 млн USD для команды в РФ и ≈2,2–3,1 млн USD для международной. Пиковая команда снижается с 73 до ≈67 человек.

Рекомендация по срокам: публичные даты релизов не менять, а экономию направить в резерв на риски. Важнее денег то, что снимаются главные технические риски: каталог функций Sheets, импорт PST и Access, свой рендер PDF, кисти и эффекты Paint. Если фаза 2 пройдёт по плану, релизы 1.5, 2.0, 3.0, 3.5 и 4.0 можно сдвинуть на 4 недели раньше. Если вы одобрите onenote_parser (MPL), экономия вырастет ещё на 4–6 чел.-мес.

Технические пробелы, которые нашлись при проверке, и как их закрываем:

Пробел Решение
В IronCalc нет графа зависимостей, пересчёт полный и однопоточный, нет 3D-ссылок, внешних ссылок, объединения и пересечения диапазонов свой граф и параллельный пересчёт; двухнедельный спайк «IronCalc против formualizer» в первом инкременте фазы 2
В QuickJS-ng нет API отладчика и нет Intl свой протокол отладчика; Intl — функции хоста на ICU4X
В Yrs нет операции перемещения элементов порядок страниц и блоков — дробные индексы
В krilla нет шифрования, подписей и аннотаций PDF свои на lopdf и RustCrypto cms
Qt 6.8 Multimedia по умолчанию работает через FFmpeg свой медиаслой на системных API: Media Foundation, AVFoundation, GStreamer
xcap на macOS использует устаревший API ScreenCaptureKit, как в ScreenPrompt
rodio по умолчанию тянет symphonia (MPL) default-features = false + hound, lewton, claxon, minimp3
dirs тянет option-ext (MPL) своя функция папок ОС через системные API
good_lp по умолчанию тянет coin_cbc (EPL) только функция highs
WiX начиная с версии 6 требует платы при выручке больше 10 000 USD MSI собираем через velopack

7. Что требует вашего решения

Ничего из этого не блокирует фазу 0: для каждого пункта есть путь без условий, решение лишь ускоряет работу.

Вопрос Варианты Рекомендация
Лицензия Qt 6 LGPL с динамической линковкой (бесплатно, пользователь может заменить библиотеки Qt) или коммерческая Qt; тариф Small Business (546 €/год за место) не подходит — максимум 3 места и выручка до 1 млн € начать на LGPL, модули Qt только под GPL не использовать; к выпуску 1.0 решить, нужна ли коммерческая
OneNote onenote_parser (MPL-2.0) без правок или своя реализация по спецификации одобрить как неизменяемую зависимость: −4–6 чел.-мес.
Словари под MPL/LGPL (fr, uk, es, pt, da, el, kk, sv, be) в комплект или загрузка пользователем из первоисточника загрузка по запросу; в комплекте только ru, en, pl, nl, tr
База автонастройки почты ISPDB (MPL) встроить данные или запрашивать онлайн не встраивать; запрос к публичному сервису только с согласия пользователя
GStreamer на Linux (LGPL) системная библиотека или свой кодек одобрить как системную зависимость
libheif и libraw (LGPL) HEIC и RAW через декодеры ОС или эти библиотеки декодеры ОС на Windows и macOS, на Linux — необязательная системная библиотека
Шрифт Intos (OFL, метрический клон Aptos) включить или ждать включить после юридической проверки кернинга
Права на ваш код короткий документ о правах на FlyType, ScreenPrompt, PasswordSafe, AXEL подписать до переноса кода
Тестовые серверы Stalwart и Dovecot (AGPL) только как внешние контейнеры в CI разрешить в политике как тестовую инфраструктуру, в продукт не входят

8. Что запрещено и чем заменяем

Запрещено (лицензия) Замена
MuPDF, PyMuPDF, iText (AGPL), Poppler (GPL), pdf2docx (тянет PyMuPDF) pdfium, hayro, lopdf, krilla; своя конвертация по алгоритмам pdfminer.six и pdfplumber
Веса surya и marker (CC BY-NC-SA, OpenRAIL-M с порогом 5 млн USD), веса ocrs (CC BY-SA, только латиница) Tesseract 5, PP-OCRv5 (Apache-2.0), модели Docling
Модель по умолчанию в rembg — bria-rmbg (некоммерческая) IS-Net и U-2-Net (Apache-2.0), BiRefNet (MIT)
HyperFormula (GPL/коммерческая), EPPlus (PolyForm NC) IronCalc, rust_xlsxwriter
mdbtools (GPL), крейт epub (GPL-3.0), sieve-rs и evalexpr (AGPL), minicaldav (GPL) jetdb + Jackcess, свой EPUB, свой Sieve (P2), выражения на meridian-calc, libdav
keygen-api (Fair Core License) свой сервер лицензий и крейт meridian-license
Zitadel (AGPL), Authentik (CC-BY-SA и enterprise), Lago (AGPL) свой MOffice ID, Ory Polis, свой биллинг
Сервер Sentry и Symbolicator (FSL), Bugsink (PolyForm NC), Meilisearch (части BUSL) GlitchTip, rust-minidump, tantivy
OnlyOffice (AGPL), Calligra, AbiWord, Gnumeric, Krita, GIMP (GPL), CKEditor (GPL), Joplin, Logseq, AppFlowy (AGPL) только «чистая комната»: свои реализации по документации и поведению
bpmn-js и tldraw (водяной знак в интерфейсе), SurveyJS Creator (коммерческая) свои трафареты на основе draw.io, свой конструктор Forms
QFluentWidgets (GPL), KDDockWidgets (GPL/коммерческая), модули Qt только под GPL своя QML-лента и докинг; Chart — свой движок
Иконки Paint.NET (CC BY-NC-ND), Papirus (GPL), RemixIcon (собственная лицензия 2026) Lucide + Tabler, перерисованные в MOffice Glyphs
Silero (CC BY-NC-SA) и edge-tts (LGPL) в FlyType, FFmpeg + libx264 (GPL) в ScreenPrompt Whisper (MIT), синтез речи ОС, кодеры ОС

9. Обязательства по атрибуции и как их выполнять

Для классов 0–1 обязательства минимальны, но их нужно выполнять аккуратно — это и есть «чистота» продукта:

  1. Окно «О программе → Лицензии открытого ПО» (макет OS-02): список компонентов с версией, лицензией и полным текстом. Генерируется из SBOM при каждой сборке.
  2. Файл NOTICE в установщике: тексты уведомлений Apache-2.0 (у IronCalc, typst, krilla, jackcess и др. есть свои NOTICE — их сохраняем дословно).
  3. Заголовки в перенесённых файлах: при порте кода на Rust в начале файла — «Основано на <проект> (MIT), © авторы»; остальной файл — наш код под EULA.
  4. Шрифты OFL: не продаём шрифты отдельно; если меняем — переименовываем (Reserved Font Name).
  5. Контроль в CI: cargo deny check licenses (файл deny.toml уже в репозитории) пропускает только классы 0–1; для C/C++/JS/данных — сканер лицензий; SBOM в формате CycloneDX к каждому релизу (макет OS-13).
  6. Зеркала исходников: копии выбранных проектов храним у себя (repoBase), чтобы исчезновение исходного репозитория не остановило сборку.

10. Что делаем дальше (фаза 0)

  1. Зеркала — сделано 2026-10-04: приватная организация meridian-oss на repoBase, 21 зеркало с ежедневной синхронизацией: IronCalc, formualizer, ssf, jackcess, jetdb, outlook-pst-rs, onenote-rs, libmypaint, mypaint-brushes, Pinta, ink-stroke-modeler, dagre, hayro, krilla, typst, hypher, harfrust, MathCAT, calcard, mail-parser, y-crdt. Крупные проекты фондов (Apache POI, draw.io, mxGraph) не зеркалим; трафареты draw.io соберём отдельным репозиторием.
  2. Реестр THIRD_PARTY.md и SBOM — генерация из oss-verified.json и Cargo.lock, окно «Лицензии открытого ПО».
  3. cargo-deny в CI с файлом deny.toml (уже в репозитории) и сканер лицензий для C/C++/JS/данных.
  4. Спайки первых инкрементов: «IronCalc против formualizer» (2 недели), «harfrust + parley + свой Кнут–Пласс», «pdfium и hayro на корпусе PDF», «libmypaint через FFI или порт».
  5. Перенос вашего кода: документ о правах, фиксация незакоммиченного кода, исправления шифрования PasswordSafe при переносе.
  6. Юридические проверки: шрифт Intos, патенты на ленту, перенос запрета Atlassian в лицензию наших трафаретов.
  7. Ваши решения из раздела 7 — к концу фазы 0.

Макеты того, как выглядит продукт с этими компонентами, — mockups/oss.html (13 экранов с метками источников).