nucleos/shariff-bundle
Symfony bundle that integrates Shariff, the privacy-friendly social sharing buttons. Adds share buttons for popular networks without tracking users, with configurable services, templates, and styling. Easy to install and customize for Symfony applications.
Architecture fit — poor, with a fundamental mismatch. nucleos/shariff-bundle is a Symfony bundle, not a Laravel package. It ships Symfony-specific integration machinery: a DependencyInjection extension with a Configuration tree, service definitions wired to Symfony's container, a Twig extension, and a controller route for the Shariff share-count endpoint. Laravel has no bundle/container-extension equivalent — package discovery, config publishing, and routing are entirely different idioms. Nothing in this package can be composer required into a Laravel app and "just work."
What it actually does. Shariff (originally from Heise) is a privacy-preserving social share button set: buttons render client-side, and share counts are fetched server-side through a proxy endpoint so the visitor's browser never talks to Facebook/X/etc. The bundle is a thin Symfony adapter over the underlying heise/shariff PHP library — it registers the backend service, exposes a counts endpoint, provides config for the enabled networks, and injects the frontend assets. The genuinely reusable value is small: a service list, a route, and a Twig/Blade partial.
Technical risk — high, and disqualifying as a direct dependency.
Key questions for the requester:
Verdict: Not recommended for adoption. The bundle is unusable in Laravel, unmaintained everywhere, and its core capability is available more cheaply through the upstream JS assets plus a small in-house endpoint if counts are truly required.
Stack fit — none as packaged. A Laravel integration would be a reimplementation of the bundle's responsibilities, not an installation of it. Concretely, a Laravel-native equivalent needs only: a config file listing enabled networks, a single controller action that proxies count requests through the heise/shariff backend, a cache layer in front of it, a Blade component that emits the Shariff markup and loads the static assets, and a route registration in a small service provider. That is a day or two of work and yields code the team owns outright.
Migration path. Treat this as an extraction, not a port:
resources/ (or publish via Vite). No PHP dependency, no maintenance burden beyond the asset refresh.heise/shariff PHP library behind a Laravel controller — check its PHP constraint compatibility against the target Laravel version before committing — or (b) write per-network count fetchers directly for the two or three networks that still expose counts, which is likely less code than reconciling a stale dependency.Compatibility notes. The underlying library's PHP constraint is the gate. If it pins ^7.3 || ^8.0, it may install alongside a modern Laravel, but you inherit unpatched code on a supported runtime — acceptable only for an isolated, cached, read-only proxy. Do not let it into the dependency graph of anything that handles authentication or user data. Where the underlying library is the blocker, skip it entirely and implement the fetchers.
Sequencing. Spike the underlying library's installability (half a day) → confirm network coverage against current API reality (half a day, mostly desk research) → decide build vs. drop counts → implement assets + endpoint + cache → wire into templates behind a feature flag. Total realistic effort: 2–4 days including the discovery, which is a small fraction of the cost of owning an abandoned third-party dependency.
Maintenance — the dominant cost, and it falls entirely on us. There is no upstream to receive fixes from: archived, four stars, zero dependents, last release December 2021. Any adoption is a permanent fork with an implicit "we are the maintainers" commitment. The bundle's own code is trivial; the liability is the surrounding surface — the count-fetching backends, their auth and rate-limit behavior, and the PHP version treadmill.
Support. None. No issue triage, no CVE response, no upgrade guidance. Internal documentation and a named owner are prerequisites, not nice-to-haves. Given the small code volume, the honest operational posture is "we wrote this ourselves and cite the bundle as prior art," which is a healthier position than "we depend on it."
Scaling. The endpoint is I/O-bound and trivially cacheable, so scaling is a caching problem, not a compute problem. Two constraints dominate: (1) upstream rate limits — an uncached endpoint will fail under any real traffic, and network per-request fan-out multiplies the exposure; (2) request amplification — one page view can trigger N network calls, so the cache key must be per-URL and the fetch should be non-blocking or pre-warmed. Keep the proxy off the render critical path; render buttons immediately and let counts populate asynchronously or from cache only.
Failure modes to design for:
Ramp-up. Low for the code — a mid-level engineer can read the whole surface in an afternoon, and the Laravel-native reimplementation is straightforward. The non-obvious ramp-up is domain knowledge: which networks still expose counts, what the privacy/compliance requirement actually demands, and how counts should degrade. That knowledge lives with whoever owns the feature, and it needs to be written down, because the abandoned package will not teach it to the next engineer.
Bottom line for a TPM: the build-vs-buy math is inverted here — "buy" means adopting an unmaintained dependency with zero community and then owning it forever, while "build" is a two-to-four-day task using the same upstream assets. Budget the small build, credit the bundle as reference material for markup and config semantics, and do not add it to the dependency graph.
How can I help you explore Laravel packages today?