1. Cài host trên Windows
Từ 0.7.0, bản Windows là một app: vừa là host cho máy này được điều khiển, vừa điều khiển máy khác (xem mục 3). Cài trong tài khoản Windows mà bạn đăng nhập hằng ngày.
Cách 1: bộ cài
- Tải SwiftDesk-Host-Setup-Windows.exe và chạy, bấm Install.
- Windows Defender Firewall hỏi lần đầu: bấm Allow access để thiết bị khác trong mạng kết nối được.
- Biểu tượng SwiftDesk xuất hiện ở khay hệ thống (góc phải taskbar). Windows 11 thường giấu biểu tượng mới trong mũi tên ^: kéo nó ra taskbar để luôn thấy. Bấm chuột phải để xem Address và PIN, bấm chuột trái để mở cửa sổ SwiftDesk.
Cách 2: một lệnh PowerShell
irm https://swiftdesk.platformforge.dev/install.ps1 | iex
Lệnh tải bộ cài mới nhất và cài cho người dùng hiện tại. Nếu bạn muốn xem trước nội dung, mở install.ps1 trong trình duyệt.
Lưu ý về phiên Windows
- Host chụp màn hình của phiên đang đăng nhập. Khi máy khóa, đang ở màn hình đăng nhập hoặc hộp thoại UAC, host không chụp được; nó tự nối lại khi desktop trở lại.
- Gập màn hình laptop: vẫn dùng được. Khi màn hình trong tắt, host chuyển sang chụp bằng GDI; hình có thể kém mượt hơn đường GPU.
- Qua Remote Desktop (RDP): host chia sẻ màn hình ảo của phiên RDP. Nếu bạn ngắt RDP (Disconnect), Windows bỏ màn hình ảo nên client thấy đen cho tới khi bạn vào lại.
- Cấu hình và PIN nằm ở
%APPDATA%\swiftdesk\host.json, log ở%LOCALAPPDATA%\swiftdesk\host.log.
2. Cài host trên macOS
Gói SwiftDesk-macOS.pkg cài app SwiftDesk và ứng dụng SwiftDesk Host. Host là bản universal, chạy trên Intel và Apple silicon, từ macOS 12.
- Mở gói .pkg và cài. Nếu macOS báo không xác minh được nhà phát triển: System Settings → Privacy & Security → Open Anyway.
- Mở SwiftDesk Host. macOS hỏi quyền Screen Recording: vào System Settings → Privacy & Security → Screen & System Audio Recording, bật SwiftDesk Host.
- Lần đầu có thiết bị gửi chuột hoặc phím, macOS hỏi quyền Accessibility: bật SwiftDesk Host trong Privacy & Security → Accessibility.
- Khởi động lại host (Quit trên thanh menu rồi mở lại) để quyền có hiệu lực.
Sau khi cập nhật host, macOS có thể coi đó là ứng dụng mới và hỏi lại quyền. Khi đó mở lại hai trang trên, gỡ dòng SwiftDesk Host cũ bằng nút “−”, thêm lại bằng “+”, rồi khởi động lại host. Log của bản cài từ .pkg nằm ở /tmp/swiftdesk-host.log.
3. Kết nối
Từ app desktop (Windows, macOS)
Windows và macOS dùng chung một app. Bấm chuột trái vào biểu tượng khay để mở cửa sổ SwiftDesk: phía trên là Your address và PIN của máy này, bên dưới có hai tab:
- This computer: ai đang kết nối, thiết bị đã pair, hộp duyệt kết nối, nhật ký.
- Connect to another computer: ô kết nối nhanh (địa chỉ[:cổng] và PIN) và danh bạ với Add, Edit, Delete, Import. Mỗi máy từ xa mở trong một cửa sổ SwiftDesk riêng.
Menu khay (chuột phải) cũng có Connect to…. Nhờ vậy máy Windows điều khiển được máy khác mà không cần trình duyệt.
Từ app Android
- Bấm Scan QR và quét mã trong cửa sổ SwiftDesk của máy cần điều khiển: app tự thêm và pair máy đó.
- Hoặc bấm Add host, chọn SwiftDesk, nhập tên và địa chỉ. Cổng nằm trong địa chỉ và có thể bỏ trống:
192.168.1.20hoặc192.168.1.20:7340. Lần đầu mở host, app hỏi PIN.
Menu ⋮ trên mỗi host có Edit, Duplicate, Forget pairing, Delete. Export và import danh bạ: xem mục 4. iPad/iOS: sắp có.
Từ trình duyệt, không cài gì
- Mở
http://192.168.1.20:7340/trong Chrome, Safari, Firefox hoặc Edge. - Đặt tên thiết bị, nhập PIN, bấm Connect. Token được lưu trong trình duyệt đó.
Bằng mã QR
Trên chính máy host, cửa sổ SwiftDesk (chuột trái vào biểu tượng khay) hoặc http://127.0.0.1:7340/admin có mã QR. Trên điện thoại, bấm Scan QR trong app để thêm và pair; quét bằng camera thì mở web client với PIN điền sẵn. Trên desktop hoặc web, dán đường link của mã QR.
Dùng địa chỉ nào?
Dùng địa chỉ IP:
- Cùng Wi-Fi hoặc mạng LAN: IP nội bộ của host, ví dụ
192.168.1.20. - Qua Tailscale: IP Tailscale của host (dạng
100.x.y.z). Dòng Your address trong cửa sổ SwiftDesk và dòng Address trên menu khay ưu tiên hiện IP Tailscale.
SSH
Add host → SSH → địa chỉ (cổng mặc định 22), user, mật khẩu (để trống sẽ hỏi khi kết nối). Lần đầu app hiện dấu vân tay khóa máy chủ để bạn xác nhận và ghim lại; nếu khóa đổi, app cảnh báo rõ và hỏi bạn trước khi chấp nhận khóa mới. Terminal tương thích xterm, 10 000 dòng cuộn.
4. VNC, RDP và mật khẩu đã lưu
VNC
App có trình xem VNC tích hợp; VNC chỉ có trong app, không có trong trình duyệt. Add host → VNC → địa chỉ.
- Máy Mac: bật Screen Sharing trong System Settings → General → Sharing, rồi đăng nhập bằng tên tài khoản và mật khẩu Mac.
- VNC server chuẩn: nhập mật khẩu của VNC server.
RDP
Mục RDP lưu địa chỉ máy Windows và mở nó bằng Remote Desktop / Windows App của Microsoft (cần cài app đó). RDP tích hợp sẵn trong SwiftDesk sẽ có sau.
Mật khẩu đã lưu
Bật Remember password khi nhập mật khẩu: mật khẩu được lưu trong keychain của hệ điều hành, không nằm trong file danh bạ.
Export và import danh bạ
- Hosts only: chỉ danh sách host, không kèm mật khẩu hay token.
- Hosts + saved passwords (encrypted): kèm mật khẩu đã lưu, mã hóa AES-256-GCM bằng passphrase bạn đặt. Không có passphrase thì không mở được file, hãy giữ nó cẩn thận.
- Import tự nhận ra file mã hóa và hỏi passphrase. Khi trùng host, bạn chọn Replace, Keep both hoặc Skip.
5. PIN, owner và quản trị
- Rotate (mặc định): sau mỗi lần pair thành công host sinh PIN mới, mỗi PIN chỉ dùng được một lần.
- Fixed: giữ nguyên PIN tới khi bạn đổi, giống AnyDesk. Đặt PIN trong giao diện là chuyển sang Fixed.
- Owner: thiết bị pair đầu tiên là owner. Owner có nút Manage host trong app và web client: xem và đổi PIN, đổi chế độ, đổi vai trò thiết bị, thu hồi thiết bị, đọc nhật ký. Thiết bị thường không làm được những việc này. Pair lại bằng PIN luôn hạ về vai trò user.
- Ask me before anyone connects: bật trên chính máy host (menu khay hoặc cửa sổ SwiftDesk). Khi có thiết bị không phải owner kết nối, người ngồi ở máy host bấm Accept hoặc Decline trong cửa sổ SwiftDesk; sau 30 giây không trả lời thì tự từ chối. Việc duyệt không làm từ app của owner.
- Pause new connections: từ chối mọi kết nối mới, phiên đang mở vẫn giữ.
- Thu hồi thiết bị từ khay, trang quản trị, app của owner hoặc cloud: phiên đang mở của thiết bị đó bị ngắt ngay, lần sau phải nhập PIN.
- Nhật ký: mọi lần pair, kết nối, thu hồi, đổi PIN, nhận file đều ghi vào
audit.logcạnhhost.json. - Chống dò PIN: 5 lần sai từ một IP thì khóa IP đó 60 giây; 30 lần sai trong 10 phút từ mọi IP thì khóa pairing, và đổi PIN nếu đang ở chế độ Rotate.
6. Biểu tượng khay
Màu biểu tượng: xanh dương là rảnh, xanh lá là đang có người điều khiển, xám là tạm dừng nhận kết nối. Mỗi khi có thiết bị kết nối, hệ điều hành hiện thông báo.
- Bấm chuột trái: mở cửa sổ SwiftDesk: Your address và PIN ở trên, tab This computer (đang kết nối, thiết bị đã pair, duyệt kết nối, nhật ký) và tab Connect to another computer.
- Bấm chuột phải (trên Mac: Ctrl-click): mở menu, trong đó có Address và PIN, bấm để copy.
| Mục menu | Tác dụng |
|---|---|
| Danh sách đang kết nối | Disconnect từng thiết bị hoặc Disconnect all |
| Address · PIN | Bấm để copy địa chỉ (ưu tiên IP Tailscale) hoặc PIN |
| Rotate / Fixed · New random PIN | Đổi chế độ PIN, sinh PIN ngẫu nhiên |
| Ask me before anyone connects | Hỏi người ở máy host trước khi cho thiết bị không phải owner vào |
| Pause new connections | Tạm dừng nhận kết nối mới |
| Open SwiftDesk… | Mở cửa sổ SwiftDesk |
| Connect to… | Mở tab Connect to another computer để điều khiển máy khác |
| Start at login · Cloud · Quit | Tự chạy khi đăng nhập, trạng thái SwiftDesk Cloud, thoát |
7. Trong phiên điều khiển
App và web client có thanh công cụ khác nhau. Web client: thanh công cụ hiện khi con trỏ nằm trên hình. App: thanh công cụ tự ẩn sau 3 giây, chạm vào tay kéo nhỏ ▾ ở mép trên để hiện lại.
Thanh công cụ của app
| Biểu tượng | Tác dụng |
|---|---|
| Disconnect | Ngắt phiên |
| Stats | fps, bitrate, thời gian encode, round trip |
| Reset zoom | Bỏ zoom sau khi pinch |
| Touch mode | Đổi Trackpad / Direct |
| Keyboard | Bàn phím ảo và dải phím đặc biệt |
| Screen | Chuyển màn hình khi host có nhiều màn hình |
| Quality | Trần bitrate 2 / 8 / 20 Mbps |
| Manage | Quản lý host (chỉ owner) |
| View only · Lock · Mute | Chỉ xem · Khóa máy host · Tắt tiếng |
| Send clipboard | Gửi clipboard của thiết bị sang host |
| Sharpen | Xin khung hình mới khi hình mờ hoặc vỡ |
Thanh công cụ của web client
| Nút | Tác dụng |
|---|---|
| ● chấm màu | Chất lượng mạng: xanh (rtt dưới 80 ms, mất gói dưới 2 %), vàng, đỏ |
| Mute | Tắt/bật tiếng |
| Manage | Quản lý host (chỉ owner) |
| View only · Lock | Chỉ xem · Khóa máy host |
| Snap | Lưu ảnh PNG màn hình từ xa |
| Sharpen | Xin khung hình mới khi hình mờ hoặc vỡ |
| Fullscreen · Keyboard | Toàn màn hình · Bàn phím ảo |
| Disconnect | Ngắt phiên. Nếu rớt mạng không do bạn, web client tự kết nối lại |
Khi mất kết nối, web client tự kết nối lại; app hiện thông báo lỗi kèm nút Thử lại.
Chuột, bàn phím, cảm ứng
Con trỏ ánh xạ 1:1 lên màn hình từ xa; phím gửi theo mã vật lý nên Ctrl+C, Cmd+Space hoạt động như bàn phím cắm thẳng vào host. Chữ gõ từ bàn phím ảo gửi dạng văn bản, gõ tiếng Việt được. Hai chế độ cảm ứng và pinch zoom có trong app:
| Cử chỉ (app) | Trackpad (mặc định) | Direct |
|---|---|---|
| Kéo một ngón | Di con trỏ như trackpad | Con trỏ nhảy tới ngón tay |
| Chạm | Click trái tại con trỏ | Click trái tại ngón tay |
| Giữ 0,5 giây | Chuột phải | Chuột phải |
| Giữ rồi kéo | Kéo chuột trái | Kéo chuột trái |
| Hai ngón kéo | Cuộn | Cuộn |
| Pinch | Zoom hình tới 4x (chỉ phía client) | Zoom |
Clipboard và file
- Văn bản copy trên host tự đồng bộ sang thiết bị owner. Để gửi clipboard của thiết bị sang host: bấm Send clipboard trong app, hoặc Ctrl/Cmd+V trong web client.
- Gửi file: kéo thả file vào khung hình trong web client. File lưu ở
Downloads/SwiftDesk/, tối đa 4 GB mỗi file và 16 GB mỗi phiên, được gắn nhãn tải từ internet để Windows/macOS cảnh báo khi mở.
8. Chất lượng và mạng yếu
- Mặc định: tối đa 60 fps, trần 8 Mbps, encode phần cứng. Màn hình đứng yên gần như không tốn băng thông.
- Nút Quality trong app: Low 2 Mbps (4G yếu), Normal 8, High 20 (xem video). Đây là trần; host vẫn tự hạ khi mạng không đủ.
- Khi băng thông xuống dưới khoảng 3,5 Mbps, host giảm độ phân giải còn 75 %, tối đa 45 fps. Dưới 1,5 Mbps còn 50 %, tối đa 30 fps. Sàn là 500 kbps, chữ vẫn đọc được.
- Client hiện thông báo dạng “Network limited: … kbps, 75 % resolution, 45 fps”. Khi mạng khá lên, host nâng dần lại, khoảng 5 giây một bước.
- Âm thanh Opus có FEC; mất gói vẫn nghe liền. Hình vỡ lâu thì bấm Sharpen.
- Mượt nhất khi dùng Wi-Fi 5 GHz hoặc dây, và Tailscale có đường thẳng (
tailscale statuskhông ghi “relay”).
9. Truy cập từ xa và phạm vi mạng
SwiftDesk ưu tiên LAN và Tailscale. Host chỉ nhận kết nối trong phạm vi đã chọn, kết nối ngoài phạm vi bị từ chối trước cả bước PIN:
| --network | Ai được kết nối |
|---|---|
lan (mặc định) | Mạng LAN riêng và Tailscale |
tailnet | Chỉ Tailscale. Nên dùng khi máy ở mạng công cộng |
any | Mọi nơi. Không khuyến nghị |
Muốn điều khiển máy ở nhà khi đang ở ngoài: cài Tailscale trên cả hai thiết bị, đăng nhập cùng tài khoản, rồi dùng địa chỉ Tailscale của host. Không mở cổng 7340 ra internet.
SwiftDesk Cloud (tùy chọn): đăng nhập bằng passkey, thấy mọi host của mình, đổi PIN và thu hồi thiết bị từ xa, mời người nhà, và relay bước bắt tay khi hai máy không thấy nhau trực tiếp. Video vẫn mã hóa đầu cuối giữa hai máy.
10. AI Terminal
AI Terminal là terminal bền bỉ do SwiftDesk giữ trên máy host. Nó liệt kê và mở lại phiên Claude Code, Codex và Cursor theo từng project, và tạo phiên mới: New shell, Claude, Codex hoặc Cursor.
Mở AI Terminal
- Trình duyệt:
http://192.168.1.20:7340/term. - App: menu của host → AI terminals.
Chỉ thiết bị owner
Terminal cho quyền truy cập đầy đủ vào máy, nên chỉ thiết bị owner dùng được. Để đặt thiết bị của bạn làm owner: trên máy host mở cửa sổ SwiftDesk → Paired devices → Make owner.
Phiên tồn tại bao lâu
Đóng trình duyệt, đóng app hay rớt mạng đều không làm mất phiên.
| Hệ điều hành host | Cách giữ phiên | Khi host khởi động lại |
|---|---|---|
| macOS, Linux | tmux, socket swiftdesk | Phiên vẫn còn |
| Windows | ConPTY | Phiên kết thúc; phiên AI mở lại được từ danh sách |
AI Terminal chưa đi qua relay của SwiftDesk Cloud: hãy kết nối trực tiếp trong LAN hoặc Tailscale. Linux host (chỉ terminal, không chia sẻ màn hình): sắp có bản tải về.
11. Dòng lệnh
Host là một file chạy swiftdesk-host; các cờ hay dùng:
| Cờ | Ý nghĩa |
|---|---|
--pin 123456 | Đặt PIN cố định (chuyển sang Fixed) |
--name "Office PC" | Tên hiển thị trên client |
--port 7340 | Cổng nghe HTTP và WebSocket |
--network lan|tailnet|any | Phạm vi được kết nối |
--fps 60, --bitrate-kbps 8000 | Trần fps và bitrate |
--screen 1 | Màn hình chia sẻ lúc khởi động |
--no-audio | Không chia sẻ âm thanh |
--tray | Chạy với biểu tượng khay |
--list-clients, --revoke <id> | Liệt kê và thu hồi thiết bị đã pair |
--install-autostart, --uninstall-autostart | Bật hoặc tắt tự chạy khi đăng nhập |
12. Xử lý sự cố
| Triệu chứng | Cách xử lý |
|---|---|
| Kết nối được nhưng màn hình đen (Mac) | Thiếu quyền Screen Recording cho SwiftDesk Host. Bật lại trong Privacy & Security rồi khởi động lại host. Log /tmp/swiftdesk-host.log ghi “declined TCCs”. |
| Màn hình đen (Windows) | Phiên đang khóa, ở màn hình đăng nhập/UAC, hoặc bạn vừa ngắt RDP. Đăng nhập lại vào máy; host tự nối lại. |
| Laptop Windows gập màn hình | Vẫn hoạt động nhờ chụp GDI; có thể kém mượt hơn. Mở màn hình ra để dùng lại đường GPU. |
| Mac không nhận chuột/phím | Thiếu quyền Accessibility cho SwiftDesk Host. |
| “wrong PIN or expired pairing” | Kiểm tra PIN trên khay của đúng host. Ở chế độ Rotate, PIN đã đổi sau lần pair trước. Thiết bị bị thu hồi phải nhập PIN lại. |
| “too many failed attempts” | Chờ 1 phút rồi thử lại. |
| App báo lỗi khi rớt mạng | Bấm Thử lại. App chưa tự kết nối lại; web client thì tự nối lại. |
| AI Terminal báo không có quyền | Thiết bị chưa là owner. Trên máy host: cửa sổ SwiftDesk → Paired devices → Make owner. |
| AI Terminal không mở qua cloud | Chưa hỗ trợ qua relay của cloud. Kết nối trực tiếp trong LAN hoặc Tailscale. |
| Không kết nối được | Hai máy có cùng LAN/tailnet không? Mở http://<host>:7340/api/info xem có trả JSON. Kiểm tra Windows Firewall đã cho phép. Kiểm tra --network. |
| Đang chờ mãi | Máy host có thể đang bật “Ask me before anyone connects”: người ngồi ở máy host cần bấm Accept trong cửa sổ SwiftDesk (tự từ chối sau 30 giây). |
| Hình vỡ, giật | Bấm Sharpen; xem chấm mạng (web client); hạ Quality (app); dùng Wi-Fi 5 GHz hoặc dây. |
| Không có tiếng | Host chạy --no-audio? Trình duyệt chặn autoplay: bấm Mute rồi bỏ Mute. |
| Clipboard không sang | Chỉ owner nhận clipboard từ host. Trình duyệt chỉ ghi clipboard khi tab đang focus. |
| Bấm Connect không phản ứng | Tải lại mạnh trang (Ctrl/Cmd+Shift+R) để lấy web client mới. |
| Không thấy biểu tượng khay (Windows 11) | Mở mũi tên ^ trên taskbar, kéo biểu tượng SwiftDesk ra ngoài. |
13. Cập nhật
- Windows: chạy bộ cài mới hoặc lệnh PowerShell một dòng.
- macOS: cài gói .pkg mới; nếu macOS hỏi lại quyền, cấp lại như mục 2.
- Android: cài APK mới đè lên bản cũ.
- Web client nằm trong host: cập nhật host là có web client mới.