PHPackages                             team-nifty-gmbh/nuxbe-remote-directory - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. team-nifty-gmbh/nuxbe-remote-directory

ActiveLibrary

team-nifty-gmbh/nuxbe-remote-directory
======================================

Serves Flux ERP contacts as a remote directory for phone clients (XML phonebook, searchable by name, company or number).

v1.1.1(today)01↑2900%proprietaryPHPPHP ^8.2CI passing

Since Aug 25Pushed todayCompare

[ Source](https://github.com/Team-Nifty-GmbH/nuxbe-remote-directory)[ Packagist](https://packagist.org/packages/team-nifty-gmbh/nuxbe-remote-directory)[ Docs](https://team-nifty.com)[ RSS](/packages/team-nifty-gmbh-nuxbe-remote-directory/feed)WikiDiscussions main Synced today

READMEChangelog (3)Dependencies (4)Versions (4)Used By (0)

nuxbe-remote-directory
======================

[](#nuxbe-remote-directory)

Serves Flux ERP contacts as a **remote directory** for phone clients. A desk phone or softphone searches Flux directly ("wigwam" finds the Wigwam GmbH entry) instead of a phonebook that has to be exported and kept in sync.

This is the opposite direction of the caller name lookup in [`team-nifty-gmbh/nuxbe-freepbx`](https://github.com/Team-Nifty-GmbH/nuxbe-freepbx), which resolves an incoming number into a name. Here the client sends a search term and receives matching contacts with their numbers.

Installation
------------

[](#installation)

```
composer require team-nifty-gmbh/nuxbe-remote-directory
php artisan vendor:publish --tag=nuxbe-remote-directory-config
```

Set the shared token in the app `.env`:

```
REMOTE_DIRECTORY_TOKEN=some-long-random-string
REMOTE_DIRECTORY_LIMIT=50
REMOTE_DIRECTORY_MAX_LIMIT=200
```

Endpoint
--------

[](#endpoint)

```
GET /api/remote-directory/search?q=&limit=&page=

```

ParameterMeaning`q`Search term: company, firstname, lastname (prefix match) or a number with at least 3 digits (contains match). Empty returns the first page of the whole directory.`limit`Entries per page, defaults to `remote-directory.limit`, capped by `remote-directory.max_limit`.`page`1 based page number.`token`The shared token, when the client cannot send an `Authorization: Bearer` header.Authentication is the bearer token, or the same value as a `token` query parameter. Desk phones fetch a plain URL and cannot set headers, which is why the query parameter exists.

Only active addresses that carry at least one number are returned.

### Response

[](#response)

XML phonebook, `Content-Type: text/xml; charset=utf-8`:

```

    Wigwam GmbH, Erika Mustermann
    +49 831 1234567
    +49 175 5867488

```

Fanvil reads the same `DirectoryEntry` structure. Should a client insist on the `IPPhoneDirectory` root element, that is the single constant `PhonebookXmlFormatter::ROOT`.

Phone configuration (Yealink)
-----------------------------

[](#phone-configuration-yealink)

Remote phonebook URL:

```
https:///api/remote-directory/search?token=

```

Remote search URL (the phone appends the typed term):

```
https:///api/remote-directory/search?token=&q=

```

LDAP directory
--------------

[](#ldap-directory)

Clients that speak LDAP rather than an XML phonebook (many desk phones, Bria) use the second protocol. It is a listener, not a route, so it runs as its own process:

```
php artisan remote-directory:ldap
```

```
REMOTE_DIRECTORY_LDAP_IP=0.0.0.0
REMOTE_DIRECTORY_LDAP_PORT=389
REMOTE_DIRECTORY_LDAP_BASE_DN="dc=flux,dc=local"
REMOTE_DIRECTORY_LDAP_USERNAME="cn=phones,dc=flux,dc=local"
REMOTE_DIRECTORY_LDAP_PASSWORD=some-long-random-string
```

Phone side (Yealink wording, Fanvil is the same with other labels):

SettingValueServer / Portthe Flux host, `389`Basethe value of `REMOTE_DIRECTORY_LDAP_BASE_DN`Username / Passwordthe values aboveName filter`(|(cn=%)(sn=%))`Number filter`(|(telephoneNumber=%)(mobile=%))`Name attributes`cn sn givenName`Number attributes`telephoneNumber mobile`VersionLDAP 3An entry carries `cn` (company and person), `o`, `givenName`, `sn`, `telephoneNumber` and `mobile`, and empty fields are left out. The DN is `uid=,`.

The listener serves one bind account. Without `REMOTE_DIRECTORY_LDAP_USE_SSL`or a certificate in `REMOTE_DIRECTORY_LDAP_SSL_CERT`, that password and every search travel in the clear, so either terminate TLS or keep the port on the network the phones sit on. Anonymous binds are off unless `REMOTE_DIRECTORY_LDAP_ALLOW_ANONYMOUS=true`, which hands the directory to anyone who reaches the port.

The server forks one process per connection and needs `ext-pcntl` and `ext-posix`. On Forge it belongs in a daemon, not in the deploy script.

Adding another protocol
-----------------------

[](#adding-another-protocol)

The query lives in `AddressDirectorySearch` and is shared by both protocols. The XML side renders in `Formatters/PhonebookXmlFormatter`, the LDAP side in `Ldap/DirectoryRequestHandler`. A third protocol writes its own renderer and reuses the same query.

Tests
-----

[](#tests)

The package tests run against MySQL, because Flux core ships MySQL only migrations. Point `DB_HOST` / `DB_PORT` / `DB_DATABASE` in `phpunit.xml` at a throwaway database, then:

```
composer install
composer test
```

###  Health Score

41

—

FairBetter than 87% of packages

Maintenance100

Actively maintained with recent releases

Popularity2

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity48

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

3

Last Release

0d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/315f809551baee16f7c5531f89a864b4d5b59bde8882779c30d4a01ae36e718e?d=identicon)[team-nifty](/maintainers/team-nifty)

---

Top Contributors

[![patrickweh](https://avatars.githubusercontent.com/u/40495041?v=4)](https://github.com/patrickweh "patrickweh (4 commits)")

###  Code Quality

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/team-nifty-gmbh-nuxbe-remote-directory/health.svg)

```
[![Health](https://phpackages.com/badges/team-nifty-gmbh-nuxbe-remote-directory/health.svg)](https://phpackages.com/packages/team-nifty-gmbh-nuxbe-remote-directory)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
