DjMirror Pulse 1.0.743 User Guide

Multi-Screen & Client-Server Installation Guide

User Guide

DjMirror Pulse · Professional Series

DjMirror Pulse User Manual Series
Source: docs_user_manuals\MULTI_SCREEN_CLIENT_SERVER_GUIDE.md
Revision 2026.10 • Release 1.0.743

Table of Contents

Chapter 1: Overview

DjMirror Pulse includes a built-in server/client architecture that lets a single master instance (the server) drive any number of secondary instances (the clients) across a local network. Every client mirrors the server's configuration in real time — style changes, brightness, effects — so you can run multiple screens or rooms from one control point without reconfiguring each machine individually.

This guide is written for AV integrators, event production companies, and venue IT staff who need to deploy DjMirror Pulse in a networked multi-screen or multi-room environment.

Supported desktop platforms: Windows and macOS. Linux is not a supported DjMirror Pulse desktop server or client platform. Android is supported as a separate mobile remote control; it does not act as a multi-screen display client. See Mobile Remote Guide.

Note

The client/server feature is enabled by default. No additional licensing or plugins are required.

Chapter 2: Architecture Overview

Network diagram showing one DjMirror Pulse server syncing screen clients over the LAN, with an Android phone connected separately as a mobile remote Figure 1: the desktop server sends configuration updates to each screen client; the Android mobile remote controls the server but is not a display client.

How changes propagate:

Channel Port Purpose
HTTP long-poll (/api/v1/config/subscribe) HTTP port (default 8080) Config subscription; delivers full state on connect
WebSocket live events HTTP port + 1 (default 8081) Real-time change announcements (<1 second latency)

Each client reads the server's full configuration on startup, then applies every subsequent change immediately. If the WebSocket connection drops, the client automatically retries every 5 seconds — no manual intervention needed.

Note

A client is a pure mirror. Configuration changes made locally on a client machine are not sent back to the server. DMX scene and "Play All" events are also not mirrored (they are available through the mobile remote control).

Chapter 3: Requirements

Network Requirements

Requirement Details
Network topology All machines on the same LAN or with a routed path between them
Firewall Inbound TCP 8080 (HTTP) and 8081 (WebSocket) open on the server machine
Bandwidth Minimal — only configuration deltas are transmitted, not video
Latency < 100 ms recommended for smooth real-time sync

Tip

For production venues, use wired Ethernet (Gigabit) rather than Wi-Fi. Wi-Fi is acceptable for small setups but can introduce latency spikes under load.

Software Prerequisites

Media Availability (Visuals/ on Every Machine)

Only configuration travels over the network — media files never do. Each machine resolves playlist entries, style assets and artist media against its own local documentsPath/Visuals/ tree, so every client needs the same files the server uses, or layers render black/missing while config sync looks fine. Two supported layouts:

Layout How Best for
Identical copies Copy the server's Visuals/ (Videos|Images|Avatars|Logos|Styles, *.txt playlists) to the same relative location on each client before the show; re-copy after adding media Touring rigs, unreliable venue networks
Network share Put Visuals/ on an SMB/NFS share and set the same documentsPath (UNC path or identically-mounted drive letter) on server and clients Fixed installs where one librarian updates content for all screens

Rules for both: keep identical subfolder structure and filenames (playlists reference bare filenames); point every machine's documentsPath at its copy (see Config & CLI); verify by loading each style/playlist on one client before doors. Note: with a network share, video decoding streams over the LAN — prefer wired Gigabit and pre-test your heaviest loops; with local copies, disks do the work and the LAN carries config only.

Chapter 4: Setting Up The Server

The server is the machine an operator uses to control the show. All other machines follow it.

Step 1 — Launch the Server

Open a PowerShell (or Terminal) window and run:

.\DjMirrorPulse.exe --server --port 8080
Flag Description
--server Forces the HTTP configuration server ON
--no-server Forces it OFF
--port <n> Sets the HTTP port (default: 8080). The WebSocket port is always n + 1

Note

The server is on by default at port 8080. You only need --server --port 8080 if you changed the defaults or want to be explicit.

Step 2 — Configure via config.json (optional)

Alternatively, set server options permanently in config.json next to the executable:

{
  "server": true,
  "port": 8080
}

The command-line flags always override config.json. A server restart is required for these settings to take effect.

Step 3 — Verify the Server Is Running

