helgesverre/telefonkatalog
A Laravel package for searching Norwegian phone directory data via Telefonkatalogen. Look up people and businesses by name, phone number, or address and get structured results, making it easy to add contact and phone-number lookup to your app.
Architecture fit
telefonkatalog is a thin third‑party adapter, not core domain logic. It wraps two Norwegian directory sources (Gulesider, Opplysningen1890) behind a Laravel‑style API and returns phone number data. Architecturally it belongs at the edge of the system, behind an interface you own (e.g. PhoneLookupService), so that the vendor coupling is contained and swappable. It should not be called inline from request handlers or domain models.
Integration feasibility
Low lift. Standard Composer install, service provider auto‑discovery, likely publishable config. No database migrations, no queue workers, no infrastructure changes implied by the release notes. A single engineer can integrate in under a day, excluding legal/ToS review.
Technical risk
__NEXT_DATA__ to JSON‑LD. That is a live demonstration of external coupling, not a hypothetical. Expect recurrence.^1.0.Key questions
null?Stack fit
Targets Laravel 11 and 12 (Testbench ^9.0|^10.0), PHP 8.2+. Testing stack moved to Pest v3. Development tooling additions (justfile) and removed dev dependencies (nunomaduro/collision, pestphp/pest-plugin-arch) are irrelevant to production runtime — treat them as neutral.
Migration path
v1.3.0 drops support. Pin to ^1.2 explicitly in composer.json (e.g. "helgesverre/telefonkatalog": "~1.2.0") so an unrestricted composer update cannot silently pull a version your framework can't run. Note this is a breaking change shipped as a minor bump — do not assume ^1.0 is safe.composer require bump. No application code changes expected; the scraper internals changed, not the public API, though this should be confirmed against the package's own API surface before assuming.Compatibility
Laravel 11/12 only. Confirm PHP constraint against your runtime images. If you run a mixed fleet across services, inventory which services are on L10 before deciding — the package may be fine for one service and blocked for another.
Sequencing
~1.2.0 in any L10 service to freeze the risk.PhoneLookup interface and adapter first, with the package as an implementation detail.v1.3.0 behind that interface.Maintenance
Higher than a typical Composer dependency, and the cost is recurring rather than one‑off. The Gulesider rewrite is the first data point; budget for periodic breakage and a maintenance owner with PHP skills to patch scrapers. If nobody owns that, the feature will rot silently.
Support
Community open‑source, effectively single‑maintainer, no commercial support path. Mitigation options in order of preference: (a) wrap behind your own interface so you can hot‑swap providers; (b) vendor/fork the scraper logic for the sources you actually use; (c) accept the risk with monitoring. Note that fixes depend on the maintainer's availability — the release notes give no indication of a response SLA.
Scaling
Scraping scales poorly by construction: every lookup is an outbound HTTP call to a third party you don't control. Expect latency in the hundreds of milliseconds to seconds, and throughput bounded by the sources' tolerance for your traffic, not your infrastructure. Required before any meaningful volume:
Failure modes
| Mode | Likelihood | Impact | Mitigation |
|---|---|---|---|
| Upstream markup/structure change | High — already observed | Silent wrong/empty results | Fixture-based contract tests; alert on empty-result rate spike |
| IP block / 429 / bot challenge | Medium | All lookups fail | Backoff, egress IP rotation if contractually permitted, alerting |
| Result present but phone number missing | Medium — partially addressed in Opplysningen1890 | Partial records | Validate downstream; treat as "unknown" not "no number" |
| Genuine no-match | Common | None | Ensure this is distinguishable from failure in your adapter |
| ToS change / legal challenge | Low–Medium | Feature must be withdrawn | Legal review up front; provider abstraction for fast removal |
| Package abandoned | Low–Medium | Unpatched breakage | Fork option; contained behind interface |
The critical implementation detail: your adapter must be able to tell "not found" from "lookup failed." The release adds tests for empty results but the changelog does not confirm failure-vs-absence semantics are explicit. If both collapse to null, every consumer downstream will silently treat an outage as "no such number" — that is the failure mode most likely to cause real business harm.
Ramp-up
Low. A mid-level Laravel engineer is productive with this package in a few hours; the API surface is small. The real ramp-up cost is not technical — it is the domain and legal context: understanding Norwegian directory data quality, GDPR obligations for personal data, and what the business is actually allowed to do with the results. Budget that time on the legal/compliance side, not engineering.
Recommendation
Integrate only behind an owned interface, only with caching and queueing, only on Laravel 11/12, and only after a documented ToS/GDPR position. Treat the package as a best-effort enrichment source, never as an authoritative directory.
How can I help you explore Laravel packages today?