# Eight vendored forks, one unnotarised build, three names

> DJOneHub is a Go program that manages the first-generation DJI 4G module over USB so a Mac can send SMS, manage eSIM profiles on a physical card, debug AT commands and use the SIM for data. Its README is written in Chinese and unusually candid, and it names three identities for one project while stopping mid-sentence on the licensing terms.

**ZenGeekLabs/DJOneHub** — A native macOS management tool for the first-generation DJI 4G module.

- Repository: https://github.com/ZenGeekLabs/DJOneHub
- Stars: 563 · Forks: 152
- Language: Go
- License: NOASSERTION
- Published: 2026-09-17 · Updated: 2026-09-17 · Language: en
- Canonical page: https://hysenlabs.com/projects/zengeeklabs-djonehub

## Three identities and a licence sentence that stops mid-word

The repository is DJOneHub under an account called ZenGeekLabs. The product is DJOneHub. The Go module path is neither, it is github.com/iniwex5/vohive, and the project states that it continues an earlier project called VoHive while adding the macOS USB communication, hotplug handling, local web management, SMS, eSIM, network diagnostics and release packaging.

The licence section is the problem. It opens by saying the repository publishes source code, then explains that because the project contains code based on the original VoHive work, something, and the sentence ends there. The repository's licence metadata identifies nothing at all.

So the terms for a tree that contains eight vendored third-party forks are described by a sentence that never finishes. Upstream authorship and third-party notices are pointed at a licence file, a notices file and per-directory notices, which is the right place for that information, and not a substitute for the missing sentence.

## The installer is a script inside the archive and it writes to /usr/local

Installation is not a package manager. You download a ZIP whose name contains macOS-arm64, extract all of it rather than dragging one file out, open Terminal, type cd followed by a space, drag the extracted folder into the terminal window so the path is typed for you, and then run the installer.

```sh
./install
```

The documentation notes that macOS may ask for your administrator password while installing, and that the terminal will show no dots or asterisks while you type it, which is normal.

So the instruction is to execute a script from inside a downloaded archive with root privileges, and the README never shows what that script contains. It does say where the result lands: the program body in a library execution directory under /usr/local, and a command entry point in /usr/local/bin, after which the command works from any directory. Uninstallation is the inverse: stop the program, then delete those two paths with sudo. If you would rather not install at all, the extracted directory can be run in place.

## The build is not notarised, and the fix strips the quarantine flag

The preview build is not signed with an Apple Developer ID and has not been notarised. macOS will therefore refuse it on first run, and the README gives two ways past that.

The supported route is the system settings panel, where the security prompt offers a choice to open the application anyway. The other route is a command.

```sh
xattr -dr com.apple.quarantine ./djonehub ./bin ./lib
```

That removes the quarantine attribute from three paths, which tells the system the files did not come from a download, and the README then restarts the program. It attaches a caution to this: perform the removal only on a file downloaded from the project's own release page whose checksum you have verified against the published digest file.

That is the right caution, attached to a command that bypasses the exact protection Gatekeeper provides. The digest file is offered alongside the ZIP for that purpose and is described as optional for installation and only useful for confirming the download.

## Eight dependency forks live in the tree, and libusb arrives at build time

The module file replaces eight dependencies with copies stored inside the repository. Two are eSIM and UICC card libraries, one is a QMI modem driver, and the rest are a date formatting library, an error wrapper, two standard library extension modules and an error aggregator.

Building the release therefore does not fetch those, which is reassuring for a tool that talks to SIM cards. One of them is itself a fork maintained under the same personal namespace as the module, so the replacement list includes code the author already controls upstream.

The build does download something. The source-build requirements list Xcode command line tools, a package configuration tool, a specific Go release or compatible, and network access to the project's release hosting in order to download and verify the upstream libusb source at a named version. Ordinary users never see this because the release package already bundles libusb, which is why the install section promises no development environment is needed.

Tests run with a single command, and a packaging script takes a version argument and writes the release directory, the ZIP and its digest file into a distribution folder.

## Four USB modes, two of them undocumented by the vendor

The module exposes different interfaces to macOS depending on a USB mode, and the tool maps four of them. Mode 0 is the SMS mode, used to read status, send and receive messages, manage eSIM profiles and issue AT commands. Mode 1 is the internet mode, which exposes a USB network adapter so macOS can use the SIM's data. Modes 2 and 3 are labelled experimental, their purpose is described as unconfirmed, and the README advises against daily use.

The interesting detail is what a mode change costs. Switching triggers the module to re-enumerate its USB interfaces, so the page may briefly show the device as disconnected, and the documentation asks you to wait for the system to rediscover it.

It also warns against unplugging the module or switching modes during critical operations such as writing an eSIM profile. That single sentence is the whole safety story for the eSIM features, and it is easy to read past when you are moving quickly between modes.