From any computer on the network, open a terminal and run:

curl.exe http://SERVER_IP:8080/config

Expected responses:

Response Meaning
JSON configuration object ✅ Server is up and accessible
{"ok":false,"error":{"code":"UNAUTHORIZED"...}} ✅ Server is up — but an API key is required (see Section 6)
Connection timeout ❌ Firewall blocking, wrong IP, or server not running

Chapter 5: Connecting Clients

Windows and macOS

On each client machine, open a terminal and run the command for its operating system:

# Windows (PowerShell)
.\DjMirrorPulse.exe --no-server --client http://192.168.1.50:8080
# macOS
./DjMirrorPulse --no-server --client http://192.168.1.50:8080

Replace 192.168.1.50 with the actual IP address of the server machine.

Flag Description
--no-server Prevents the client from starting its own HTTP server (recommended — avoids port conflicts)
--client <url> URL of the server to follow
--no-client Disables client mode even if config.json has a URL

Persistent Configuration via config.json

To avoid typing the command every time, set the client URL in config.json:

{
  "server": false,
  "client": "http://192.168.1.50:8080"
}

An empty "client": "" value means "no client mode."

Tip

Once configured in config.json, double-clicking the DjMirror Pulse icon will automatically connect the client — no terminal needed for daily use.

Chapter 6: Firewall Configuration

Open the following inbound TCP ports on the server machine's firewall. Client machines do not require any special firewall rules (they make outbound connections only).

Port Protocol Service Required
8080 TCP HTTP Config API + long-poll ✅ Yes
8081 TCP WebSocket live events ✅ Yes (strongly recommended)

Warning

If port 8081 (WebSocket) is blocked, clients fall back to slower HTTP long-polling. Changes will still arrive, but with higher latency. Always open both ports for best performance.

Windows Firewall (PowerShell — run as Administrator)

# HTTP port
New-NetFirewallRule -DisplayName "DjMirror Pulse HTTP" `
  -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow

# WebSocket port
New-NetFirewallRule -DisplayName "DjMirror Pulse WebSocket" `
  -Direction Inbound -Protocol TCP -LocalPort 8081 -Action Allow

macOS Firewall

If the macOS Application Firewall is enabled, allow DjMirror Pulse through it in System Settings → Privacy & Security → Firewall → Firewall Options.

Chapter 7: API Key Authentication

For venues where network security matters, you can require an API key on the server so that only authorized clients can connect.

Setting the API Key

Set the key using any one of these methods (listed in order of priority — higher items win):

  1. Environment variable (highest priority):
    $env:DJMIRROR_API_TOKEN = "YOUR_SECRET_KEY"
    .\DjMirrorPulse.exe --server
    
  2. config.json:
    { "apiKey": "YOUR_SECRET_KEY" }
    
  3. Settings → Mobile app (API security section) in the DjMirror Pulse UI

Connecting Clients with the Key

.\DjMirrorPulse.exe --no-server --client http://192.168.1.50:8080 --client-key YOUR_SECRET_KEY

Or set it permanently in config.json on the client:

{
  "client": "http://192.168.1.50:8080",
  "clientApiKey": "YOUR_SECRET_KEY"
}

Tip

The easiest secure setup is to configure the same API key on every machine (server and clients). If clientApiKey is not set, the client automatically uses its own apiKey value — meaning identical config.json files work on all machines.

Warning

Prefer config.json over --client-key on shared computers. Command-line arguments are visible to other users in the process list.

Testing Authentication

# Should return the config JSON (not UNAUTHORIZED)
curl.exe -H "X-API-Key: YOUR_SECRET_KEY" http://SERVER_IP:8080/config

# Alternative header format also accepted
curl.exe -H "Authorization: Bearer YOUR_SECRET_KEY" http://SERVER_IP:8080/config

Note

In PowerShell, always use curl.exe (not curl) when passing custom headers. curl in PowerShell is an alias for Invoke-WebRequest and does not support these options.

Chapter 8: Verifying Synchronization

Use this checklist after connecting all clients to confirm the setup is working correctly.

Synchronization Checklist

