os2display/campaign-bundle
The os2display/campaign-bundle is a PHP package for the OS2Display digital signage platform that adds campaign management features, helping organize, schedule, and display campaign content across screens in OS2Display-based applications.
Architecture fit. The first thing to correct: this is a Symfony bundle, not a Laravel package. The -bundle suffix is Symfony's convention, and os2display is a Symfony/Doctrine digital-signage platform (Aarhus open-source lineage) composed of sibling bundles — core, screen, slide, template, media, campaign, admin, API. That changes the evaluation materially. It is also not a leaf/presentation-tier dependency. Campaign management is domain logic: a Campaign entity with scheduling windows, channel/screen targeting, and an override that suppresses normal playback while active. It sits alongside screen-bundle and slide-bundle and shares their entities. Any assessment that treats it as an installable asset-composition helper is wrong and would mis-scope the work.
Integration feasibility. There are exactly three viable postures, and they should be stated plainly to stakeholders:
Technical risk. Dominant risk is lifecycle, not code quality.
Key questions.
composer.json, and does it intersect a supported runtime we are willing to operate?Stack fit. Symfony + Doctrine + MySQL, administered through the platform's admin UI and exposed via its API bundle. If our stack is Laravel, the integration cost is not "add a Composer dependency" — it is "stand up a separate Symfony application." That is a programme decision, not a sprint task. Confirm the platform fit before any estimation.
Migration path.
2.1.0 exactly (no caret), vendor the source into our repo, verify sibling bundle versions resolve, run the campaign migrations against staging, and diff screen behaviour for one channel before enabling a second.Compatibility. Three axes to verify from source, not from release notes: (1) Symfony/PHP constraints against our runtime; (2) sibling bundle version ranges — campaign, screen, and core must move together; (3) database migrations, which on a live signage deployment cannot be rolled back casually. The "changed campaign icon" note is the one genuinely low-risk item here — an admin-UI asset — and should not consume assessment bandwidth relative to the coupling and lifecycle risks.
Sequencing. Resolve the posture question first; everything else is wasted if the answer is "reference only." Then, in order: pin and vendor; verify sibling resolution in a container; enable campaign override on a single low-stakes channel; instrument expiry; then broaden. Do not enable campaign override across a fleet until expiry behaviour has been observed through at least one full campaign window — that is the only way to prove the release path works.
Maintenance. There is no upstream maintenance. The realistic model is: we own the code the day we adopt it. That means a named owner, a fork in our namespace, a documented set of local patches, and a standing line item for Symfony/PHP compatibility work. If nobody will sign for that, do not adopt — use it as a reference and move on. MPL-2.0 makes the fork legally clean, which is the package's main remaining asset.
Support. None. Archived repository, no disclosed security process, no response history to evaluate. The nearest thing to support is "read the source." For a domain-tier component that can suppress all normal content on a screen fleet, that is a materially higher bar than it would be for a presentation-tier helper — a position the generic framing of this evaluation should not obscure.
Scaling. Server-side cost is modest: campaign evaluation is a lookup against active windows per screen/channel. Two things need checking in source. First, whether override resolution is cached per screen or recomputed on every player poll — signage fleets poll on short intervals, so an uncached join per poll multiplies quickly. Second, whether any campaign content is resolved from local disk; if so, multi-node deployment behind a load balancer breaks it and it must point at shared or object storage.
Failure modes.
Mitigations are concrete and cheap: pin the version, add a monitor that asserts no campaign has been active past its window, alert on scheduler heartbeat, and run expiry evaluation against a single authoritative clock source.
Ramp-up. For a Symfony-fluent developer, the mechanics are a day — install, migrate, register a channel, observe the override. The real ramp-up is domain onboarding: understanding how campaign override interacts with screen, channel, and slide resolution is the difference between a working pilot and a fleet incident. For a TPM, the meaningful ramp-up is governance, not API: until the posture question and the expiry-mechanism question are answered, any estimate presented to stakeholders is a guess. Carry explicit contingency, and be prepared to recommend against adoption if no long-term owner exists.
How can I help you explore Laravel packages today?