Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Bearychat Laravel Package

laravel-notification-channels/bearychat

Send Laravel notifications to BearyChat with this channel driver. Post messages to BearyChat webhooks through Laravel's built-in notification system, keeping your team chat in sync with app events using a simple, familiar API.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. This is a textbook laravel-notification-channels driver and nothing more: a single BearyChatChannel implementing Laravel's NotificationChannel contract, a BearyChatMessage value object with a shallow fluent builder (text(), markdown()), and an incoming-webhook POST. Roughly 150 lines total. It slots into Laravel's existing notification pipeline cleanly — via() returns 'bearychat', the notification class exposes toBearyChat(), and routeNotificationForBearyChat() gives you per-notifiable routing. No models, migrations, service providers beyond the standard channel registration, or background infrastructure. From an architecture-review standpoint that's a positive: the integration surface is small enough to reason about completely in one sitting.

Integration feasibility. The code is easy; the Composer resolution is not. An archived repo with zero dependents and no maintainers means no illuminate/* or guzzlehttp/guzzle constraint bumps for Laravel 10/11/12. Expect composer require to conflict, and treat --ignore-platform-reqs or constraint pinning as the signal to stop depending and start vendoring. Time-to-first-notification is genuinely 15–30 minutes after you've resolved the dependency question — budget the resolution as the real task, not the code.

Technical risk. Four concrete risks, in priority order:

  1. Unmaintained upstream. No security advisories, no non-2xx handling fixes, no PHP/Guzzle version support. You become the maintainer the moment you ship it.
  2. Silent delivery failure. Laravel's HTTP client only throws on explicit throw()/throwIf(). If send() doesn't check response status, a 400/401/403 completes "successfully" and the notification vanishes. This must be verified in source before adoption, not assumed.
  3. Webhook URL as credential. The URL grants post rights to the channel. Laravel serializes notification data into failed_jobs, so the URL lands in your jobs table unless scrubbed — an easy audit finding.
  4. Message surface is smaller than stakeholders assume. No attachments, buttons, threading, or read receipts. Confirm in BearyChatMessage.php before anyone designs a notification around rich cards.

Product-level risk sits on top of these: BearyChat is a niche, apparently declining platform. Any request to integrate should be treated as a named, customer- or team-specific deliverable, not a platform feature to productize.

Key questions.

  • Who is the named engineer accountable for this channel after day one?
  • Does BearyChatChannel::send() throw on non-2xx, or do we wrap it?
  • Do we take the dependency at all, or vendor the two files under MIT immediately?
  • Is BearyChat a requirement (existing team/customer standard, on-prem webhook target) or a preference that a maintained Slack/Teams channel satisfies at the same cost?
  • Does this sit anywhere near an on-call or paging path? If yes, the commercial trajectory of the upstream platform disqualifies it as a hard dependency.
  • Does security/compliance review apply? An archived package in the dependency graph is a recurring finding; a vendored ~150-line channel you own is a much shorter conversation.

Integration Approach

Stack fit. Purely additive to the Laravel notification stack. It assumes queued notifications, the HTTP client, and config-driven webhook storage in config/services.php + env('BEARYCHAT_WEBHOOK'). There is no database footprint, no event sourcing, no queue topology change beyond adding a dedicated queue name. It composes with existing notification classes without touching them.

Migration path — vendor, don't depend. The defensible path is to copy BearyChatChannel and BearyChatMessage into app/Notifications/Channels/BearyChat, retain the MIT copyright header, pin constraints to your supported PHP/Laravel ranges, and delete the Composer dependency. This is the primary migration decision and it should be made up front, not after a failed composer require. Rationale: zero maintainers, no upgrade path, and you will read the source to debug it anyway — at this size, owning it is cheaper than the dependency review.

Compatibility. Before writing code, run composer show laravel-notification-channels/bearychat --all and read composer.json constraints against your PHP/Laravel versions. Expect conflicts on modern Laravel. If you vendor, this step becomes a one-time port rather than a recurring upgrade negotiation. Also verify the HTTP client usage matches your Laravel version's Http facade API.

Sequencing. The order matters because each step de-risks the next:

  1. Read src/BearyChatChannel.php and src/BearyChatMessage.php (10 minutes — it's the whole package). Check status handling and the exact payload fields emitted.
  2. curl the webhook directly with a {"text":"hello"} body. If that fails, the problem is endpoint or egress, not code.
  3. Vendor the two files, drop the Composer dependency, keep the MIT header.
  4. Wrap send() with Http::timeout(10)->retry(3, 200)->post($webhook, $payload)->throw() if status isn't already checked.
  5. Ship one low-stakes notification (deploy finished, CI failed, cron missed) to validate rendering and the webhook contract in a channel nobody pages on.
  6. Add Http::fake() contract tests asserting the payload shape and destination URL.
  7. Introduce an internal ChatChannel/ChatMessage abstraction only when a second chat destination (Slack, Teams, DingTalk, Feishu) enters scope — not before.
  8. Register a NotificationFailed listener filtering on channel === 'bearychat', logging notification class but never the webhook URL.

Estimating the roadmap. The pattern is the reusable asset, not the package: channel class + send(), fluent message builder, routeNotificationFor*() hook. That lets you size each additional chat channel at roughly 0.5–1 dev-day and defend it in planning. The archived-upstream facts are what let you say, correctly, that a "just one more channel" ask is not a one-day build but a permanent small ownership line.

Operational Impact

Maintenance. You own it permanently. No upstream will ship a fix for a Guzzle bump, a Laravel version change, or a payload drift. Mitigate by (a) naming an accountable engineer, (b) writing a one-page runbook covering where the channel lives, how to rotate the webhook, and how to run the contract test, and (c) subclassing the channel rather than editing vendored code in place, so patches stay mergeable if you ever re-sync against the original.

Support. No vendor, no issue tracker with a response, no security advisories. Support is entirely internal triage: failed jobs, NotificationFailed events, and the contract test. The NotificationFailed listener is the closest thing to a pager for this integration — feed it into existing alerting so a rotated or revoked webhook surfaces as a metric, not as silence.

Scaling. Delivery scales with your queue workers, not the package. Two hard requirements: run it on a dedicated queue (notifications-chat) so a BearyChat outage or a 30-second timeout can't back up the mail/primary notification pool, and set timeout, tries, and backoff explicitly. Note what's absent: no rate limiting, no idempotency keys, no dead-letter handling, no delivery observability beyond what you add. If those are requirements, this package doesn't meet them — build the wrapper yourself.

Failure modes to design against.

  • Silent non-2xx (if status isn't checked) — mitigured by ->throw() and the contract test.
  • Dead/rotated webhook — three timeouts per notification per retry window with tries = 3; exhausted jobs land in failed_jobs and look like a database problem hours later unless the failed-jobs queue is monitored.
  • Credential leakage — webhook URL serialized into failed_jobs and exception context; scrub both.
  • Markdown injection — user-supplied strings (deployer, branch, commit message) can break formatting or inject links; escape or code-fence anything from input.
  • Http::fake() left registered in tests — the classic "code works, delivery doesn't" red herring; the real-curl smoke test disambiguates.

Ramp-up. Onboarding cost is genuinely low by design: ~10 minutes to read the source, 15–30 minutes to a first working notification, under a day to vendor and wrap it properly. The thing that makes ramp-up expensive over time is tribal knowledge — hence the one-page runbook. For the product side, the ramp-up framing is: a single chat channel is cheap to build and expensive to own, and the roadmap unit for "add chat notifications" should be a permanent small ownership line, not a sprint task.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk
martialbe/flysystem-oss
chondal/3312client
jeroen-g/flickr
opscale-co/nova-genbi
itsjustvita/laravel-retention
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log