N3X Remote – Remote Support
A native Windows and macOS app for remote support and remote desktop. Connect by ID and password over encrypted WebRTC (P2P), or manage your own unattended computers from a self-hosted Control Center. A TeamViewer, AnyDesk and RustDesk alternative. Free download.
N3X Remote — next-generation remote support
A lightweight, native Windows and macOS app for remote support and remote desktop. Share your screen with a 9-digit ID and one-time password, take control, or securely pass a file. Screen, input and accepted files travel over an encrypted WebRTC connection directly between devices (P2P) — no accounts and no cloud file storage.
Windows 11 (.exe) and macOS (.dmg) · encrypted P2P, your own server, no cloud
Versions and releases
The complete N3X Remote stack in one place
The desktop app, self-hosted server and unattended agent follow independent release cycles. Their current published versions are always listed here.
Desktop application
v1.8.48
On-demand support, screen sharing and Windows control.
Self-hosted server
v1.15.46
Control Center, signaling and API in the Docker image.
Unattended agent
v0.17.40
Persistent N3XAgent for managed Windows and Linux computers.
Application interface
See the app before you deploy
A real product interface — open any preview to inspect it at full size.
1 / 2
Control Center
Infrastructure health, online devices and administrative events in one command center.
Managed hosting by N3X
Want to use it without maintaining the server?
N3X can deploy and maintain this application, from initial setup and SSL to updates, monitoring and backups.
What N3X Remote can do
Connect by ID and password
Every computer has a stable 9-digit ID and a random session password. Share them with your helper — the model you know from TeamViewer and AnyDesk, only faster.
Full control
Remote mouse, keyboard, scrolling and keyboard shortcuts. The controller drives the desktop as if sitting right in front of it.
Encrypted P2P (WebRTC)
Screen and control travel directly between devices, encrypted end-to-end (DTLS/SRTP). The server only helps establish the connection.
Secure file transfer
Send files both ways over a dedicated encrypted WebRTC channel. The host enables the feature first, every file needs separate approval, SHA-256 is verified, and downloads go to Downloads\N3XRemote.
Hardware video encoding
Modern codecs (H.264/VP9/AV1) with hardware acceleration deliver a smooth picture at low latency and light bandwidth.
Your own server, no cloud
You point the app at your own signaling server (and optionally TURN). No session data goes to a third-party cloud — full control and privacy.
Host-side consent
The host sees a clear banner that it is being controlled and can end the session at any time with a single click.
Control Center, unattended and terminal
Enroll Windows and Linux agents on your own server. Start a desktop or a policy-restricted PowerShell, CMD, Bash or SH session with a real PTY, visible service identity and metadata-only audit that never stores command contents.
How to install
- 1Choose the Windows installer (.exe) or the macOS disk image (.dmg).
- 2Run the .exe installer, or open the .dmg and move N3XRemote to Applications.
- 3There is no server to configure — the app automatically uses remote.n3x.pl. Share your screen (give out the ID and password) or connect to another computer.
Your own server and Control Center — ready-made Docker Compose
The app connects to our server by default and works straight after download. Companies can run signaling, TURN, the device database, audit and management console in-house. The stack does not mandate a specific solution — use any reverse proxy capable of forwarding WebSockets. Secrets are generated locally in your browser and the data never leaves your server.
TURN ports must be published separately — an HTTP(S) reverse proxy is not enough
Forward TCP 3478, UDP 3478 and UDP 49160–49200 directly to the Docker host, or carry them through a layer 4 proxy or load balancer with TCP/UDP support. Allow this traffic through the host firewall. Without it, login and screen selection may work while video and control fail with a P2P/TURN error. Do not configure these ports as a regular HTTP(S) host.
A subdomain pointing at your server, e.g. remote.yourcompany.com
Generated in your browser. It stays on the server — you never enter it in the app.
Use 127.0.0.1 for a proxy on the host. For a proxy in another container or on another server, use the host address or 0.0.0.0 and restrict access with a firewall.
Compose maintains this protected owner account. Add more operators and roles later in Control Center.
Save it in a password manager. This account also provides emergency access recovery for Control Center.
Use 16 to 64 letters, numbers, dashes or underscores.
# N3XRemote — complete self-hosted remote support stack
#
# signaling WebSocket relay, Control API and browser Control Center
# postgres private device inventory, policy and audit database
# coturn TURN relay for restrictive/symmetric NATs
#
# Before you start:
# 1. point remote.example.com at this server (DNS A/AAAA record)
# keep it DNS-only when the same hostname is also used for TURN
# 2. configure any reverse proxy to forward https://remote.example.com to http://127.0.0.1:8788
# with WebSocket upgrades enabled; TLS/proxy is not part of this stack
# 3. when binding to 0.0.0.0, restrict port 8788 to your proxy/firewall
# 4. REQUIRED: publish TURN on your router/firewall or through a TCP/UDP layer 4 proxy
# (not as a regular HTTP(S) proxy host):
# 3478/tcp, 3478/udp and 49160-49200/udp -> this Docker host
# without these rules signaling works, but remote video/control cannot connect
# for a second stack on the same host, set N3X_TURN_PORT and a separate
# N3X_TURN_MIN_PORT/N3X_TURN_MAX_PORT range in Portainer or .env
#
# IMPORTANT — keep this file for future stack updates.
# POSTGRES_PASSWORD initializes only an empty postgres_data volume. Replacing
# it later requires changing the n3xremote database role password first, or
# removing postgres_data (which permanently deletes the Control Center data).
#
# Then run: docker compose up -d
# Control Center: https://remote.example.com/control-GENERATING/
services:
signaling:
image: ghcr.io/nexitpl/n3xremote-signaling:latest
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
PORT: 8787
TURN_SECRET: GENERATING_TURN_SECRET
TURN_URL: turn:remote.example.com:${N3X_TURN_PORT:-3478}?transport=udp,turn:remote.example.com:${N3X_TURN_PORT:-3478}?transport=tcp
DATABASE_URL: postgresql://n3xremote:GENERATING_DATABASE_PASSWORD@postgres:5432/n3xremote
ADMIN_USERNAME: admin
ADMIN_PASSWORD: GENERATING_ADMIN_PASSWORD
ADMIN_PATH: /control-GENERATING
SESSION_SECRET: GENERATING_SESSION_SECRET
ports:
- "127.0.0.1:8788:8787"
networks:
frontend:
backend:
postgres:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_DB: n3xremote
POSTGRES_USER: n3xremote
POSTGRES_PASSWORD: GENERATING_DATABASE_PASSWORD
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "PGPASSWORD=$$POSTGRES_PASSWORD psql -h 127.0.0.1 -U $$POSTGRES_USER -d $$POSTGRES_DB -c 'SELECT 1' >/dev/null"]
interval: 5s
timeout: 5s
retries: 10
start_period: 10s
networks:
- backend
coturn:
image: coturn/coturn:4-alpine
restart: unless-stopped
environment:
# Set N3X_TURN_EXTERNAL_IP only when automatic DNS detection is blocked.
REAL_EXTERNAL_IP: ${N3X_TURN_EXTERNAL_IP:-}
ports:
- "${N3X_TURN_PORT:-3478}:${N3X_TURN_PORT:-3478}/tcp"
- "${N3X_TURN_PORT:-3478}:${N3X_TURN_PORT:-3478}/udp"
- "${N3X_TURN_MIN_PORT:-49160}-${N3X_TURN_MAX_PORT:-49200}:${N3X_TURN_MIN_PORT:-49160}-${N3X_TURN_MAX_PORT:-49200}/udp"
entrypoint: ["/bin/sh", "-ec"]
command:
- |
candidate="$${REAL_EXTERNAL_IP:-}"
if [ -z "$$candidate" ]; then
candidate="$$(detect-external-ip 2>/dev/null || true)"
fi
external_ip="$$(printf '%s\n' "$$candidate" | awk 'match($$0, /([0-9]{1,3}\.){3}[0-9]{1,3}/) { print substr($$0, RSTART, RLENGTH); exit }')"
if [ -z "$$external_ip" ]; then
echo "N3XRemote coturn: no valid public IPv4 address was detected; set N3X_TURN_EXTERNAL_IP" >&2
exit 1
fi
echo "N3XRemote coturn: using external IPv4 $$external_ip"
exec turnserver \
-n \
--log-file=stdout \
--external-ip="$$external_ip" \
--realm=remote.example.com \
--use-auth-secret \
--static-auth-secret=GENERATING_TURN_SECRET \
--listening-port=${N3X_TURN_PORT:-3478} \
--min-port=${N3X_TURN_MIN_PORT:-49160} \
--max-port=${N3X_TURN_MAX_PORT:-49200} \
--no-tls \
--fingerprint \
--no-multicast-peers
tmpfs:
- /var/lib/coturn
networks:
- frontend
networks:
frontend:
backend:
internal: true
volumes:
postgres_data:
mkdir -p n3xremote && cd n3xremote nano docker-compose.yml # paste the file above docker compose up -d # Verify N3XRemote before configuring the proxy: curl http://127.0.0.1:8788/healthz # Configure your own reverse proxy (WebSockets required): http://127.0.0.1:8788 -> https://remote.example.com # REQUIRED TURN rules (direct NAT/firewall or a TCP/UDP layer 4 proxy): # TCP 3478 -> DOCKER_HOST:3478 # UDP 3478 -> DOCKER_HOST:3478 # UDP 49160-49200 -> DOCKER_HOST:49160-49200 # Verify that coturn is running and listens on the Docker host: docker compose ps coturn docker compose logs --tail=100 coturn sudo ss -lntup | grep ':3478' # Test TCP 3478 from a DIFFERENT internet connection, not this LAN: nc -vz remote.example.com 3478 # Verify through the public proxy: curl https://remote.example.com/healthz # Open and bookmark the private Control Center address: https://remote.example.com/control-GENERATING/
What to enter in the app's settings
- Backend listener
127.0.0.1:8788- Reverse proxy target
http://127.0.0.1:8788- Signaling server
wss://remote.example.com- Control Center
https://remote.example.com/control-GENERATING/- Recovery owner
admin- Owner password
…
The downloaded app already uses remote.n3x.pl. Change the address only under Settings → Advanced when using your own instance. Keep the private Control Center address out of public documentation. Enroll unattended agents with the ready-made command generated in the panel; clients never receive TURN or database secrets.
N3X Remote does not install or configure a reverse proxy. Point your chosen domain at the displayed HTTP target, enable WebSockets and request an SSL certificate. The default 127.0.0.1 address works with a proxy running on the host; for a proxy in another container, use the host address or 0.0.0.0 and restrict the port with a firewall. TURN still needs port 3478 (UDP and TCP) and 49160-49200 (UDP) published on the router and firewall or through layer 4 — not as a regular HTTP(S) host. If the same hostname serves TURN, keep it DNS-only in Cloudflare.
Changelog
- ImprovementUnified application and installer icon on macOS and Windows: a shared dark tile, cyan symbol, transparent surroundings and consistent scale across the N3X desktop family.
- FixN3XAgent 0.17.39 fixes staging downloaded updates on Windows: the file is flushed with write access, allowing the updater to proceed to installation instead of failing with access denied.
- FixAfter repair and a successful server heartbeat, the agent clears failures for the installed or older version. A failed newer release keeps its rollback retry cooldown.
- ImprovementThe Windows package includes a one-time update repair script for agents 0.17.32–0.17.38. It checks the release archive SHA-256 and expected agent version, and the installer preserves the existing device identity. Run it from a local administrator PowerShell or an independent management channel.
- FixFixed Windows key encoding: Shift and AltGr bits no longer enter the virtual-key code. Text preserves case and the local keyboard layout, while shortcuts and key release use consistent behavior in the desktop app and browser control center.
- ImprovementN3XAgent 0.17.38 replaces the shared loop and 150 ms sleep with independent input and capture workers. Capture targets 30 fps, backs off on an idle desktop, reuses the GDI buffer and refreshes immediately after a session resumes.
- ImprovementThe relay keeps receiving keys during video upload; queues retain the latest frame and file transfers leave room for video. These changes accompany N3XRemote Server 1.15.46.
- FixWindows administrator worker verification compares process objects even when the UAC launch handle does not allow reading its PID. Restricted handle rights no longer cause the correct worker to be rejected.
- ImprovementControl status distinguishes launch, process verification, readiness and runtime connection failures. Added native restricted-handle tests and Windows desktop pull request validation.
- FixLinux agent removal no longer hits the Windows safe-restart restriction. N3XRemote Server 1.15.45 distinguishes platform, required version and missing privileges, with actionable errors inside the removal dialog.
- NewN3XAgent 0.17.37 adds a bounded systemd uninstaller for Linux. It requires the current installer to run once as root and removes only the agent installation after server acknowledgement, leaving other services intact. Audit records initiation, not verified removal completion.
- ImprovementThe removal dialog now uses consistently styled fields and mode-specific warnings. Revoke-only remains available independently of uninstall support.
USER GUIDE
N3XRemote user guide
Installation, getting started, settings and troubleshooting.
N3XRemote
N3XRemote provides remote assistance. It includes a desktop app, an optional self-hosted Docker server and an agent for managed devices.
Requirements and installation
Windows 11 or macOS (Intel or Apple Silicon).
- Download the ready installer using the download button on this page.
- On Windows, open the
.exefile and follow the installer. On macOS, open the.dmgfile and drag the app into Applications. - Open the installed app.
Use the current release linked on the product page. Installation does not require source code or developer tools.
Connect to another computer
- Install and open the app on both computers.
- The person receiving help shares the nine-digit ID and current session password with a trusted operator.
- The operator enters those details to connect.
- The person sharing their computer can see and end the active session. File transfer must be enabled and each file needs separate consent.
System permissions
On Windows, a manual launch may show a UAC prompt for the control module. The person at the computer approves it. Declining still lets the app run with limited permissions. Startup at login skips UAC; to request it again, end the session, choose Quit from the tray menu and launch manually.
The module can control elevated windows on the normal desktop. The UAC secure desktop still requires local interaction.
On macOS, grant the requested screen-recording and control permissions in system privacy settings, then reopen the app.
Your own server and managed devices
Use the server configurator on this page. It requires a Linux host with Docker Compose, an HTTPS domain and a reverse proxy that supports WebSocket. The configurator provides a ready Compose file and startup commands. Configure TURN for networks where direct connections are unavailable.
Keep PostgreSQL on the internal network and back up the database and persistent secrets. Enroll agents with a token from your trusted Control Center. Unattended access depends on the assigned policies and should be limited to authorized operators.
Troubleshooting and privacy
Check that both devices can reach the server and that the session password is current. If connections fail across networks, check TURN and the firewall. For permission problems, record the full message and how the app was launched.
Assistance sessions use encrypted WebRTC. The server does not store desktop recordings or transferred files. Share your ID and password only with the person you want to grant access to.
