eminos/statamic-video-tools
Statamic Video Tools is an add-on for embedding and managing videos in your Statamic site. It provides video fieldtypes, responsive embed output, and handy template helpers for YouTube, Vimeo, and other sources, making video content easy to add and display.
Scope correction: despite the Laravel/PHP framing, this is a Statamic addon, not a framework-agnostic Laravel package. It only delivers value if the target application is (or will be) a Statamic site. For a plain Laravel app, this is effectively a decision to adopt Statamic first — a much larger commitment than a composer require. That distinction should be settled before any further evaluation is done.
Architecture fit: The design is sound for self-hosted, privacy-sensitive video. Encoding, transcription, thumbnailing, and streaming packaging all happen in-process on infrastructure the team already controls, driven off Statamic's asset pipeline and queue. The {{ video }} tag and <x-video> component mean presentation is a first-class concern rather than something the team builds from scratch, and the CP fieldtype keeps operators out of the CLI. The published VideoConversionCompleted / VideoAssetProcessed events are the right seam for cache busting and downstream automation — this suggests the authors understand that encoding is asynchronous and that the rest of the app needs to react to state changes rather than poll.
Integration feasibility: Straightforward on a Statamic stack — install, configure presets, ensure ffmpeg and whisper.cpp binaries plus a model file are present on the worker hosts, and point the queue at the conversions. On anything else, feasibility collapses to "rewrite or port."
Technical risk (ranked):
ffmpeg and whisper.cpp must be installed, versioned, and kept present on every worker host. This is a real departure from the "composer install and go" expectation most Laravel teams have, and it interacts badly with ephemeral/serverless compute and with autoscaling worker pools built from a stock PHP image.ffmpeg and to a model runner is a known class of risk (crafted files, option injection, resource exhaustion). Presets must be developer-controlled, not CP-editable by non-admins.Key questions for the maintainer:
whisper.cpp get installed in a containerized deploy — is there a documented Dockerfile?Stack fit: Only a fit for Statamic sites on Laravel. If the product is not on Statamic, stop here — the correct next step is evaluating a standalone encoding layer (e.g. a queue-driven ffmpeg wrapper plus a transcription service), not this addon.
Migration path: Greenfield for this addon (v1.0.0), so there is no data migration. The real migration is operational: replacing an existing third-party transcoding service (Mux, Cloudflare Stream, Transcoder API) with self-hosted encoding. That means backfilling poster/thumbnail renditions and, if desired, existing HLS ladders — or, more pragmatically, leaving legacy assets on the old provider and applying this only to new uploads. Recommend the latter for the first release; bulk re-encoding is a separate project with its own cost model.
Compatibility: Unverified. Confirm PHP and Statamic versions against the app's locked constraints before scheduling work. Confirm the queue driver — this addon assumes a real worker (redis/database + supervised queue:work), not sync, and will not behave acceptably on sync in any environment with real video.
Sequencing:
ffmpeg with AV1 and HEVC encoders present, whisper.cpp compiled, model file staged. This is the single highest-risk step and should be timeboxed first.Maintenance: Two native dependencies to track and patch (ffmpeg, whisper.cpp) plus periodic Whisper model updates, on top of the addon's own upgrade cadence. That is meaningfully more maintenance than a SaaS transcoder, where the vendor absorbs codec churn. Assign clear ownership — this tends to rot quietly when the person who set it up moves on.
Support: Support burden shifts in character: fewer "vendor outage" tickets, more "my video is stuck at 40%" tickets. The CP status fieldtype with live polling and per-preset re-run buttons materially reduces this — operators can self-serve a retry without a developer. Budget supporting documentation for the retry workflow and for what "failed" means per preset.
Scaling: Scales by adding queue workers, but only if the workers can encode efficiently. Three practical limits: (1) CPU-only AV1 is expensive enough that encode time may exceed upload cadence at moderate volume; (2) storage grows multiplicatively per asset (5 formats + HLS segments + poster + thumbnails, and roughly double for alpha assets) with no built-in retention policy mentioned; (3) transcription competes for the same CPU as encoding, so a burst of uploads can starve both. Recommend a dedicated queue for video work and a dedicated queue for transcription so a slow Whisper job never blocks a time-sensitive encode.
Failure modes to instrument before launch:
ffmpeg or whisper.cpp missing/not on PATH on a newly autoscaled worker — fails silently per job.<video> element.Ramp-up: Low for content editors — the tag/component and CP fieldtype are self-explanatory, and preset conditions hide the complexity. Moderate for the implementing developer: they need working fluency in codec/container tradeoffs, HLS ladder design, alpha-channel handling across Safari vs Chrome/Firefox, and queue-based media pipelines. This is not a "read the README over lunch" integration; plan for a spike and a proof of concept before committing to a delivery date. The documentation file is the primary onboarding asset and should be reviewed for completeness on install, presets, and troubleshooting before the team depends on it.
How can I help you explore Laravel packages today?