Версия 3.1.0 по имени «Aurora» — это релиз смены вывески: проект MD.Viewer стал MD.Scribe, поведение не изменилось. Полезного в нём два: новое имя во всех местах, где его видит человек и сеть, и починка самообновлятора, который искал в архиве каталог по старому имени. Основной разбор платформы — в обзоре MD Viewer: просмотрщик Markdown без браузерного движка; здесь — что именно поменялось в MD.Scribe 3.1.0 и как это проверить.

md scribe 3 1 0 cover

TL;DR: что произошло

  1. Переименование, не переписывание. Код тот же, что в 3.0.1; меняются имена, тексты и манифест.
  2. Починен самообновлятор. Раньше он искал в архиве glob('.../MD.Viewer-*'), теперь имя берётся из репозитория.
  3. Пакет переименован в mdscribe/md-scribe, content-hash в composer.lock пересчитан.
  4. Архив самодостаточен: vendor/ внутри, Composer не нужен.
  5. Проверка: распаковать, открыть главную, /docs и admin.php.

Что нового

Область Изменение
Имена в коде Version::REPO, RAW_BASE, API_BASE, userAgent() указывают на paulmann/MD.Scribe
Видимый текст заголовки окон, шапка админки и страница входа, <meta name="generator">, футер, X-Powered-By, SITE_NAME по умолчанию, баннер в консоли
Пакеты composer.json — mdscribe/md-scribe; content-hash в composer.lock пересчитан и проверен
Документация README, docs/, страницы content/, LICENSE, примеры развёртывания (Docker, nginx, Caddy, php.ini)
Манифест config/manifest.json пересобран: 921 файл, приложение MD.Scribe, версия 3.1.0
Исправление самообновлятор больше не привязан к имени MD.Viewer-* при распаковке
flowchart TB
  PUB["docroot public: просмотр"] --> CORE["ядро: разбор Markdown"]
  ADMIN["admin.php: панель и редактор"] --> CORE
  CORE --> STORE["storage: кэш, бэкапы, индекс"]
  CORE --> VENDOR["vendor: зависимости в архиве"]
  UPD["updater.php: самообновление"] --> REPO["GitHub: релизы и манифест"]

Про причину переименования в заметках сказано прямо и с числами: старые имена заняты. Поиск по именам репозиториев на GitHub даёт 750 совпадений для md-viewer и 686 для mdview против 24 для md-scribe; заодно имя было свободно на npm и как домен .dev. Это не вопрос вкуса: чем меньше одноимённых проектов, тем легче найти нужный.

Ключевые изменения

flowchart LR
  OLD["MD.Viewer 3.0.1"] --> REN["переименование: код тот же"]
  REN --> NEW["MD.Scribe 3.1.0"]
  NEW --> CFG["config/manifest.json: 921 файл"]
  CFG --> DEP["развёртывание: архив с vendor"]
  DEP --> CHK["проверка: главная, /docs, admin.php"]
Что Было Стало
Имя приложения MD.Viewer MD.Scribe
Пакет Composer прежнее имя mdscribe/md-scribe
Поиск архива при обновлении glob('.../MD.Viewer-*') имя из репозитория
Манифест прежний 921 файл, версия 3.1.0
Метатег генератора MD.Viewer MD.Scribe

Главное техническое изменение — именно обновлятор. Ошибка была тихой: если архив назывался по репозиторию (MD.Scribe-main/), распаковщик не находил ожидаемый каталог и обновление не срабатывало. Такие ошибки опасны тем, что не ломают установку — просто «обновление не приехало», и никто не замечает.

Установка и обновление

unzip MD.Scribe-3.1.0.zip -d /srv/docs
chmod -R u+w /srv/docs/storage
# docroot: /srv/docs/public
# из клона
git clone https://github.com/paulmann/MD.Scribe.git /srv/docs
cd /srv/docs && composer install --no-dev --optimize-autoloader
Требование Значение
PHP 8.3 или новее
Расширения mbstring, dom, libxml, json
Рекомендуются curl, phar, zip — для обновлятора и архивов бэкапов
База данных не нужна
Сборка не нужна
Composer не нужен при установке из архива

Переезд с MD.Viewer не требует миграции: структура каталогов и контракты прежние. Практически это замена каталога с сохранением content/ и storage/.

Проверка после обновления

flowchart TD
  I1["главная отдаёт 200"] --> OK{"все проверки зелёные?"}
  I2["/docs открывается"] --> OK
  I3["admin.php ведёт на настройку"] --> OK
  I4["storage доступен на запись"] --> OK
  OK -- да --> DONE["готово к работе"]
  OK -- нет --> FIX["права, PHP-расширения, docroot"]
Проверка Ожидаемо
Главная отдаёт страницу HTTP 200 и заголовок с именем MD.Scribe
Раздел документации HTTP 200, тот же шаблон
admin.php без настройки перенаправление на первичную настройку
<meta name="generator"> содержит MD.Scribe
Запись в storage файлы создаются без ошибок прав

