{"id":50718891,"url":"https://github.com/felixclements/omnirdp","last_synced_at":"2026-06-09T22:00:26.068Z","repository":{"id":355613731,"uuid":"1225890598","full_name":"FelixClements/OmniRDP","owner":"FelixClements","description":"OmniRDP N:1 RDP multiplexer - connect one Windows Desktop, share it with multiple clients/ viewers. ","archived":false,"fork":false,"pushed_at":"2026-05-11T13:41:25.000Z","size":11838,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-11T14:40:34.241Z","etag":null,"topics":["multi-view","multiplexer","rdp","rdp-connection"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FelixClements.png","metadata":{"files":{"readme":".github/README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-30T18:50:02.000Z","updated_at":"2026-05-11T13:48:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/FelixClements/OmniRDP","commit_stats":null,"previous_names":["felixclements/omnirdp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/FelixClements/OmniRDP","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FelixClements%2FOmniRDP","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FelixClements%2FOmniRDP/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FelixClements%2FOmniRDP/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FelixClements%2FOmniRDP/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FelixClements","download_url":"https://codeload.github.com/FelixClements/OmniRDP/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FelixClements%2FOmniRDP/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34127345,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["multi-view","multiplexer","rdp","rdp-connection"],"created_at":"2026-06-09T22:00:17.855Z","updated_at":"2026-06-09T22:00:26.061Z","avatar_url":"https://github.com/FelixClements.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OmniRDP\n\nStandalone N:1 RDP multiplexer with Windows service management — one backend Windows RDP session fanned out to multiple simultaneous viewers.\n\nBuilt on FreeRDP 3.26.0 client and server APIs. The process sits in the middle: it connects to one Windows target as an RDP client and accepts multiple viewer connections as an RDP server, forwarding display updates and arbitrating input between viewers.\n\nNew in v2: Windows service manager (`OmniRDP-svc.exe`) with system tray app (`OmniRDP-tray.exe`) for managing multiple backend instances. Multi-service support with isolated configs, per-instance logging, and named pipe IPC.\n\n## Features\n\n### Core Multiplexer\n- **N:1 multiplexing** — multiple viewers see the same remote desktop simultaneously\n- **Input arbitration** — one viewer at a time holds the input lock; idle timeout releases it automatically\n- **Cursor visibility** — passive viewers see the current mouse position\n- **Multi-monitor support** — configure 1–16 monitors for the backend session\n- **Classic SurfaceBits/NSCodec path** — stable display pipeline using encoded bitmap transport\n- **Late-join** — new viewers receive a full refresh on connect\n- **Slow-viewer disconnect** — viewers that can't keep up are automatically disconnected\n\n### Service Manager (NEW)\n- **Windows Service** — OmniRDP runs as a proper Windows service in Session 0\n- **Multiple instances** — one service manages multiple backend+viewer pairs from a single config file\n- **Auto-recovery** — crashed instances auto-restart with exponential backoff\n- **DPAPI encryption** — passwords stored encrypted in config, never on command line\n- **Heartbeat monitoring** — child process health tracked via named pipes\n- **Config hot-reload** — add/remove instances without restarting the service\n\n### System Tray App (NEW)\n- **Status icon** — colored tray icon (green/yellow/red/gray) reflects overall health\n- **Status window** — ListView table showing all instances across all services\n- **Instance controls** — Start/Stop/Restart instances from the tray menu\n- **Log viewer** — built-in window for viewing service logs\n- **First-time setup** — prompts to install service and configure instances\n- **Session change handling** — graceful shutdown on user logoff\n\n### Multi-Service Support (NEW)\n- **Named services** — install multiple isolated OmniRDP services (`OmniRDP-Prod`, `OmniRDP-Test`, etc.)\n- **Per-service configs** — each service has its own `config.ini`\n- **Per-service logs** — isolated log directories per service\n- **Tray discovery** — tray app auto-discovers all `OmniRDP-*` services via SCM enumeration\n\n\n\n---\n\n## Installation and First Connection Guide\n\nThis guide walks you through the complete setup — from getting the binaries to connecting your first RDP viewer.\n\n---\n\n### 1. Where to Download\n\n**Pre-built releases** — if available, download the latest release zip from the [Releases](https://github.com/FelixClements/OmniRDP/releases) page. Otherwise, follow the [Build](#build) instructions above to compile from source.\n\nThe build output contains these files you need:\n\n| File | Purpose |\n|------|---------|\n| `OmniRDP.exe` | Core multiplexer (standalone or child process) |\n| `OmniRDP-svc.exe` | Windows service manager |\n| `OmniRDP-tray.exe` | System tray app for monitoring/control |\n| `freerdp3.dll` | FreeRDP client library |\n| `freerdp-client3.dll` | FreeRDP client helpers |\n| `freerdp-server3.dll` | FreeRDP server library |\n| `winpr3.dll` | FreeRDP Windows portability layer |\n| `libcrypto-3-x64.dll` | OpenSSL crypto library |\n| `libssl-3-x64.dll` | OpenSSL TLS library |\n| `libusb-1.0.dll` | USB redirection support |\n| `zlib1.dll` | Compression library |\n\n---\n\n### 2. How to Install\n\n1. **Download the installer** — get `OmniRDP-Setup.exe` from the GitHub Actions build artifacts (or from [GitHub Releases](https://github.com/OmniRDP/OmniRDP/releases) once published).\n\n2. **Run `OmniRDP-Setup.exe`** — this is an Inno Setup installer that handles everything automatically:\n   - Installs all executables and DLLs to `C:\\Program Files\\OmniRDP`\n   - Copies `setup/config.ini.template` to `C:\\ProgramData\\OmniRDP\\config.ini` (only if it doesn't already exist)\n   - Registers the Windows service (`OmniRDP-svc.exe --install`)\n   - Registers the tray app for auto-start on login (`OmniRDP-tray.exe --install`)\n   - No manual file copying or `--install` commands needed — the installer does it all\n\nOn first run, if no config file exists yet, the service auto-generates a default config at `C:\\ProgramData\\OmniRDP\\config.ini`. You'll edit this file in step 4.\n\n\u003e **Note on DLLs:** The installer places all DLLs in `C:\\Program Files\\OmniRDP` alongside the executables, so they are always found. See the [Usage note](#connecting-viewers) for details.\n\n---\n\n### 3. Generate SSL Certificates\n\nViewer connections use TLS. You need a certificate and private key pair. Two options:\n\n**Option A — Use the built-in test certificates** (quick start, not for production):\n\nThe build generates test certs at `OmniRDP/build/Release/server.crt` and `OmniRDP/build/Release/server.key`. Copy them alongside your executables.\n\n**Option B — Create self-signed certificates with OpenSSL**:\n\n```powershell\nopenssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 -nodes -subj \"/CN=YourServerName\"\n```\n\n**Option C — Use the FreeRDP `makecert` tool**:\n\nLocated at `freerdp-3.26.0/winpr/tools/makecert/`. Build and run it to generate certificates matching FreeRDP's expected format.\n\nCopy the resulting `server.crt` and `server.key` to a secure location (e.g., `C:\\ProgramData\\OmniRDP\\`). You'll reference these paths in the config below.\n\n---\n\n### 4. Configure `config.ini`\n\nOpen `C:\\ProgramData\\OmniRDP\\config.ini` in a text editor. It contains a `[service]` section and one or more `[instance:\u003cname\u003e]` sections. At minimum, edit the `[instance:Example]` section:\n\n```ini\n[instance:Example]\nenabled = true\n\n; --- Backend connection (your Windows target) ---\nbackend.hostname = 192.168.1.100    ; \u003c-- Change to your RDP server IP/hostname\nbackend.port = 3389                  ; Default RDP port\nbackend.username = myuser            ; \u003c-- Your Windows username\nbackend.password = mypassword        ; \u003c-- Your Windows password\n\n; --- Viewer listener (where RDP clients connect) ---\nviewer.bind_address = 0.0.0.0        ; 0.0.0.0 = all interfaces, 127.0.0.1 = local only\nviewer.port = 3390                   ; Port viewers connect to\nviewer.cert_path = C:\\ProgramData\\OmniRDP\\server.crt   ; \u003c-- Path to your certificate\nviewer.key_path  = C:\\ProgramData\\OmniRDP\\server.key   ; \u003c-- Path to your private key\n```\n\n**Key settings explained:**\n\n| Setting | What to put |\n|---------|-------------|\n| `backend.hostname` | IP or hostname of the Windows machine you want to multiplex |\n| `backend.port` | Usually `3389` (the standard RDP port) |\n| `backend.username` / `backend.password` | Credentials for that Windows machine |\n| `viewer.bind_address` | `0.0.0.0` to accept connections from any network, `127.0.0.1` for local-only |\n| `viewer.port` | Any free port (e.g., `3390`, `3391`, etc.) |\n| `viewer.cert_path` / `viewer.key_path` | Absolute paths to your TLS certificate and key files |\n\nSave the file. For a full list of available settings, see the [Configuration Reference](#configuration-reference) section below.\n\n---\n\n### 5. Start It All\n\n**Via Windows Service** (recommended — runs in Session 0, auto-starts on boot):\n\nThe service starts automatically after installation. If you need to start it manually:\n\n```powershell\nnet start OmniRDP_svc\n```\n\nOr open **Services.msc**, find `OmniRDP Service`, and click **Start**.\n\n**Via Standalone Mode** (for testing or manual use):\n\n```powershell\nOmniRDP.exe --config C:\\ProgramData\\OmniRDP\\config.ini\n```\n\nThe service (or standalone process) reads the config, spawns an instance for each enabled `[instance:\u003cname\u003e]` section, and begins listening on the configured viewer ports.\n\n**Connect an RDP client** — use any standard RDP client to connect to `viewer.bind_address:viewer.port`:\n\n```powershell\n# Windows built-in Remote Desktop Connection\nmstsc.exe /v:192.168.1.10:3390\n\n# Or from another machine on the network\nmstsc.exe /v:\u003cserver-ip\u003e:3390\n```\n\nReplace `192.168.1.10` with your server's actual IP address and `3390` with your configured viewer port.\n\nEach viewer that connects will see the same remote desktop. Only one viewer controls input at a time (see [Input Arbitration](#input-arbitration) for details).\n\n**To uninstall**, use **Add/Remove Programs** (or **Apps \u0026 Features**) in Windows Settings — select `OmniRDP` and click **Uninstall**. This removes all files, the Windows service, and the tray auto-start entry.\n\n---\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│  User Session (Session 1+)                                  │\n│  ┌─────────────────────────┐                                │\n│  │  OmniRDP-tray.exe       │  ← System tray + status window │\n│  │  - Tray icon (colored)  │                                │\n│  │  - Status window        │                                │\n│  │  - Service discovery    │                                │\n│  └───────────┬─────────────┘                                │\n│              │ Named Pipe IPC (\\.\\pipe\\OmniRDP_Pipe)        │\n└──────────────┼──────────────────────────────────────────────┘\n               │\n┌──────────────┼──────────────────────────────────────────────┐\n│              │  Session 0 (Windows Service)                 │\n│  ┌───────────▼───────────┐                                  │\n│  │  OmniRDP-svc.exe      │  ← SCM-registered service        │\n│  │  - Instance manager   │                                  │\n│  │  - Config watcher     │                                  │\n│  │  - Named pipe server  │                                  │\n│  └──┬───────┬────────────┘                                  │\n│     │       │                                               │\n│  ┌──▼──┐ ┌──▼──┐                                            │\n│  │Inst1│ │Inst2│  ← Child processes (OmniRDP.exe)           │\n│  │     │ │     │     Each: backend client + viewer server   │\n│  └─────┘ └─────┘                                            │\n└─────────────────────────────────────────────────────────────┘\n```\n\n### Three Executables\n\n| Binary | Purpose | Dependencies |\n|--------|---------|-------------|\n| `OmniRDP.exe` | Standalone multiplexer or service child instance | FreeRDP 3.26.0 (client+server) |\n| `OmniRDP-svc.exe` | Windows Service manager | advapi32, crypt32, kernel32 |\n| `OmniRDP-tray.exe` | System tray application | comctl32, shell32, wtsapi32 |\n\n## Project Structure\n\n```\nOmniRDP/\n├── CMakeLists.txt\n├── include/\n│   ├── backend.h              — BackendClient API and types\n│   ├── viewer_server.h         — ViewerServer, Viewer, MonitorLayout types\n│   └── platform_compat.h       — Cross-platform helpers\n├── src/\n│   ├── main.c                 — Standalone CLI entrypoint\n│   ├── backend.c               — FreeRDP client to Windows target\n│   ├── viewer_server.c         — FreeRDP server for viewer connections\n│   ├── viewer_internal.c/h    — Pure helper logic (input policy, caps, late-join)\n│   ├── pointer_shape.c/h      — Pointer shape cache\n│   ├── platform_compat.c       — Sleep, timestamps, signal handling\n│   │\n│   │  Service Manager (NEW):\n│   ├── svc_main.c             — Service entry point (--install/--uninstall/--run)\n│   ├── svc_service.c/h        — SCM integration, install/uninstall\n│   ├── svc_instance_mgr.c/h   — Child process spawn/monitor/restart\n│   ├── svc_config.c/h         — INI config loading and validation\n│   ├── svc_log.c/h            — Thread-safe file logging with rotation\n│   ├── svc_dpapi.c/h          — DPAPI password encrypt/decrypt\n│   ├── ini_parser.c/h         — Minimal INI file parser\n│   ├── instance_runner.c      — --instance mode entry point for child processes\n│   │\n│   │  Named Pipe IPC (NEW):\n│   ├── pipe_protocol.c/h      — Wire format, framing, message types\n│   ├── svc_pipe_server.c/h    — Service-side named pipe server\n│   ├── tray_pipe_client.c/h   — Tray-side named pipe client\n│   │\n│   │  Tray App (NEW):\n│   ├── tray_main.c            — Tray app entry point\n│   ├── tray_icon.c/h          — System tray icon, context menu, polling\n│   ├── tray_status_dlg.c/h    — Status window with ListView table\n│   └── tray_log_viewer.c/h    — Built-in log viewer window\n└── tests/\n    ├── test_late_join_policy.c\n    ├── test_pointer_shape.c\n    └── test_viewer_state.c\n```\n\n## Build\n\n### Prerequisites\n\n- CMake 3.20+\n- FreeRDP 3.26.0 (vendored in `freerdp-3.26.0/`, must be built first)\n- C11 compiler\n- Windows SDK (for service manager and tray app)\n\n### Windows (Visual Studio 2022)\n\nPrerequisites: CMake, Visual Studio 2022 BuildTools/IDE, vcpkg with `openssl`, `libjpeg-turbo`, `libpng`, `zlib`, `libusb` installed for `x64-windows`.\n\n```powershell\n# 1. Build FreeRDP\ncmake -S freerdp-3.26.0 -B freerdp-3.26.0/build `\n  -DWITH_SERVER=ON -DWITH_CLIENT=ON -DWITH_SHADOW=OFF -DWITH_PROXY=OFF `\n  -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=ON `\n  -DWITH_X11=OFF -DWITH_WAYLAND=OFF -DWITH_PULSE=OFF -DWITH_ALSA=OFF `\n  -DWITH_FFMPEG=OFF -DWITH_CAIRO=OFF -DWITH_SDL2=OFF `\n  -DWITH_SWSCALE=OFF -DWITH_DSP_FFMPEG=OFF -DWITH_VIDEO_FFMPEG=OFF `\n  -DWITH_OPENH264=OFF -DWITH_MEDIA_FOUNDATION=OFF `\n  -DCMAKE_TOOLCHAIN_FILE=\"$env:VCPKG_ROOT\\scripts\\buildsystems\\vcpkg.cmake\" `\n  -G \"Visual Studio 17 2022\" -A x64\n\ncmake --build freerdp-3.26.0/build --config Release -j\n\n# 2. Build OmniRDP (all 3 targets)\ncmake -S OmniRDP -B OmniRDP/build -G \"Visual Studio 17 2022\" -A x64\ncmake --build OmniRDP/build --config Release --target OmniRDP OmniRDP-svc OmniRDP-tray -j\n```\n\n## Usage\n\n### Standalone Mode (original)\n\n```\nOmniRDP \u003chostname\u003e \u003cport\u003e \u003cusername\u003e \u003cpassword\u003e [domain] [monitors]\n```\n\n| Argument   | Required | Description                                      |\n|------------|----------|--------------------------------------------------|\n| hostname   | Yes      | Windows RDP server hostname or IP                |\n| port       | Yes      | RDP port (typically 3389)                         |\n| username   | Yes      | RDP username                                      |\n| password   | Yes      | RDP password                                      |\n| domain     | No       | Domain (use `.` for workgroup)                   |\n| monitors   | No       | Number of 1920×1080 monitors (1–16, default: 1)  |\n\n### Service Manager Mode (NEW)\n\n#### Installation\n\n```powershell\n# Install the service (runs as Administrator)\nOmniRDP-svc.exe --install\n\n# Install with custom name and config\nOmniRDP-svc.exe --install --service-name \"OmniRDP-Prod\" --config \"C:\\OmniRDP\\prod\\config.ini\"\n```\n\n#### Managing Instances\n\nEdit `C:\\ProgramData\\OmniRDP\\config.ini`:\n\n```ini\n[service]\nlog_level = debug\nlog_dir = C:\\ProgramData\\OmniRDP\\logs\n\n[instances]\nnames = office-desktop, lab-server\n\n[instance:office-desktop]\nenabled = true\nbackend.hostname = 192.168.1.209\nbackend.port = 3389\nbackend.username = localadmin\nbackend.password = changeme\nviewer.bind_address = 0.0.0.0\nviewer.port = 3390\n\n[instance:lab-server]\nenabled = true\nbackend.hostname = lab-rdp.company.com\nbackend.port = 3389\nbackend.username = admin\nbackend.password = changeme\nviewer.bind_address = 127.0.0.1\nviewer.port = 3391\n```\n\nAfter editing, reload the config from the tray app or restart the service.\n\n#### Tray App\n\n```powershell\n# Run the tray app\nOmniRDP-tray.exe\n\n# Register for auto-start on login\nOmniRDP-tray.exe --install\n```\n\n### Instance Mode (spawned by service, not for direct use)\n\n```\nOmniRDP --instance \u003cname\u003e --secrets-handle \u003chandle\u003e [--config \u003cpath\u003e]\n```\n\n### Connecting Viewers\n\nViewers connect to the instance's configured viewer port:\n\n```bash\n# Using mstsc (Windows) — connect to the viewer port from the config\nmstsc /v:127.0.0.1:3390\n\n# Using xfreerdp (Linux)\nxfreerdp /v:127.0.0.1:3390 /u:viewer /p:viewer /sec:rdp\n```\n\n\u003e **Note:** On Windows, ensure the FreeRDP DLLs (`freerdp3.dll`, `freerdp-client3.dll`, `freerdp-server3.dll`, `winpr3.dll`) are either in the same directory as the executable or on your `PATH`.\n\n## Configuration Reference\n\n### `[service]` Section\n\n| Key | Default | Description |\n|-----|---------|-------------|\n| `log_level` | `info` | Log level: debug, info, warn, error |\n| `log_dir` | `C:\\ProgramData\\OmniRDP\\logs` | Log directory |\n| `log_max_size_mb` | `10` | Max log file size before rotation |\n| `log_max_files` | `5` | Max old log files to keep |\n| `pipe_name` | `OmniRDP_ServicePipe` | Named pipe for tray IPC |\n| `heartbeat_timeout_sec` | `10` | Child process heartbeat timeout |\n| `graceful_shutdown_sec` | `10` | Graceful shutdown wait time |\n\n### `[instance:\u003cname\u003e]` Section\n\n| Key | Default | Required | Description |\n|-----|---------|----------|-------------|\n| `enabled` | `true` | No | Enable/disable this instance |\n| `backend.hostname` | — | **Yes** | Backend RDP server hostname/IP |\n| `backend.port` | `3389` | No | Backend RDP port |\n| `backend.username` | — | **Yes** | Login username |\n| `backend.password` | — | **Yes** | Password (plaintext auto-encrypted with DPAPI) |\n| `backend.domain` | — | No | Domain (empty for workgroup) |\n| `viewer.bind_address` | `127.0.0.1` | No | Viewer listener address |\n| `viewer.port` | — | **Yes** | Viewer listener port |\n| `viewer.max_viewers` | `10` | No | Max simultaneous viewers |\n| `viewer.cert_path` | — | No | TLS certificate path |\n| `viewer.key_path` | — | No | TLS key path |\n| `display.monitor_count` | `1` | No | Number of monitors |\n| `display.monitor_width` | `1920` | No | Monitor width |\n| `display.monitor_height` | `1080` | No | Monitor height |\n| `reconnect.enabled` | `true` | No | Auto-reconnect on disconnect |\n| `reconnect.max_attempts` | `10` | No | Max reconnect attempts |\n| `codec.nscodec` | `true` | No | Enable NSCodec |\n| `codec.remote_fx` | `true` | No | Enable RemoteFX |\n| `security.tls_enabled` | `true` | No | Enable TLS security |\n| `security.nla_enabled` | `true` | No | Enable NLA security |\n\n## Input Arbitration\n\n- The first viewer to send input automatically acquires the **input lock**\n- Only the viewer holding the input lock can send keyboard/mouse events to the backend\n- If the input owner is idle for the timeout period, the lock is released\n- Passive viewers still see the desktop and current mouse cursor position\n\n## Security\n\n- **DPAPI encryption**: Passwords in `config.ini` are auto-encrypted with `CryptProtectData` (machine-local)\n- **Password transfer**: Never on command line — passed via anonymous pipe with handle inheritance\n- **Config file ACL**: SYSTEM/Admin Full Control, Authenticated Users Read-only\n- **Named pipe ACL**: Restricted to SYSTEM, NetworkService, and interactive user\n- **Service account**: Defaults to `NT AUTHORITY\\NetworkService` (least privilege)\n\n## Repository Layout\n\n```\nOmniRDP/              — Active project source (multiplexer + service manager + tray app)\nfreerdp-3.26.0/       — Vendored FreeRDP dependency (must be built first)\narchive/              — Historical plans, architecture notes, and prior proxy-plugin work\n```\n\n## License\n\nSee [LICENSE](../LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffelixclements%2Fomnirdp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffelixclements%2Fomnirdp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffelixclements%2Fomnirdp/lists"}