boysfromthefactory/groundhog
Groundhog is a lightweight Laravel/PHP package from boysfromthefactory that simplifies recurring, repeatable work in your app. Drop it in, configure a few options, and keep repetitive logic clean, predictable, and easy to test. No extra dependencies.
Architecture fit
groundhog_occurrences table) to read-time expansion inside the database using JSON set-returning functions (json_each, JSON_TABLE, json_array_elements).Integration feasibility
groundhog-migrations, run php artisan migrate. The migration is idempotent and a no-op on fresh installs, which lowers first-install risk.materialized_until column are dropped, and groundhog.max_materialization_ahead is removed. Any application code, reporting query, export, BI connection, or admin screen reading those directly will break.max_occurrences_per_series semantic change is subtle: it now bounds occurrences per series per query (in-window only), while the save-time check is unchanged. Existing configured values may need retuning.Technical risk
RecurrenceNotSupported on drivers other than SQLite, MySQL, and PostgreSQL. Teams on MariaDB, SQL Server, or other Laravel-supported drivers lose the feature or need a fallback.max_allowed_packet) and statement timeouts.Key questions
groundhog_occurrences or materialized_until directly?max_occurrences_per_series is hit — truncation, silent omission, or exception? This needs confirmation before relying on the bound.Stack fit
JSON_TABLE (8.0.4+), PostgreSQL with json_array_elements, SQLite with JSON1 enabled.composer update fallout.Migration path
groundhog_occurrences, materialized_until, and groundhog.max_materialization_ahead.php artisan vendor:publish --tag="groundhog-migrations" and php artisan migrate in staging against a production-like snapshot.Compatibility
Sequencing
max_occurrences_per_series, default window sizes, and page limits; add caching or read-replica routing if latency is unacceptable.Maintenance
Support
RecurrenceNotSupported on unsupported drivers. Support and on-call runbooks need to recognize this exception and route it as a configuration/deployment issue, not a data issue.Scaling
Failure modes
RecurrenceNotSupported on any non-SQLite/MySQL/PostgreSQL driver.max_occurrences_per_series silently changing result completeness (behavior on bound exceeded must be confirmed).Ramp-up
How can I help you explore Laravel packages today?