Замеры и цифры

Проверено 12.11.2026, двумя проверками.

Что Значение Как
Архив MD.Scribe-3.1.0.zip 3 327 231 байт, SHA-256 69cfbeb3…12a7a6b6 скачивание ассета релиза
Записей в архиве 945 файлов разбор zip
vendor/ внутри есть — Composer не нужен разбор zip
Манифест приложение MD.Scribe, версия 3.1.0, php_min 8.3.0, 921 файл config/manifest.json
Состав league 323, scrivo 299, nette 54, assets 46, Markdown 35 подсчёт по каталогам
Прогон на сервере PHP 8.5.4, расширения curl dom json libxml mbstring zip php -v, php -m
Главная HTTP 200, заголовок «Self-hosted docs, distilled — MD.Scribe» php -S + curl
/docs HTTP 200 curl
admin.php HTTP 302 — уводит на первичную настройку curl
MD.Scribe 3.1.0: архив, манифест и прогон на PHP 8.5

Отдельно про прогон: приложение поднималось встроенным сервером PHP на свободном порту и отдавало страницы без базы данных и без сборки. Это и есть главное свойство платформы — её можно запустить на голом PHP и убедиться, что она живая, за минуту.

Чего замеры не показывают: работы редактора, поиска и бэкапов в админке — для этого нужна первичная настройка и прогон сценариев, а это отдельная задача. И не проверялась совместимость с PHP 8.4 именно для этого релиза: на 8.5 работает, заявленный минимум 8.3.

Почему переименование — это работа

Смена имени выглядит как правка одной строки, но в проекте, который живёт три года, имя прошито в десятке мест.

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

Второе: видимый текст. Заголовки окон, шапка админки, страница входа, футер, метатег генератора, X-Powered-By. Мелочи, но именно по ним пользователь и поисковик понимают, что за продукт открыт.

Третье: упаковка. Имя пакета в composer.json, пересчёт content-hash в composer.lock — иначе composer validate ругается, а сборка зависимостей идёт по старым метаданным.

Четвёртое: документация и примеры развёртывания. Docker, nginx, Caddy, php.ini — всё это содержит имя в путях и комментариях, и устаревший пример хуже отсутствующего.

Пятое: манифест. Пересобрать config/manifest.json — иначе самопроверка покажет чужое имя приложения и неверную версию.

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

Совместимость

Параметр Значение
Минимум PHP 8.3
Проверено на 8.5.4
База данных не требуется
Веб-сервер любой, умеющий PHP-FPM или CGI
Docroot public/ (рекомендуется)
Сборка отсутствует
CDN не используется
Переход Что делать
С MD.Viewer 3.0.1 заменить каталог, сохранить content/ и storage/
С версий 2.x свериться с документацией: имя изменилось, контракты прежние
На новое имя репозитория обновить свои скрипты и ссылки, если они указывали на MD.Viewer

Подводные камни

  • Это не переписывание. Ждать новых функций от 3.1.0 не стоит: код тот же, что в 3.0.1.
  • Ссылки в ваших скриптах. Всё, что указывало на paulmann/MD.Viewer в API-запросах, надо перевести на новое имя — старый репозиторий существует, но обновляться не будет.
  • Манифест — это файл, а не база. config/manifest.json пересобран при выпуске; если правите состав вручную, версия в манифесте и в коде разойдутся.
  • Docroot. Открывать надо public/, а не корень проекта: иначе наружу уедут vendor, storage и конфиги.
  • Права на storage. Без записи в storage панель работает частично и ошибки не всегда очевидны.
  • Порт при локальном прогоне. Встроенный сервер легко запустить на занятом порту — и тогда вы смотрите на чужое приложение. Проверять надо заголовок и метатег, а не только код ответа.
  • Расширения не все обязательны. Без zip и phar обновлятор и бэкапы не работают, хотя просмотр при этом жив.
  • Имя и домен. Переименование в коде не переименовывает ваш домен; старые ссылки на сайт живут отдельно.

FAQ

Это новый продукт или переименованный старый?

Переименованный. Код совпадает с 3.0.1, меняются имена, видимый текст, упаковка и манифест.

Нужен ли Composer?

Нет, если ставить из архива релиза: vendor/ внутри. Composer нужен только при установке из клона.

Что именно исправлено в 3.1.0?

Самообновлятор искал в архиве каталог по имени MD.Viewer-*; теперь имя берётся из репозитория, и архив вида MD.Scribe-main/ распаковывается правильно.

Переезд с MD.Viewer сложный?

Нет: заменить каталог, сохранив content/ и storage/. Схема данных не менялась.

Какая версия PHP нужна?

8.3 минимум. Проверено на 8.5.4; обязательные расширения — mbstring, dom, libxml, json.

