galahad/laravel-addressing
Laravel package for managing postal addresses: bundled country, state and city data plus address models and migrations you can attach to users or orders. Seed geographic records and store structured addresses without building the schema yourself.
Architecture fit
Unchanged by 4.0.0. glhd/laravel-addressing is a Laravel-first package (Composer, service provider, publishable config/migrations, Eloquent models). It is a natural fit only where the application is already an Eloquent-centric Laravel codebase. The likely value proposition — a reusable address model plus the polymorphic glue needed to attach addresses to arbitrary entities — maps well onto common domains (customers, billing/shipping, facilities, contacts). It is not a good fit for framework-agnostic services, event-driven services with non-relational storage, or any codebase that has already standardized on a vendor address-validation provider's schema, because the package would become a thin competing abstraction. Laravel 13 support does not change this calculus; it only widens the set of host applications for which the fit applies.
Integration feasibility
Mechanically low-effort: composer require, publish and run migrations, add a trait or relation to the host model. The real effort sits in data migration, not installation — reconciling an existing addresses table or denormalized address columns with the package's schema, and deciding whether the package's model becomes the system of record or a projection.
The 4.0.0 release adds a version-selection step that did not previously exist in the plan: the package now targets Laravel 13, and a major-version bump with a one-line changelog ("modernizes the dependencies a bit") is an undocumented breaking-change surface. Integration feasibility now depends on knowing which major line your Laravel version forces you onto.
Technical risk The dominant risk remains provenance, not code quality. Zero stars, zero dependents, and a one-line README mean there is effectively no external validation signal: no evidence of production usage, no reported issue surface, no community pressure toward semantic versioning discipline.
4.0.0 moves this slightly, in two directions:
3.3.0 → 4.0.0 progression is evidence of a maintained release line and semver discipline, which is a better signal than the assessment previously had. Combined with explicit Laravel 13 support, the maintainer is demonstrably tracking the framework rather than having abandoned the package. This partially — not fully — de-risks the bus-factor concern.Risks to verify during a spike, amended:
3.3.0...4.0.0. Confirm whether the major bump is confined to composer.json constraints (Laravel 13 floor, PHP floor, dev dependencies) or whether it touches the service provider, config, model, or migrations. A migration change is the only outcome that forces a real data-migration project rather than a composer constraint edit.Key questions for the maintainer/spike
Stack fit
Assumes Laravel with Eloquent and a relational database (MySQL/Postgres). Confirm the package's composer.json constraints against the application's Laravel and PHP versions before anything else; a mismatch here ends the evaluation cheaply. As of 4.0.0 this check has a new answer shape: applications on Laravel 12 or earlier will resolve to the 3.3.x line, applications on Laravel 13 to 4.x. Establish which line you land on before any code is written, because it determines whether you are adopting a maintained package or a frozen one.
Migration path Do not adopt the package as the domain's address model directly. Instead:
AddressRepository / AddressService boundary and let the package sit behind it. Domain code depends on your interface, so a future fork or replacement is a contained change. This boundary is also what makes a 3.3.x-to-4.x upgrade a composer change rather than a refactor.Compatibility checks Verify nullable/optional fields, country code representation (ISO 3166-1 alpha-2 vs. alpha-3), subdivision handling (free text vs. FK), and how the package treats incomplete or partial addresses — international addresses frequently lack a subdivision or postal code, and a schema that assumes US-style completeness will reject valid data. Add: diff the published migrations between 3.3.0 and 4.0.0 if your schema was ever created from the package, and re-run the migrations against a scratch database to confirm no drift.
Sequencing
3.3.0...4.0.0 diff to classify the 4.0.0 break as dependency-only or code/migration-affecting.If the spike reveals static reference data or a thin validation story, budget for either an internal fork or a supplementary validation layer (e.g., a commercial address-validation API) before commit. Record the pinned major explicitly in the decision — this package has now demonstrated it will ship framework-gated majors, so the pin is a standing commitment, not a one-time formality.
Maintenance Assume you will own this code. Pin to an exact version, mirror the repository internally (or vendor-fork it) so an upstream deletion or archive does not break builds, and subscribe to release notifications. Review the source once for anything touching migrations, since those are the least reversible part of the package.
4.0.0 makes the pinning policy concrete: this is a package that publishes framework-gated major versions with minimal changelog detail. Expect to be forced onto a new major roughly in step with Laravel majors, and expect to have to read the diff yourself each time. If you support multiple applications on different Laravel versions, be prepared to carry both a 3.3.x and a 4.x pin in your internal mirror, with the 3.3.x line receiving no further framework-compatibility work.
Support Community-only, no SLA. Escalation path is the maintainer's issue tracker and, realistically, your own engineers reading PHP. For a package this small the source is auditable in an afternoon, which offsets the lack of support — but that audit must actually happen before adoption. A major release with a one-line note is a reminder that the changelog is not a substitute for the audit.
Scaling
Address lookups are typically join-heavy and read-dominated. Watch for N+1 when a list view renders an address per row; eager-load the relation. If the package ships country/subdivision tables, cache them — they are effectively static and should not be queried per request. Polymorphic relations need a composite index on (addressable_type, addressable_id); verify the package's migrations include it, because its absence degrades silently as volume grows. Nothing in 4.0.0 indicates changes here, but re-verify rather than assume, since dependency modernization can alter driver defaults.
Failure modes
composer update.Ramp-up Low for any Laravel developer — the package's surface is small and idiomatic. The ramp-up cost is in the data migration and in establishing internal conventions (when to create a new address vs. reuse, how to format for display, which fields are required per country). Document those conventions; they will outlive the package. Add one convention up front: the pinned major and the trigger for revisiting it when Laravel upgrades.
Recommendation Still a build-vs-adopt decision, not a drop-in, but the maintenance signal has improved enough to move it from "prove the maintainer exists" to "prove the 4.0.0 break is benign." 4.0.0 gives the package an active maintainer tracking Laravel 13 and a visible semver line, which retires the most acute abandonment concern. It does not retire the zero-dependent, no-production-evidence concern, and it adds a new one: a major version whose contents are undocumented.
Proceed only if the spike confirms (a) the 4.0.0 change set is confined to dependency constraints and does not touch migrations or the model, (b) your application clears the new Laravel/PHP floor, and (c) a reference-data update path exists. If (a) fails, or if you cannot clear the new floor and would be adopting a frozen 3.3.x line, lift the schema and write the ~200 lines yourself.
How can I help you explore Laravel packages today?