The module identifies itself over USB with a vendor and product identifier given in the documentation, and the first troubleshooting entry is that a cable which only charges will make macOS see no device at all.

## The eSIM page writes to a physical card, and deletion is permanent

The eSIM page manages a physical eUICC or eSIM card sitting in the module's SIM slot, which the documentation is careful to distinguish from the eSIM built into the Mac. With a plain physical SIM inserted, the page has nothing to do.

What it can do is substantial: read the card's identifier, firmware, free space and installed profiles, view each profile's name, provider, type and card identifier, download new profiles, enable one, rename one, delete one, check whether the card supports the phonebook extension, and save manually entered phone numbers into the module's own phonebook keyed to the card identifier.

Enabling, downloading, renaming and deleting all modify the physical card, and the warning is explicit that you must not unplug during a write and that deleting a profile is usually irreversible. On compatibility, the documentation notes that different physical eUICC products all following the same specification do not implement every extension identically, and that verification was done only on the cards the author had.

That is the honest framing: the feature set is standard-shaped, the conformance is partial, and the destructive path is real.

## The counters reset on restart and they are not the bill

In internet mode the module hands the Mac a network adapter with an address on a private range, assigned by DHCP, and macOS gains a network service for it whose name in local testing was a vendor string.

The page shows current upload and download rates, totals for the session, and a session total defined as the sum of the two. Three properties of that number are stated. It counts only while the current program process runs, refreshing the page does not reset it, and closing the program means the next start counts from zero.

So the counter is a per-run observation tool, not a metering device, and the documentation says so in as many words: the figures on the page are not the same as the carrier's bill. The safety notes repeat the point from the other direction, asking you to confirm your plan, roaming charges and data cap before using cellular data, and not to switch to internet mode when you do not know what it will cost.

Proxy behaviour is also documented as network-service specific, with advice to reconfigure the system proxy for that service or enable a tunnel mode in proxy software.

## The AT page hands raw modem control to the browser

One page lets you send AT commands straight to the module, and the documentation gives five examples: a bare command, a signal quality query, an operator registration query, a PIN status query and a stored-number query.

The warning under that list is the important part. These commands can change network registration, packet data contexts, USB mode, message storage and SIM state, and the documentation says not to run commands you do not understand and not to copy flashing or writing commands from unknown sources.

That page is also the honest face of the whole tool. It is an AT terminal for a consumer modem, reachable from a local web page, on a machine that the same documentation says should not be used to flash firmware.

Elsewhere the behaviour is carefully bounded: the page listens only on the loopback address on one port, logs and local data stay under the user's Library directories, terminal output is limited to start, stop and error summaries with the low-level USB traffic going to the log file, and a demo mode starts the whole interface with no hardware attached.

## Conclusion

Read it as a single-vendor tool with a narrow support target, because everything in it is built around one module's USB behaviour and two of its four modes are undocumented. Two things to settle before you rely on it: the licence terms are incomplete in the README and absent from the metadata, and the release is unnotarised, so the documented fix strips the quarantine attribute and that decision is yours to make safely.

## FAQ

### What is DJOneHub?

An unofficial third-party macOS tool for the first-generation DJI 4G module. It talks to the module over its existing USB interface so SMS, eSIM profile management on a physical card, AT command debugging and USB 4G internet work on a Mac without a virtual machine.

### Which Macs does DJOneHub support?

The current preview package is Apple Silicon only, covering M1, M2, M3, M4 and later chips, on macOS 13 Ventura or newer. An Intel version has not been released and has not been verified on real hardware.

### Why does macOS block DJOneHub on first run?

The preview build is not notarised with an Apple Developer ID, so macOS may report that the developer cannot be verified. You can allow it in Privacy and Security, or remove the quarantine attribute with xattr, which the README says to do only for files from the trusted release page whose SHA-256 you have checked.

### Does DJOneHub manage the eSIM built into the Mac?

No. The eSIM page works with a physical eUICC or eSIM card in the module's SIM slot. It can read the card identifier, list and download profiles, enable, rename and delete them, and save number records into the module phonebook keyed to the card identifier.

### Where does DJOneHub keep its data?

Logs are written to a file under the user's Library Logs directory for the app, and local run data to its Application Support directory. The management page listens only on the loopback address on port 7575, and nothing is uploaded to a remote server.

## Sources

- [Issues](https://github.com/ZenGeekLabs/DJOneHub/issues)
- [README](https://github.com/ZenGeekLabs/DJOneHub/blob/main/README.md)
- [Releases](https://github.com/ZenGeekLabs/DJOneHub/releases)
- [ZenGeekLabs/DJOneHub on GitHub](https://github.com/ZenGeekLabs/DJOneHub)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/zengeeklabs-djonehub
