mobizel/markdown-docs-bundle
A Symfony bundle that turns plain Markdown files into a browsable documentation site. It handles routing, navigation menus, and Twig rendering, with configurable source paths and templates, so you can write docs in Markdown and let the bundle generate the pages.
Release delta (v0.13.0). The first release since 2022-04-20. Contents are maintenance-grade, not feature-grade: PHP 8.1 added to the test matrix (#107), a test-app Kernel fix for Symfony 6 (#111), a "Print action" (#112), removal of package.json/yarn.lock (#113/#114), removed Travis badge (#110), commented-out testing contexts (#115). Every PR is from the same contributor. No breaking changes, no deprecations, no security fixes, no changelog entries affecting the public API. Two findings matter for us: Symfony 6 is now explicitly exercised, which materially softens the Composer-conflict risk for a Laravel 10 host; and the project is alive but not developed — a heartbeat, not a revival. The core recommendation does not change.
Architecture fit. Low as a drop-in dependency. Despite the "Laravel/PHP package" framing, mobizel/markdown-docs-bundle is a Symfony bundle — the name and the Mobizel stack both point there. That means it ships a Bundle subclass, a DI Extension + Configuration tree, Symfony routing (YAML or attributes), Twig templates, and symfony/finder-based discovery of a docs directory. None of those primitives exist in Laravel's service-provider/Blade/routing model. As architecture, the fit is poor; as a reference implementation of "scan a folder of markdown, build a nav tree, render to HTML," the fit is decent — the domain logic is thin and portable. v0.13.0 does not touch this verdict.
Integration feasibility. The valuable core is small: a doc-tree scanner, a slug/route resolver, a markdown→HTML step, and a view layer. That is a 1–2 week extraction for one engineer. The blocker was not code volume, it was Composer gravity — and v0.13.0 improves that picture at the margin:
composer why-not friction is still the expected outcome there.The extraction effort estimate holds at 1–2 weeks.
Technical risk. Still high on sustainability, moderate on security. Revised on one axis:
../). Finder against symlinked trees can loop. v0.13.0 contains no security-related work, and there is still no advisory feed or disclosure policy.package.json/yarn.lock means the frontend build path is gone from the repo. If a downstream fork needs to restyle or rebuild assets, it must determine whether pre-built files ship in the release artifact or whether assets were dropped entirely. Worth one ls in the tarball, not more.Key questions to resolve before committing (Q4 now partly answered; Q7 new):
league/commonmark, parsedown, michelf/php-markdown)? Determines whether we keep parsing semantics or re-implement them.composer.json constraint string, and whether Symfony 7 / PHP 8.2+ are admissible.?print=1 variant, a PDF export? Cheap to port if it's a CSS/query-param variant; not worth it if it pulls a renderer dependency.Stack fit. Mismatched framework, matched language — unchanged by v0.13.0. A Laravel-native equivalent is roughly: league/commonmark (already present transitively in many Laravel apps), a Route::get('/docs/{page?}') controller, a Blade layout with a nav partial, a Finder/Storage scan, and a response cache. ~300–500 LOC on primitives the team already debugs daily.
Options, ranked:
| Option | Effort | Fit | Verdict |
|---|---|---|---|
| Reimplement, bundle as reference | 1–2 wks | Native | Recommended |
| Fork + port to a Laravel service provider | 2–4 wks | Good | Viable if nav semantics are rich; now marginally safer on Symfony 6 |
| Install alongside Laravel as-is | — | None | Not viable (Twig, bundle bootstrap) |
| Sidecar Symfony app behind a route | 2 wks | Poor | Overkill for static docs |
Compatibility. PHP 8.1 is now CI-proven; PHP 8.2/8.3 presumed fine but unverified. The real question remains the Symfony constraint set versus the host app's resolved symfony/* versions. Update to the check: run composer why-not against both Laravel 10 (Symfony 6) and the actual target version — on Laravel 10 this is now plausible rather than near-certain to fail; on Laravel 11+ expect failure. Twig output is still a hard no; views get rewritten regardless.
Sequencing. Largely unchanged, with the spike cheaper:
composer why-not against the target Laravel version, confirm parser and nav model, answer Q1–Q7. v0.13.0 does not shorten the reading — it answers one question for us.league/commonmark and nav is filesystem-derived, reimplement. If nav is config-driven and non-trivial, fork — accepting that the fork inherits a Symfony 6-era baseline.Maintenance. Revised framing: upstream is low-cadence and single-maintainer, not formally dead. The practical consequence is identical — treat any adoption as a fork, and the fork is yours — but the residual hope of upstream patches is now slightly higher for narrow issues (framework compatibility), and still near-zero for feature or security work. Inherited code surface stays tiny (single-digit classes), so carrying cost is low but non-zero. Budget a few hours per quarter for dependency bumps.
Support. No commercial support, no CVE feed, no maintainer SLA. v0.13.0 provides no evidence of a security-disclosure path being established. MIT still permits forking and internal relicensing, so legal risk is nil and continuity risk is entirely operational. Assign a named internal owner before starting — this is unchanged and remains the single most important operational control.
Scaling. Unchanged. Documentation traffic is near-static: rendered HTML cached per page keyed on file mtime, served from CDN, compute cost approaching zero. Two watch items: filesystem scans over hundreds of files at request time, and cold-cache rebuild storms after a deploy touching the docs folder. Compile-at-build remains the safer pattern for a large tree.
Failure modes to design against (none addressed by v0.13.0):
{page} → arbitrary file read; validate against the resolved tree, never raw input.Finder → request hangs.package.json removal means styling is now unbuilt or undocumented → unstyled print output.Ramp-up. Unchanged. A Laravel developer rebuilds this in a day or two with league/commonmark; no Symfony fluency needed on that path. Forking does require Symfony fluency (DI, config tree, bundle bootstrapping), which is scarce in a Laravel shop and is itself a reason to prefer reimplementation. Doc authors need a short convention brief (front-matter keys, nav ordering, image paths) either way.
TPM recommendation. Unchanged: treat this package as a design reference, not a dependency. v0.13.0 is housekeeping — a maintained CI matrix and a Symfony 6 fix, plus a minor print feature. It reduces integration friction for a Laravel 10 host by a notch and does nothing to address abandonment, security posture, or Twig coupling. The opportunity score (13.32) still reflects a niche, unproven idea rather than a weak one: the idea is sound, the artifact is not a dependency. Rebuild natively.
What would flip this recommendation: a Symfony 7 / PHP 8.3 constraint bump with an active release cadence (2+ releases per year), a security advisory process, or evidence of third-party production use (dependents > 0). Any one of those would justify reopening the fork option; none is present in v0.13.0.
How can I help you explore Laravel packages today?