jeremykenedy/slack
Laravel package for Slack integration, letting your app send messages and notifications to Slack channels, often via incoming webhooks. Useful for alerts, error logging, and activity updates from Laravel applications.
Architecture fit. jeremykenedy/slack is a thin convenience wrapper — a Laravel service provider, config file, and facade that POSTs a payload to a Slack incoming webhook. It solves a problem that the framework now solves natively: laravel/slack-notification-channel (first-party, actively maintained) plus the Notifier/Notification facade covers the same surface with retries, queueing, and block-kit formatting. Architecturally this is compatible but redundant for anything on Laravel 9+. The only defensible fit is a legacy application already pinned to Laravel ≤8 where the wrapper is already in place and rewriting has no product value.
Integration feasibility. Low engineering effort: composer require, publish config, set a webhook URL in .env, call Slack::send(). A developer completes a first successful message in under an hour. The real gate is dependency resolution, not code — with a last release of 2020-12-21, its illuminate/support constraint is likely ^5.0|^6.0|^7.0|^8.0. On Laravel 10/11/12 that constraint will block installation outright or force --with-dependencies gymnastics that destabilize the lockfile. This must be verified against our actual composer.json before any estimate is trusted, since the package metadata we have is incomplete.
Technical risk.
Key questions to resolve before committing.
illuminate/* and php constraints are in its composer.json, and does it install cleanly on our target framework?Stack fit. Adopt only if we are on Laravel ≤8 and already sending Slack messages through it. For Laravel 9+, the correct answer is laravel/slack-notification-channel — first-party, version-locked to the framework, and covered by Laravel's release cadence. That is the recommendation to take to the team, with this package positioned as the legacy path, not the default.
Migration path. Do not let call sites depend on the package facade directly. Introduce a one-method internal contract (SlackNotifier::send(string $channel, string $message)) and bind the package behind it. Swapping implementations then becomes a container binding change plus a parity test, not a refactor. Move the webhook URL into config/services.php (services.slack.webhook) so credentials handling survives the migration, and treat the old config/slack.php as transitional.
Compatibility and verification. Pin an exact version — never a caret range on an unmaintained package. Run composer why-not, composer audit, and a clean install in a throwaway branch against the production PHP/framework matrix. Confirm PHP 8.2/8.3 behavior explicitly; deprecation notices in a shared logger can become noise that hides real errors.
Sequencing.
Http::post() or go straight to the first-party channel.Http::fake().Maintenance. Effectively zero upstream. Budget for us owning it: vendor/fork into our repo if we keep it, or accept a pinned, frozen dependency with a scheduled review date. Assign an explicit owner — unowned pinned dependencies are how framework upgrades slip a quarter.
Support. Community-only, no SLA, no security feed. Contrast with the first-party channel, where Laravel's support window and security policy apply. For an internal-notifications use case that is tolerable; for anything customer-adjacent or compliance-relevant it is not.
Scaling. Slack incoming webhooks are rate-limited (roughly 1 message/second per webhook with limited bursts) and return HTTP 429 beyond that. A synchronous Slack::send() in a request path adds Slack's latency to user-facing responses and will time out under Slack degradation. All sends must go through a queued job with retry/backoff and a dead-letter path; the package itself almost certainly does not provide this. Fan-out to many channels means many webhooks — plan credential management accordingly rather than treating one URL as a broadcast channel.
Failure modes.
Each of these is cheap to mitigate (queue + retry + failure metric + pinned version) and expensive to discover in production.
Ramp-up. Negligible for any Laravel developer — the wrapper is a handful of methods and the config is self-explanatory. Documentation is thin, but the abstraction layer we add is the real reference. Onboarding cost is roughly an hour; the meaningful cost is the institutional knowledge that this dependency is frozen and owned by us, which needs to live in the repo README, not in someone's head.
How can I help you explore Laravel packages today?