dumbtv
dumbtv가 ADB로 Fire TV에서 광고·추적·업데이트 알림을 제거, 루트·앱 변경 없이, 무료 오픈소스
브라우저 탭에서 원격 데스크톱 제공, 머신 간 WireGuard형 메쉬와 팀 채팅·영상 포함, 자체 호스팅·종단 암호화
Remote desktop in a browser tab and a private WireGuard-style mesh between your machines, with team chat and video included. Self-hostable, end-to-end encrypted.
보안Rust · TypeScriptGitHub @gjovanov온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Open-source remote desktop and WireGuard mesh in one daemon — control any machine from a browser tab, or reach its ports and shell over a private encrypted network. Tunnels, SOCKS5, exit nodes, MagicDNS, SSH with no sshd. Team chat and video included. Rust. Self-hostable, AGPL + MPL.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Open-source remote desktop and WireGuard mesh in one daemon.
Put the desktop of any machine you own into a browser tab, and join all of those
machines into one private encrypted network that travels with you — so a laptop
in a hotel, a GPU box at home and a server in a rack behave as if they shared a
LAN. Chat and video conferencing come with it.
It is one small agent per machine and one server you can run yourself. Traffic
goes peer-to-peer and is end-to-end encrypted: the server introduces the two
ends and enforces policy, and never sees your pixels, keystrokes, files or
tunnelled bytes.README 전문 보기 ↗Open-source remote desktop and WireGuard mesh in one daemon.
Put the desktop of any machine you own into a browser tab, and join all of those machines into one private encrypted network that travels with you — so a laptop in a hotel, a GPU box at home and a server in a rack behave as if they shared a LAN. Chat and video conferencing come with it.
It is one small agent per machine and one server you can run yourself. Traffic goes peer-to-peer and is end-to-end encrypted: the server introduces the two ends and enforces policy, and never sees your pixels, keystrokes, files or tunnelled bytes.
Self-hosted — unlimited devices, no licence key, no activation, no phone-home. Same code as the hosted service; there is no crippled community build.
git clone https://github.com/gjovanov/roomler-ai.git && cd roomler-ai
cp .env.selfhost.example .env.selfhost # fill in 4 values; 2 are `openssl rand -hex 32`
docker compose -f docker-compose.selfhost.yml --env-file .env.selfhost pull
docker compose -f docker-compose.selfhost.yml --env-file .env.selfhost up -d
Then open http://localhost:8080. Full walkthrough — TLS, reverse proxy, media
ports, backups — in docs/self-hosting.md.
Images are published at
ghcr.io/gjovanov/roomler-ai
for linux/amd64 and linux/arm64 — a Raspberry Pi, an Apple Silicon Mac or an
ARM VPS pulls the same tag. To build from source instead — always supported, and
never merely a fallback — swap the last two lines for up -d --build; that
compiles Rust and mediasoup, measured 6 minutes on a 16-core laptop, 15–20 on a
small VPS.
Hosted — create a workspace at roomler.ai and skip to the next step. Free for 10 users and 100 devices, commercial use included.
Mint an enrollment token in the app (Devices → Enroll device), then on the machine you want to reach:
# Linux / macOS
curl -fsSL https://roomler.ai/api/setup/install.sh | sh -s -- --role daemon --token <enrollment-jwt>
# Windows (PowerShell, elevated)
& ([scriptblock]::Create((irm https://roomler.ai/api/setup/install.ps1))) `
-Role daemon-system -Token <enrollment-jwt>
The agent connects outbound only — nothing is opened on the machine you enrol, and no port is forwarded. Then, from anywhere:
roomler ssh gpu-1 # a shell — no sshd, no listening port
roomler forward --agent office-1 --local 127.0.0.1:5432 --remote db.internal:5432
roomler socks5 --agent berlin-1 --local 127.0.0.1:1080 # see the network as that machine sees it
…or open the machine's desktop from the web app and use it as if you were sitting at it.
Prefer a GUI? The roomler-setup wizard installs any role on any OS —
see docs/installation.md.
| If you use… | …for | Roomler does it |
|---|---|---|
| TeamViewer / AnyDesk / RustDesk | reaching a desktop | browser-based, hardware-encoded, consent-gated, works through corporate firewalls |
| Tailscale / ZeroTier / NetBird | a private network between machines | WireGuard mesh, stable IPs, MagicDNS, subnet routers, exit nodes |
| ngrok / Cloudflare Tunnel | reaching one service behind a NAT | roomler forward, SOCKS5, daemon-supervised declared routes |
sshd + a jump host | a shell on a remote box | roomler ssh — no daemon to install, no port to open, no bastion |
| Slack + Zoom | the team layer | rooms, threads, files, HD calls on the same server and accounts |
Not a claim that it beats each of those at its own game — a claim that you stop running five things, on one identity, with one agent, and can host the whole lot yourself. Head-to-head write-ups, each naming what the other product does better: vs Tailscale · vs RustDesk · vs TeamViewer · vs MeshCentral · vs NetBird.
The server you would host is AGPL-3.0; everything you install on a
machine — agent, CLI, desktop and setup apps — is MPL-2.0, which imposes
nothing on the tooling you build around it. MSPs and IT providers: that split
exists for you. See LICENSING.md and
COMMERCIAL.md.
On the name: the AI in
roomler.aiis one optional document-recognition feature. This is a networking and remote-access product. Nothing calls home, and self-hosted deployments send us no telemetry at all.
Open any of your machines in a browser tab and use it as if you were sitting in front of it. Nothing to install on the viewing side — the machine you're reaching runs a small agent, and your browser becomes its screen, keyboard, and mouse. The picture is hardware-encoded and fluid enough for real work; clipboard, file transfer, remote apps, and even the Windows lock screen just work. Every session is consent-gated and audit-logged, end-to-end encrypted, and connects straight through hotel Wi-Fi, NATs, and corporate firewalls.
| In detail | |
|---|---|
| Viewer | Plain browser tab — nothing to install on the viewing side. Classic <video> or low-latency WebCodecs canvas paths (bypasses Chrome's ~80 ms jitter buffer) |
| Codecs | H.264, HEVC, AV1, VP9 4:4:4 — hardware-encoded when the GPU allows (NVENC / Quick Sync / AMF / Media Foundation), with probe-and-rollback cascade and software fallback. See docs/encoders.md |
| Input & UX | Full keyboard/mouse with keyboard-lock + Ctrl-Alt-Del, multi-monitor, resolution/scale control, remote cursor, clipboard sync (text/HTML/image), resumable file transfer, remote-apps menu (list / focus / launch, tmux re-attach), optional remote audio |
| Unattended access | Runs as a service, survives logout, controls the lock screen / UAC / pre-logon on Windows (SystemContext), virtual desktops for headless Linux servers |
| Security | Consent-gated + audit-logged sessions, tenant-scoped agent identity, E2E-encrypted WebRTC — the server relays only signalling |
Every machine you enroll joins your own private network — as if all your devices
were on the same home LAN, wherever they actually are. Each one keeps a stable
address and a memorable name (gpu-box, home), traffic flows directly
between your devices, end-to-end encrypted with WireGuard, and nothing needs an
open port or a VPN concentrator. On top of that network: forward any port with
one command, point any app at a SOCKS5 doorway into a network only one of your
machines can see, share a whole home LAN through one device, SSH to any node by
name with no sshd exposed — or route all of your internet through a trusted
machine when you travel.
| In detail | |
|---|---|
| WireGuard mesh | Every node gets a stable private IP (CGNAT 100.64.0.0/10) + a MagicDNS name. Carriers auto-negotiate: LAN-direct → public-direct → NAT hole-punch → TURN relay (QUIC-upgraded) → DERP over :443 — it works even from strict corporate networks. See docs/overlay-communication.md |
| Tunnels | roomler forward (any host:port an agent can reach becomes a local port), roomler socks5 (per-agent or whole-fleet mesh proxy, TCP + UDP), declared routes supervised by the daemon |
| SSH without sshd | roomler ssh <name> — interactive shells on any node with no listening port and no sshd install, consent-gated (docs/roomler-ssh.md) |
| Exit nodes | Route a client's entire internet egress (v4+v6, DNS included) through a chosen mesh peer — with a never-self-wedge safety model |
| Multi-org | One daemon can join several organizations at once, with per-org WireGuard keys and disjoint address blocks |
| Policy & audit | Default-deny tunnel ACLs, overlay ACLs (off/warn/enforce), subnet-route + exit-node approval in the admin UI, audit trail per flow |
| Fleet operations | roomler exec remote command execution (four independent default-deny gates), device console, live observability: mesh graph, per-carrier stats, relay usage |
The team layer is built in, not bolted on: organized rooms with threaded chat, reactions, mentions and file sharing, plus HD video calls with screen sharing and recordings — on the same server and the same accounts as everything above. If your team already lives here to reach its machines, meetings and chat come free.
| In detail | |
|---|---|
| Rooms & chat | Hierarchical room tree (text + voice/video), threaded messages, reactions, custom emoji, @mentions (TipTap editor), pins, embeds, typing indicators, presence |
| Video conferencing | mediasoup WebRTC SFU, per-room calls, multiple producers/consumers, in-call chat, recordings |
| Multi-tenancy | Organizations with plans + Stripe billing, roles & permissions, invite links / email / batch invites, OAuth (Google, Facebook, GitHub, LinkedIn, Microsoft) |
| Files | Versioned + multipart uploads (S3/MinIO), cloud sync (Google Drive, OneDrive, Dropbox), AI document recognition (Claude vision) |
| Search & export | Global full-text search (Ctrl+K), XLSX + PDF conversation export, background task pipeline |
| Notifications | Real-time WebSocket + Web Push (VAPID), unread counts, mark-read flows |
For the technically curious — the control plane coordinates; your data takes its own encrypted paths:
flowchart LR
subgraph you["🧑 You"]
B["Browser<br/>chat · calls · remote desktop<br/>· admin · observability"]
T["roomler CLI<br/>forwards · SOCKS5 · exec"]
end
subgraph cloud["☁️ roomler.ai — coordination, not data"]
S["API + signalling<br/>auth · enrollment · consent<br/>ACL policy · audit"]
M["mediasoup SFU<br/>(conference media)"]
R["TURN + DERP relays<br/>(fallback paths — ciphertext only)"]
end
subgraph fleet["🖥️ Your machines — each runs the roomlerd daemon"]
A1["Office / home PC"]
A2["Headless cloud server"]
A3["GPU workstation"]
end
B -->|"sign in · policy · consent"| S
T -->|"authenticate · ACL check"| S
B <-->|"WebRTC (SFU):<br/>team video calls"| M
A1 -.->|"always-on control link<br/>(outbound WSS)"| S
A2 -.-> S
A3 -.-> S
B <==>|"WebRTC P2P, E2E-encrypted:<br/>screen · input · clipboard<br/>· files · apps · audio"| A1
T <==>|"QUIC / WebRTC tunnels:<br/>TCP forward · SOCKS5"| A2
A2 <-.->|"WireGuard overlay mesh:<br/>stable private IPs + MagicDNS,<br/>LAN-direct when possible"| A3
B <-.->|"no direct path? relayed —<br/>still end-to-end encrypted"| R
R <-.-> A1
Solid arrows are the control plane (login, policy, session setup). Thick double
arrows are your data — end-to-end encrypted, flowing directly between your device
and your machine whenever a direct path exists. The server introduces the two ends and
enforces policy; it never sees pixels, keystrokes, tunneled payloads, or overlay
plaintext. When no direct path can be punched, TURN/DERP relays forward ciphertext
they cannot read. Full picture: docs/architecture.md.
| Layer | Technology |
|---|---|
| Backend | Rust (edition 2024), Axum 0.8, Tokio, MongoDB 7, Redis (multi-pod fan-out) |
| Remote desktop | webrtc-rs (P2P, vendored forks for H.265 payloading + TURNS/TCP), OpenH264, Media Foundation, FFmpeg (NVENC/QSV/AMF), libvpx VP9 4:4:4, WebCodecs viewer |
| Overlay / tunnels | boringtun (WireGuard), quinn (QUIC), smoltcp userspace netstack, Wintun / tun / utun, coturn + standalone DERP relays |
| Conference media | mediasoup 0.20 SFU + mediasoup-client |
| Native apps | roomlerd daemon (Rust), roomler CLI, roomler-desktop tray companion (Tauri 2), roomler-setup install wizard (Tauri 2) |
| Frontend | Vue 3, Vuetify 3, Pinia, TipTap v3, d3 (observability) |
| Auth | JWT (6 audience-checked token types), Argon2, OAuth 2.0 |
| Infrastructure | Docker multi-stage image (nginx + API), docker-compose dev stack (MongoDB, Redis, MinIO, coturn), Kubernetes-ready |
Running it, hosted or self-hosted, is above. This is the loop for working on it — the dev stack runs the dependencies and you run the API and the Vite server yourself, so both hot-reload.
# 1. Dependencies only — MongoDB :27019, Redis :6379, MinIO :9000, coturn
docker compose up -d
# 2. Backend — API on :3000
cargo run --bin roomler-ai-api
# 3. Frontend — SPA on :5000, proxying /api and /ws to :5001
cd ui && bun install && bun run dev
⚠️ docker-compose.yml is the development stack: dependencies, no
application. The one-command self-hosted stack is
docker-compose.selfhost.yml — see
docs/self-hosting.md.
Tests, lint and the agent's feature flags: docs/testing.md
and CONTRIBUTING.md.
| Component | Windows | Linux | macOS |
|---|---|---|---|
roomlerd daemon (desktop + tunnel exit + overlay node) | x64 — MSI (per-user / per-machine), signed | x86_64 + arm64 — .deb / tarball, systemd | arm64 — .pkg, LaunchAgent |
roomler CLI (tunnel client) | x64 zip | x86_64 tarball + .deb | universal tarball |
roomler-setup wizard | x64 (signed) | x86_64 | universal |
roomler-desktop companion (tray, consent, tunnels UI) | ✅ | — | — |
| Viewer / web app | any modern browser; WebCodecs low-latency paths are Chrome-first |
All release artifacts ship with SHA-256 sidecars, GPG signatures, and SLSA build
provenance (gh attestation verify --repo gjovanov/roomler-ai).
→ Full documentation index · new here and not an engineer? Start with Use cases.
| Start with | |
|---|---|
| Use cases | What people do with it — in plain language, scenario by scenario |
| Self-hosting | Run the whole thing yourself: one compose file, TLS, media ports, backups |
| Agent & Tunnel overview | The remote-access stack in five minutes, for users and operators |
| Installation | Every install path on every platform, enrollment, self-update |
| Remote control | Full remote-desktop design: protocol, security, latency budget |
| Encoders | Codec × platform matrix, hardware cascade, rate control |
| Rate control | The Priority dial, per-session rate loops, and why resolution never flips mid-motion |
| Overlay communication | Every carrier path, inside and outside a corporate VPN |
| Tunnels | Forwards, SOCKS5, declared routes, QUIC-over-TURN |
| Roomler SSH | SSH into any node — no , no bound port |
Roomler is open source under a split licence:
The server you would host — crates/api, services, db, config, derp-relay, ui/ | AGPL-3.0-only |
Everything you install on a machine — roomlerd, the roomler CLI, desktop + setup apps, and the transport crates they share with the server | MPL-2.0 |
Documentation (docs/) | CC-BY-4.0 |
Self-host all of it, free, on unlimited devices, forever. The agent you deploy to your own or your clients' machines is MPL-2.0 and imposes no copyleft on anything you build around it — that matters if you are an MSP, and it is why the agent is deliberately not AGPL.
→ LICENSING.md answers the practical questions · COMMERCIAL.md for an AGPL exception · THIRD-PARTY-NOTICES.md for third-party obligations
How the project earns — and what is deliberately free — is in docs/business-model.md.
Releases up to the commit that introduced the split were MIT, retained in LICENSE-MIT. That grant is irrevocable.
© 2026 G ROX EOOD
sshd| Architecture | The whole system: control plane vs three data planes |
| API reference | Every HTTP route + the WebSocket surfaces |