martin-georgiev/social-post
Social Post is a Laravel package for publishing content to multiple social networks from a single API. Compose a post once and share it to Facebook, Twitter/X, LinkedIn and more, with a clean, framework-friendly interface for managing cross-platform social updates.
Architecture fit. martin-georgiev/social-post is a thin abstraction layer: a manager/driver construct that resolves a per-network driver from Laravel config and exposes a single "publish a status update" call. That shape is idiomatic Laravel (service provider + publishable config + facade) and is the right pattern for centralised publishing. The problem is the abstraction boundary. In 2018 all three networks could be reasonably modelled as "140–280 characters plus a link." Today they diverge on media (required for reach), threading, organisation vs personal identity, mention/link syntax, and scheduling semantics. A single normalised payload will inevitably be bypassed by per-driver payload builders, at which point the package contributes config plumbing and little else.
Integration feasibility. Low for composer require, moderate for a fork. A package last released 2018-08-02 and archived upstream will almost certainly carry php: ^7.0 and illuminate/support: ~5.x constraints, Guzzle 6, and pinned third-party SDKs — all of which block a clean install on PHP 8.2+/Laravel 10–11 without --ignore-platform-reqs hacks. Feasibility improves sharply if we treat the repo as a reference implementation and interface spec rather than a dependency.
Technical risk — high.
ugcPosts/r_liteprofile (OpenID Connect identity, Posts API, restricted share endpoint). X/Twitter has effectively retired v1.1 write paths in favour of v2 with paid access tiers and revised media upload. None of this is patchable from upstream.Key questions before committing.
Stack fit.
| Dimension | Package baseline (expected) | Our target | Verdict |
|---|---|---|---|
| PHP | 7.0–7.2 | 8.2/8.3 | Blocking |
| Laravel | 5.x | 10/11 | Blocking |
| HTTP | Guzzle 6 | Guzzle 7 / Laravel HTTP client | Blocking |
| Twitter/X | v1.1 + OAuth 1.0a | v2 write, OAuth 2.0 PKCE + OAuth 1.0a for media | Rewrite |
| Graph ~v3/v4 | Current Graph, Page access tokens | Rewrite | |
v1/v2 ugcPosts |
Posts API + OpenID Connect | Rewrite | |
| Queueing/retries | Synchronous, ad hoc | Queued jobs, backoff, idempotency | Build |
Migration path — four options, ranked.
SocialPost contract and config ergonomics, rebuild the drivers on current platform APIs behind Laravel's HTTP client and queue. Recommended — preserves the package's one genuinely good idea (a uniform publishing contract) and discards the unmaintainable half.Sequencing.
PartialSuccess state and per-network outcome list. This is the deliverable we keep from the package.Maintenance. We become the maintainer. Budget roughly 0.2–0.25 FTE steady state for token handling, error triage and dependency hygiene, with 1–2 week spikes whenever a platform ships a breaking change — Meta on a near-annual version cadence, LinkedIn one to two times a year, X unpredictably. Upstream is archived and effectively has no maintainer, so there is no "wait for a fix" path; every incident is ours.
Support. No vendor, no SLA, and a 10-star community means no realistic third-party answers. This is a bus-factor-1 pattern: the engineer who understands the drivers must document them or the whole capability becomes unmaintainable. Contrast with a bought aggregation service, which moves this to a support contract.
Scaling. Publishing is I/O-bound fan-out with per-network quotas, not a throughput problem — a queue with per-network rate limiters and concurrency caps is sufficient for typical volumes. The non-obvious costs are (a) token lifecycle for every connected account, which grows linearly with tenants, (b) media upload, which is a separate multi-step protocol on X and LinkedIn, and (c) idempotency, because retries on a partially-completed publish will produce duplicate posts on networks that succeeded.
Failure modes to design for explicitly.
Ramp-up. One engineer, roughly one week to fully understand the package and produce the gap analysis; two to three weeks per driver to bring to production quality including auth, media and tests; plus platform review lead times that we do not control. Net: this is not a "drop in a package" task. It is a 6–10 week capability build where the package supplies a naming convention and a config file. The honest recommendation is to keep the interface idea, source the drivers from current APIs or a paid aggregator, and avoid inheriting an archived dependency into a codebase we intend to maintain.
How can I help you explore Laravel packages today?