Skip to content

Releases: xtapo/Titan-XT

2.4.0

Choose a tag to compare

@github-actions github-actions released this 20 May 12:30
v2.4.0

release: v2.4.0 - clipboard sync, folder transfer, queued sends with …

2.3.0

Choose a tag to compare

@github-actions github-actions released this 20 May 11:58
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

Choose a tag to compare

@github-actions github-actions released this 20 May 10:01
v2.2.3

release: v2.2.3 - faster scroll, clearer disconnect toast, hide-after…

2.2.1

Choose a tag to compare

@github-actions github-actions released this 20 May 06:28
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

Choose a tag to compare

@github-actions github-actions released this 20 May 06:06
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

Choose a tag to compare

@github-actions github-actions released this 20 May 04:47
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

Choose a tag to compare

@github-actions github-actions released this 20 May 03:53
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

Choose a tag to compare

@github-actions github-actions released this 20 May 01:45
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

Choose a tag to compare

@github-actions github-actions released this 20 May 01:03
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

Choose a tag to compare

@github-actions github-actions released this 19 May 13:31
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).