Files
ChatApp/apps/desktop
byGalax b057795735 fix(desktop): stop chat opening at top + flicker on switch
Make stick-to-bottom intent the single source of truth in MessageList and
drive onAtBottomChange from intent, not raw scroll position. A measurement
reflow can no longer flip the intent off (RC1), the second scrollPositions
writer no longer persists a drifting topmost index while stuck (RC2), and a
pin-on-rows layout effect re-pins through the two-phase data swap (RC3).

- scrollController: add tested nextStickIntent() state machine
- MessageList: input-event-based unstick (wheel/key/touch + scrollbar drag),
  reveal after 2 stable frames, tabIndex for keyboard nav, remove debug overlay
- ConversationPage: reuse resolveInitialAnchor; harden handleRangeChanged

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 22:31:39 +02:00
..
2026-04-18 23:11:35 +02:00
2026-06-02 21:48:43 +02:00
2026-04-18 23:11:35 +02:00
2026-04-18 23:11:35 +02:00

@chat-app/desktop

Tauri v2 + React + Vite + Tailwind desktop client (macOS / Windows / Linux).

Prerequisites

  • Node 22+, pnpm 9+
  • Rust + Cargo (install via https://rustup.rs)
  • Platform build deps:
    • macOS: Xcode Command Line Tools
    • Linux: libwebkit2gtk-4.1-dev, build-essential, libssl-dev (Debian/Ubuntu)
    • Windows: Microsoft C++ Build Tools + WebView2

Dev

# from repo root
pnpm install
pnpm desktop:dev      # tauri dev — launches Vite + native window
pnpm desktop:build    # production bundle per platform

Layout

  • src/ — React app (Vite bundles into dist/).
  • src-tauri/ — Rust backend. main.rs wires Tauri plugins.
  • vite.config.ts — port 1420, HMR on 1421, aliases to shared packages.

Secure Storage

Session tokens + user private keys live in Stronghold (tauri-plugin-stronghold). Local message history lives in SQLite (tauri-plugin-sql), DB file encrypted at rest.