Back to tools

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

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.

Ask about N3X hosting

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

  1. 1Choose the Windows installer (.exe) or the macOS disk image (.dmg).
  2. 2Run the .exe installer, or open the .dmg and move N3XRemote to Applications.
  3. 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.

docker-compose.yml
# 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:
Running it on the server
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).

  1. Download the ready installer using the download button on this page.
  2. On Windows, open the .exe file and follow the installer. On macOS, open the .dmg file and drag the app into Applications.
  3. 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

  1. Install and open the app on both computers.
  2. The person receiving help shares the nine-digit ID and current session password with a trusted operator.
  3. The operator enters those details to connect.
  4. 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.