Headwind MDM is a Mobile Device Management platform for Android devices, designed for corporate app developers and IT managers.
(c) 2020 h-mdm.com
Public fork: https://github.com/Intteger157/hmdm-server
Companion Remote (Janus / web-admin) repo: https://github.com/Intteger157/h-mdm-remote-control
Compared to stock upstream, this tree packages extra server plugins into the WAR and includes launcher / remote-control agent sources for a full self-hosted stack (MDM + Remote on one VPS via HAProxy).
Building server packages these plugins into server/target/launcher.war (see server/pom.xml / plugins/pom.xml):
| Plugin | What it does |
|---|---|
deviceremote |
Unattended remote control (opens Headwind Remote viewer) |
devicelocation |
Device location on the map |
devicereset |
Factory reset, reboot, lock / unlock |
deviceinfo |
Extended device information |
deviceinventory |
Hardware / inventory reporting |
devicelog |
Application / device logs in the panel |
push |
Push / MQTT-related delivery |
messaging |
Messaging |
audit |
Audit trail |
platform / xtra |
Plugin platform + extras |
Yes: one Maven build of this repository produces a WAR with Remote, Location, Reboot/Lock/Reset, and the other plugins above — you do not need to assemble plugins by hand.
Related sources in this repo (not inside the WAR itself):
| Path | Purpose |
|---|---|
plugins/deviceremote/ |
MDM plugin UI + REST |
plugins/deviceremote/apuppet-android/ |
Android remote agent (com.hmdm.control) |
android-launcher/ |
Launcher with remote-control integration |
plugins/deviceremote/h-mdm-remote-control/ |
Optional local checkout of the Remote server (prefer the standalone GitHub repo) |
- Enrollment to Android 7+ devices through scanning a QR-code
- Work in "Application mode" without enrollment
- Customize the mobile desktop design and available applications
- Automatic deployment of applications through the web panel
- Mobile device management: groups, configurations, device status
- Setup the available mobile device capabilities (GPS, Wi-Fi, Bluetooth etc.)
- Manage the automatic OS update mode on the mobile device
- Extensible platform design allowing the custom plugin development
- Collection of application logs in the web panel
- Centralized configuration of corporate applications
The Enterprise edition of the platform has more features:
- Restriction of mobile user functions ("kid's shell" for corporate users)
- Disable to change the mobile device settings
- Kiosk mode (COSU, single-task mode)
- Sending images from mobile device to server
- Cloud-based or self-hosted server setup
- Premium support of enterprise users
- Custom plugin development services
The enterprise edition may be ordered on the project website.
Headwind MDM control panel is cross-platform (it is written in Java and uses Tomcat web server). However the best OS for the deployment of Headwind MDM control panel is Ubuntu Linux.
- Clone the project and build it (see Build custom WAR below, or
BUILD.txt) - Install the web panel to the server (installer script or Docker)
- Open the web panel and follow the hints to generate a QR code
- Perform the factory reset on your Android device, tap 7 times on the welcome screen
- Follow the instructions to scan a QR code and enroll the mobile agent
On a build machine or on the MDM VPS (Docker Maven avoids installing JDK/Maven on the host):
git clone https://github.com/Intteger157/hmdm-server.git
cd hmdm-server
docker run --rm \
-v "$(pwd)":/usr/src/mymaven \
-v "$HOME/.m2":/root/.m2 \
-w /usr/src/mymaven \
maven:3.8.6-openjdk-11 \
mvn clean package -pl server -am -DskipTestsArtifact:
server/target/launcher.war
Typical layout: sources in ~/hmdm-server, compose project in ~/hmdm-docker with volumes/webapps/ROOT.war mounted into Tomcat.
cd ~/hmdm-docker
docker compose stop hmdm
rm -rf volumes/webapps/ROOT
cp ~/hmdm-server/server/target/launcher.war volumes/webapps/ROOT.war
chmod 644 volumes/webapps/ROOT.war
docker compose start hmdmAfter boot, open Plugins — bundled plugins should register (Liquibase). Enable what you need.
Without Docker, see classic Tomcat steps in BUILD.txt / INSTALL.txt.
Use two DNS names on one public IP, for example:
mdm.example.com→ Headwind MDM (Tomcat behind Docker)remote.example.com→ Headwind Remote (Janus + web-admin)
Internet :80 / :443
│
HAProxy (TLS terminate)
│
├── Host: remote.* ──► https://127.0.0.1:9443 (Remote docker nginx)
└── Host: mdm.* ──► https://127.0.0.1:8443 (MDM docker Tomcat)
Janus still needs public 8089/tcp, 8989/tcp, and UDP 10000-10500.
Follow your usual hmdm-docker setup so MDM HTTPS listens on localhost only, e.g. 127.0.0.1:8443 (not public :443). Deploy the custom WAR from this repo (section above).
git clone https://github.com/Intteger157/h-mdm-remote-control.git
cd h-mdm-remote-controlIn config.yaml (when MDM already owns public 443 / HAProxy will own 80+443):
---
hostname: "remote.example.com"
email: "admin@example.com"
web_https_port: 9443
web_http_listen: "127.0.0.1:8080"
nat: true
public_ip: "YOUR.PUBLIC.IP"sudo ./install.sh
cat deploy/dist/credentials/janus_api_secretScripts live in the Remote repo:
cd ~/h-mdm-remote-control
cp scripts/single-port/config.env.example scripts/single-port/config.env
nano scripts/single-port/config.env # REMOTE_DOMAIN, MDM_DOMAIN, paths, email
chmod +x scripts/single-port/*.sh
sudo scripts/single-port/setup-single-port.shAlready on nginx stream SNI? Migrate:
sudo scripts/single-port/migrate-nginx-to-haproxy.shFull details: h-mdm-remote-control / scripts/single-port/README.md
- Plugins → Remote control → Settings
- URL:
https://remote.example.com/web-admin/(no:9443when HAProxy fronts 443) - Secret: value from
janus_api_secret
- URL:
- Roll out launcher +
com.hmdm.controlwith the same server URL/secret (or set via configuration).
More Remote install notes: INSTALL-UBUNTU.md
Headwind MDM is a platform making corporate app development easier. We are happy to get more powerful plugins related to mobile device management.
Please contact us on the project website if you'd like to:
- develop a public plugin for Headwind MDM
- suggest a feature
- order the custom development
- report a bug