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

Kudi Sms Php Laravel Package

toneflix-code/kudi-sms-php

A Laravel/PHP package for sending SMS through the Kudi SMS API. It offers a simple, framework-friendly interface for adding transactional or bulk messaging to your applications, with straightforward configuration and a clean API for quick integration.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. toneflix-code/kudi-sms-php is a thin vendor SDK wrapper around the KudiSMS HTTP API, packaged for Laravel consumption (service provider + facade + publishable config is the conventional shape for this author's packages). Architecturally it is a leaf dependency: it sits at the edge of your domain, called by a notification channel, a queued job, or an application service. That is a low-coupling position, which remains the single most important fact in this evaluation — a leaf dependency with a narrow method surface is cheap to replace, so the risk profile is dominated by API contract stability and vendor reliability, not by architectural intrusion.

The correct fit is behind an application-owned port (SmsSender interface / NotificationChannel), with this package as one adapter. Do not let Toneflix\KudiSms\... types or the facade leak into controllers, jobs, or domain services.

Integration feasibility. High, on the assumption that the package is a straightforward Guzzle/Http client with an API-key or bearer-token config block. Integration work is typically: publish config, set credentials from secrets manager, implement the port adapter, map the vendor response into your own DTO/result type, and wire the Laravel notification channel. Expect half a day to two days for a competent Laravel engineer including tests.

The blocker is not effort, it is evidence. The package shows minimal external validation of it working against the current KudiSMS API. The 1.0.6 release is recent, so endpoint drift is unlikely, but the content of that release is itself a warning — see below. Treat the package as unverified until you have run it against a live sandbox or production account.

What release 1.0.6 tells us. The changelog is a single line: "fix: correct senderId typo to senderID." That is a rename of an identifier in the package's public surface, shipped as a patch bump (1.0.5 → 1.0.6). Two readings, and you must determine which before adoption:

  • Cosmetic/internal rename — the PHP parameter name or config key was corrected. Harmless if you call positionally and never use named arguments; fatal for any caller using PHP 8 named arguments (->send(senderId: ...) now throws Unknown named parameter), which is exactly the style many Laravel developers use. A semver-major change delivered as a patch.
  • Wire-level fix — the outgoing request field name was wrong, meaning 1.0.5 and earlier sent a payload the vendor ignored or rejected, so sender IDs were silently not applied and traffic may have defaulted to a shared route. Anyone who adopted 1.0.5 has been running with a defect they could not see, because the API presumably still returned 2xx.

Either way, the release is evidence for the risk that was previously only theoretical: the package does not apply semver discipline, and its release notes do not document breaking changes or migration steps. That is a direct, observed data point rather than an inference from zero dependents. It also validates the port/adapter seam — if you had wired the facade directly into jobs, this is the release that breaks your deploy.

Technical risk.

Risk Severity Mitigation
Semver violation — public identifier renamed in a patch release (1.0.6) High Pin exact version; never use ^1.0; forbid vendor named arguments in your adapter; review every changelog before bumping
Silent regression from 1.0.5's senderId payload Medium–High Verify on the wire which field name the vendor now expects; if you ran 1.0.5, confirm historical messages used the correct sender ID
Single-maintainer abandonment Medium MIT + thin wrapper; fork or reimplement in ~100 LOC if needed
Supply-chain / typosquat exposure Medium Pin exact version, commit lockfile, review source before first install, enable Dependabot but do not auto-merge
Silent API drift (KudiSMS changes endpoint or payload) Medium Contract tests asserting the exact senderID key; alert on non-2xx and schema mismatch
Poor error semantics (throwing on 4xx, swallowing failures) Medium Wrap every call; normalize to your own success/failure/retryable result type
No test suite / no CI Medium Read tests/ before adopting; if absent, budget for your own characterization tests — the 1.0.6 rename shows a test suite either doesn't exist or doesn't cover the wire contract
Laravel/PHP version constraint too narrow Low–Medium Check composer.json require before committing; may block PHP 8.4 or Laravel 12 upgrades
Credential handling (config caching, logging) Low Credentials via env() only, never in published config values, redact from logs

The absence of dependents means no peer-reported failure modes. You are the first mover; your incident data is the ecosystem's incident data. Release 1.0.6 is the first concrete instance of that asymmetry: no one else flagged the break, so it will reach you first.

Key questions to resolve before adoption.

  1. Which side of the boundary did 1.0.6 change — the PHP parameter name, the config key, or the HTTP payload field? Get the 1.0.5→1.0.6 diff and read it.
  2. Was 1.0.5 functionally broken? If the wire field was wrong, was sender ID silently ignored, and does the vendor default to a shared route when it is absent?
  3. Does the package expose delivery reports / DLR callbacks, or only fire-and-forget send? Can you confirm delivery, or only submission?
  4. What is the auth model, and does it support key rotation without a redeploy?
  5. Does it expose balance/quota, sender-ID management, and per-message cost — the operational surface you need for alerting and cost control?
  6. Does it support bulk send and per-recipient status, or must you loop?
  7. Is there a sandbox/test mode, and does the package have a way to fake it in tests (Http::fake compatibility)?
  8. Does it declare support for your Laravel and PHP versions, and does it use auto-discovery?
  9. Is there a retry/backoff policy, or does that remain the caller's responsibility?
  10. What is KudiSMS's own SLA, rate limit, and geographic coverage — and is that coverage the reason you are choosing this vendor?

Note the last question: the package is a wrapper on a Nigerian SMS aggregator. If your recipient base is not West African, the vendor choice is the real decision and this package is incidental. Do not let a convenient wrapper drive a routing decision.

Integration Approach

Stack fit. Presumably strong — the author publishes Laravel-first packages and the naming convention (-php suffix, toneflix-code vendor) implies Laravel service provider + facade with optional framework-agnostic use. Verify auto-discovery in composer.json extra.laravel. If you are not on Laravel, expect to instantiate the client manually; confirm the client is not facade-coupled at construction. Given 1.0.6, also confirm whether the renamed senderID appears in the signature of the object you call directly — that is what determines whether the break reaches you.

Migration path. There is no migration — this is greenfield adoption. The meaningful "migration" is now twofold. First, the exit path, built on day one: an SmsSender port with a KudiSmsAdapter and a LogSmsAdapter (dev/test) and, if you already send SMS elsewhere, a NullSmsAdapter or a second adapter so provider switching is a config change, not a refactor. Design the port around your needs (send(to, message, senderId): SmsResult), not around the vendor's method signatures — and note that your own port can legitimately keep senderId while the adapter translates to whatever spelling the vendor currently uses. Second, an upgrade path for the package itself: because 1.0.6 broke a public identifier in a patch release, every future bump is a potential mini-migration and must be treated as one.

Compatibility. Confirm three axes: PHP version against your runtime; Laravel version against your framework pin; Guzzle/illuminate/support constraints against your locked dependency graph. Because the package has effectively no dependents, its constraint ranges have not been battle-tested against real-world dependency graphs — expect a possible composer update conflict. Pin exactly: composer require toneflix-code/kudi-sms-php:1.0.6, not ^1.0. Release 1.0.6 is the argument for that rule; a caret constraint would have silently absorbed this rename on the next composer update in CI. Commit the lockfile and treat the dependency as manually curated.

Sequencing.

  1. Source and diff review (1d, up from 0.5d). Read the full package — it is small — and explicitly diff 1.0.5...1.0.6. Identify the renamed identifier's blast radius: signature only, config key, or HTTP payload. Confirm endpoints, error handling, and that no telemetry or unexpected outbound calls exist beyond KudiSMS.
  2. Credential and sandbox provisioning (0.5d). Obtain API credentials, confirm a test/sandbox mode or a low-cost live send to your own number. Verify the sender ID actually takes effect — send once with a registered sender ID and confirm the receiving handset shows it, not the shared shortcode.
  3. Port and adapter (1d). Define SmsSender, implement KudiSmsAdapter, normalize results into SmsResult{success, messageId, providerCode, retryable}. Call the vendor API positionally; never use its named arguments.
  4. Characterization tests (0.5–1d). Http::fake() tests pinning the exact request shape the package emits, including an explicit assertion that the outgoing payload carries senderID. These are your regression alarm when you bump the dependency, and they are the only thing standing between you and the next patch-release rename.
  5. Notification channel wiring (0.5d). Connect to the Notification channel for the actual auth/OTP/alert use cases; queue the send, never send inline in a request.
  6. Observability and go-live (0.5–1d). Log messageId, sender ID, provider code, latency; alert on failure rate and on balance depletion. Canary with a low-volume, non-critical notification before moving OTP traffic.
  7. Exit-path rehearsal (0.5d). Flip the binding to a stub adapter in staging to prove the seam holds.

Roughly 5–7 engineer-days end to end, of which one to one-and-a-half days is package-specific — the delta versus a clean dependency is entirely attributable to 1.0.6.

Operational Impact

Maintenance. Low ceiling, low floor, and now demonstrably higher-touch than a typical leaf dependency. The code surface is small enough to fork and own outright if the maintainer goes quiet — that is your real safety net, and release 1.0.6 makes the case for exercising it sooner: at ~100 LOC, forking to control your own release cadence is a credible alternative to consuming upstream patches blind. Until then, budget a recurring quarterly review plus a mandatory review on every release, because the version number is not a reliable signal of breaking-ness. Read the changelog, read the diff, run the characterization tests. Because there are no dependents, you will not learn about upstream breakage from anyone else — 1.0.6 proves that; it shipped with a one-line note and no migration guidance.

Support. No community, no Stack Overflow corpus, no issue-tracker history to mine. Support is: read the source (feasible at this size), then the KudiSMS vendor docs, then the vendor's support channel. The 1.0.6 release note is the shape of all the support you will get from upstream — terse, undated, unexplained. Escalation for anything vendor-side is entirely on the KudiSMS relationship — negotiate that as a commercial dependency, not a technical one. Do not adopt this package if your organization requires a vendor with a published support SLA.

Scaling. The package is not the bottleneck; KudiSMS is. Two things to design for: (a) throughput and rate limits — assume the vendor enforces per-second and per-day caps and that the package does not implement backoff; put sends on a queue with a rate limiter and a dead-letter queue; (b) connection reuse — confirm the client is resolvable as a singleton rather than rebuilt per call. SMS is bursty (OTP spikes, outage fan-out), so the queue and the retry policy matter more than raw client efficiency.

Failure modes.

  • Vendor outage or 5xx — package behavior unknown. Wrap in try/catch, classify retryable vs. terminal, retry with exponential backoff, cap attempts, dead-letter, and surface to ops.
  • Silent sender-ID regression — the 1.0.6 class of failure. A rename on either side of the boundary can cause messages to be accepted (2xx) but routed from the wrong sender ID, or rejected only at the handset. Indistinguishable from success in your logs unless you assert the payload and spot-check the received message. Alert on provider response codes and on any sender-ID-related field in the response.
  • Auth failure after key rotation — will present as a hard failure across all traffic at once; needs a distinct alert and a rotation runbook that includes config-cache clearing.
  • Quota exhaustion — the nastiest silent one if you are not polling balance. Alert at 70% of daily quota.
  • Ambiguous timeout — request may have been accepted by the vendor despite a client-side timeout; without DLR support you cannot distinguish sent from not-sent. For OTP this is tolerable; for transactional/billing messages it means duplicate sends unless you carry an idempotency key. Confirm whether the package and the vendor support one.
  • Breaking change in a patch release — now an observed, not hypothetical, failure mode. Surfaces on a routine composer update and manifests as either a fatal Unknown named parameter error or a silently wrong payload. Mitigated by exact pinning, lockfile discipline, no auto-merge on Dependabot, and the port/adapter seam.
  • Dependency conflict on framework upgrade — the classic low-adoption failure. Surfaces during a routine Laravel major bump and blocks the upgrade. Mitigated only by the port/adapter seam.

Ramp-up. Near zero for a Laravel developer — the facade/config pattern is idiomatic and the API surface is small. The actual ramp-up cost is domain ramp-up: understanding KudiSMS's routing, sender-ID registration requirements, cost model, and delivery-reporting semantics. That knowledge lives in vendor documentation and your own characterization tests, not in this package. Write a one-page runbook (credentials location, rotation steps, quota alerting, failure triage, dependency-bump procedure, exit-path procedure) as part of the integration — it is the artifact that makes this dependency survivable, and 1.0.6 is a good reminder that the bump procedure belongs in it.

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.
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
frankyso/ipaymu
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package
kda/filament-dynamic-navigation
bypersoft/signbox
pairus/product-data
fayne/laravel-filament-cms-core