Releases: xtapo/Titan-XT
Releases · xtapo/Titan-XT
Release list
2.4.0
2.3.0
release: v2.3.0 - SendInput worker, host BlockInput, stronger scroll - Worker input via direct user32 SendInput on the desktop-attached thread, replacing nut.js. nut.js dispatches through libuv worker threads that never re-attach across desktop switches, so input died on the lock screen. Now keystrokes and clicks survive lock/unlock and UAC dim screens. - Host-side BlockInput while a 'control'-mode viewer is connected so the physical user can't fight the cursor. Re-asserted on every desktop switch since the OS clears it on UAC dim / Ctrl+Alt+Del. Released on disconnect, control-lock, or viewer flipping to 'view' mode. - Scroll speed bumped to 8x with ±150 cap — the previous 2.5x still felt sluggish over long pages.
2.2.3
v2.2.3 release: v2.2.3 - faster scroll, clearer disconnect toast, hide-after…
2.2.1
release: v2.2.1 - revert host cursor hide from v2.1.0/v2.1.1 Xác nhận rằng v2.2.0 đã tự động revert các thay đổi cursor hide: - connection.ts: đã xóa cursor:'never' trong getDisplayMedia (cả 2 chỗ) - input-handler.ts: đã xóa wrapper.style.cursor='none' trong enable/disable Tính năng host cursor hide từ v2.1.0/v2.1.1 không còn tồn tại trên main. Chỉ còn lại cursor:none trên <video> element (có từ v1.7.0 synthetic cursor). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2.2.0
release: v2.2.0 - GDI lock-screen capture fallback Keep streaming through Windows lock screen / Winlogon / UAC dim screen — Chromium's desktopCapturer goes black on the secure desktop. SYSTEM worker BitBlts the active input desktop and pushes BGRA frames over a side pipe; renderer hot-swaps them onto the live RTCRtpSender via replaceVideoTrack so viewers see no gap.
2.1.1
release: v2.1.1 - cursor hiding extends to wrapper, file action style - input-handler.ts: when input is enabled, also hide the cursor on the video's parent (.video-wrapper). Setting cursor:none on the <video> alone left the OS cursor visible while the pointer was over the letterbox margins, which on `object-fit: contain` aspect ratios is a noticeable strip top/bottom or left/right. Restored to 'default' on disable so the toolbar etc. keep a normal pointer. - session.css: file-action buttons styled as solid accent-cyan instead of translucent grey so "Mở file" / "Mở thư mục" stand out next to the file row's text and read as primary CTAs. - README.md: document the synthetic-cursor architecture under a new "Tối ưu hóa Hiệu năng & Trải nghiệm" section.
2.1.0
release: v2.1.0 - Capacitor Android shell, host cursor hide The web viewer is now also packaged as a native Android app via Capacitor 8. Same Vite/TypeScript codebase ships to web (PWA), Chrome extension deep-link, and now Google Play / sideload — no separate codepaths. Plus a getDisplayMedia tweak so the host cursor is no longer baked into the encoded video, freeing the synthetic cursor introduced in v1.7.0 to be the only one the viewer sees. Capacitor + Android - web-viewer/package.json: pull in @capacitor/core, /android, /haptics, /push-notifications, plus the CLI for build commands. - web-viewer/capacitor.config.ts: appId com.titanxt.viewer, webDir dist so `npx cap sync` picks up the Vite output. - web-viewer/android/: scaffolded Capacitor project with Java MainActivity, gradle wrapper, splash + launcher icons, file_paths for sharing. - web-viewer/.gitignore: keep generated build artifacts (.gradle, .idea, app/build, local.properties) out of the repo while committing the sources. Host cursor in stream - connection.ts (host-side getDisplayMedia, both initial + monitor- switch paths): pass `cursor: 'never'` so Chromium's screen capture pipeline doesn't paint the cursor onto the encoded frames. The synthetic cursor we already render on the viewer is now the only one the user sees, instead of competing with a baked-in copy that always lags ~80ms+ behind.
2.0.2
release: v2.0.2 - "open file" action on received files Add a second action button next to "Mở thư mục" that opens the received file with the OS default application. Saves the trip through Explorer when the user just wants to view what they got. - file-transfer.ts: new file:openFile IPC handler that delegates to shell.openPath, returning the underlying error string when the OS refuses (no associated app, file gone, etc.). - preload.ts: expose titanAPI.file.openFile. - session.ts: render the button in renderFileRowActions ahead of the existing "open folder" entry; toast the OS error on failure.
2.0.1
release: v2.0.1 - revert signal client to renderer Roll back the v2.0.0 main-process signal client. The architecture was right on paper (lighter unattended footprint when sitting in tray) but moving the socket out of the renderer broke the offer/answer SDP path in practice — the renderer-side ConnectionManager still holds the RTCPeerConnection, and threading every signal:* hop through IPC added just enough latency that ICE candidates raced ahead of the bridge's 'connect' event on flaky networks. Easier to keep the connection in the renderer and accept the larger idle footprint. - Remove main/signal-client.ts and renderer/lib/signal-bridge.ts. - Restore renderer-owned socket.io client + heartbeat in ConnectionManager. - Restore "minimize to tray" close behaviour (window hidden, not destroyed). - Drop the titanAPI.signal IPC surface from preload.
1.9.1
release: v1.9.1 - signal server domain, scroll fidelity, h-scroll - shared/constants.ts + web-viewer: switch signal server default from http://152.67.122.105:3456 to https://titan.xtapo.org so the public endpoint is HTTPS (PWA viewer requires it for getUserMedia / service workers) and no longer leaks the origin VM's IP. - input-handler.ts: stop quantizing wheel deltas to ±3. Browsers report deltaMode 0 (pixels), 1 (lines), or 2 (pages) — earlier we tossed the magnitude with Math.sign, so a fast wheel flick scrolled exactly as much as a slow nudge. Translate to "lines" with deltaMode-aware math (~33 px per line on Windows pixel-mode mice, raw lines on Firefox/ Linux, pages × 10 for keyboard PageDown emulation), preserving a 1-tick floor in the direction of motion so trackpad nudges still register. - input-executor.ts: forward deltaX through nutMouse.scrollLeft/Right so horizontal scroll works on hosts (matters for code editors with long lines, kanban boards, wide spreadsheets — previously dropped).