Meridian Office — основание проекта (библия)
Документ-источник истины для всех остальных документов, макетов и кода. Если что-то здесь противоречит другому документу — прав этот документ, а другой нужно исправить. Версия 0.1 · 2026-10-03 · язык документации — русский; идентификаторы, код, имена файлов — английский.
1. Что мы строим
Meridian Office («Меридиан Офис») — полный офисный пакет для Windows, Linux и macOS, который:
- Читает всё. Открывает любой распространённый формат документов, таблиц, презентаций, изображений, схем, заметок, почты и баз данных — Microsoft Office (включая устаревшие бинарные), OpenDocument, Apple iWork, Google-экспорт, PDF, растровые и векторные форматы — с точностью отображения не хуже оригинала.
- Имеет свои форматы. У каждого приложения есть собственный открытый формат семейства Meridian Open Package (MOP) — ZIP-контейнер с XML и ресурсами, по духу близкий к OOXML/ODF, но проще, строже и с встроенной историей изменений.
- Лучше, а не «тоже». Единое ядро (одна модель текста, одна модель таблиц, один движок рендера и формул во всех приложениях), современный интерфейс одного стиля, локальная работа без облака, совместное редактирование по желанию, скрипты вместо макросов, встроенный ассистент.
- Один код — три платформы. Это десктопные приложения (решение владельца, 2026-10-03): ядро на Rust, оболочка на Qt 6; одинаковое поведение и внешний вид на Windows 10/11, macOS 13+ (Intel и Apple Silicon) и Linux (Flatpak/AppImage/deb/rpm, X11 и Wayland). Полноценная работа офлайн, установка на компьютер, нативные диалоги, печать, интеграция с проводником/Finder. Веб-версия и мобильные клиенты — не цель проекта; архитектура их лишь не исключает (ядро компилируется в WebAssembly), и они могут появиться отдельным решением после фазы 7.
- Коммерческий продукт с первого дня. Система аккаунтов (Meridian ID), лицензионные ключи, активация, редакции и подписки закладываются в структуру проекта с фазы 0 — см. раздел 9.
1.1 Целевые пользователи
| Сегмент | Что им важно | Как отвечаем |
|---|---|---|
| Частные пользователи и студенты | бесплатно/недорого, открывает присланные .docx/.xlsx без искажений | точный импорт OOXML, лёгкий интерфейс, Hub с шаблонами |
| Малый и средний бизнес | привычный Word/Excel-подход, почта + календарь, формы, простые БД | Write/Sheets/Mail/Forms/Base, ribbon-интерфейс, скрипты |
| Корпорации и госсектор | офлайн-работа, контроль данных, свои серверы, совместимость, политики | локальный режим, Meridian Cloud на своём сервере, подпись документов, групповые политики |
| Образование | дёшево, кроссплатформенно, совместная работа | Linux-первый класс, совместное редактирование, Forms |
| Творческие и технические специалисты | Paint/Draw/Math/PDF, скрипты, большие таблицы | слои в Paint, коннекторы в Draw, LaTeX-ввод в Math, миллионы строк в Sheets |
1.2 Принципы продукта
- Точность важнее скорости релиза. Открытый документ должен выглядеть так же, как в приложении-источнике.
- Локально по умолчанию. Всё работает без интернета и аккаунта. Облако и ИИ — опциональные модули.
- Одна модель — много представлений. Таблица в Write, диаграмма в Sheets, текст в Slides — это один и тот же код.
- Не ломать привычки. Горячие клавиши, расположение команд и терминология — знакомые пользователям Microsoft Office; но с «компактным режимом» для тех, кто любит минимализм.
- Расширяемость — часть продукта. Скрипты (JavaScript/TypeScript и Python), плагины, темы, шаблоны, магазин.
- Безопасность по умолчанию. Скрипты в песочнице, подписи документов, отсутствие «макро-вирусов» как класса.
2. Состав пакета
2.1 Приложения
| # | Приложение | Аналоги | Назначение | Фаза |
|---|---|---|---|---|
| 0 | Meridian Hub | стартовое окно Office, LibreOffice Start Center | единая точка входа: недавние файлы, шаблоны, облако, поиск, аккаунт, настройки, обновления | 1 |
| 1 | Meridian Write | Word, LibreOffice Writer, Pages | текстовый процессор: документы, письма, отчёты, книги, рецензирование | 1 |
| 2 | Meridian Sheets | Excel, Calc, Numbers | электронные таблицы: формулы, сводные таблицы, диаграммы, данные | 2 |
| 3 | Meridian Slides | PowerPoint, Impress, Keynote | презентации: слайды, анимации, режим докладчика | 3 |
| 4 | Meridian Draw | Visio, LibreOffice Draw, draw.io | векторная графика, схемы, блок-схемы, планы, коннекторы | 3 |
| 5 | Meridian Paint | Paint, Paint.NET, Krita-lite | растровый редактор: слои, кисти, выделения, фильтры, скриншоты | 4 |
| 6 | Meridian PDF | Acrobat Reader/Standard, Preview | просмотр, аннотации, формы, редактирование, конвертация, подпись PDF | 4 |
| 7 | Meridian Math | LibreOffice Math, Equation Editor | редактор формул (визуальный + LaTeX/UnicodeMath), встраивается во все приложения | 4 |
| 8 | Meridian Notes | OneNote, Evernote, Notion-lite | записные книжки: свободный холст, разделы, рукописный ввод, вырезки | 5 |
| 9 | Meridian Mail | Outlook, Thunderbird | почта, календарь, контакты, задачи (PIM) | 5 |
| 10 | Meridian Base | Access, LibreOffice Base | настольные базы данных: таблицы, запросы, формы, отчёты, коннекторы к серверным СУБД | 5 |
| 11 | Meridian Forms | Microsoft Forms, Google Forms | формы и опросы, сбор ответов в Sheets | 5 |
| 12 | Meridian Publisher | MS Publisher, Scribus-lite | настольная вёрстка: буклеты, визитки, печатная продукция | 7 |
| 13 | Meridian Plan | MS Project, Planner | планирование проектов: диаграммы Ганта, ресурсы, задачи | 7 |
2.2 Общие модули (не приложения, а библиотеки ядра)
| Модуль | Назначение |
|---|---|
| Meridian Kernel | модели документов, раскладка текста, движок формул, графика сцены, растр, undo/redo, история |
| Meridian Codecs | импорт/экспорт всех форматов (OOXML, ODF, бинарные MS, PDF, RTF, HTML, изображения, …) |
| Meridian Render | список отображения → Skia (CPU/GPU) → экран, печать, PDF, растровые снимки |
| Meridian Chart | единый движок диаграмм (во всех приложениях) |
| Meridian Scene | общая сцена фигур (геометрия prstGeom, стили заливки/обводки, группы, коннекторы) для Write, Sheets, Slides, Draw, Notes, Forms |
| Meridian Diagram | «диаграммы-схемы» (аналог SmartArt): типы списков/процессов/иерархий/циклов с автораскладкой, во всех приложениях |
| Meridian Color | управление цветом: ICC-профили (lcms2), sRGB/Display P3/CMYK, общий для Paint, PDF, Print, Chart |
| Meridian Crypto | подписи и шифрование документов (XAdES/PAdES, AES-256-GCM, Argon2id), доверенные хранилища ОС, ГОСТ через плагин |
| Meridian Broker | фоновый процесс пакета: единственный экземпляр, межпроцессное взаимодействие, глобальные клавиши, планировщик задач, восстановление; Hub — его окно |
| Meridian Lingo | проверка орфографии, грамматики, переносы, тезаурус, автозамена, языковые данные |
| Meridian Script | скрипты и автоматизация: JavaScript/TypeScript (QuickJS) с синхронной объектной моделью, запись макросов (recorder) как обязательная функция, Python (опц.), транслятор VBA |
| Meridian Sync | совместное редактирование (CRDT), синхронизация с облаками и своим сервером |
| Meridian Print | печать, настройки принтера, предпросмотр, PDF/A, PDF/UA |
| Meridian Assist | ИИ-функции (локальные модели или облако): переписать, подытожить, формула по описанию, перевод |
| Meridian Shell | общая оболочка: окна, ribbon, панели, диалоги, темы, доступность, локализация |
| Meridian ID | клиент системы аккаунтов: вход, токены в хранилище ОС, организации, роли, устройства |
| Meridian License | лицензионные ключи, активация (онлайн/офлайн), проверка подписанных лицензий, плавающие лицензии, пробный период, включение функций по редакции |
| Meridian Update | каналы обновлений (stable/beta/nightly), дельта-обновления, подпись пакетов, откат |
3. Имена, форматы, расширения
3.1 Семейство форматов Meridian Open Package (MOP)
- Контейнер: ZIP (deflate; большие медиа — stored),
первый элемент
mimetypeбез сжатия (как в ODF), чтобы тип определялся по первым байтам. - Содержимое: XML с пространством имён
urn:meridian:office:<app>:1(схемы — XSD + RELAX NG), манифестmanifest.xml, метаданныеmeta.xml(Dublin Core + свои), стилиstyles.xml, настройкиsettings.xml, медиа вmedia/, встроенные объекты вobjects/, миниатюраthumbnail.png, история измененийhistory/(журнал операций CRDT, опционально), скриптыscripts/, подписиsignatures/. - Плоский вариант (один XML-файл без ZIP) для систем
контроля версий: суффикс
f→.mwxf,.msxf, … - Шаблоны: последняя буква
tвместоx. - Скрипты внутри документа не меняют расширение (в
отличие от
.docm): наличие скриптов видно по значку и по манифесту, скрипты не запускаются без явного разрешения, подписанные — по политике. - Версионирование:
manifest.xml/@version, обратная совместимость в пределах мажорной версии; неизвестные элементы сохраняются при пересохранении (round-trip extension elements).
3.2 Таблица расширений
| Приложение | Документ | Шаблон | Плоский XML | Пространство имён |
|---|---|---|---|---|
| Write | .mwx |
.mwt |
.mwxf |
urn:meridian:office:write:1 |
| Sheets | .msx |
.mst |
.msxf |
urn:meridian:office:sheets:1 |
| Slides | .mpx |
.mpt |
.mpxf |
urn:meridian:office:slides:1 |
| Draw | .mvx |
.mvt |
.mvxf |
urn:meridian:office:draw:1 |
| Paint | .mpi |
— | — | urn:meridian:office:paint:1 (ZIP: слои PNG/EXR +
image.xml) |
.pdf (стандарт) |
— | — | аннотации по стандарту PDF; свой формат не нужен | |
| Math | .meq |
— | — | urn:meridian:office:math:1 (MathML + своя
разметка) |
| Notes | .mnx |
— | — | urn:meridian:office:notes:1 (одна книжка = пакет) |
.mmx (архив) |
— | — | архив писем/календаря/контактов (EML + ICS + VCF + индекс) | |
| Base | .mbx |
— | — | файл SQLite + служебные таблицы meridian_*
(формы/запросы/отчёты как XML) |
| Forms | .mfx |
.mft |
— | urn:meridian:office:forms:1 |
| Publisher | .mpub |
.mpubt |
— | urn:meridian:office:publisher:1 |
| Plan | .mpln |
— | — | urn:meridian:office:plan:1 |
Дополнительные расширения (решения 2026-10-03, см. раздел 10):
.mvs — трафарет Draw (пакет библиотеки фигур),
.mcht — шаблон диаграммы Meridian Chart, .mfr
— пакет ответов Forms, .mnt — шаблон страницы Notes,
.meqf — плоская формула Math, .mxt — пакет
расширения/скрипта (подписанный ZIP с манифестом), .mkeys —
схема горячих клавиш, .mlic/.mreq — лицензия и
запрос офлайн-активации (раздел 9).
MIME-типы: application/vnd.meridian.<app>
(например application/vnd.meridian.write), плоские —
application/vnd.meridian.<app>+xml.
3.3 Чужие форматы — сводная матрица (R — чтение, W — запись, R* — чтение с ограничениями)
| Приложение | Полная поддержка (R/W) | Чтение | Экспорт |
|---|---|---|---|
| Write | .docx .docm .dotx .doc .rtf .odt .ott .txt .md .html .fb2 .epub | .pages .wpd .abw .wps .pub(R*, фаза 3–4) .xml(DocBook) .tex(подмножество) | .pdf .pdf/a .epub .html .md .tex .png/.svg страниц |
| Sheets | .xlsx .xlsm .xltx .xls .ods .ots .csv .tsv | .xlsb .numbers .gnumeric .dif .sylk .dbf .parquet .json .xml | .pdf .html .csv .json .parquet .png диаграмм |
| Slides | .pptx .pptm .potx .ppt .odp .otp | .key .sxi | .pdf .mp4/.webm (видео) .png/.svg/.jpg слайдов .html |
| Draw | .mvx .mvs .svg .odg .vsdx | .vsd .vsdm .vssx(трафареты) .emf .wmf .dxf .drawio .pub(R*) .cdr(подмн.) | .pdf .png .svg .emf .vsdx |
| Paint | .png .jpg .webp .gif .bmp .tiff .ico .ora | .psd .xcf .heic .avif .svg(растрирование) .raw(через libraw) | .png .jpg .webp .gif(анимация) .bmp .tiff .ico .psd(базово) .pdf |
| .xps .oxps .djvu .cbz | .pdf/a .pdf/ua .png .jpg .txt .docx(через Write) | ||
| Math | .meq .mml(MathML) .tex | .odf(формулы) OMML(из docx) | .mml .tex .svg .png |
| Notes | .mnx | .enex(Evernote) .one/.onepkg(OneNote, R*) .md-папки .html | .pdf .md .html |
| .eml .mbox .ics .vcf | .pst .ost(R*) .msg .ldif | .eml .mbox .ics .vcf .pdf | |
| Base | .mbx .sqlite .csv | .accdb .mdb .odb .xlsx(импорт) ODBC/коннекторы PostgreSQL MySQL MS SQL | .csv .xlsx .sql .pdf отчётов |
| Forms | .mfx | импорт вопросов из .docx/.xlsx | ответы → .msx/.xlsx/.csv, форма → .pdf |
4. Технологический стек (решение)
| Слой | Выбор | Почему |
|---|---|---|
| Ядро (модели, раскладка, формулы, кодеки, растр) | Rust (стабильный toolchain, рабочее пространство cargo) | безопасность памяти при разборе чужих файлов, скорость как у C++, компиляция в WebAssembly для веб-версии |
| Рендер | Skia (skia-safe) с бэкендами
Metal/Vulkan/D3D12/OpenGL + CPU; экспериментально vello
(wgpu) |
лучший в индустрии растеризатор текста и векторов, печать/PDF из того же списка отображения |
| Шейпинг текста | HarfBuzz (rustybuzz), unicode-bidi,
unicode-linebreak, переносы по TeX-шаблонам
(hyphenation), шрифты через fontdb + системные
API (DirectWrite/CoreText/fontconfig) |
корректные арабский, иврит, индийские письменности, лигатуры, кернинг |
| Оболочка (UI) | Qt 6.8 LTS (C++ + QML, Qt Quick Controls с
собственным стилем «Meridian»), мост в Rust через
cxx-qt |
зрелость на трёх ОС, IME, доступность, печать, нативные диалоги, Wayland/HiDPI; десятки больших приложений на Qt (Krita, WPS, Telegram) |
| Холст документа | Rust → список отображения → Skia → текстура GPU →
QQuickItem (QRhi) |
один код рендера для экрана, печати, PDF и веб |
| Скрипты | QuickJS-ng (JavaScript/TypeScript через встроенный транспилятор), опционально CPython 3.12 (плагин), транслятор VBA→MeridianScript для простых макросов | лёгкая песочница, типизированный API, знакомый язык |
| Совместная работа | Yrs (Rust-порт Yjs, CRDT) + WebSocket-сервер «Meridian Cloud» (Rust, axum) | офлайн-первый CRDT, конфликтов нет, работает с любым хранилищем |
| Локальные данные | SQLite (Base, Mail, Notes, индекс Hub),
sled/redb для кэшей |
один файл, транзакции, переносимость |
| Проверка языка | Hunspell-словари (hunspell-rs),
LanguageTool-совместимый локальный сервер (опц.), ICU4X для
сортировки/чисел/дат |
офлайн, 40+ языков |
| Шрифты в комплекте | Liberation (метрически = Arial/Times/Courier), Carlito/Caladea (= Calibri/Cambria), Gelasio (= Georgia), Selawik (≈ Segoe UI), Noto (все письменности), PT Sans/Serif, Inter, JetBrains Mono, STIX Two Math + Latin Modern Math + Noto Math (формулы). Для Aptos (шрифт Office по умолчанию с 2024) метрического клона нет: таблица компенсации ширин в фазе 1 и заказ OFL-клона в фазе 2 | документы из MS Office выглядят одинаково без их шрифтов |
| PDF-рендер | на старте — pdfium (BSD) в песочном процессе; собственный писатель
PDF на Rust с первого дня; переход на собственный рендер поэтапно (см.
docs/apps/pdf.md) |
скорость выхода без компромисса по лицензии (MuPDF/Poppler — AGPL/GPL) |
| Управление цветом | lcms2 (MIT) через крейт meridian-color |
один движок ICC для Paint, PDF, печати и диаграмм |
| Видеокодеры (Slides) | платформенные API: Media Foundation (Windows), VideoToolbox (macOS), GStreamer/VA-API (Linux); без встроенных H.264-кодеров | лицензии кодеков не нужны |
| Qt-лицензия | LGPLv3, динамическая линковка (пользователь может заменить библиотеки Qt); коммерческая лицензия Qt — по решению владельца позже | |
| Минимальные ОС | Windows 10 21H2+ и 11; macOS 13+; Linux с glibc 2.35+ (Ubuntu 22.04+, Fedora 36+), для старых — Flatpak | |
| Сборка и CI | cargo + CMake (Qt), just для задач, GitHub/Gitea
Actions: windows-2022, macos-14 (arm64+x86_64), ubuntu-22.04;
кросс-проверка Wayland/X11 |
матрица из трёх ОС на каждый коммит |
| Установка | Windows: MSIX + MSI (WiX 4), подпись EV; macOS: DMG + нотаризация, universal binary; Linux: Flatpak (главный), AppImage, deb/rpm, Snap; автообновление — свой модуль (дельты, каналы stable/beta/nightly) | |
| Тесты | unit (cargo test), снимочные тесты рендера (корпус из 10 000+ реальных документов → PNG → сравнение), фаззинг парсеров (cargo-fuzz), UI-тесты (Qt Test + Squish), бенчмарки (criterion) | точность импорта измеряется числом, а не ощущениями |
Альтернативы, которые рассмотрены и отклонены (подробнее — в
03-architecture.md): Electron/Tauri с веб-UI (тяжелее, хуже
IME и доступность на десктопе), Flutter (слабая поддержка сложного
текстового ввода и a11y на десктопе), Avalonia/.NET (меньше экосистема
рендера), чистый C++ без Rust (риски безопасности в парсерах).
5. Стиль компании и дизайн-система (Meridian Design System, MDS)
5.1 Идея бренда
Меридиан — линия отсчёта, точность, навигация. Метафора: карта, компас, штурманский стол. Бренд спокойный, инженерный, без «игрушечности»; цвета глубокие, акценты тёплые.
- Логотип пакета: окружность (глобус) с вертикальной линией-меридианом и короткой «засечкой» сверху (как у компаса); монохромный вариант — просто кольцо с линией.
- Значки приложений: скруглённый квадрат (радиус 22 % стороны) цвета приложения, белый глиф-символ (не буква, как у MS, а знак сути: Write — перо-строка, Sheets — сетка 2×2, Slides — прямоугольник с треугольником «play», Draw — узел-коннектор, Paint — капля-кисть, Notes — закладка, Mail — конверт, Base — цилиндр, Forms — список с галочкой, PDF — лист с загнутым углом, Math — ∑, Hub — логотип).
- Голос интерфейса: коротко, по делу, во втором лице («Сохраните файл…» → «Сохранить»), без восклицаний.
5.2 Токены (единые для Qt-темы, веб-версии и макетов)
Цвета бренда и приложений (светлая тема; в тёмной — те же оттенки на 1 ступень светлее):
| Токен | Значение | Применение |
|---|---|---|
--m-ink / --app-hub |
#0B3C5D |
бренд, Hub, заголовки |
--m-sun |
#F2A541 |
тёплый акцент (выделения, «звёздочки», прогресс) |
--app-write |
#3B5BDB |
Write |
--app-sheets |
#1E8E5A |
Sheets |
--app-slides |
#E25C3D |
Slides |
--app-draw |
#0E8A8A |
Draw |
--app-paint |
#C2309B |
Paint |
--app-pdf |
#C92A2A |
|
--app-math |
#495057 |
Math |
--app-notes |
#7048E8 |
Notes |
--app-mail |
#1C7ED6 |
|
--app-base |
#A61E4D |
Base |
--app-forms |
#5C940D |
Forms |
--app-publisher |
#D6336C |
Publisher |
--app-plan |
#E67700 |
Plan |
Нейтральные: светлая тема — фон окна #F5F6F8,
поверхность #FFFFFF, граница #E1E4E8, текст
#1A1D21, вторичный текст #5C636E; тёмная — фон
#16181D, поверхность #1F2228, граница
#2E3238, текст #E6E8EB, вторичный
#9AA1AB. Контраст текста к фону ≥ 7:1 (AAA) для основного,
≥ 4.5:1 для вторичного.
Геометрия: сетка 4 px (компоненты) / 8 px (раскладка); радиусы 6 px (кнопки, поля), 10 px (карточки, панели), 14 px (всплывающие окна); толщина обводки 1 px; фокус — кольцо 2 px цвета приложения с 2 px отступом.
Типографика интерфейса: Inter (резерв: Segoe UI / SF Pro / Cantarell), размеры 11/12/13 (основной)/15/18/24/32 px, моноширинный — JetBrains Mono. Шрифты документов по умолчанию: «Carlito» 11 pt (= Calibri) для совместимости, «PT Serif/Sans» в русских шаблонах, «Liberation Serif» для академических.
Иконки: набор Meridian Glyphs — контурные, 20 px (ribbon — 20 и 32 px), штрих 1,5 px, скругления 2 px; активное состояние — залитая версия. Основа на этапе прототипа — Lucide/Fluent (MIT), затем свой набор.
Движение: 120–200 мс, ease-out; уважение к системному
«уменьшить движение».
5.3 Каркас окна (одинаков для всех приложений)
┌───────────────────────────────────────────────────────────────────────┐
│ Заголовок: [значок] Имя документа — Meridian Write [поиск ⌘⇧P] [☁][👤] │ ← на macOS нативный, на Win/Linux свой (CSD); вкладки документов в одном окне (P0)
├───────────────────────────────────────────────────────────────────────┤
│ Файл Главная Вставка Дизайн Макет Ссылки Рецензирование Вид Скрипты │ ← вкладки ribbon (+ контекстные)
│ [группа команд] [группа] [группа] ... [⌄ свернуть] │ ← лента 92 px; компактный режим 40 px
├────────┬──────────────────────────────────────────────┬───────────────┤
│ Навиг. │ │ Боковая панель│
│ панель │ Холст документа │ (свойства, │
│ (опц.) │ │ стили, исправ-│
│ │ │ ления, …) │
├────────┴──────────────────────────────────────────────┴───────────────┤
│ Стр. 3 из 12 · 1 254 слова · Русский · [режимы] [масштаб ───●─── 100%] │ ← строка состояния 24 px
└───────────────────────────────────────────────────────────────────────┘
- Вкладка Файл открывает «backstage» на весь экран (Создать/Открыть/Сохранить/Экспорт/Печать/Поделиться/Сведения/Параметры).
- Командная палитра
Ctrl+Shift+P/⌘⇧P(псевдонимAlt+Q, как «Что вы хотите сделать» в Office) — поиск любой команды, стиля, файла, функции.Ctrl+K/⌘Kостаётся за гиперссылкой, как в Microsoft Office (решение 2026-10-03). - Контекстная мини-панель при выделении (как в Office) + контекстные вкладки ribbon (Таблица, Рисунок, Диаграмма).
- Три режима плотности: «Лента», «Компактная панель» (одна строка), «Фокус» (только холст).
- Горячие клавиши — как в Microsoft Office; схема LibreOffice и своя — в настройках.
6. Архитектура — верхний уровень
┌──────────────── Meridian Shell (Qt 6 / QML, C++) ─────────────────┐
│ Hub │ Write │ Sheets │ Slides │ Draw │ Paint │ PDF │ Notes │ Mail │ Base │ Forms │
├──────────────── FFI (cxx-qt, C ABI, stable) ──────────────────────┤
│ Meridian Kernel (Rust) │
│ text-model · text-layout · grid-model · calc-engine · scene │
│ raster · chart · math · undo/crdt · styles · fields · search │
├─────────────── Meridian Codecs (Rust) ────────────────────────────┤
│ ooxml · odf · msbinary(doc/xls/ppt) · rtf · pdf(read/write) · │
│ html/md · images · svg · vsdx · pst/eml · accdb · iwork · … │
├─────────────── Platform (Rust + C++) ─────────────────────────────┤
│ render(Skia) · fonts · print · ime · a11y · fs/cloud · script(QuickJS) · sync(Yrs) │
└───────────────────────────────────────────────────────────────────┘
Процессная модель: один процесс на документ-окно (как у браузеров) + общий «брокер» (Hub) для буфера, недавних, облака и обновлений; парсеры чужих форматов — в отдельном песочном процессе (crash ≠ потеря документа). Автосохранение — журнал операций каждые 2 с, восстановление после сбоя.
7. Фазы (сводно; подробно
— 08-roadmap.md)
| Фаза | Название | Срок (от старта) | Результат |
|---|---|---|---|
| 0 | Основание | 0–3 мес | библия, дизайн-система, прототип ядра текста + рендера, репозиторий, CI, корпус тестовых файлов, схема лицензирования и редакций, каркас Meridian ID / License (клиент + сервер) |
| 1 | Ядро и Write | 3–12 мес | Meridian Hub + Write 1.0: .mwx, импорт/экспорт docx/odt/rtf/pdf, исправления и сравнение документов, печать; отображение (без редактирования) формул OMML и диаграмм из docx; вкладки документов; журналы операций моделей сразу CRDT-совместимые; вход в аккаунт, активация ключом, пробный период, портал аккаунта, продажа лицензий (биллинг) |
| 2 | Sheets | 6–16 мес | движок формул (500+ функций), сводные, диаграммы (Meridian Chart), xlsx/ods |
| 3 | Slides и Draw | 12–22 мес | презентации с анимациями и режимом докладчика (экспорт видео — P1); Draw с коннекторами; pptx/vsdx; Business «стартовый»: консоль администратора v1, SSO OIDC, Education |
| 4 | Paint, PDF, Math | 16–26 мес | растровый редактор со слоями; PDF-редактор; формулы во всех приложениях |
| 5 | Notes, Mail, Base, Forms | 22–34 мес | записные книжки, почта/календарь, базы данных, формы (сбор ответов офлайн/PDF/почта; веб-сбор — в 3.5 вместе с облаком); виртуальный принтер «Печать в Notes/PDF» |
| 6 | Совместная работа и облако | 28–40 мес | Meridian Cloud (свой сервер и on-prem для Enterprise), CRDT-редактирование между десктопными клиентами, корпоративная консоль администратора, плавающие лицензии |
| 7 | Экосистема | 36–48 мес | магазин скриптов и шаблонов, Assist (ИИ), Publisher, Plan; веб-просмотрщик (WASM) — только если будет решение владельца |
Фазы перекрываются: команды Sheets и Slides стартуют, когда ядро стабилизировано (конец фазы 0 / середина фазы 1).
8. Соглашения для документов этого репозитория
- Язык документов — русский; термины интерфейса даём по-русски с английским в скобках при первом упоминании.
- Имена приложений пишем латиницей: Meridian Write, Meridian Sheets (не «Врайт»). Ядро — Meridian Kernel.
- Каждый документ приложения (
docs/apps/<app>.md) имеет разделы: Назначение и аналоги → Функции (по группам, с приоритетами P0/P1/P2) → Экраны (список всех окон/панелей/диалогов с описанием) → Модель данных → Алгоритмы и скрипты (псевдокод/Rust/TypeScript) → Форматы (чтение/запись, особенности) → Горячие клавиши → Критерии готовности → Риски. - Приоритеты: P0 — без этого нельзя выпустить 1.0; P1 — в 1.x; P2 — позже.
- Макеты (
mockups/*.html) используютmockups/assets/mds.css, одна страница на приложение, каждый экран — блок<section class="screen">с подписью; не изобретать свои цвета — только токены. - Код в примерах: Rust для ядра, TypeScript для MeridianScript и веб,
C++/QML для оболочки. Комментарии в коде — двуязычные:
// Пересчёт зависимостей / Recalculate dependencies.
9. Лицензирование, аккаунты и редакции (закладывается с фазы 0)
Требование владельца (2026-10-03): система аккаунтов и лицензионных
ключей — часть структуры проекта с самого начала, а не надстройка
«потом». Подробно — docs/10-licensing-accounts.md; здесь —
решения верхнего уровня.
9.1 Редакции
| Редакция | Для кого | Что входит | Модель |
|---|---|---|---|
| Free | личное использование | Hub, Write, Sheets, Slides, Math (с 2.5; до этого — только отображение формул); все форматы чтения/записи этих приложений; локальные скрипты и запись макросов; просмотр (режим «только чтение») файлов Draw/Paint/Notes/Forms; PDF: просмотр, поиск, печать, заполнение форм, простые комментарии; инструмент «Снимок»; без облака, совместной работы, Assist, Base, Mail, редактирования PDF, магазина скриптов | бесплатно, без аккаунта |
| Home | дом (до 5 устройств одного владельца; аккаунт не обязателен, перенос через ключ) | всё из Free + Paint, Draw, Notes, Mail (IMAP/POP3/CalDAV, без
Exchange), PDF-редактор, Forms (все каналы, кроме веб-сбора), экспорт
видео в Slides, Base в режиме выполнения готовых баз
(BaseRuntime) |
разовая покупка (вечная лицензия: версия + 12 мес. функциональных обновлений + 5 лет обновлений безопасности) или подписка |
| Pro | фрилансеры, специалисты (до 5 устройств) | всё из Home + Base (конструктор), Assist, Meridian Cloud 100 ГБ, совместная работа, веб-сбор ответов Forms, приоритетная поддержка, Publisher/Plan (фаза 7) | подписка (месяц/год) или разовая покупка без облака; после 12 оплаченных месяцев подписки — право на вечную версию годичной давности (fallback) |
| Business | компании, за рабочее место | всё из Pro + консоль администратора (v1 — фаза 3, v2 — фаза 6), SSO (OIDC — фаза 3, SAML/SCIM — фаза 6), политики, централизованная раздача ключей, аудит, Exchange/Graph в Mail, 1 ТБ на организацию, Home Use Program для сотрудников | подписка за место/год |
| Enterprise | крупные компании, госсектор | всё из Business + on-prem сервер лицензий и облака, офлайн-активация, плавающие лицензии, SLA, собственные сборки/политики, поддержка 152-ФЗ/ГОСТ-подписи | договор, объёмные ключи |
| Education | школы, вузы | как Business с ограничениями (без облачного Assist по умолчанию, облако 100 ГБ/пользователь), лицензии на класс/кампус; бесплатный уровень для школ (Hub, Write, Sheets, Slides, Forms) — предварительно, требует подтверждения владельца | подписка/грант |
| Trial | все | Pro на 30 дней, без карты | автоматически при первом запуске (по желанию) |
9.2 Meridian ID (аккаунты)
- Вход: e-mail + пароль (Argon2id), ссылка-вход по почте, OAuth (Google, Apple, Microsoft, Яндекс ID, VK ID), корпоративный SSO (OIDC/SAML 2.0), 2FA (TOTP, passkeys/WebAuthn), восстановление доступа.
- Сущности: пользователь → устройства (ограничение по редакции) → организации (владелец/админ/участник/гость) → группы → политики. SCIM-провиженинг для Business/Enterprise, журнал аудита, регионы хранения данных (РФ / ЕС), удаление аккаунта и экспорт данных (152-ФЗ, GDPR).
- Аккаунт не обязателен для Free/Home-офлайн; обязателен для подписок, облака, совместной работы, Assist.
- Токены: короткоживущий access (15 мин) + refresh (90 дней, ротация); хранение — Keychain (macOS), DPAPI/Credential Manager (Windows), Secret Service (Linux). Никаких токенов в файлах настроек.
9.3 Лицензионные ключи и активация
- Формат ключа:
MRDN-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX(25 символов Crockford Base32 без неоднозначных букв; внутри — редакция, тип (вечная/подписка/объёмная), число мест, серия, дата выпуска, контрольная часть). Ключ сам по себе ничего не «разблокирует»: он обменивается на лицензию. - Лицензия — подписанный (Ed25519) файл
license.mlic(CBOR): владелец, редакция, функции (features), устройства/отпечаток (хэш: ОС, ID машины, серийник диска/платы, без персональных данных), сроки, льготный период, канал обновлений, ограничения. Проверяется офлайн при каждом запуске; ключ подписи зашит в приложение, резервный — для ротации. - Способы активации: онлайн (ключ → сервер →
лицензия), через аккаунт (покупка привязывается к
Meridian ID, устройства активируются входом), офлайн
(файл запроса
.mreq→ портал/администратор →.mlic), плавающая (on-prem сервер лицензий выдаёт аренду на 1 ч, продлевается в фоне, 24 ч офлайн-резерв), объёмная (Enterprise: один ключ на N мест + политика автоактивации через MDM/GPO). - Подписка: онлайн-проверка раз в 7 дней, льготный период 30 дней без сети, затем режим «только чтение и печать» (документы никогда не блокируются). Вечная лицензия: обновления в пределах мажорной версии.
- Деактивация и перенос устройств — из портала и из приложения; отзыв ключа — списком отзыва при проверке.
- Защита — разумная: подписи, проверки в нескольких местах ядра, целостность сборки; никакого DRM, который мешает честным пользователям; взлом не предотвратить полностью — цель «честным удобно, пиратам неудобно».
9.4 Серверная часть (Rust/axum + PostgreSQL, Docker-образы, on-prem вариант для Enterprise)
| Сервис | Назначение |
|---|---|
id-service |
аккаунты, сессии, OAuth/OIDC/SAML, 2FA, организации, устройства, аудит |
license-service |
выпуск/активация/проверка/отзыв ключей и лицензий, плавающие аренды, объёмные ключи |
billing-service |
тарифы, подписки, платежи (адаптеры: ЮKassa, CloudPayments, Stripe), счета для юрлиц, НДС, промокоды, реселлеры |
portal (веб) |
личный кабинет: покупки, ключи, устройства, подписки, счета; консоль администратора организации |
update-service |
манифесты обновлений по каналам и редакциям, дельты, подпись |
cloud-service (фаза 6) |
хранилище, совместная работа (CRDT-сервер), общий доступ |
telemetry-service |
только по согласию: анонимные метрики и отчёты о сбоях |
Домены (план): id.meridian-office.<tld>,
license.…, account.… (портал),
update.…, cloud.…. Enterprise получает тот же
набор как docker compose для своей сети.
9.5 Как это живёт в структуре кода
kernel/crates/meridian-license/ ← проверка лицензий, отпечаток, аренда, флаги функций (Rust, без сети)
kernel/crates/meridian-id/ ← клиент аккаунтов: OAuth-поток, токены, хранилище ОС (Rust)
shell/src/account/ ← диалоги входа/активации, менеджер лицензий, значки состояния (QML/C++)
services/id-service/ services/license-service/ services/billing-service/ services/portal/ services/update-service/
tools/keygen/ ← выпуск ключей и подпись лицензий (только у владельца, HSM/YubiKey)
Все функции, зависящие от редакции, в коде включаются через один
механизм Features::has(Feature::X), а не разбросанными
проверками; интерфейс показывает «замок» и предложение перейти на
редакцию выше.
10. Решения по вопросам из документов (журнал, 2026-10-03)
Каждый документ заканчивается разделом «Вопросы к библии». Здесь — принятые решения; документы приводятся в соответствие постепенно, при расхождении действует этот раздел.
| № | Вопрос (откуда) | Решение |
|---|---|---|
| 1 | Ctrl+K: палитра или гиперссылка (write, sheets,
slides) |
Гиперссылка — Ctrl+K/⌘K, как в
Office. Командная палитра — Ctrl+Shift+P/⌘⇧P,
псевдоним Alt+Q. Раздел 5.3 и макеты
исправлены |
| 2 | Единицы длины (formats, write, notes, architecture) | Целые EMU (914 400 на дюйм) и в файлах MOP, и во внутренней
арифметике раскладки (Length = i64 EMU в
meridian-core); детерминизм без плавающей точки. Write
переводит Lu = 1/64 pt на EMU при реализации; Notes хранит
координаты холста в EMU |
| 3 | Где лежат документы ядра (sheets, chart) | Папка docs/algorithms/ — модули ядра
(chart-engine.md, kernel-core.md);
docs/03-architecture.md — скрипты, синхронизация, процессы.
Ссылки исправлены |
| 4 | Business/SSO: фазы 2–3 или 6 (roadmap, licensing) | Двухступенчато: Business «стартовый» в фазе 3 (консоль v1, OIDC, Education), Enterprise в фазе 6 (on-prem, плавающие и объёмные лицензии, SAML/SCIM, консоль v2). Таблица фаз обновлена |
| 5 | Платные форматы (draw, slides, licensing) | Форматы внутри приложения никогда не платные.
Платными бывают приложения (Draw, Paint, Mail, Base…) и функции (облако,
совместная работа, Assist, экспорт видео = Home+, веб-сбор Forms =
Pro+). Флаги DrawVsdxExport и подобные удалить из матрицы
лицензирования |
| 6 | Free и просмотр чужих приложений (paint, pdf, draw, mail) | Free открывает файлы Draw/Paint/Notes/Forms в режиме просмотра (без сохранения изменений), включает инструмент «Снимок», просмотр/печать/заполнение/простые комментарии PDF. Mail в Free отсутствует полностью. Раздел 9.1 обновлён |
| 7 | Скрипты в Free (sheets, market) | Локальные скрипты, запись макросов и редактор — во всех редакциях, включая Free (как VBA). Магазин и Python-плагин — Home+. Синхронная объектная модель и recorder — требования P0 (раздел 2.2) |
| 8 | Лимиты Sheets (market, sheets) | Минимум 1 048 576 × 16 384 (совместимость с Excel); «большой режим» 16 777 216 строк — P1, с предупреждением при экспорте в xlsx |
| 9 | Шрифт Aptos (market) | Таблица компенсации ширин (фаза 1), заказ OFL-клона (фаза 2). Раздел 4 обновлён |
| 10 | Вкладки документов в одном окне (market) | P0 для Shell (фаза 1); PDF — вкладки в одном процессе окна |
| 11 | Publisher и .pub (market) |
Publisher остаётся в фазе 7; чтение .pub (R*) в
Write/Draw — фазы 3–4 |
| 12 | Home: число устройств, Family, fallback, HUP, безопасность вечных лицензий (market, licensing) | Home — 5 устройств; вечная лицензия = версия + 12 мес. функциональных обновлений + 5 лет обновлений безопасности; fallback после 12 месяцев подписки; Home Use Program для Business/Enterprise. «Family» и бесплатный Education для школ — предварительно да, подтверждает владелец |
| 13 | Лицензия исходного кода (architecture) | Открытый вопрос владельца: проприетарный код или open core (ядро форматов под MPL-2.0). До решения — проприетарный монорепозиторий |
| 14 | Qt LGPLv3, магазины, минимальные ОС (architecture) | LGPLv3 с динамической линковкой; App Store/Microsoft Store — отдельные песочные сборки в фазе 7, основной канал — прямая загрузка; минимальные ОС — раздел 4 |
| 15 | Совместная работа в Paint; WebView для расширений; телеметрия в Trial (architecture) | Paint — без CRDT (только файл); расширения — декларативные QML-панели, WebView-панель в песочнице — P2; телеметрия всегда по согласию, в Trial — один запрос согласия при первом запуске |
| 16 | Фокус, тёмные цвета, --text-3, выделение, тени,
радиусы, высоты, HC-акцент, 32 px, стиль «Обычный», заголовок 36 px,
минимум окна (design-system) |
Принято всё: фокус — кольцо 2 px цвета приложения с отступом 2 px
(CSS макетов — приближение); тёмная тема — ступень 500 цветов
приложений; --text-3 только для необязательных подсказок;
выделение — единое indigo; 5 уровней теней; токены
--r-xs 4px, --r-pill; высота контролов 30 px —
зафиксированное исключение из сетки 4 px;
hc.accent #FFD400; стиль «Обычный» — Carlito 11 pt,
интервал 1,08, после абзаца 8 pt; заголовок окна 36 px; минимум окна 960
× 600 |
| 17 | Значки-буквы и эмодзи в макетах (design-system) | В макетах допустимы как заглушки; в продукте — глифы из
mockups/assets/icons.svg и набор Meridian Glyphs |
| 18 | Вечная лицензия и мажорные версии; pdfium; CRDT-журналы с фазы 1; Forms-веб; видео Slides; Math в Free; Education-консоль (roadmap) | Приняты предложения плана: pdfium как временный рендер; журналы операций CRDT-совместимы с фазы 1; веб-сбор Forms — в 3.5; экспорт видео — P1; до 2.5 Free показывает формулы без редактирования; Education-консоль — 3.6. GA за 3–4 недели до конца фазы — норма |
| 19 | Ключ: 28 бит MAC + 5 бит контрольного символа; «мягкий режим» 7 дней; регионы; CRL через update-service (licensing) | Принято |
| 20 | Кэш значений формул в .msx; comments.xml;
порог строк; ShapeSheet; усечение history/ (formats) |
Кэш значений — для всех формульных ячеек (быстрое открытие,
просмотрщики); comments.xml — для потоковых обсуждений,
заметки — в листе; порог строк проверить на корпусе; «живое»
подмножество ShapeSheet — решение фазы 3; history/ усекать
автоматически после 50 МБ с сохранением снимков-вех |
| 21 | .mcht, геоданные, 3D (chart) |
.mcht добавлен; карты — P2 с отдельными загружаемыми
пакетами геоданных; объёмные диаграммы и 3D-фигуры — вне 1.0 и вне
критерия «не хуже оригинала» |
| 22 | BaseRuntime для Home; единый язык выражений;
пространство имён; SQLCipher (base) |
Принято: Feature::BaseRuntime в Home; выражения Base =
движок формул Sheets; urn:meridian:office:base:1 для
XML-частей в .mbx; SQLCipher статически |
| 23 | .mvs, meridian-scene, .vssx
(draw); Diagram-модуль, кодеки (slides) |
Принято: расширения и модули добавлены в разделы 2.2, 3.2, 3.3, 4 |
| 24 | forms-service до фазы 6; .mfr;
forms:// в Sheets (forms) |
.mfr добавлен; веб-сбор — 3.5; источник
forms:// описать в документе Sheets при реализации |
| 25 | Брокер; глобальные клавиши; .mxt/.mkeys;
каталог шаблонов (hub, notes) |
Брокер — отдельный процесс meridian-broker, Hub — его
окно (раздел 2.2); глобальные клавиши регистрирует брокер; расширения
добавлены; домен templates.meridian-office.<tld>
добавить в 9.4 при реализации |
| 26 | Exchange/Graph — Business+; регистрация OAuth-клиентов;
.msg запись (mail) |
Принято; регистрации OAuth — организационная задача фазы 1–2 в плане |
| 27 | .meqf; шрифты Math; общий реестр клавиш; формулы в
Sheets; PDF/UA-теги формул (math) |
.meqf и шрифты добавлены;
docs/shell/keymap.md — результат фазы 0 (единый реестр
сочетаний для всех приложений); формулы-дроби в Sheets — P2; теги формул
PDF/UA — P1 |
| 28 | Шаблоны Notes; виртуальный принтер (notes, pdf) | .mnt добавлен; виртуальный принтер «Meridian» (Windows
— подписанный драйвер, macOS — PDF-служба, Linux — бэкенд CUPS) — фаза
5, общий для Notes и PDF |
| 29 | ICC-движок; 32-бит float; .mpi; общий диалог экспорта
(paint) |
lcms2 через meridian-color (раздел 4); 32-бит float —
P2; .mpi оставляем (MIME решает конфликты); общий диалог
экспорта изображений — в Shell |
| 30 | meridian-crypto; tessdata; печать в PDF (pdf) |
Крейт meridian-crypto добавлен (раздел 2.2); языковые
пакеты OCR загружаются по требованию через update-service; печать в PDF
— см. п. 28 |
| 31 | Бинарные части MOP для больших листов; INDIRECT/OFFSET (sheets) | Столбцовые бинарные части data/*.bin в
.msx — P1, описать в 04-file-formats при реализации;
динамические зависимости вместо волатильности — принято,
задокументировать как отличие с тем же результатом |
| 32 | Вкладка «Дизайн»; сравнение P0; «Исправления»;
history/snapshots; subdoc/ (write) |
Вкладка «Дизайн» добавлена в 5.3; сравнение документов — P0; термин
UI — «Исправления» (как в Word RU); снимки истории и
subdoc/ — дополнить 04-file-formats при реализации |
| 33 | Юридическая проверка ленты (market) | Задача фазы 0 для юриста: патенты Microsoft на ribbon (большинство истекли/истекают 2026–2027), программа Office UI Licensing закрыта; зафиксировать отличия реализации |