Matcha View là agent điều khiển máy tính Linux trong cùng mạng LAN từ trình duyệt. Agent truyền màn hình bằng WebRTC, nhận thao tác chuột và bàn phím qua WebRTC DataChannel, đồng thời cung cấp giao diện tối ưu cho cả máy tính và điện thoại.
Warning
Phiên bản hiện tại dùng HTTP và token trong URL. Chỉ triển khai trong mạng LAN tin cậy; không mở trực tiếp cổng dịch vụ ra Internet.
- Xem màn hình Linux gần thời gian thực qua WebRTC video.
- Điều khiển chuột: di chuyển tuyệt đối/tương đối, giữ/thả nút và click trái, giữa, phải.
- Gửi văn bản và các phím đặc biệt từ bàn phím máy tính hoặc điện thoại.
- Touchpad ảo và bàn phím di động tích hợp trong giao diện web.
- Đồng bộ clipboard hai chiều khi máy đích có
xcliphoặcxsel. - Token ngẫu nhiên cho mỗi lần chạy, hoặc token cố định qua
AUTH_TOKEN. - Tùy chọn VP8/H.264, encoder phần mềm hoặc NVIDIA NVENC.
- Cấu hình ICE server để hỗ trợ các mô hình mạng phức tạp hơn.
flowchart LR
B["Trình duyệt trong LAN"] -->|"HTTP: giao diện và signaling"| A["Matcha View agent"]
A -->|"WebRTC video"| B
B -->|"WebRTC DataChannel: chuột và bàn phím"| A
A --> F["FFmpeg: chụp và mã hóa màn hình"]
A --> X["xdotool: điều khiển X11"]
A --> C["xclip/xsel: clipboard"]
Agent Go nhúng trực tiếp giao diện web và signaling HTTP. FFmpeg lấy hình ảnh từ X11, mã hóa thành VP8 hoặc H.264 rồi chuyển RTP vào Pion WebRTC. Trình duyệt gửi lệnh điều khiển dạng JSON qua DataChannel.
Xem chi tiết tại docs/ARCHITECTURE.md.
- Linux desktop sử dụng X11.
- Go 1.26 trở lên nếu build từ mã nguồn.
ffmpegvàxdotool.xcliphoặcxselnếu cần đồng bộ clipboard.
Ubuntu/Debian:
sudo apt update
sudo apt install -y ffmpeg xdotool xclip golanggit clone git@github.com:digital-enterprise-projects/matcha-view.git
cd matcha-view
go run .Mặc định agent lắng nghe trên 0.0.0.0:4783. Khi khởi động, terminal hiển thị URL LAN và URL có token:
Matcha View (WebRTC)
Listening on 0.0.0.0:4783
LAN URL: http://192.168.1.20:4783
Auth URL: http://192.168.1.20:4783/?token=...
Mở Auth URL bằng trình duyệt trên thiết bị khác trong cùng mạng LAN.
go build -trimpath -o matcha-view .Cross-compile Linux x86-64 từ macOS hoặc Linux:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -o matcha-view-linux-amd64 .| Biến | Mặc định | Mô tả |
|---|---|---|
HOST |
0.0.0.0 |
Địa chỉ HTTP server lắng nghe. |
PORT |
4783 |
Cổng HTTP/signaling. |
DISPLAY |
:0 |
X11 display cần điều khiển. |
XAUTHORITY |
rỗng | Đường dẫn Xauthority khi phiên đồ họa yêu cầu. |
AUTH_TOKEN |
ngẫu nhiên | Token truy cập; nên dùng giá trị dài và khó đoán. |
VIDEO_WIDTH |
1920 |
Chiều rộng video đầu ra. |
VIDEO_FPS |
20 |
Số khung hình mỗi giây. |
VIDEO_BITRATE |
4500k |
Bitrate video. |
VIDEO_CODEC |
vp8 |
vp8 hoặc h264. |
VIDEO_ENCODER |
auto |
auto, software hoặc nvenc. |
QUALITY_PRESET |
smooth |
smooth hoặc sharp. |
CAPTURE_MODE |
auto |
auto, x11 hoặc gnome-screenshot. |
ICE_SERVERS |
rỗng | Mảng JSON chứa cấu hình STUN/TURN. |
Ví dụ chạy với cấu hình rõ ràng:
HOST=0.0.0.0 \
PORT=4783 \
DISPLAY=:0 \
AUTH_TOKEN='replace-with-a-long-random-token' \
VIDEO_CODEC=vp8 \
VIDEO_FPS=20 \
go run .Ví dụ ICE_SERVERS:
export ICE_SERVERS='[
{"urls":["stun:stun.l.google.com:19302"]},
{"urls":["turn:turn.example.com:3478"],"username":"user","credential":"pass"}
]'- Kéo trong vùng touchpad để di chuột tương đối.
- Chạm một lần để click trái; dùng nút riêng cho click phải.
- Bấm Bật bàn phím để gửi ký tự và các phím
Backspace,Enter,Tab,Escapetheo thời gian thực. - Dùng ô nhập nhanh khi cần gửi một đoạn văn bản dài.
- Không chuyển tiếp cổng
4783từ router ra Internet. - Đặt
AUTH_TOKENdài, ngẫu nhiên và không chia sẻ qua kênh công khai. - URL chứa token có thể xuất hiện trong lịch sử trình duyệt hoặc log; hãy đóng phiên và đổi token sau khi hỗ trợ xong.
- Nếu cần truy cập ngoài LAN, đặt agent sau reverse proxy HTTPS và bổ sung kiểm soát phiên/phê duyệt kết nối.
/healthkhông yêu cầu xác thực; không đưa thông tin nhạy cảm vào endpoint này.
Xem thêm SECURITY.md.
- Tối ưu cho Linux X11; Wayland native chưa được hỗ trợ đầy đủ.
- Mỗi agent ưu tiên một viewer hoạt động tại một thời điểm.
- Chưa truyền âm thanh.
- Chưa có TLS tích hợp, xác thực nhiều người dùng hoặc phê duyệt phiên tại máy đích.
- Signaling hiện nằm chung trong agent và dùng one-shot SDP, chưa có trickle ICE.
go test ./...
go vet ./...Smoke test WebRTC sau khi agent chạy:
go run ./cmd/smoke-webrtc -url http://127.0.0.1:4783 -token "$AUTH_TOKEN".
├── main.go # HTTP server và thông tin LAN
├── config.go # Cấu hình qua biến môi trường
├── controller.go # API, token auth và quản lý phiên
├── session.go # WebRTC, RTP và pipeline FFmpeg
├── input.go # Chuột, bàn phím và clipboard
├── web/ # Giao diện điều khiển nhúng trong binary
└── cmd/smoke-webrtc/ # Client smoke test
v0.1.0 là bản thử nghiệm đầu tiên dành cho mạng LAN tin cậy. API và cấu hình có thể còn thay đổi.