Repository navigation
MD.Scribe v3.1.0 — "Aurora"
Self-hosted documentation for a folder of Markdown files — with an editor, an admin panel,
full-text search and zero CDN dependencies. PHP 8.3, no database, no build step.
First release under the name MD.Scribe. Until 3.0.1 this project was published as
MD.Viewer; that repository still exists and is untouched. Same code, same contracts, new name
and new home — 3.1.0 is a rename release, not a rewrite: application behaviour is unchanged.
Install
Download MD.Scribe-3.1.0.zip below — it bundles vendor/, so Composer is not needed:
unzip MD.Scribe-3.1.0.zip -d /var/www/docs
chmod -R u+w /var/www/docs/storage
# docroot: /var/www/docs/public (recommended) or the project rootFrom a clone instead:
git clone https://github.com/paulmann/MD.Scribe.git /var/www/docs
cd /var/www/docs && composer install --no-dev --optimize-autoloaderOpen admin.php for first-run setup; the viewer works before that. Requirements: PHP >= 8.3
with mbstring, dom, libxml, json (curl + phar + zip recommended for the updater and
backup archives).
Why the name changed
The old name described only the reading half of what v3 became. This is a viewer, an editor, an
admin panel, a publisher and a search index — "Scribe" covers the whole where "Viewer" covered one
part. The practical numbers, measured on GitHub (in:name): 750 repositories match md-viewer and
686 match mdview, against 24 for md-scribe — which was also free on npm, free as a .dev
domain and unused in this account.
What is in 3.1.0
| Area | Change |
|---|---|
| Naming | Version::REPO / RAW_BASE / API_BASE and userAgent() point at paulmann/MD.Scribe |
| User-visible text | Window titles, admin header and login page, <meta name="generator">, footer, X-Powered-By, default SITE_NAME, console banner, bootstrap error messages |
| Packages | composer.json is now mdscribe/md-scribe; composer.lock content-hash recomputed and verified with composer validate --check-lock |
| Docs | README, docs/, content/ pages, LICENSE, and the deployment samples (Docker, nginx, Caddy, php.ini) |
| Manifest | config/manifest.json rebuilt: 921 files, app MD.Scribe, version 3.1.0 |
Fixed in the same release
The self-updater pinned a product name when unpacking a release archive — it looked for
glob('.../MD.Viewer-*'). An archive named after the repository (MD.Scribe-main/) would have
been rejected with "does not look like a release". It now accepts any <name>-<ref> directory
containing config/manifest.json, with a fallback for a flat archive.
.gitignore did not ignore vendor/ at all, so git add -A would have committed 723 dependency
files. Added as /vendor/; reproducibility is kept through the committed composer.lock.
Deliberately unchanged
- The PHP namespace
MdViewer\. It is an internal identifier shared by every class insrc/;
renaming it would touch every file for no user-visible gain and would break code that type-hints
these classes. - Every v2 compatibility contract:
md.php?file=…,&download=1,updater.php?update=?restore=,
the machine-API envelope{ok, action, version, steps, files, conflicts, errors}, per-directory
.md.inilayering,mdv_feat_*cookies, and the 14-layer path validator. - Historical references to v2 still read
MD.Viewer v2 …where they describe the previous
product (upgrade guide, changelog, compatibility notes). v2 was MD.Viewer. - Upgrading in place from 3.0.x works: the tracked file list and the API envelope are unchanged,
and.md.inikeys are the same —SITE_NAMEkeeps whatever value the installation already has.
Verified
php -lacross 110 PHP files outsidevendor/: 0 errors;node --checkon both committed
bundles: clean.- Served with PHP 8.5.0: home, themes catalogue and search API answer 200 and report
MD.Scribe 3.1.0 in<meta generator>;/admin.phpanswers Setup · MD.Scribe Admin;
a missing document answers 404;updater.php?action=status&format=jsonanswers
{"ok":false,…,"error":"unauthorized"}without a key — the v2 contract intact. - The release archive was unpacked and served before publishing;
Version::REPOinside it points
at the new repository. - PHPUnit and PHPStan were not run on the build machine: its
vendor/is a--no-devinstall,
so neither tool is present..github/workflows/ci.ymlruns lint, PHPStan level 6 and PHPUnit on
PHP 8.3 and 8.4 for every push.
Documentation
The wiki is being published at https://github.com/paulmann/MD.Scribe/wiki (22 pages: install
and deployment, the complete .md.ini reference, the Markdown extensions matrix, the self-updater
and machine-API guides, and the security hardening guide).
Full changelog: CHANGELOG.md