jn-devops/common
jn-devops/common provides reusable Laravel/PHP utilities, service providers, configuration defaults, and shared helpers for consistent setup across jn-devops projects. It reduces boilerplate and keeps applications aligned with common DevOps conventions.
Architecture fit. jn-devops/common is best read as an internal shared-library package for a Laravel application family — the "common" naming convention, the jn-devops org scope, and the "Homeful Common Package" description all point to a vendor-owned bundle of cross-cutting code (base service providers, shared enums/DTOs, traits, helpers, config defaults, and possibly shared contracts or migrations) rather than a general-purpose OSS utility. Fit is therefore conditional on two things: (1) our application is Laravel on a compatible major version, and (2) we actually share a domain vocabulary with the Homeful product family. If we are building an adjacent service in the same domain, the value is a common language and reduced duplication. If we are not in that domain, adopting it imports a dependency graph and a set of opinions we get no benefit from — a "common" package is the single highest-leverage coupling point in a Laravel codebase, because a service provider can mutate the container, publish config, register global scopes, or alter Eloquent behavior for every consumer at once.
Integration feasibility. Mechanically straightforward — it is a Composer package, so integration is a composer require plus provider auto-discovery, and possibly vendor:publish for config/assets. The real feasibility gate is distribution: with zero stars, an empty star field, a score of 0, and zero dependents, there is no public health signal at all. That is consistent with a private or recently published repo. We must confirm the package resolves from Packagist versus requiring a VCS repositories entry plus credentials (deploy key or GitHub App token) in every developer environment and every CI runner. That credential path is the most common source of day-one friction and needs to be designed, not discovered.
Technical risk.
^1.0 constraint on a library with no external consumers is an unbounded blast radius.Key questions.
illuminate/* and third-party packages?Stack fit. Validate the declared constraint set first: PHP version, illuminate/support and related component ranges, and whether it assumes a specific Laravel major. Then diff its dependencies against our composer.lock. A shared package that drags in a second HTTP client, an alternate testing framework, or an older nesbot/carbon pin is a net negative regardless of feature value.
Compatibility. Run composer why-not jn-devops/common <version> against our current lockfile before writing any application code — this surfaces constraint conflicts in minutes rather than after a migration. Confirm the package's own test matrix covers our Laravel version; if it does not, treat our environment as untested and budget for a smoke test suite around it. Check whether it registers a provider via auto-discovery or requires manual registration; the latter is actually preferable for us because it lets us control boot order.
Migration path. Three scenarios, in order of preference:
Regardless of scenario, place an anti-corruption boundary in front of it: our own thin adapter or a small set of application-level interfaces that wrap the package's types. This costs an hour and means a future swap or fork is a bounded change rather than a repo-wide search-and-replace.
Sequencing. (1) Confirm distribution and credentials — a spike branch that installs it in CI is the fastest way to prove or kill the whole thing. (2) Inventory the package contents and classify each element low/medium/high blast radius. (3) Pin an exact tagged version with a committed lockfile; forbid floating constraints. (4) Integrate the highest-value, lowest-coupling module and run a full regression. (5) Only then expand usage, and add a CI check that fails on unexpected version drift.
Maintenance. Ownership is the pivotal operational question. If the jn-devops team maintains it, our cost is upgrade testing on their cadence. If not, we are de facto maintainers of a package we did not write, and we should plan for a fork or a vendored patch branch from the outset. Either way, budget recurring time per Laravel major upgrade — a common package is one of the first things to break and one of the last things to get attention.
Support. There is no community to lean on: no issue tracker history, no Stack Overflow corpus, no downstream users hitting the same edge cases. Escalation is a direct conversation with a named team. Get that name in writing, along with an expected response time and a stated deprecation policy. Absent that, treat the package as unsupported code we have accepted into our supply chain.
Scaling. Runtime scaling is a non-issue — it is a library, not a service. Organizational scaling is the concern. Every additional consuming service multiplies the blast radius of a bad release and the coordination cost of a breaking change. Beyond roughly three consumers, insist on a release train: tagged versions, a changelog, and a deprecation window. Also watch for the package becoming an unbounded dumping ground — a "common" library with product logic in it is a design smell that will eventually force a rewrite.
Failure modes.
Ramp-up. Onboarding cost is low for engineers who already know Laravel, but non-trivial in a different way: the package's behavior is undocumented externally, so the first engineer must read the source to understand what it does at boot. Budget explicit time for that, and write an internal one-page README covering what we use, why we pinned the version we pinned, and who to call. That document is the actual deliverable that makes the dependency safe to hold.
Recommendation. Proceed only if the spike confirms clean installation and the package's contents are predominantly low-blast-radius (DTOs, enums, traits). Treat high-blast-radius contents — migrations, global scopes, middleware — as requiring a separate, deliberate decision. Pin exactly, wrap it, name an owner, and revisit at the next Laravel major.
How can I help you explore Laravel packages today?