Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Time Traveller Laravel Package

conceptbyte/time-traveller

ConceptByte Time Traveller lets you freeze, shift, and travel through time in Laravel apps and tests. Mock now(), set custom timestamps, and verify time-dependent logic without waiting. Works with Carbon and PHP's DateTime, integrates with PHPUnit and Pest, and makes testing expirations, schedules,...

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • The package is a trait-based Eloquent extension ("time travel for your Laravel Models"), which is the idiomatic Laravel pattern: opt in per model, hook created/updated/deleted model events, write a snapshot row, expose a query scope to read state as of a timestamp. Conceptually that fits any Eloquent-based codebase.
  • The fit breaks on version era. A 2016-05 release targets Laravel 5.1/5.2 and PHP 5.5–7.0. It predates package auto-discovery (Laravel 5.5), so integration assumes manual providers/aliases registration in config/app.php.
  • The 0.215 score and 34 stars are consistent with a small, single-author utility rather than a framework-grade component. Treat it as a design reference, not a dependency.

Integration feasibility

  • Blocking issue is Composer constraint resolution, not code quality. A laravel/framework constraint of 5.1.*|5.2.* will not install against a modern Laravel without --ignore-platform-reqs or a fork — both of which push risk onto us.
  • Pre-5.5 packages also mean no Illuminate\Support\ServiceProvider auto-registration and, very likely, use of helpers removed or deprecated since (array_get, str_*, each()), which will fatal on PHP 8.
  • Unknown whether snapshots are stored as JSON or PHP serialize(). Serialized payloads are a deserialization/object-injection surface if any historical record is ever attacker-influenced; JSON is the only acceptable answer for us.
  • Key questions for the maintainer spike:
    • What exactly is persisted per write — full attribute set, dirty diff, or serialized model?
    • Does it capture soft deletes, casts, mutators, and relation state, or raw DB columns only?
    • Is there a restore/rollback path, or is it read-only historical query?
    • Where does actor/request context come from, if at all?
    • Is there a retention/pruning mechanism?
    • Test coverage and CI status (almost certainly none, given archive date).

Technical risk

  • Abandoned upstream: archived, no releases since 2016, no security response, no PHP 8 / Laravel 10+ compatibility. Adopting it means we own it permanently.
  • Event-listener collision: any other package hooking saved/deleted (auditing, activity log, search-index sync, cache invalidation) will interact with it; ordering is implicit and undocumented.
  • Schema drift: historical snapshots encoded against an old attribute set will not hydrate cleanly after migrations, casts, or column renames.
  • Data-protection exposure: indefinite retention of historical PII in a second table is a GDPR/CCPA finding waiting to happen, and this package almost certainly has no redaction or TTL story.

Integration Approach

Stack fit

  • Viable only if the target service is pinned to Laravel 5.1/5.2 and will stay there for the program's life. On Laravel 8+ — and certainly 10/11 — this is a no-go as a dependency.
  • If the requirement is "audit/history of model state" rather than literal time-travel, the maintained alternatives (owen-it/laravel-auditing, spatie/laravel-activitylog) cover ~80% of the need with active security patching.

Migration path (if we proceed)

  1. Fork into our VCS under an internal namespace; do not depend on Packagist.
  2. Lift composer.json constraints, add extra.laravel.providers for auto-discovery, replace deprecated helpers, add PHP 8 type/return compatibility.
  3. Add a minimal test suite around the event hooks and the as-of query scope — this is the deliverable that makes the fork ownable.
  4. Wrap the public API behind a thin internal interface (HistoryRepository / Snapshotter) so the package can be swapped without touching domain code.
  • Rough effort: 3–5 engineer-days for the fork and tests; ongoing ownership is the real cost.

Compatibility

  • Test explicitly for double-writes and event-order conflicts with whatever auditing, queue, and search packages are already installed. Two packages writing history rows is worse than one.
  • Verify behaviour under Model::withoutEvents(), saveQuietly(), bulk Model::insert(), and chunked updates — event-based history silently misses all of these.

Sequencing

  1. Sandbox spike: fork, upgrade, run against a staging schema; measure write overhead and row growth.
  2. Parallel evaluation of a maintained auditing package against the same requirements.
  3. Decision gate: adopt fork vs. maintained alternative vs. in-house snapshot table (~2 days of work and fully ours).
  4. Only after gate: define retention policy, redaction rules, and the as-of query contract before any production read path depends on it.

Operational Impact

Maintenance

  • Archived means we become the maintainer on day one. Budget a named owner and a recurring compatibility task every Laravel/PHP upgrade cycle. There is no upstream to defer to.
  • Bus factor is effectively 1 (original author, now inactive); community is 34 stars, so no de facto fork to inherit.

Support

  • No vendor, no SLA, no issue triage, README-only documentation. Incident response will be our engineers reading vendor source under pressure — acceptable for an internal utility, not for a component on a compliance-relevant path.

Scaling

  • Snapshot storage grows linearly with every write to every instrumented model. At even moderate write volume this becomes the largest table in the database within months.
  • Each save gains an extra INSERT inside the existing transaction — measurable latency and lock-hold increase on hot models.
  • No pruning mechanism means a manual retention job is mandatory, plus composite indexes on (model_type, model_id, created_at) and likely partitioning. Plan for this before launch, not after.

Failure modes

  • Silent miss: bulk writes, saveQuietly(), and raw query-builder updates bypass events — history is incomplete and looks complete, which is the worst failure shape for an audit feature.
  • Hydration failure after schema changes: old snapshots reference removed columns/casts.
  • Restore-path hazard: if a rollback exists, restoring an old snapshot can clobber newer concurrent writes; needs optimistic-lock semantics the package does not provide.
  • Storage exhaustion / unbounded growth taking down the primary database.
  • Compliance: retained historical PII with no redaction, no TTL, no deletion-propagation on subject erasure requests.

Ramp-up

  • Low to read — a mid-level Laravel engineer understands the trait and event hooks in under a day.
  • High to own safely — the cost is the test suite, retention policy, migration-compatibility discipline, and the upgrade treadmill, none of which ship with the package. That ownership cost, not the 34-star adoption risk, is the reason to prefer a maintained alternative or a small in-house table.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle
glavweb/extra-bundle
glavweb/api-bundle
glavweb/admin-bundle
adachsoft/api-version-bundle
elsayed85/laravel-api-exceptions
ouhssini/laravel-demo-mode
daworks/ncloud-outbound-mailer-driver
gp247/cms
ignibyte/aic-gates
nexa-merchant/blog
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
shitoudev/permissionmanager