rich-id/terms-module-chromium-bundle
A Laravel package that bundles the Terms module with Chromium support, making it easy to install and manage term-related features in your PHP applications. It provides the module scaffolding and required Chromium assets so terms pages render reliably with minimal setup.
The package now identifies itself as a Chromium Generator (v1.0.0, "Initial version"). That reframes what the bundle is for: it is more likely a generator module in the rich-id ecosystem (code/scaffold generator, or a headless-Chromium-backed generator) than a runtime "render the terms page" helper. Read the source before assuming either way — the terms-module prefix in the package name is now much weaker evidence of the package's actual job than the v1.0.0 release note.
Install and pin the exact tag first:
composer require rich-id/terms-module-chromium-bundle:1.0.0
There is still only this one release and no downstream users to copy fixes from. Pin now; don't let Composer float you onto a hypothetical 1.1.0.
Read composer.json for two things, not one. First, Laravel/PHP constraints (as before — do not assume Laravel 11/12 works). Second, what the generator actually depends on: symfony/panther, spatie/browsershot, chrome-php/*, a Twig/Blade stub directory, or nothing at all. That require block is the fastest answer to "is this a headless-browser wrapper or a code scaffolder?"
Locate the generator entry point. Grep the source for Generator, generate(, class Chromium, and any Contract/Interface. In v1.0.0 there is likely a single ChromiumGenerator class with one or two public methods. That method signature is the entire API surface.
Smoke test with the smallest possible input — a single string or array in, an artifact out (generated file, HTML string, PDF, or class file). Do this on a known-good input before wiring it into a controller. You are not debugging your app yet; you are debugging whether Chromium launches, templates resolve, and output lands somewhere.
Confirm where output goes. If it writes to disk, verify the path is not inside vendor/. If it returns a string, verify the string actually contains what you expect. This is your integration contract for everything downstream.
The v1.0.0 note confirms this is a generator, so the working pattern is: call it from a service you own, treat the output as an artifact, and never call it inline on a request that needs to respond quickly.
App\Contracts\TermsGenerator with a Chromium implementation that delegates to the package. When the package is abandoned (single release, zero stars — assume it will be) you swap one binding, not every call site.GenerateTermsJob, return a job ID to the caller, and expose a status endpoint. This is the single biggest architectural decision — make it before the first real invocation, not after.cache()->remember('terms-gen:' . sha1($input) . ':v1.0.0', $ttl, fn () => $generator->generate($input)). Include the package version in the key so a future upgrade doesn't serve stale artifacts.Storage::disk('terms')->put($path, $result). Keeps the package's output path out of your public tree unless you deliberately expose it, and makes cleanup / re-generation straightforward.config/terms-chromium.php (adjust name to what publishes). Any hardcoded binary path you find in the source is a bug waiting to happen in Docker.config('features.chromium_generator') so you can turn it off without a deploy if it starts failing in production.require and any repositories entry), reimplement it. A v1.0.0 with no users is cheap to fork and cheap to replace.PATH, --no-sandbox if it runs as root in Docker, and enough shared memory (--shm-size=1g or --disable-dev-shm-usage). Budget that into infra work, not application work.fonts-liberation (or equivalent) in the image and verify output inside the container.memory_limit high enough for the worker, and put a retryUntil / maxExceptions on the queued job. A hung Chromium process is a hung queue worker.php artisan config:cache silently drops config values the generator reads lazily from boot(). First debugging step for "it worked yesterday" is still php artisan config:clear.php artisan route:list | grep -i terms before assuming the namespace is yours.error_reporting(E_ALL) and watch the log — dynamic properties and Serializable are the usual suspects.terms-module prefix may now be misleading. The v1.0.0 note describes a generator, not a terms renderer. Do not wire it in assuming it renders a terms page. Confirm by reading the main class before writing any Blade view against it.repositories.vcs in composer.json) the first time you need a patch, and pin the fork by commit SHA in composer.lock.How can I help you explore Laravel packages today?