Em dash in Write-Error string broke PowerShell string termination.
Also try C:\Users\%USERNAME%\.cargo\bin as fallback since act may
override USERPROFILE to a temp directory.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
cargo.exe lives in %USERPROFILE%\.cargo\bin but act does not
automatically export it into the CI subprocess PATH. Added an explicit
step to append that directory to GITHUB_PATH, matching what the Linux
job already does for $HOME/.cargo/bin.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Polls now use TDS accent-cyan tokens instead of hardcoded Cinny blue
- Avatar decorations now visible in user profile modal (UserHero)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Three changes to the build-windows job:
1. CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse — uses lightweight HTTPS
per-crate fetching instead of a full git clone of the crates.io index.
The git clone path triggers an SSL connection reset ([curl 35]) on
Windows Schannel in this runner environment.
2. CARGO_HTTP_MULTIPLEXING=false — disables HTTP/2 ALPN negotiation which
is another common source of Schannel SSL resets on Windows.
3. CARGO_NET_RETRY=5 — retry transient network errors up to 5 times before
failing the build.
4. Add Swatinem/rust-cache for Windows (mirrors the Linux job) — after a
successful build, compiled crates are cached so subsequent runs skip the
crates.io download entirely.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The Windows overlay badge rendered as a black square because GDI drawing
functions do not write the alpha channel — all pixels stay at A=0, causing
Windows to fall back to the opaque monochrome mask and draw corner pixels
as solid black.
Fix: after all GDI calls, iterate the pixel buffer and set alpha=0xFF for
every non-zero pixel; corner pixels (zero) retain A=0 and composite as
transparent, giving a proper circular badge.
Also increased bitmap size 16→20 and font height 11→14 for better
legibility, especially for two-digit mention counts.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- set_tray_unread command re-renders the tray icon with a red unread dot
composited onto the base icon (handle + base pixels kept in managed state).
- flash_window command flashes the taskbar via request_user_attention.
- Register both commands; bump cinny submodule to 107921e0 (web wiring).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
tauri::tray is gated behind the 'tray-icon' Cargo feature; the tray code
failed to compile without it (E0432). Also enable image-png for tray icon
decoding.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- System tray with Open/Quit menu + left-click toggle; closing the window now
minimizes to tray instead of quitting, so notifications keep arriving.
- Single-instance: a second launch focuses the running window (and forwards a
matrix: link) instead of colliding on the localhost port.
- Window: 1100x720 default, 480x600 min, centered first run; starts hidden and
shows on page-load to kill the white launch flash (8s failsafe).
- matrix: deep links via tauri-plugin-deep-link -> dispatched to the web client
(useDeepLinkNavigate) for both cold-start and already-running cases.
- Windows 11 Mica backdrop (subtle; app paints opaque TDS bg).
- NSIS installer: per-user install (no UAC), downloadBootstrapper.
- Remove dead/broken src/menu.rs.
- Bump cinny submodule to 053b364a (deep-link web handler).
Note: Rust not compiled locally (no toolchain / Windows-only paths); verified by
careful API review against tauri 2.10 — needs a real 'tauri build' to confirm.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Regenerated all desktop icons (32/128/128@2x PNG, multi-res icon.ico [16-256],
icon.icns, Windows Store Square*/StoreLogo) from a genuinely transparent
1024x1024 Lotus source via 'tauri icon'. The old icons had a black square
background that looked wrong on the Windows taskbar; these have an alpha
background so only the lotus + dove show.
Also bumps the cinny submodule to 3282832a (corrected transparent source asset).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Element Call copy fix — restores voice/video calls in the desktop build
(/public/element-call/index.html was 404ing). Includes this session's
voice-channel limit + join/leave sound work.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The squashfs magic was not found at any 512-byte boundary because
Tauri's linuxdeploy build uses a non-standard layout. Using the
AppImage's own --appimage-extract flag extracts squashfs internally
without FUSE or needing to locate the offset manually.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The step exits in 1s with no output — need to see which command fails
and whether github.com is reachable from the runner.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The 4096-byte-aligned scan raised StopIteration when linuxdeploy's squashfs
starts at a non-page-aligned boundary. Scan every 512 bytes instead and
exit cleanly with error code 1 if nothing is found.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The Linux runner cannot reach static.rust-lang.org, so dtolnay/rust-toolchain
times out every build. The runner host has Rust installed and bind-mounts
~/.cargo into the container — use that directly and skip the download.
Also bump cinny submodule to 2178295e.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Column-0 lines inside run: | blocks (Python -c script and C heredoc)
caused Gitea's YAML parser to terminate the literal block early, resulting
in a 500 error on every workflow_dispatch call. Fix by collapsing the
Python to a single line and moving the C source into tools/ld_wrapper.c
so CI can compile it directly without any heredoc.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Windows (windows-rs 0.61):
- FONT_PITCH_AND_FAMILY does not exist; ipitchandfamily is u32 - revert
to (DEFAULT_PITCH.0 | FF_DONTCARE.0) as u32
- CreateBitmap returns HBITMAP directly (not Result<HBITMAP>); replace
.map_err()? with explicit null pointer check on hbm_mask.0
Linux AppImage:
- Shell script wrapper is destroyed by Tauri's `dd if=/dev/zero bs=1
count=3 seek=8` which zeroes the shebang at bytes 8-10
- Compile a tiny C ELF forwarder instead: ELF bytes 8-10 are
EI_OSABI/EI_ABIVERSION padding (already zero), dd is a no-op
- Use page-aligned squashfs offset search for more reliable extraction
- Add set -e to Stage step and explicit gcc install
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Docker CI containers lack FUSE kernel module, and the env var approach
was unreliable when Tauri spawns linuxdeploy as a subprocess.
Instead: download linuxdeploy-x86_64.AppImage, extract its squashfs
content using squashfs-tools (no FUSE needed), then place a shell
wrapper at ~/.cache/tauri/linuxdeploy-x86_64.AppImage so Tauri uses
the extracted binary directly without AppImage runtime.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Move BOOL import to windows::core (removed from Win32::Foundation in 0.61)
- Move CreateBitmap import from WindowsAndMessaging to Win32::Graphics::Gdi
- Wrap nullable handles in Some() for GetDC, CreateCompatibleDC,
CreateDIBSection, ReleaseDC (new Option<T> API in 0.61)
- Add .into() for all SelectObject/DeleteObject GDI handle args (now HGDIOBJ)
- Use FONT_PITCH_AND_FAMILY type directly in CreateFontW instead of u32 cast
- Make DrawTextW slice mutable (&mut [u16] required in 0.61)
- Use hicon.unwrap_or_default() for SetOverlayIcon (takes HICON not Option<HICON>)
- Add libfuse2 to apt-get for Linux AppImage bundler (FUSE mount fallback)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Windows: ConvertTo-Json outputs True/False (invalid JSON) and UTF-16
BOM, corrupting tauri.conf.json. Switch to `node -e` which round-trips
JSON correctly.
Linux: linuxdeploy is itself an AppImage and cannot execute inside
Docker without FUSE. APPIMAGE_EXTRACT_AND_RUN=1 makes it self-extract
and run as a plain binary instead.
Also fix unreachable_code warning in check_for_update.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>