spiriitlabs/commit-history-bundle
SpiriitLabs Commit History Bundle adds a simple Symfony interface for browsing your project's Git commit history. View commits, authors, dates, and messages directly in your app, making release notes and change tracking easier without leaving the admin.
What the package actually is. A Symfony bundle (Bundle class, DI extension, Doctrine entity, console command, Twig templates), MIT-licensed, 2 stars, latest release 2026-02-11. Its scope is narrow and single-purpose: read a git repository's log, persist commits, render them as a vertical timeline. There is no Laravel service provider, no Eloquent model, no Blade view, and no Laravel-facing API.
Architecture fit. For a Laravel product, near zero. Composer-requiring it means pulling Symfony's HttpKernel/DI and a Doctrine entity alongside Laravel's container and Eloquent — two runtimes, two migration systems, one feature. There are three honest options, in order of preference:
Integration feasibility. On Symfony 6/7 the effort is genuinely low: register the bundle, import routing, write one config file, generate/run the migration, run one import command. On Laravel, effort is medium-to-high if forced and low if reimplemented.
Technical risk.
git and a real checkout. proc_open is blocked in many hardened PHP images; shallow clones (--depth=1) silently produce a one-commit history that reads as "the importer is broken."Key questions.
/changelog, an in-app "what's new" panel, or an internal release feed? The UI choice drives everything downstream.Stack fit. Native to Symfony 6/7 + Doctrine + Twig. No first-class fit for Laravel 10/11 + Eloquent + Blade. Treat "Symfony bundle" as a hard constraint rather than an inconvenience to engineer around.
Recommendation. Default to build-the-slice for a Laravel product: an artisan command that shells out to git log --pretty with a fixed format, a small commits/releases table keyed on hash, a Blade partial, and a cache key. Comparable output, one less dependency, no cross-framework boundary.
Migration path. Effectively greenfield — there is no legacy changelog data to migrate. "Backfill" is simply running the importer over existing history once. If a sidecar is chosen, the data contract is a JSON feed; keep it versioned so the Laravel consumer is not coupled to the bundle's entity shape.
Compatibility checks before any spike. PHP constraint and Symfony version floor from composer.json; Doctrine DBAL/ORM version; git binary availability in the runtime image; CI checkout depth (fetch-depth: 0); whether the web user can read the repo path — a path that works in your shell usually does not work for www-data.
Sequencing (one sprint slice, timeboxed).
Maintenance. Small surface — one command, one route, one table, a few templates — but it is a real dependency: pin the version, read release notes each bump, and hand-review any regenerated migration against a vendor-owned entity. Never let Doctrine auto-ALTER a changelog table with real rows. The build-it-yourself path trades this for ownership of ~200 lines you fully understand; for a feature this small, that trade usually wins.
Support. Low user-facing ticket volume. The realistic failure is "the changelog looks stale or wrong," which is a trust problem rather than a support queue problem. Assign a named owner (platform/DevOps) for the import job and its schedule.
Scaling. Reads are trivially cacheable — cache the rendered page on the newest commit hash with an ETag and invalidate from the importer's post-run hook. Writes are O(commits) and negligible. The only real scaling hazard is running the importer per-request; it shells out to git and will dominate TTFB. Run it on deploy, or on a scheduled job (every 15 minutes is plenty) with a lock so workers cannot stampede.
Failure modes to design detection for.
git blocked or absent in the image; shallow clone yielding one commit; repo path unreadable by the runtime user.bin/console debug:router | grep -i commit after install and after every upgrade.Ramp-up. Half a day for a Symfony developer. For a Laravel-only team the ramp is not the bundle — it is the decision to write the parser and view yourself, which is roughly a day including a security review of sanitization and route exposure. Budget that day on either path.
Scope discipline. The cost of being wrong here is low because the feature is decorative — which argues for hard timeboxing and keeping it off any critical path. Do not let the "audit trail / compliance" framing in the supplied material expand scope: if the business genuinely needs accountability history over entity changes, this package is the wrong vehicle, and that decision belongs to a Laravel activity-log package or an event store, evaluated separately.
How can I help you explore Laravel packages today?