Test How to perform Expected result
Server responds curl.exe http://SERVER_IP:8080/config Config JSON returned
One client follows Change a style or brightness on the server Client updates within 1 second
Multiple clients follow Connect 2+ clients; change server setting All clients update simultaneously
Automatic reconnection Restart the server while clients are connected Clients reconnect within ~5 seconds, no manual action
Client independence Stop one client Server and remaining clients continue unaffected
Media present everywhere Load each style/playlist on one client Same pictures/video as the server — no black layers

Reading the Client Log

To see exactly what a client is doing, start it with --console and pipe the output:

.\DjMirrorPulse.exe --no-server --console --client http://192.168.1.50:8080 2>&1 | Tee-Object client.log

Key log lines to look for:

Log line Meaning
WebSocket connected to ws://... Live channel established ✅
Configuration update received via WebSocket Server change arrived and applied ✅
Subscription error / WebSocket error Server unreachable or API key rejected ❌
WebSocket reconnection scheduled in 5 seconds... Connection dropped; auto-retry in progress ⚠️

Note

If the log shows only FFmpeg or MIDI messages but no [HttpConfigClient] entries, you may be running an older build. Set these environment variables before starting:

$env:QT_LOGGING_TO_CONSOLE = "1"
$env:QT_FORCE_STDERR_LOGGING = "1"

Chapter 9: Multi-Room & Large Venue Scenarios

Scenario A — Single Room, Multiple Screens

Run one server and connect one client per screen. All screens show the same content, synchronized in real time.

[Operator Laptop — Server]
       │
       ├── [Stage Screen L — Client]
       ├── [Stage Screen C — Client]
       └── [Stage Screen R — Client]

Scenario B — Multi-Room Venue

Each room has its own display machine (client). All rooms follow the same server.

[Lighting Booth — Server :8080]
       │
       ├── [Main Hall — Client]
       ├── [VIP Room — Client]
       └── [Bar Area — Client]

Scenario C — Backup / Redundancy

Run a second DjMirror Pulse as a client on a standby machine. If the primary display fails, point the output at the standby. The standby is always in sync and ready.

Performance Notes for Large Deployments

Tip

For venues with VLAN segmentation, ensure the server's HTTP and WebSocket ports are reachable from the VLAN(s) where client machines reside. A simple ping test from each client machine to the server IP confirms routing before show day.

Chapter 10: Troubleshooting

Connection Problems

Symptom Likely Cause Fix
curl to server times out Firewall blocking, wrong IP, or server is off Check --server flag; open ports 8080 and 8081 in firewall
Server returns UNAUTHORIZED API key is configured Send the key via -H "X-API-Key: YOUR_KEY" (see Section 6)
Client starts but never syncs Wrong IP/port, or missing API key Check the client log for UNAUTHORIZED, 401, or WebSocket errors
Port already in use on startup Two instances on same machine both have server enabled Start the second instance with --no-server

Synchronization Problems

Symptom Likely Cause Fix
Changes arrive slowly (seconds delay) WebSocket port 8081 blocked Open port 8081 — client is falling back to slow HTTP long-poll
Client follows config but layers are black / media missing Visuals/ files absent on that client Copy the server's Visuals/ tree or point documentsPath at the shared folder (§2, Media Availability)
Client does not reconnect after server restart Invalid or empty --client URL Verify the URL is correct; reconnection requires a valid URL
Client shows stale content after reconnect Normal — config is re-fetched on reconnect Wait a moment; client re-reads full config on reconnect

Log-Guided Diagnostics

Start both server and client with --console and compare logs side-by-side:

# Terminal 1 — Server
.\DjMirrorPulse.exe --server --console 2>&1 | Tee-Object server.log

# Terminal 2 — Client
.\DjMirrorPulse.exe --no-server --console --client http://192.168.1.50:8080 2>&1 | Tee-Object client.log

Note

PowerShell does not wait for a windowed program without a pipe. Using | Tee-Object file.log makes PowerShell wait and capture all output. The log ends when you close DjMirror Pulse — do not close the PowerShell window first.

Chapter 11: Summary — Command Reference

Scenario Command
Start server (default port) DjMirrorPulse.exe --server
Start server (custom port) DjMirrorPulse.exe --server --port 9090
Connect client DjMirrorPulse.exe --no-server --client http://SERVER_IP:8080
Connect client with API key DjMirrorPulse.exe --no-server --client http://SERVER_IP:8080 --client-key KEY
Start with console log DjMirrorPulse.exe --server --console 2>&1 \| Tee-Object server.log

Chapter 12: Related Documentation