konekt/address
Konekt Address is a Laravel package for managing countries, provinces, and addresses with Eloquent models. It offers address types, validation, formatting helpers, and seed data for building location-aware applications.
What the package actually is. konekt/address is a data-model package, not a geo service. It ships Eloquent models, migrations, and seeders for Country, Province, City, Address, Person, Organization, and Location, plus an address-type concept (billing/shipping/etc.) and a polymorphic addressable relation so any domain object can own addresses. The value is the schema, the country/province reference dataset, and the addressable pattern — not runtime behavior.
Architecture fit. The package is built on Concord, Konekt's module/model-registry layer. That is the single most important architectural fact: adopting it means adopting Concord's conventions (contracts resolved through a module registry, models swappable via config) in at least the parts of the app that touch addresses. If the codebase already uses Konekt packages (konekt/user, konekt/customer, Concord itself), fit is high and near-frictionless. In a clean or conventionally-structured Laravel app, Concord is an extra indirection layer your team must learn for a peripheral domain — a real cost for a countries/provinces table.
Integration feasibility. Low-to-moderate technical effort, moderate organizational effort. Install is standard Composer + publish migrations/config. The realistic work is: (1) deciding whether to use the bundled Person/Organization models or only Address — most teams only want the address half and should not adopt the people/org half; (2) seeding and refreshing country/province data; (3) populating cities, which ships effectively empty — there is no global city dataset included, so city-level autocomplete requires you to source, license, and load your own data (GeoNames, GeoNames-based commercial feeds, or a vendor API); (4) postal-code/address validation, which the package does not do — you still need a validator (e.g., commerceguys/addressing + symfony/intl) for format rules and normalization.
Technical risk. Concentrated and identifiable:
provinces as best-effort and design the UI to allow free-text fallback where the list is empty.Person/Organization models invite teams to model identity data in a package table rather than their own domain — a migration trap later.Key questions for the maintainer / spike.
cities intentionally empty, and is there a recommended data loader?Verdict. Adopt wholesale only if you are already in the Konekt/Concord ecosystem and your address needs are simple (country/province dropdowns, billing/shipping records). Otherwise, cherry-pick: take the schema shape and the addressable pattern, and pair commerceguys/addressing with your own thin tables. The package is small enough to imitate and too small to depend on uncritically.
Stack fit. Composer-installable Laravel package; assumes Eloquent, migrations, and Concord's service-provider bootstrapping. It is not framework-agnostic and has no headless API surface — it is a persistence layer you expose yourself. No queue, cache, or external service dependencies, which is a genuine plus.
Migration path (recommended sequencing).
Address + Country/Province (+ City only if you have a data source). Disable or ignore Person/Organization unless you have a named owner for that domain.vendor:publish), pin the version in composer.json, and record the decision in an ADR. Never rely on the package's migrations running implicitly in a way you can't audit.geo:sync task so future dataset updates are a deploy step, not a surprise migration.Relation::enforceMorphMap) and update every model that should own addresses. Do this before building UI so the polymorphic keys are stable.Compatibility and exit. Keep the package behind your own AddressRepository/service boundary and reference the package's contracts, not its concrete models, in your domain code. That way, if the package is abandoned, you swap implementations without rewriting call sites — Concord's contract indirection helps here, and it costs you almost nothing to preserve.
Maintenance. Low runtime maintenance, non-trivial version maintenance. The tables are near-static reference data plus per-user address rows; there is nothing to tune. The maintenance burden is dependency management: a package with one maintainer and zero dependents will not track Laravel releases on your schedule. Budget for the possibility that you fork it — small surface area, MIT license, so forking is cheap and should be a pre-approved fallback, not a crisis.
Support. No vendor SLA, no commercial support, community-issue-only. Escalation path is "read the source" (feasible — it's small) or "fork it." Assign an internal owner for the address domain so there is a named person, not a team, accountable.
Scaling. Effectively free. countries/provinces are a few thousand rows; read-heavy, cache the full country list in the app cache or a config file and you remove the query entirely. Addresses scale linearly with users — ordinary indexed tables. The only scaling concern is UI: never load all cities; use typeahead against a properly indexed table or an external geocoder.
Failure modes to design against.
Ramp-up. One developer-day for a Laravel-fluent engineer to be productive; add half a day for Concord's model-resolution conventions if the team hasn't used Konekt packages. Documentation is thin — plan on source reading. The Person/Organization half roughly doubles the surface area to learn, which is another argument for scoping it out.
Overall. A reasonable schema with a heavy framework dependency and thin community. Operational cost is low if you contain the blast radius; the real risk is strategic — betting address handling on a 20-star package whose maintainer's release cadence you don't control. Contain it behind an interface, own the migrations, own the data, and it's a fine choice. Skip that discipline and it becomes a quiet liability.
How can I help you explore Laravel packages today?