epigra/trgeozones
Laravel package for Turkey's administrative geography. It provides migrations, Eloquent models, and ready-to-use seed data for provinces, districts, and neighborhoods, helping you add address selection, location filters, and region-based features to your app quickly.
Architecture fit. epigra/trgeozones is a domain-data package for the Turkish administrative hierarchy (İl → İlçe → Semt/Muhit/Mahalle → Posta Kodu). For any Laravel product serving Turkish users—e-commerce checkout, logistics, KYC/onboarding, fintech address capture, CRM, marketplace delivery—address selection is a first-class flow, not a nice-to-have. The package’s value proposition is that it abstracts the messy, locally-nuanced Turkish address model into Laravel-native primitives (service provider, migrations, seeders, likely Eloquent models and relationships), which means it can slot into an existing app without a bespoke data layer. The opportunity score (8.23) is consistent with this: Turkish addressing is a real, recurring build-vs-buy problem that most teams solve badly and repeatedly.
Integration feasibility. High in principle. Laravel packages with published migrations/seeders are typically a composer require + php artisan migrate --seed away from usable. The main integration work is not installation but UI wiring: cascading select components (province → district → neighborhood) and mapping the package’s schema onto your existing address columns or a polymorphic address entity. Because the package is data-centric rather than opinionated about storage, it should compose with existing address models via foreign keys rather than forcing a schema replacement. Zero dependents and 91 stars tell us there is no large public reference implementation to copy from—expect to design the integration yourself, not follow an established pattern.
Technical risk.
utf8mb4) and that any search/sort is Turkish-locale-aware.Key questions.
illuminate/support: *)?Stack fit. The package is Laravel-specific, which is a plus if—and only if—the host application is on a supported Laravel line. Confirm the composer.json constraints before committing. For a standard Laravel 9/10/11 monolith on MySQL, integration is straightforward. For non-Laravel services (Node, Go, Python microservices) in a polyglot estate, this package is not the right layer; the better pattern is to treat the dataset as a shared reference service/table and consume it across services, using this package only inside the Laravel boundary.
Migration path. Recommended sequence:
addresses table.Compatibility. Watch for: package Laravel version pinning, PHP 8.x type strictness, migration naming collisions with existing tables (a common Laravel package failure mode), and seeder idempotency (re-running seeds should not duplicate rows). If any of these are missing, budget for a thin wrapper/fork to harden them.
Sequencing. Do the data-quality spike first, then schema alignment, then UI, then backfill. Do not let UI work proceed in parallel with data validation—the UI is the easy part and will create false confidence.
Maintenance. Reference data is low-churn but not zero-churn. Expect an annual (at minimum) refresh cycle tied to administrative reorganizations, plus postal code updates. If the upstream package is not actively refreshed, the team inherits the refresh responsibility—meaning someone must own sourcing, diffing, and applying updates. Quantify that as a standing ~0.1–0.25 FTE, or a scheduled data-ops task, not a one-off install.
Support. With 91 stars and zero dependents, there is no community to lean on for issues. Support burden falls entirely on your team. The package’s README (in Turkish) is likely the only documentation; expect to read source to understand behavior. Mitigate by forking into an internal namespace and pinning to a commit—do not treat an externally maintained low-adoption data package as an unowned transitive dependency for a production address flow.
Scaling. Read volume will dominate: address dropdowns and lookups are high-frequency, low-write. The correct operating model is aggressive caching (in-memory or Redis) of province/district lists and neighborhood/postal-code lookups, with cache invalidation only on data refresh. Database-side, these tables are small in row count relative to a typical app, so scaling risk is in query fan-out from UI, not storage. Watch seeding at scale only in CI/ephemeral environments.
Failure modes.
Ramp-up. Low for a Laravel developer: install, seed, read models, build cascading selects—likely half a day to a working demo. The non-trivial ramp is domain knowledge: understanding the Turkish address hierarchy, which levels are actually required for your use case (many products only need province + district + postal code), and how neighborhoods map to postal codes. Assign a Turkish-speaking or Turkey-domain product owner for validation—this is a product/data risk, not solely an engineering one. Given the favorable opportunity signal, the package is worth a spike; the go/no-go decision should hinge on dataset currency and upstream maintenance health, not on integration effort, which is modest.
How can I help you explore Laravel packages today?