Почему переименовали?

Старое имя занято: по данным заметок к релизу, 750 репозиториев совпадают с md-viewer и 686 с mdview против 24 у md-scribe.

Итог

MD.Scribe 3.1.0 — аккуратный релиз смены имени: код тот же, но продукт перестал называться половиной того, чем стал. Ценное здесь — починка обновлятора, которая убирает тихий отказ самообновления, и самодостаточный архив на 3,3 МБ с vendor внутри. Проверка подтвердила: манифест честно говорит MD.Scribe 3.1.0 с 921 файлом, а приложение поднимается на PHP 8.5 и отдаёт главную, документацию и редирект на настройку — без базы данных и без сборки.

Цитата: Хорошее переименование не меняет поведение — оно меняет только то, как продукт находят.

Связанные материалы

LLM Summary

  • Тема: MD.Scribe 3.1.0 «Aurora» — релиз переименования бывшего MD.Viewer.
  • Суть: код тот же, что в 3.0.1; меняются имя приложения, пакета Composer, видимые тексты, метатег генератора, документация и манифест.
  • Исправление: самообновлятор искал в архиве каталог по шаблону MD.Viewer-*; теперь имя берётся из репозитория, архив MD.Scribe-main/ распаковывается корректно.
  • Пакет: composer.json — mdscribe/md-scribe, content-hash в composer.lock пересчитан и проверен.
  • Манифест: config/manifest.json — приложение MD.Scribe, версия 3.1.0, php_min 8.3.0, 921 файл.
  • Проверено 12.11.2026: архив MD.Scribe-3.1.0.zip — 3 327 231 байт, SHA-256 69cfbeb3…12a7a6b6, 945 записей, vendor/ внутри; состав — league 323, scrivo 299, nette 54, assets 46, Markdown 35.
  • Прогон: на сервере PHP 8.5.4 с расширениями curl dom json libxml mbstring zip; встроенный сервер PHP: главная — 200 с заголовком «Self-hosted docs, distilled — MD.Scribe», /docs — 200, admin.php — 302 на первичную настройку.
  • Требования: PHP ≥ 8.3, mbstring, dom, libxml, json; curl/phar/zip рекомендуются; база данных и сборка не нужны.
  • Грабли: docroot должен быть public/; нужна запись в storage/; при локальном прогоне легко попасть на занятый порт и увидеть чужое приложение.
  • Не проверялось: работа редактора, поиска и бэкапов в админке; совместимость именно с PHP 8.4.
  • Ссылки: https://github.com/paulmann/MD.Scribe, https://sysadministrator.ru/md-viewer/

Промт для агента (установка и настройка)

Готовый промт: скопируйте блок целиком. Источник шагов — README.md репозитория MD.Scribe (файла AGENTS.md в релизе нет, проверено по архиву 3.1.0), сверено с прогоном на PHP 8.5.

Задача: развернуть MD.Scribe 3.1.0 из архива релиза и проверить, что просмотр, документация и первичная настройка работают.

Материалы:
- репозиторий: https://github.com/paulmann/MD.Scribe
- README: https://github.com/paulmann/MD.Scribe/blob/main/README.md
- релиз и архив: https://github.com/paulmann/MD.Scribe/releases/tag/v3.1.0
- обзор платформы: https://sysadministrator.ru/md-viewer/

Шаг 1. Скачать MD.Scribe-3.1.0.zip из релиза, распаковать: unzip MD.Scribe-3.1.0.zip -d /srv/docs
Шаг 2. Выдать права на запись: chmod -R u+w /srv/docs/storage
Шаг 3. Направить docroot на /srv/docs/public — не на корень проекта.
Шаг 4. Проверить PHP: версия >= 8.3, расширения mbstring, dom, libxml, json; желательно curl, phar, zip.
Шаг 5. Открыть главную — ожидается 200 и заголовок с именем MD.Scribe; проверить <meta name="generator">.
Шаг 6. Открыть раздел документации — ожидается 200 и тот же шаблон.
Шаг 7. Открыть admin.php — ожидается перенаправление на первичную настройку.
Шаг 8. Пройти первичную настройку, проверить запись в storage и создание бэкапа.
Шаг 9. Если переезжаете с MD.Viewer: сохранить content/ и storage/, заменить остальное.

Запрещено:
- открывать наружу корень проекта вместо public/ — уедут vendor, storage и конфиги;
- ставить из клона без composer install --no-dev;
- считать успешным локальный прогон, не сверив заголовок страницы: на занятом порту отвечает чужое приложение;
- менять config/manifest.json вручную: версия в манифесте и коде разойдутся;
- опираться на старое имя репозитория MD.Viewer в скриптах обновления;
- публиковать наружу .env и данные storage.

Что считать успехом: главная и документация отдают 200, admin.php ведёт на настройку, запись в storage работает, метатег генератора содержит MD.Scribe, бэкап создаётся.