Compare commits

...

172 Commits

Author SHA1 Message Date
Lotus CI af6615ca98 chore: bump cinny submodule to 79f8fabb
Build Lotus Chat Desktop / prepare (push) Successful in 4s
Build Lotus Chat Desktop / build-linux (push) Successful in 25m15s
Build Lotus Chat Desktop / build-windows (push) Successful in 32m14s
Build Lotus Chat Desktop / update-manifest (push) Successful in 5s
2026-06-20 01:28:16 +00:00
Lotus CI bfd176e338 chore: bump cinny submodule to 5470e25b
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m23s
Build Lotus Chat Desktop / build-windows (push) Successful in 31m2s
Build Lotus Chat Desktop / update-manifest (push) Successful in 5s
2026-06-20 00:53:45 +00:00
Lotus CI 0800cf2327 chore: bump cinny submodule to e713d473
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m10s
Build Lotus Chat Desktop / build-windows (push) Successful in 34m45s
Build Lotus Chat Desktop / update-manifest (push) Successful in 13s
2026-06-19 22:38:16 +00:00
Lotus CI 32dd6561ab chore: bump cinny submodule to 4a4dede1
Build Lotus Chat Desktop / prepare (push) Successful in 4s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m7s
Build Lotus Chat Desktop / build-windows (push) Successful in 34m37s
Build Lotus Chat Desktop / update-manifest (push) Successful in 5s
2026-06-19 20:34:48 +00:00
Lotus CI 690be31a1d chore: bump cinny submodule to b818d3fc
Build Lotus Chat Desktop / prepare (push) Successful in 7s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m24s
Build Lotus Chat Desktop / build-windows (push) Successful in 33m30s
Build Lotus Chat Desktop / update-manifest (push) Successful in 8s
2026-06-19 17:21:35 +00:00
Lotus CI 5cb6b44744 chore: bump cinny submodule to cf839e73
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m45s
Build Lotus Chat Desktop / build-windows (push) Successful in 35m10s
Build Lotus Chat Desktop / update-manifest (push) Successful in 5s
2026-06-19 15:33:28 +00:00
Lotus CI 0c315e9250 chore: bump cinny submodule to c54cb126
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m5s
Build Lotus Chat Desktop / build-windows (push) Successful in 33m18s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
2026-06-19 04:29:27 +00:00
Lotus CI ff4a04265b chore: bump cinny submodule to 8dc4c4d0
Build Lotus Chat Desktop / prepare (push) Successful in 4s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m31s
Build Lotus Chat Desktop / build-windows (push) Successful in 35m28s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
2026-06-19 02:57:38 +00:00
Lotus CI 040c8afef2 chore: bump cinny submodule to 9742eaea
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-linux (push) Successful in 27m57s
Build Lotus Chat Desktop / build-windows (push) Successful in 35m28s
Build Lotus Chat Desktop / update-manifest (push) Successful in 4s
2026-06-19 01:05:02 +00:00
Lotus CI de00d087f6 chore: bump cinny submodule to fb66c0ed
Build Lotus Chat Desktop / prepare (push) Successful in 9s
Build Lotus Chat Desktop / build-linux (push) Successful in 26m47s
Build Lotus Chat Desktop / build-windows (push) Successful in 38m24s
Build Lotus Chat Desktop / update-manifest (push) Successful in 4s
2026-06-19 00:02:13 +00:00
Lotus CI afffe6958b chore: bump cinny submodule to e2b957b6
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m57s
Build Lotus Chat Desktop / build-windows (push) Successful in 46m23s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
2026-06-19 00:02:05 +00:00
Lotus CI 09e489a79b chore: bump cinny submodule to a77c4b6d
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m25s
Build Lotus Chat Desktop / build-windows (push) Successful in 38m2s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
2026-06-18 23:15:48 +00:00
Lotus CI 3c7ea720f7 chore: bump cinny submodule to f054abfb
Build Lotus Chat Desktop / prepare (push) Successful in 12s
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
Build Lotus Chat Desktop / build-linux (push) Has been cancelled
2026-06-18 23:15:38 +00:00
Lotus CI a52ee06d73 chore: bump cinny submodule to ffa490e7
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-linux (push) Successful in 21m15s
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
2026-06-18 22:32:59 +00:00
Lotus CI 744e608b1d chore: bump cinny submodule to 8c711f5f
Build Lotus Chat Desktop / prepare (push) Successful in 9s
Build Lotus Chat Desktop / build-linux (push) Successful in 21m23s
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
2026-06-18 19:29:32 +00:00
Lotus CI c1e46ddedf chore: bump cinny submodule to c395f7d1
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 20m39s
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
2026-06-18 17:46:37 +00:00
Lotus CI ca612b33bb chore: bump cinny submodule to 26f90087
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 21m27s
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
2026-06-18 14:48:32 +00:00
Lotus CI 8ada70dcf7 chore: bump cinny submodule to bb99ad56
Build Lotus Chat Desktop / prepare (push) Successful in 4s
Build Lotus Chat Desktop / build-linux (push) Successful in 27m8s
Build Lotus Chat Desktop / build-windows (push) Successful in 29m57s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
2026-06-18 01:13:07 +00:00
Lotus CI d21553088e chore: bump cinny submodule to b24ab838
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m17s
Build Lotus Chat Desktop / build-windows (push) Successful in 26m16s
Build Lotus Chat Desktop / update-manifest (push) Successful in 5s
2026-06-18 00:37:57 +00:00
Lotus CI f37ef1df8f chore: bump cinny submodule to abb7f743
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m4s
Build Lotus Chat Desktop / build-windows (push) Successful in 27m28s
Build Lotus Chat Desktop / update-manifest (push) Successful in 4s
2026-06-17 22:00:00 +00:00
Lotus CI df9cc34c5d chore: bump cinny submodule to 14cfa021
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m14s
Build Lotus Chat Desktop / build-windows (push) Successful in 25m4s
Build Lotus Chat Desktop / update-manifest (push) Successful in 8s
2026-06-16 22:06:54 +00:00
Lotus CI d176ae396c chore: bump cinny submodule to 86272b6b
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-windows (push) Successful in 24m21s
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
Build Lotus Chat Desktop / build-linux (push) Has been cancelled
2026-06-16 21:25:02 +00:00
Lotus CI 66190fc7af chore: bump cinny submodule to 6634b2b8
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 22m24s
Build Lotus Chat Desktop / build-windows (push) Successful in 25m38s
Build Lotus Chat Desktop / update-manifest (push) Successful in 4s
2026-06-16 05:54:12 +00:00
Lotus CI c92b1f1e8b chore: bump cinny submodule to 5d5f5f45
Build Lotus Chat Desktop / prepare (push) Successful in 6s
Build Lotus Chat Desktop / build-windows (push) Failing after 37s
Build Lotus Chat Desktop / build-linux (push) Failing after 9m40s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-16 04:55:31 +00:00
Lotus CI d0700d0475 chore: bump cinny submodule to 938ead79
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m30s
Build Lotus Chat Desktop / build-windows (push) Successful in 25m51s
Build Lotus Chat Desktop / update-manifest (push) Successful in 7s
2026-06-16 03:01:14 +00:00
Lotus CI 095783baa9 chore: bump cinny submodule to 4a401cf8
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
Build Lotus Chat Desktop / build-linux (push) Has been cancelled
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
2026-06-16 01:03:46 +00:00
Lotus CI de38fceff2 chore: bump cinny submodule to 5deed79b
Build Lotus Chat Desktop / prepare (push) Successful in 4s
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
Build Lotus Chat Desktop / build-linux (push) Has been cancelled
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
2026-06-16 00:41:19 +00:00
jared 5cc84991f2 fix(badge): zero-init DIB bits buffer to eliminate black square
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
Build Lotus Chat Desktop / build-linux (push) Has been cancelled
CreateDIBSection does not guarantee zeroed memory. Uninitialized bytes
with non-zero RGB but zero alpha were getting alpha=255 set by the
existing pixel loop, causing a black square around the badge circle.
Zeroing with write_bytes before GDI drawing ensures only explicitly
painted pixels are opaque.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 20:35:31 -04:00
Lotus CI 150a1921f9 chore: bump cinny submodule to f9edd202
Build Lotus Chat Desktop / prepare (push) Successful in 11s
Build Lotus Chat Desktop / build-linux (push) Successful in 25m46s
Build Lotus Chat Desktop / build-windows (push) Successful in 29m18s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
2026-06-15 05:27:19 +00:00
Lotus CI a7aad94755 chore: bump cinny submodule to 10f6544e
Build Lotus Chat Desktop / prepare (push) Successful in 4s
Build Lotus Chat Desktop / build-linux (push) Successful in 28m14s
Build Lotus Chat Desktop / build-windows (push) Successful in 33m35s
Build Lotus Chat Desktop / update-manifest (push) Successful in 9s
2026-06-15 04:48:17 +00:00
jared ff3d4b4a18 fix(ci): use USERPROFILE and add rustup toolchain bin to PATH
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m56s
Build Lotus Chat Desktop / build-windows (push) Successful in 30m50s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
The rustup shim at .cargo\bin\cargo.exe was failing with
"No application is associated with the specified file for
this operation" — a Windows error indicating the shim proxy
could not resolve the toolchain. Fix by also adding the
actual stable toolchain bin dir to PATH, bypassing the shim.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 23:54:01 -04:00
jared f70f749216 fix(ci): set cargo PATH inline in Build step
Build Lotus Chat Desktop / prepare (push) Successful in 8s
Build Lotus Chat Desktop / build-windows (push) Failing after 14m12s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m37s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
GITHUB_PATH written by a prior step is not reliably picked up by act
(the local runner). Set PATH directly in the Build step's PowerShell
session so cargo.exe is visible to tauri build.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 23:33:37 -04:00
jared fd565e1edc fix(ci): fix PowerShell parse error in Add Rust to PATH step
Build Lotus Chat Desktop / prepare (push) Successful in 25s
Build Lotus Chat Desktop / build-windows (push) Failing after 16m57s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m50s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
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>
2026-06-14 21:37:25 -04:00
jared 83725e1a2a fix(ci): add Rust to PATH on Windows runner before cargo steps
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-windows (push) Failing after 1m18s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m31s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
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>
2026-06-14 20:51:04 -04:00
Lotus CI a543c98ae1 chore: bump cinny submodule to 7f329e3b
Build Lotus Chat Desktop / prepare (push) Successful in 8s
Build Lotus Chat Desktop / build-windows (push) Failing after 20m35s
Build Lotus Chat Desktop / build-linux (push) Successful in 27m43s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-14 23:07:37 +00:00
Lotus CI a386226073 chore: bump cinny submodule to 97d80858
Build Lotus Chat Desktop / prepare (push) Successful in 9s
Build Lotus Chat Desktop / build-windows (push) Failing after 20m1s
Build Lotus Chat Desktop / build-linux (push) Successful in 27m45s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-14 22:56:53 +00:00
Lotus CI 6f9db2187f chore: bump cinny submodule to 4bb7c1ff
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-windows (push) Successful in 35m51s
Build Lotus Chat Desktop / build-linux (push) Successful in 28m28s
Build Lotus Chat Desktop / update-manifest (push) Successful in 19s
2026-06-14 21:49:34 +00:00
jared 1662fbab2b chore: bump cinny submodule (poll TDS fix + avatar decoration in profile modal)
Build Lotus Chat Desktop / prepare (push) Successful in 16s
Build Lotus Chat Desktop / build-windows (push) Failing after 14m37s
Build Lotus Chat Desktop / build-linux (push) Successful in 27m15s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
- 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>
2026-06-14 17:40:32 -04:00
jared 0eb0b223a2 fix(ci): resolve Windows Cargo SSL handshake failures on crates.io
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>
2026-06-14 17:39:50 -04:00
jared 524fa61c01 fix(desktop): taskbar badge transparent circle + larger size
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>
2026-06-14 17:39:50 -04:00
Lotus CI 0306842284 chore: bump cinny submodule to 388a9346
Build Lotus Chat Desktop / prepare (push) Successful in 12s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m54s
Build Lotus Chat Desktop / build-windows (push) Successful in 36m56s
Build Lotus Chat Desktop / update-manifest (push) Successful in 15s
2026-06-14 20:35:22 +00:00
Lotus CI 2d20634107 chore: bump cinny submodule to 99e6a456
Build Lotus Chat Desktop / prepare (push) Successful in 10s
Build Lotus Chat Desktop / build-linux (push) Successful in 28m0s
Build Lotus Chat Desktop / build-windows (push) Successful in 34m38s
Build Lotus Chat Desktop / update-manifest (push) Successful in 6s
2026-06-14 20:24:31 +00:00
Lotus CI eaacfb2189 chore: bump cinny submodule to a5fe3583
Build Lotus Chat Desktop / prepare (push) Successful in 12s
Build Lotus Chat Desktop / build-windows (push) Failing after 22m10s
Build Lotus Chat Desktop / build-linux (push) Successful in 27m4s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-14 19:08:28 +00:00
Lotus CI 75292b0011 chore: bump cinny submodule to d7d7b598
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 27m3s
Build Lotus Chat Desktop / build-windows (push) Successful in 43m36s
Build Lotus Chat Desktop / update-manifest (push) Successful in 6s
2026-06-14 18:29:25 +00:00
Lotus CI d73ee5660d chore: bump cinny submodule to 6ec0ab78
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 27m49s
Build Lotus Chat Desktop / build-windows (push) Successful in 39m1s
Build Lotus Chat Desktop / update-manifest (push) Successful in 17s
2026-06-14 17:36:19 +00:00
Lotus CI e5757026fb chore: bump cinny submodule to e9a970a7
Build Lotus Chat Desktop / prepare (push) Successful in 8s
Build Lotus Chat Desktop / build-linux (push) Successful in 26m6s
Build Lotus Chat Desktop / build-windows (push) Successful in 33m45s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
2026-06-14 16:58:58 +00:00
Lotus CI 02021b4446 chore: bump cinny submodule to 2a545b8b
Build Lotus Chat Desktop / prepare (push) Successful in 12s
Build Lotus Chat Desktop / build-linux (push) Successful in 28m20s
Build Lotus Chat Desktop / build-windows (push) Successful in 35m33s
Build Lotus Chat Desktop / update-manifest (push) Successful in 7s
2026-06-14 16:19:35 +00:00
Lotus CI 16173ede84 chore: bump cinny submodule to bf1308dd
Build Lotus Chat Desktop / prepare (push) Successful in 16s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m59s
Build Lotus Chat Desktop / build-windows (push) Successful in 36m55s
Build Lotus Chat Desktop / update-manifest (push) Successful in 8s
2026-06-14 15:40:48 +00:00
Lotus CI f6723f9723 chore: bump cinny submodule to ca09e8e6
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m20s
Build Lotus Chat Desktop / build-windows (push) Successful in 31m32s
Build Lotus Chat Desktop / update-manifest (push) Successful in 6s
2026-06-14 04:58:08 +00:00
jared b8f0d7d498 feat(desktop): tray unread overlay + taskbar flash
Build Lotus Chat Desktop / prepare (push) Successful in 16s
Build Lotus Chat Desktop / build-windows (push) Successful in 32m14s
Build Lotus Chat Desktop / build-linux (push) Successful in 25m15s
Build Lotus Chat Desktop / update-manifest (push) Successful in 10s
- 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>
2026-06-13 23:53:52 -04:00
jared a0707e6113 fix(desktop): enable tauri tray-icon feature
Build Lotus Chat Desktop / prepare (push) Successful in 7s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m1s
Build Lotus Chat Desktop / build-windows (push) Successful in 27m10s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
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>
2026-06-13 19:59:05 -04:00
jared 5da2069eba feat: Windows-native desktop polish (tray, single-instance, deep links, Mica, installer)
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Failing after 14m12s
Build Lotus Chat Desktop / build-windows (push) Failing after 22m14s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
- 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>
2026-06-13 18:52:37 -04:00
jared 368953c0d6 feat: transparent Lotus app icons (no more black/checkerboard square)
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m36s
Build Lotus Chat Desktop / build-windows (push) Successful in 28m0s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
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>
2026-06-13 14:57:11 -04:00
jared 3a5269acfc chore: bump cinny submodule to 00524beb
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-linux (push) Successful in 22m21s
Build Lotus Chat Desktop / build-windows (push) Successful in 25m10s
Build Lotus Chat Desktop / update-manifest (push) Successful in 4s
Corrects the voice-limit setting description to reflect server-side enforcement.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-13 13:41:45 -04:00
jared 5b891074da chore: bump cinny submodule to 9df4d2d7
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 21m48s
Build Lotus Chat Desktop / build-windows (push) Successful in 22m9s
Build Lotus Chat Desktop / update-manifest (push) Successful in 4s
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>
2026-06-13 12:29:15 -04:00
Lotus CI 478e455e24 chore: bump cinny submodule to 2c5f0b8b
Build Lotus Chat Desktop / prepare (push) Successful in 4s
Build Lotus Chat Desktop / build-linux (push) Successful in 22m22s
Build Lotus Chat Desktop / build-windows (push) Successful in 26m52s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
2026-06-13 03:57:00 +00:00
Lotus CI bac3aa25e7 chore: bump cinny submodule to 702e2e00
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m36s
Build Lotus Chat Desktop / build-windows (push) Successful in 26m33s
Build Lotus Chat Desktop / update-manifest (push) Successful in 5s
2026-06-13 02:51:13 +00:00
Lotus CI cf41b6880d chore: bump cinny submodule to 2b1c3256
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m38s
Build Lotus Chat Desktop / build-windows (push) Successful in 27m20s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
2026-06-13 01:53:19 +00:00
Lotus CI 79839951bb chore: bump cinny submodule to 6a57c13c
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 21m59s
Build Lotus Chat Desktop / build-windows (push) Successful in 29m20s
Build Lotus Chat Desktop / update-manifest (push) Successful in 5s
2026-06-13 01:42:24 +00:00
Lotus CI 56b64a7885 chore: bump cinny submodule to 362f4943
Build Lotus Chat Desktop / prepare (push) Successful in 10s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m27s
Build Lotus Chat Desktop / build-windows (push) Successful in 30m31s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
2026-06-13 00:04:10 +00:00
Lotus CI 90aec9edf2 chore: bump cinny submodule to f15c4caf
Build Lotus Chat Desktop / prepare (push) Successful in 13s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m19s
Build Lotus Chat Desktop / build-windows (push) Successful in 24m38s
Build Lotus Chat Desktop / update-manifest (push) Successful in 4s
2026-06-12 23:01:39 +00:00
Lotus CI 9da1e56bc8 chore: bump cinny submodule to aa48c9ef
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 21m7s
Build Lotus Chat Desktop / build-windows (push) Successful in 24m37s
Build Lotus Chat Desktop / update-manifest (push) Successful in 16s
2026-06-12 22:28:26 +00:00
jared 352d9085c3 fix: pre-stage linuxdeploy plugins; add wrapper diagnostic log
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m47s
Build Lotus Chat Desktop / build-windows (push) Successful in 26m13s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
2026-06-12 04:12:06 -04:00
jared f6a6849a9e ci: retry build after transient prepare failure
Build Lotus Chat Desktop / prepare (push) Successful in 7s
Build Lotus Chat Desktop / build-linux (push) Failing after 19m48s
Build Lotus Chat Desktop / build-windows (push) Successful in 28m27s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-11 20:39:13 -04:00
jared f8f6564d55 fix: strip --appimage-extract-and-run from linuxdeploy args in wrapper
Build Lotus Chat Desktop / prepare (push) Failing after 14m11s
Build Lotus Chat Desktop / build-windows (push) Has been skipped
Build Lotus Chat Desktop / build-linux (push) Has been skipped
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-11 20:16:21 -04:00
jared 18d53ad054 fix: extract linuxdeploy to /root (persists), add wrapper diagnostics
Build Lotus Chat Desktop / prepare (push) Successful in 9s
Build Lotus Chat Desktop / build-linux (push) Failing after 18m59s
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
2026-06-11 19:47:22 -04:00
jared 087e3cf92f fix: ensure icons are RGBA PNG before build using imagemagick
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Failing after 18m39s
Build Lotus Chat Desktop / build-windows (push) Successful in 30m33s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-11 19:19:10 -04:00
jared 9cc58c8772 fix: use --appimage-extract instead of unsquashfs to unpack linuxdeploy
Build Lotus Chat Desktop / prepare (push) Successful in 10s
Build Lotus Chat Desktop / build-linux (push) Failing after 18m15s
Build Lotus Chat Desktop / build-windows (push) Successful in 28m46s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
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>
2026-06-11 17:20:35 -04:00
jared 8335a68b0f debug: add set -ex and verbose wget to diagnose Stage step failure
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-linux (push) Failing after 12m47s
Build Lotus Chat Desktop / build-windows (push) Successful in 22m8s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
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>
2026-06-11 16:51:49 -04:00
Lotus CI 40392e117e chore: bump cinny submodule to 3df9c4d9
Build Lotus Chat Desktop / prepare (push) Successful in 2s
Build Lotus Chat Desktop / build-linux (push) Failing after 12m25s
Build Lotus Chat Desktop / build-windows (push) Successful in 21m47s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-11 19:59:45 +00:00
jared 07d6b18ccf fix: search all 512-byte boundaries for squashfs offset in linuxdeploy AppImage
Build Lotus Chat Desktop / prepare (push) Successful in 10s
Build Lotus Chat Desktop / build-linux (push) Failing after 14m50s
Build Lotus Chat Desktop / build-windows (push) Successful in 22m38s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
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>
2026-06-11 15:32:12 -04:00
jared 08926e76e4 fix: use pre-installed Rust to avoid static.rust-lang.org connection failures
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Failing after 12m13s
Build Lotus Chat Desktop / build-windows (push) Successful in 23m20s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
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>
2026-06-11 14:56:33 -04:00
jared 2de368847c fix: resolve YAML parse error in release.yml CI workflow
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-linux (push) Failing after 18m39s
Build Lotus Chat Desktop / build-windows (push) Failing after 46m47s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
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>
2026-06-11 13:19:06 -04:00
Lotus CI d34eaafd34 chore: bump cinny submodule to 055dcec6 2026-06-11 16:01:19 +00:00
Lotus CI e0375bf9a9 chore: bump cinny submodule to 9a24feb9 2026-06-11 15:47:36 +00:00
jared a306fdf3bd ci: trigger build 2026-06-11 11:42:37 -04:00
jared a7e0d7bef9 Fix FONT_PITCH_AND_FAMILY, CreateBitmap, and linuxdeploy ELF wrapper
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>
2026-06-11 11:27:06 -04:00
jared 6028a41d65 Replace APPIMAGE_EXTRACT_AND_RUN with pre-extracted linuxdeploy wrapper
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>
2026-06-11 10:40:01 -04:00
jared 768c286d4a Fix Windows badge API for windows-rs 0.61 + add libfuse2 for Linux AppImage
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-linux (push) Failing after 14m42s
Build Lotus Chat Desktop / build-windows (push) Failing after 16m14s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
- 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>
2026-06-11 10:20:34 -04:00
Lotus CI 44d75881f9 chore: bump cinny submodule to 46567555
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Failing after 17m45s
Build Lotus Chat Desktop / build-windows (push) Failing after 19m38s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-11 03:22:53 +00:00
jared 3be18b8e5d fix: Windows JSON patch via node, Linux AppImage via APPIMAGE_EXTRACT_AND_RUN
Build Lotus Chat Desktop / prepare (push) Successful in 8s
Build Lotus Chat Desktop / build-linux (push) Failing after 18m17s
Build Lotus Chat Desktop / build-windows (push) Failing after 20m37s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
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>
2026-06-10 22:52:54 -04:00
Lotus CI 858f0e13bd chore: bump cinny submodule to b41bfd35
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-linux (push) Failing after 18m19s
Build Lotus Chat Desktop / build-windows (push) Failing after 18m44s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-11 02:09:25 +00:00
Lotus CI 49c7075b92 chore: bump cinny submodule to 6a83e67f
Build Lotus Chat Desktop / prepare (push) Successful in 9s
Build Lotus Chat Desktop / build-linux (push) Failing after 19m1s
Build Lotus Chat Desktop / build-windows (push) Failing after 20m23s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-11 01:02:37 +00:00
jared 0bdaa66d24 fix: convert all PNG icons from RGB to RGBA
Build Lotus Chat Desktop / prepare (push) Successful in 8s
Build Lotus Chat Desktop / build-linux (push) Failing after 18m9s
Build Lotus Chat Desktop / build-windows (push) Failing after 22m23s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
Tauri's generate_context! macro requires RGBA PNG icons. All 14 files
were RGB (source logo is RGB); converted with Pillow.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 20:38:18 -04:00
jared 32286d03de feat: native notifications + in-app update checker
Build Lotus Chat Desktop / prepare (push) Successful in 9s
Build Lotus Chat Desktop / build-linux (push) Failing after 18m6s
Build Lotus Chat Desktop / build-windows (push) Failing after 23m47s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
- Register tauri-plugin-notification; inject initialization script that
  patches window.Notification to route through the native plugin and
  always report permission as granted — bypasses WebView2's default deny
- Also grant COREWEBVIEW2_PERMISSION_KIND_NOTIFICATIONS via existing
  PermissionRequestedEventHandler
- Register tauri-plugin-updater; add check_for_update and install_update
  commands using the pubkey/endpoint already in tauri.conf.json

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 20:31:25 -04:00
Lotus CI 817430f11b chore: bump cinny submodule to 77a29ed3
Build Lotus Chat Desktop / prepare (push) Successful in 4s
Build Lotus Chat Desktop / build-linux (push) Failing after 16m29s
Build Lotus Chat Desktop / build-windows (push) Failing after 21m50s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-10 23:43:21 +00:00
Lotus CI 1dc045ef1e chore: bump cinny submodule to a30a3d3a
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Failing after 23m21s
Build Lotus Chat Desktop / build-windows (push) Failing after 28m25s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-10 23:01:45 +00:00
jared 72a03dac33 fix: patch version with PowerShell instead of python3 on Windows runner
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-linux (push) Failing after 27m38s
Build Lotus Chat Desktop / build-windows (push) Failing after 27m45s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 18:56:23 -04:00
Lotus CI cee7809155 chore: bump cinny submodule to a9787ef0
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-windows (push) Failing after 1m38s
Build Lotus Chat Desktop / build-linux (push) Failing after 16m33s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-10 21:48:48 +00:00
Lotus CI 4ccd2845fb chore: bump cinny submodule to 0a14ec63
Build Lotus Chat Desktop / prepare (push) Successful in 5s
Build Lotus Chat Desktop / build-windows (push) Failing after 51s
Build Lotus Chat Desktop / build-linux (push) Failing after 15m18s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-10 21:37:51 +00:00
jared b4812e6659 feat: Windows taskbar overlay badge via ITaskbarList3
Build Lotus Chat Desktop / prepare (push) Successful in 7s
Build Lotus Chat Desktop / build-windows (push) Failing after 1m31s
Build Lotus Chat Desktop / build-linux (push) Failing after 15m17s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
Adds set_badge_count Tauri command (Windows only). Uses CoCreateInstance
to get ITaskbarList3 and SetOverlayIcon to display a dynamically drawn
badge on the taskbar button. The badge is a 16x16 GDI bitmap: red circle,
white bold Segoe UI text, capped at "99+". Passing count=0 clears the
overlay. Uses windows = 0.61 (already a transitive dep via webview2-com).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 17:32:53 -04:00
jared f0100c0c0c feat: replace all desktop icons with custom Lotus Chat logo
Build Lotus Chat Desktop / prepare (push) Successful in 3s
Build Lotus Chat Desktop / build-windows (push) Failing after 3m9s
Build Lotus Chat Desktop / build-linux (push) Failing after 15m22s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
Updates all Tauri icon targets: 32x32, 128x128, 128x128@2x, icon.png,
icon.ico (multi-size), icon.icns (16/32/128/256/512), and all Windows
NSIS Square*Logo and StoreLogo sizes. Generated from lotus_chat.png
(1254x1254 source in the cinny repo).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 17:02:01 -04:00
jared ed718704ee fix(ci): add prepare job, auto-version, fix Windows build issues
- Add prepare job: computes version (4.12.{run_number}), creates/updates
  the Gitea release once — eliminates the race condition where build-windows
  and build-linux both tried to create the same release simultaneously.
- Auto-increment version: both build jobs patch tauri.conf.json with
  4.12.{run_number} before building, so every CI run produces a strictly
  increasing semver and the Tauri updater fires correctly.
- Fix double -- in Windows build command: was 'build -- --bundles nsis'
  which passed --bundles as cargo args (silently ignored), causing all
  bundle targets to build. Now 'build --bundles nsis' (single --).
- Add setup-node to Windows build: pins Node.js to .node-version like
  the Linux job already does.
- update-manifest: uses version/release_id from prepare outputs instead
  of re-fetching and parsing the release name.
- Fix window title: was "Cinny", now "Lotus Chat".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 17:02:01 -04:00
Lotus CI dffe5fb05a chore: bump cinny submodule to 5469740f
Build Lotus Chat Desktop / build-linux (push) Successful in 22m46s
Build Lotus Chat Desktop / build-windows (push) Successful in 30m22s
Build Lotus Chat Desktop / update-manifest (push) Successful in 15s
2026-06-10 20:39:54 +00:00
Lotus CI 03d7ae05e0 chore: bump cinny submodule to 891f2daf
Build Lotus Chat Desktop / build-linux (push) Successful in 21m25s
Build Lotus Chat Desktop / build-windows (push) Successful in 29m36s
Build Lotus Chat Desktop / update-manifest (push) Successful in 8s
2026-06-10 17:34:14 +00:00
jared 2f55bb3f6d fix(ci): single-line python3 in update-manifest to avoid YAML block scalar truncation
Build Lotus Chat Desktop / build-linux (push) Successful in 23m56s
Build Lotus Chat Desktop / build-windows (push) Successful in 28m35s
Build Lotus Chat Desktop / update-manifest (push) Successful in 3s
Zero-indented lines inside run: | terminate the block early.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 11:58:40 -04:00
Lotus CI c151c2936c chore: bump cinny submodule to b7daabe2 2026-06-10 15:49:09 +00:00
jared 7c77c8e850 fix(ci): replace jq with python3 in update-manifest (jq not in node:20-bookworm)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 11:17:52 -04:00
Lotus CI 667ad72583 chore: bump cinny submodule to d78f81c3
Build Lotus Chat Desktop / build-linux (push) Successful in 22m22s
Build Lotus Chat Desktop / build-windows (push) Successful in 26m38s
Build Lotus Chat Desktop / update-manifest (push) Failing after 4s
2026-06-10 14:17:17 +00:00
jared 4b71e80636 fix(windows): call with_webview on built window, import COREWEBVIEW2_PERMISSION_KIND type
Build Lotus Chat Desktop / build-windows (push) Successful in 27m6s
Build Lotus Chat Desktop / build-linux (push) Successful in 20m21s
Build Lotus Chat Desktop / update-manifest (push) Failing after 3s
with_webview is on WebviewWindow (the built window), not WebviewWindowBuilder.
Also import COREWEBVIEW2_PERMISSION_KIND as a type for the out-param zero-init.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 10:05:49 -04:00
Lotus CI 07327845b3 chore: bump cinny submodule to 170d22ee
Build Lotus Chat Desktop / build-windows (push) Failing after 28m42s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m37s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-10 04:16:28 +00:00
jared d043f9c416 fix(windows): fix PermissionKind out-param and add AppImage support
Build Lotus Chat Desktop / build-windows (push) Failing after 23m52s
Build Lotus Chat Desktop / build-linux (push) Has been cancelled
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
- Fix COREWEBVIEW2_PERMISSION_KIND out-param pattern in PermissionRequestedEventHandler
- Add "wry" feature to tauri dep so with_webview compiles on Windows
- Build both appimage and deb on Linux for auto-update compatibility
- Commit AppRun-x86_64 binary to avoid GitHub download timeout in CI

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 00:06:12 -04:00
jared eadd3bfc48 fix(windows): use webview2_com built-in handler instead of #[implement]
Build Lotus Chat Desktop / build-linux (push) Failing after 17m40s
Build Lotus Chat Desktop / build-windows (push) Failing after 22m16s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
The previous approach used windows::core::implement to manually implement
ICoreWebView2PermissionRequestedEventHandler_Impl, but the sealed
IUnknownImpl constraint in webview2-com prevents external #[implement]
usage — you must use the crate's own pre-built handler types.

Replace with PermissionRequestedEventHandler::create() which wraps the
closure and handles COM ref-counting internally. Also removes the now-
unused windows = "0.61" direct dependency.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 23:32:02 -04:00
Lotus CI 26bd0722bc chore: bump cinny submodule to bafd9cbe
Build Lotus Chat Desktop / build-linux (push) Failing after 17m12s
Build Lotus Chat Desktop / build-windows (push) Failing after 28m9s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
2026-06-10 03:07:59 +00:00
jared 443c85c9b5 fix(windows): gate with_webview call to Windows only
Build Lotus Chat Desktop / build-linux (push) Failing after 13m50s
Build Lotus Chat Desktop / build-windows (push) Failing after 23m55s
Build Lotus Chat Desktop / update-manifest (push) Has been skipped
with_webview is not available on Linux; break the builder chain and apply
it conditionally so the Linux build compiles without the wry feature flag.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 21:52:09 -04:00
Lotus CI efcc11771e chore: bump cinny submodule to f11b308f
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
Build Lotus Chat Desktop / build-linux (push) Has been cancelled
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
2026-06-10 01:12:22 +00:00
jared 4288eb2c02 fix(ci): drop extra -- that forwarded --bundles to cargo instead of tauri
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
Build Lotus Chat Desktop / build-linux (push) Has been cancelled
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 21:11:37 -04:00
jared e009af0575 fix(ci): fix YAML parse error in update-manifest step
Build Lotus Chat Desktop / build-linux (push) Failing after 17m21s
Build Lotus Chat Desktop / update-manifest (push) Has been cancelled
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
Multi-line python3 -c "..." with zero-indented Python code caused Gitea
to fail parsing the workflow YAML (line 188: could not find expected ':').
Replace with jq which handles variable interpolation in a single line.

This was silently breaking every push-triggered workflow run.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 20:43:05 -04:00
jared c466d93519 chore: trigger desktop build for cinny 81e1a25d 2026-06-09 19:44:09 -04:00
Lotus CI d4968b935b chore: bump cinny submodule to 81e1a25d 2026-06-09 23:44:02 +00:00
Lotus CI f45817d4ac chore: bump cinny submodule to 8ff2f33d 2026-06-09 23:15:38 +00:00
jared a6aae9d6f2 fix(ci): correct artifact filenames and drop AppImage build
Two build failures after rename to "Lotus Chat":
- Windows upload was globbing for Cinny_*_x64-setup.exe; Tauri now
  outputs "Lotus Chat_4.12.2_x64-setup.exe" to match productName
- Linux upload was globbing for Cinny_*_amd64.deb; same issue

Also switch version source from filename parsing to tauri.conf.json
directly — more robust, no regex.

Linux: drop AppImage bundle (--bundles deb only). AppImage requires
downloading AppRun from github.com/tauri-apps/binary-releases during
the build step; the CI runner times out on that download. The deb
builds cleanly. Re-enable AppImage once GitHub connectivity is fixed.

Update manifest now covers Windows only (Linux AppImage not available).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 18:57:31 -04:00
jared 838c69f46e fix(windows): grant microphone and camera permissions in WebView2
WebView2 silently denies getUserMedia() unless a PermissionRequested
handler explicitly allows it. macOS was already covered by Info.plist;
Windows had nothing. Adds a COM event handler via with_webview that
auto-approves mic and camera requests so Element Call voice/video
works in the desktop app.

Also includes previously uncommitted changes:
- tauri.conf.json: add media-src / mediastream: to CSP
- Info.plist: macOS NSMicrophoneUsageDescription / NSCameraUsageDescription

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 18:27:12 -04:00
jared 0b7ace5dfa Add update-manifest job to generate release.json after both builds 2026-06-07 13:14:54 -04:00
jared 8f0f8db201 Rename to Lotus Chat, point updater at our release manifest
Build Lotus Chat Desktop / build-windows (push) Has been cancelled
Build Lotus Chat Desktop / build-linux (push) Has been cancelled
2026-06-07 13:13:32 -04:00
jared ceda17edc4 Set matrix.lotusguild.org as default homeserver
Build Lotus Chat Desktop / build-windows (push) Successful in 26m54s
Build Lotus Chat Desktop / build-linux (push) Successful in 21m54s
2026-06-07 13:12:27 -04:00
jared 12c860de0c Deduplicate assets on upload, fix release accumulation
Build Lotus Chat Desktop / build-linux (push) Successful in 22m54s
Build Lotus Chat Desktop / build-windows (push) Successful in 24m4s
2026-06-07 12:29:56 -04:00
jared 12a559dc6d Remove rust-cache from Windows job (stale paths break cargo)
Build Lotus Chat Desktop / build-windows (push) Failing after 15m25s
Build Lotus Chat Desktop / build-linux (push) Successful in 22m19s
2026-06-07 11:27:42 -04:00
jared 938fa0953b Fix upload: extract version from artifact, fix bash token syntax
Build Lotus Chat Desktop / build-windows (push) Failing after 15m46s
Build Lotus Chat Desktop / build-linux (push) Successful in 24m8s
2026-06-07 01:40:31 -04:00
jared 5f678ff088 Fix PowerShell env var: TOKEN -> env:TOKEN
Build Lotus Chat Desktop / build-linux (push) Failing after 17m12s
Build Lotus Chat Desktop / build-windows (push) Successful in 30m8s
2026-06-07 00:46:28 -04:00
jared df39489916 Use scoped RELEASE_TOKEN instead of GITHUB_TOKEN
Build Lotus Chat Desktop / build-linux (push) Successful in 23m13s
Build Lotus Chat Desktop / build-windows (push) Failing after 30m28s
2026-06-06 22:53:16 -04:00
jared b2288bc9b2 Read version directly in upload step, not from step outputs
Build Lotus Chat Desktop / build-linux (push) Successful in 22m9s
Build Lotus Chat Desktop / build-windows (push) Failing after 31m5s
2026-06-06 22:15:23 -04:00
jared 0923312111 Drop prepare-release job, each build gets-or-creates the release
Build Lotus Chat Desktop / build-linux (push) Successful in 26m14s
Build Lotus Chat Desktop / build-windows (push) Failing after 36m56s
2026-06-06 19:35:56 -04:00
jared 279117ecf2 Switch Windows bundler from WiX/MSI to NSIS/EXE
Build Lotus Chat Desktop / prepare-release (push) Failing after 18m5s
Build Lotus Chat Desktop / build-windows (push) Has been skipped
Build Lotus Chat Desktop / build-linux (push) Has been skipped
2026-06-06 19:03:33 -04:00
jared adb017804d Shallow submodule clone on Windows to fix checkout timeout
Build Lotus Chat Desktop / prepare-release (push) Successful in 8s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m26s
Build Lotus Chat Desktop / build-windows (push) Failing after 32m33s
2026-06-06 17:26:03 -04:00
jared 0e700b335a Restructure: publish direct to release, no artifact storage
Build Lotus Chat Desktop / prepare-release (push) Successful in 8s
Build Lotus Chat Desktop / build-windows (push) Failing after 17m29s
Build Lotus Chat Desktop / build-linux (push) Successful in 23m46s
2026-06-06 16:49:49 -04:00
jared a7b93deb98 Add xdg-utils for AppImage bundler
Build Lotus Chat Desktop / build-linux (push) Failing after 16m51s
Build Lotus Chat Desktop / build-windows (push) Failing after 30m24s
Build Lotus Chat Desktop / publish (push) Has been skipped
2026-06-06 16:13:59 -04:00
jared 99fb77b867 Fix shell: use powershell not pwsh on Windows
Build Lotus Chat Desktop / build-windows (push) Failing after 41s
Build Lotus Chat Desktop / build-linux (push) Failing after 15m5s
Build Lotus Chat Desktop / publish (push) Has been skipped
2026-06-06 14:12:57 -04:00
jared 6f543f8bef Install full Tauri 2 Linux deps (webkit4.1 + soup3 + xdo)
Build Lotus Chat Desktop / build-windows (push) Failing after 27s
Build Lotus Chat Desktop / publish (push) Has been cancelled
Build Lotus Chat Desktop / build-linux (push) Has been cancelled
2026-06-06 13:59:42 -04:00
jared 473028491c Use pre-installed Node on Windows runner
Build Lotus Chat Desktop / build-windows (push) Failing after 35s
Build Lotus Chat Desktop / build-linux (push) Failing after 10m23s
Build Lotus Chat Desktop / publish (push) Has been skipped
2026-06-06 13:58:19 -04:00
jared a598ba6049 Fix webkit package for Bullseye
Build Lotus Chat Desktop / build-windows (push) Failing after 5s
Build Lotus Chat Desktop / build-linux (push) Failing after 9m18s
Build Lotus Chat Desktop / publish (push) Has been skipped
2026-06-06 13:21:46 -04:00
jared a7ced9d477 Add Lotus Chat desktop build workflow
Build Lotus Chat Desktop / build-linux (push) Failing after 36s
Build Lotus Chat Desktop / build-windows (push) Failing after 2m12s
Build Lotus Chat Desktop / publish (push) Has been skipped
2026-06-06 13:03:30 -04:00
jared 646da8276a Update cinny submodule to lotus branch tip 2026-06-06 12:56:03 -04:00
jared af9ad2eb6f Point cinny submodule at LotusGuild/cinny lotus branch 2026-06-06 12:55:13 -04:00
Krishan 9d12943e3a chore: use shx for cross platform compatibility (#582) 2026-05-24 21:15:53 +10:00
Krishan b670ef0e32 chore: update config.json to match with web code (#583) 2026-05-24 21:12:22 +10:00
Krishan a823e45535 chore: fix script to not break on windows (#581)
fix script to not break on windows
2026-05-24 21:11:58 +10:00
Krishan 36887eaf40 chore: Release v4.12.2 (#580)
Release v4.12.2
2026-05-23 23:18:03 +10:00
Krishan 9809657b84 chore: add script for updates (#578) 2026-05-23 21:52:55 +10:00
Krishan 2b61520524 fix: update CSP to allow reordering rooms inside space (#579)
* fix: update CSP to allow reordering rooms inside space

Fixes https://github.com/cinnyapp/cinny/issues/2949

* disable native dnd in windows configuration

* Disable drag and drop for main webview window in lib.rs

* Remove dragDropEnabled setting from tauri.conf.json

* Replace drag_drop_enabled with disable_drag_drop_handler
2026-05-23 21:52:14 +10:00
Krishan 8b7bced138 chore: Release v4.12.1 (#577)
chore: release v4.12.1
2026-05-15 19:16:31 +10:00
dependabot[bot] 24d34c77d5 chore: bump actions/setup-node from 6.2.0 to 6.4.0 (#576)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.2.0 to 6.4.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/6044e13b5dc448c55e2357c09f80417699197238...48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 6.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-23 22:29:10 +10:00
dependabot[bot] e72e44bb12 chore: bump softprops/action-gh-release from 2.3.3 to 3.0.0 (#575)
Bump softprops/action-gh-release from 2.3.3 to 3.0.0

Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.3.3 to 3.0.0.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/6cbd405e2c4e67a21c47fa9e383d020e4e28b836...b4309332981a82ec1c5618f44dd2e27cc8bfbfda)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: 3.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-14 14:21:27 +10:00
Shenwei Wang 08fcd330e1 fix: enable tauri plugin opener (#559)
* fix: enable tauri plugin opener

* fix: add remote urls to make build work on Windows

* fix: update Cargo.lock

We need tauri v2.8.0 since which supports `WebviewBuilder::on_new_window`

* fix: handle `window.open()` using `WebviewBuilder::on_new_window`

---------

Co-authored-by: Krishan <33421343+kfiven@users.noreply.github.com>
2026-04-13 17:20:44 +10:00
Krishan 0a5f14508c chore: upload build artifacts to workflow run (#571)
* Add artifact collection and upload steps to workflow

* Change artifact upload method in test workflow

Replaced the upload-artifact action with a custom bash script to handle artifact uploads.

* Refactor artifact upload process in CI workflow

Removed artifact collection step and added separate upload steps for macOS, Linux, and Windows artifacts.
2026-04-12 18:10:24 +10:00
Pietagorh a2077499a0 chore: replace link to tauri v1 docs in README (#568)
now points to tauri v2
2026-04-01 22:33:50 +11:00
Krishan 18b8f696a1 chore: use private vulnerability disclosure (#565) 2026-03-22 18:21:18 +11:00
Krishan 957f2a9f77 chore: add issue template to redirect new issues to discussions (#564)
* chore: add issue template to redirect new issues to discussions

* chore: delete .github/PULL_REQUEST_TEMPLATE.md

* chore: delete .github/ISSUE_TEMPLATE/bug_report.yml

* chore: delete .github/ISSUE_TEMPLATE/feature_request.yml
2026-03-22 17:48:53 +11:00
Shenwei Wang 89804c83ac fix: use devUrl when dev (#556) 2026-03-18 00:29:22 +11:00
Shenwei Wang a396a54f90 fix: modify CSP to allow connect-src blob (#549)
* Modify CSP to allow connect-src blob

Updated Content Security Policy to include 'blob' in connect-src.

Fixing #548

* chore(ci): Disable Updater for Fork PRs

* fix: disable createUpdaterArtifacts for fork PRs

* fix: always disable createUpdaterArtifacts

* fix: fix typos
2026-03-17 23:57:32 +11:00
Krishan 3930144876 chore: remove secret from test run 2026-03-13 13:29:00 +11:00
Krishan d2b51ee0e6 chore(release): v4.11.2 [skip ci] (#543) 2026-03-12 01:10:36 +11:00
Krishan 086ba8b77a fix: version is on top level now (#542) 2026-03-12 01:10:18 +11:00
Krishan 8da44b2b88 chore(release): v4.11.1 [skip ci] (#541) 2026-03-12 00:35:57 +11:00
Krishan fcd638bc1c fix: duplicate window creation and CSP issues (#540) 2026-03-12 00:23:50 +11:00
Krishan c6921d602c chore: update Renovate configuration for dependency dashboard (#537)
* Update Renovate configuration for dependency dashboard

* Fix JSON formatting in renovate.json
2026-03-10 14:56:50 +11:00
Krishan 9b3574a80e chore: add PR title check workflow (#536)
Add PR title check workflow
2026-03-10 14:56:29 +11:00
Krishan 1e8d28faee Pin all the action deps to SHA (#531) 2026-03-04 00:22:57 +11:00
Krishan d15e86a176 Update Tauri from v1 to v2 (#496)
* Upgrade tauri to v2

* update action and disable menu

* Add args to workflow step in test.yml

* Rename environment variables for Tauri signing

* Change mainBinaryName from 'Cinny' to 'cinny'

* Update linux file names to use 'Cinny' instead of 'cinny'

* Upgrade Tauri action to v0.6.1 and fix targets

Updated Tauri action version and corrected target specification.
2026-03-03 23:16:04 +11:00
Krishan cf839c0fe9 Update Rust installation action in workflow 2026-03-03 22:15:57 +11:00
Krishan 617891af96 Add args to workflow job configuration 2026-03-03 21:47:45 +11:00
Krishan 82d6cc26ec Fix environment variable names for Tauri signing (#530) 2026-03-03 21:20:11 +11:00
Krishan e4ee81518f Update Tauri action version to v0.6.1 (#529) 2026-03-03 18:49:50 +11:00
Krishan 27565fe635 Update GTK dependency version in test workflow (#528)
* Update GTK dependency version in test workflow

* Modify test.yml for new platforms and args

Updated GitHub Actions workflow to include Ubuntu 22.04 and additional arguments for macOS.

* Enable pull request trigger for workflow
2026-03-03 11:40:29 +11:00
Krishan 92b4f91c6b Release v4.10.5 (#524) 2026-02-23 23:16:03 +11:00
Krishan 7ae56af131 Release v4.10.4 (#523)
* Release v4.10.4

* bump cinny submod
2026-02-23 22:48:07 +11:00
renovate[bot] 336313cfa4 Update actions/setup-node action to v6.2.0 (#521)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-22 18:58:07 +11:00
renovate[bot] cc07a51ba2 Update actions/checkout action to v6 (#520)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-22 18:46:41 +11:00
Krishan 24d1e0b0f2 Update node to v24.13.1 LTS (#509) 2026-02-22 18:14:28 +11:00
Krishan fb6dc8ba9a Release v4.10.3 (#510) 2026-02-16 22:51:29 +11:00
Zach f27b5b9e73 Replace envs.net with unredacted.org in config.json (#506)
* Replace envs.net with unredacted.org in config.json

* Update defaultHomeserver and modify homeserverList
2026-02-12 10:40:34 +11:00
Krishan b102ceba08 Release v4.10.2 (#481) 2025-11-05 18:22:29 +11:00
55 changed files with 26884 additions and 2380 deletions
+1
View File
@@ -0,0 +1 @@
81e1a25de641f0292863b1404cba728c1eadd00d
+301
View File
@@ -0,0 +1,301 @@
name: Build Lotus Chat Desktop
on:
push:
branches: [main]
workflow_dispatch:
env:
GITEA_URL: https://code.lotusguild.org
REPO: LotusGuild/cinny-desktop
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.ver.outputs.version }}
release_id: ${{ steps.release.outputs.release_id }}
steps:
- name: Compute version
id: ver
run: echo "version=4.12.${{ github.run_number }}" >> $GITHUB_OUTPUT
- name: Create or update release
id: release
env:
TOKEN: ${{ secrets.RELEASE_TOKEN }}
run: |
VERSION="4.12.${{ github.run_number }}"
EXISTING=$(curl -sf "$GITEA_URL/api/v1/repos/$REPO/releases/tags/latest" \
-H "Authorization: token $TOKEN" 2>/dev/null || true)
RELEASE_ID=$(echo "$EXISTING" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('id',''))" 2>/dev/null || true)
if [ -n "$RELEASE_ID" ] && [ "$RELEASE_ID" != "None" ] && [ "$RELEASE_ID" != "" ]; then
curl -sf -X PATCH "$GITEA_URL/api/v1/repos/$REPO/releases/$RELEASE_ID" \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"name\":\"Lotus Chat $VERSION\",\"body\":\"Built from ${{ github.sha }}\"}" > /dev/null
else
RELEASE_ID=$(curl -sf -X POST "$GITEA_URL/api/v1/repos/$REPO/releases" \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"tag_name\":\"latest\",\"name\":\"Lotus Chat $VERSION\",\"prerelease\":true,\"body\":\"Built from ${{ github.sha }}\"}" \
| python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
fi
echo "release_id=$RELEASE_ID" >> $GITHUB_OUTPUT
build-windows:
needs: prepare
runs-on: windows
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: .node-version
- name: Checkout submodules (shallow)
shell: powershell
run: git submodule update --init --depth=1
- name: Patch version
shell: powershell
run: |
$ver = '${{ needs.prepare.outputs.version }}'
node -e "const fs=require('fs');const d=JSON.parse(fs.readFileSync('src-tauri/tauri.conf.json','utf8'));d.version='$ver';fs.writeFileSync('src-tauri/tauri.conf.json',JSON.stringify(d,null,2),'utf8');"
- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
- name: Install frontend deps
shell: powershell
run: cd cinny; npm ci
- name: Install Tauri deps
shell: powershell
run: npm ci
- name: Build
shell: powershell
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ''
NODE_OPTIONS: '--max_old_space_size=4096'
# Sparse registry avoids a full git clone of the crates.io index —
# eliminates the curl SSL handshake failures seen on Windows runners.
CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
# Disable HTTP/2 multiplexing — ALPN negotiation can reset on Windows Schannel.
CARGO_HTTP_MULTIPLEXING: 'false'
# Retry transient network errors before failing.
CARGO_NET_RETRY: '5'
run: |
# USERPROFILE is set by Windows directly; more reliable than C:\Users\$USERNAME
$env:PATH = "$env:USERPROFILE\.cargo\bin;$env:PATH"
# Also add the actual toolchain bin to bypass rustup shim execution issues
$toolchain = Get-ChildItem "$env:USERPROFILE\.rustup\toolchains" -Directory -ErrorAction SilentlyContinue |
Where-Object { $_.Name -match 'stable' } | Select-Object -First 1
if ($toolchain) { $env:PATH = "$($toolchain.FullName)\bin;$env:PATH" }
Write-Host "cargo: $((Get-Command cargo -ErrorAction SilentlyContinue).Source)"
cargo --version
npm run tauri -- build --bundles nsis
- name: Upload to release
shell: powershell
env:
TOKEN: ${{ secrets.RELEASE_TOKEN }}
RELEASE_ID: ${{ needs.prepare.outputs.release_id }}
VERSION: ${{ needs.prepare.outputs.version }}
run: |
$releaseId = $env:RELEASE_ID
$VERSION = $env:VERSION
Write-Host "Version: $VERSION Release: $releaseId"
$nsis = "src-tauri\target\release\bundle\nsis"
$files = @(
"$nsis\Lotus Chat_${VERSION}_x64-setup.exe",
"$nsis\Lotus Chat_${VERSION}_x64-setup.nsis.zip",
"$nsis\Lotus Chat_${VERSION}_x64-setup.nsis.zip.sig"
)
$names = @("LotusChat-x86_64-setup.exe", "LotusChat-x86_64-setup.nsis.zip", "LotusChat-x86_64-setup.nsis.zip.sig")
for ($i = 0; $i -lt $files.Length; $i++) {
$existing = (Invoke-RestMethod -Uri "$env:GITEA_URL/api/v1/repos/$env:REPO/releases/$releaseId/assets" `
-Headers @{ Authorization = "token $env:TOKEN" }) | Where-Object { $_.name -eq $names[$i] }
if ($existing) {
Invoke-RestMethod -Uri "$env:GITEA_URL/api/v1/repos/$env:REPO/releases/$releaseId/assets/$($existing.id)" `
-Method Delete -Headers @{ Authorization = "token $env:TOKEN" }
}
$bytes = [System.IO.File]::ReadAllBytes($files[$i])
Invoke-RestMethod -Uri "$env:GITEA_URL/api/v1/repos/$env:REPO/releases/$releaseId/assets?name=$($names[$i])" `
-Method Post `
-Headers @{ Authorization = "token $env:TOKEN"; "Content-Type" = "application/octet-stream" } `
-Body $bytes
}
build-linux:
needs: prepare
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- uses: actions/setup-node@v4
with:
node-version-file: .node-version
- name: Install system deps
run: |
apt-get update
apt-get install -y \
curl wget file gcc imagemagick \
libwebkit2gtk-4.1-dev \
libssl-dev \
libxdo-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
patchelf \
xdg-utils \
squashfs-tools
- name: Ensure icons are RGBA PNG
run: |
for f in src-tauri/icons/*.png; do
info=$(identify -verbose "$f" 2>/dev/null | grep "Type:" | head -1)
echo "$f: $info"
convert "$f" -type TrueColorAlpha PNG32:"$f"
done
- name: Set up Rust toolchain
run: |
source "$HOME/.cargo/env" 2>/dev/null || true
if command -v cargo >/dev/null 2>&1; then
echo "Using existing Rust: $(cargo --version)"
else
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --default-toolchain stable --profile minimal
source "$HOME/.cargo/env"
fi
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
- name: Patch version
run: python3 -c "import json; d=json.load(open('src-tauri/tauri.conf.json')); d['version']='${{ needs.prepare.outputs.version }}'; open('src-tauri/tauri.conf.json','w').write(json.dumps(d,indent=2))"
- name: Install frontend deps
run: cd cinny && npm ci
- name: Install Tauri deps
run: npm ci
- name: Stage AppRun and linuxdeploy for AppImage bundler
run: |
set -e
mkdir -p ~/.cache/tauri
cp tools/AppRun-x86_64 ~/.cache/tauri/AppRun-x86_64
chmod +x ~/.cache/tauri/AppRun-x86_64
wget -q \
"https://github.com/tauri-apps/binary-releases/releases/download/linuxdeploy/linuxdeploy-x86_64.AppImage" \
-O /tmp/linuxdeploy.AppImage
chmod +x /tmp/linuxdeploy.AppImage
rm -rf /root/linuxdeploy-root
(cd /root && /tmp/linuxdeploy.AppImage --appimage-extract)
mv /root/squashfs-root /root/linuxdeploy-root
echo "Extracted linuxdeploy:"
ls /root/linuxdeploy-root/
ls /root/linuxdeploy-root/usr/bin/ 2>/dev/null || echo "no usr/bin"
# Pre-stage plugin scripts next to linuxdeploy so it finds them via /proc/self/exe lookup
wget -q "https://raw.githubusercontent.com/tauri-apps/linuxdeploy-plugin-gtk/master/linuxdeploy-plugin-gtk.sh" \
-O /root/linuxdeploy-root/usr/bin/linuxdeploy-plugin-gtk.sh
wget -q "https://raw.githubusercontent.com/tauri-apps/linuxdeploy-plugin-gstreamer/master/linuxdeploy-plugin-gstreamer.sh" \
-O /root/linuxdeploy-root/usr/bin/linuxdeploy-plugin-gstreamer.sh
chmod +x /root/linuxdeploy-root/usr/bin/linuxdeploy-plugin-gtk.sh \
/root/linuxdeploy-root/usr/bin/linuxdeploy-plugin-gstreamer.sh
gcc -o ~/.cache/tauri/linuxdeploy-x86_64.AppImage tools/ld_wrapper.c
chmod +x ~/.cache/tauri/linuxdeploy-x86_64.AppImage
- name: Build
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ''
NODE_OPTIONS: '--max_old_space_size=4096'
RUST_LOG: tauri_bundler=debug
run: npm run tauri -- build --bundles appimage,deb
- name: Show linuxdeploy wrapper log
if: always()
run: cat /tmp/ld-wrapper.log 2>/dev/null || echo "no wrapper log found"
- name: Upload to release
env:
TOKEN: ${{ secrets.RELEASE_TOKEN }}
RELEASE_ID: ${{ needs.prepare.outputs.release_id }}
VERSION: ${{ needs.prepare.outputs.version }}
run: |
APPIMAGE_DIR="src-tauri/target/release/bundle/appimage"
DEB_DIR="src-tauri/target/release/bundle/deb"
upload() {
local name="$1" path="$2"
local existing_id
existing_id=$(curl -sf "$GITEA_URL/api/v1/repos/$REPO/releases/$RELEASE_ID/assets" \
-H "Authorization: token $TOKEN" \
| python3 -c "import sys,json; assets=json.load(sys.stdin); print(next((str(a['id']) for a in assets if a['name']=='$name'), ''))" 2>/dev/null || true)
if [ -n "$existing_id" ]; then
curl -sf -X DELETE "$GITEA_URL/api/v1/repos/$REPO/releases/$RELEASE_ID/assets/$existing_id" \
-H "Authorization: token $TOKEN" || true
fi
echo "Uploading $name"
curl -sf -X POST \
"$GITEA_URL/api/v1/repos/$REPO/releases/$RELEASE_ID/assets?name=$name" \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/octet-stream" \
--data-binary @"$path"
}
upload "LotusChat-x86_64.AppImage" "$APPIMAGE_DIR/Lotus Chat_${VERSION}_amd64.AppImage"
upload "LotusChat-x86_64.AppImage.tar.gz" "$APPIMAGE_DIR/Lotus Chat_${VERSION}_amd64.AppImage.tar.gz"
upload "LotusChat-x86_64.AppImage.tar.gz.sig" "$APPIMAGE_DIR/Lotus Chat_${VERSION}_amd64.AppImage.tar.gz.sig"
upload "LotusChat-x86_64.deb" "$DEB_DIR/Lotus Chat_${VERSION}_amd64.deb"
update-manifest:
needs: [prepare, build-windows, build-linux]
runs-on: ubuntu-latest
steps:
- name: Generate and upload release.json
env:
TOKEN: ${{ secrets.RELEASE_TOKEN }}
RELEASE_ID: ${{ needs.prepare.outputs.release_id }}
VERSION: ${{ needs.prepare.outputs.version }}
run: |
BASE="$GITEA_URL/LotusGuild/cinny-desktop/releases/download/latest"
WIN_SIG=$(curl -sf "$BASE/LotusChat-x86_64-setup.nsis.zip.sig")
LIN_SIG=$(curl -sf "$BASE/LotusChat-x86_64.AppImage.tar.gz.sig")
DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ)
python3 -c "import json,sys; v,d,wu,ws,lu,ls=sys.argv[1:]; print(json.dumps({'version':v,'notes':'Latest Lotus Chat release','pub_date':d,'platforms':{'windows-x86_64':{'url':wu,'signature':ws},'linux-x86_64':{'url':lu,'signature':ls}}},indent=2))" \
"$VERSION" "$DATE" \
"$BASE/LotusChat-x86_64-setup.nsis.zip" "$WIN_SIG" \
"$BASE/LotusChat-x86_64.AppImage.tar.gz" "$LIN_SIG" \
> release.json
cat release.json
OLD=$(curl -sf "$GITEA_URL/api/v1/repos/$REPO/releases/$RELEASE_ID/assets" \
-H "Authorization: token $TOKEN" \
| python3 -c "import sys,json; print(next((str(a['id']) for a in json.load(sys.stdin) if a['name']=='release.json'), ''))" 2>/dev/null || true)
[ -n "$OLD" ] && curl -sf -X DELETE \
"$GITEA_URL/api/v1/repos/$REPO/releases/$RELEASE_ID/assets/$OLD" \
-H "Authorization: token $TOKEN" || true
curl -sf -X POST \
"$GITEA_URL/api/v1/repos/$REPO/releases/$RELEASE_ID/assets?name=release.json" \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
--data-binary @release.json
-58
View File
@@ -1,58 +0,0 @@
name: 🐞 Bug Report
description: Report a bug
labels: 'type: bug'
body:
- type: markdown
attributes:
value: |
## First of all
1. Please search for [existing issues](https://github.com/cinnyapp/cinny-desktop/issues?q=is%3Aissue) about this problem first.
2. Make sure Cinny is up to date.
3. Make sure it's an issue with Cinny and not something else you are using.
4. Remember to be friendly.
- type: textarea
id: description
attributes:
label: Describe the bug
description: A clear description of what the bug is. Include screenshots if applicable.
placeholder: Bug description
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Reproduction
description: Steps to reproduce the behavior.
placeholder: |
1. Go to ...
2. Click on ...
3. See error
- type: textarea
id: expected-behavior
attributes:
label: Expected behavior
description: A clear description of what you expected to happen.
- type: textarea
id: info
attributes:
label: Platform and versions
description: "Provide OS, browser and Cinny version with your Homeserver."
placeholder: |
1. OS: [e.g. Windows 10, MacOS]
2. Cinny version: [e.g. 1.8.1]
3. Matrix homeserver: [e.g. matrix.org]
4. Downloaded from: [e.g. GitHub, Flatpak]
render: shell
validations:
required: true
- type: textarea
id: context
attributes:
label: Additional context
description: Add any other context about the problem here.
+4 -3
View File
@@ -1,4 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: 💬 Matrix Chat
url: https://matrix.to/#/#cinny:matrix.org
about: Ask questions and talk to other Cinny users and the maintainers
- name: Features, Bug Reports, Questions
url: https://github.com/cinnyapp/cinny/discussions/new/choose
about: Our preferred starting point if you have any questions or suggestions about features or behavior.
@@ -1,34 +0,0 @@
name: 💡 Feature Request
description: Suggest an idea
labels: 'type: feature'
body:
- type: textarea
id: problem
attributes:
label: Describe the problem
description: A clear description of the problem this feature would solve
placeholder: "I'm always frustrated when..."
validations:
required: true
- type: textarea
id: solution
attributes:
label: "Describe the solution you'd like"
description: A clear description of what change you would like
placeholder: "I would like to..."
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives considered
description: "Any alternative solutions you've considered"
- type: textarea
id: context
attributes:
label: Additional context
description: Add any other context about the problem here.
-22
View File
@@ -1,22 +0,0 @@
<!-- Please read https://github.com/cinnyapp/cinny/blob/dev/CONTRIBUTING.md before submitting your pull request -->
### Description
<!-- Please include a summary of the change. Please also include relevant motivation and context. List any dependencies that are required for this change. -->
Fixes #
#### Type of change
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] This change requires a documentation update
### Checklist:
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
-3
View File
@@ -1,3 +0,0 @@
# Reporting a Vulnerability
**If you've found a security vulnerability, please report it to cinnyapp@gmail.com**
+4 -7
View File
@@ -2,16 +2,13 @@
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended",
":dependencyDashboardApproval"
],
"labels": [
"Dependencies"
":dependencyDashboardApproval",
":semanticCommits"
],
"labels": ["Dependencies"],
"packageRules": [
{
"matchUpdateTypes": [
"lockFileMaintenance"
]
"matchUpdateTypes": ["lockFileMaintenance"]
}
],
"lockFileMaintenance": {
+2 -2
View File
@@ -8,7 +8,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.0
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: true
- name: Create zip including submodules
@@ -16,7 +16,7 @@ jobs:
cd ..
zip ${{ github.event.repository.name }}/${{ github.event.repository.name }}-${{ github.ref_name }}.zip ${{ github.event.repository.name }} -r
- name: Upload zip to release
uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
with:
files: |
${{ github.event.repository.name }}-${{ github.ref_name }}.zip
+1 -1
View File
@@ -12,7 +12,7 @@ jobs:
- name: 'CLA Assistant'
if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target'
# Beta Release
uses: cla-assistant/github-action@v2.6.1
uses: cla-assistant/github-action@ca4a40a7d1004f18d9960b404b97e5f30a505a08 # v2.6.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# the below token should have repo scope and must be manually added by you in the repository's secret
+2 -2
View File
@@ -14,9 +14,9 @@ jobs:
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@v4.2.0
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: NPM Lockfile Changes
uses: codepunkt/npm-lockfile-changes@b40543471c36394409466fdb277a73a0856d7891
uses: codepunkt/npm-lockfile-changes@b40543471c36394409466fdb277a73a0856d7891 # v1.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
# Optional inputs, can be deleted safely if you are happy with default values.
+15
View File
@@ -0,0 +1,15 @@
name: Check PR title
on:
pull_request_target:
types:
- opened
- edited
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+37 -42
View File
@@ -9,33 +9,31 @@ jobs:
runs-on: windows-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.0
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: true
- name: Setup node
uses: actions/setup-node@v4.4.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 20.12.2
cache: 'npm'
node-version-file: ".node-version"
package-manager-cache: false
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
uses: dtolnay/rust-toolchain@stable # They use branch based releases
- name: Install cinny dependencies
run: cd cinny && npm ci
- name: Install tauri dependencies
run: npm ci
- name: Build desktop app with Tauri
uses: tauri-apps/tauri-action@v0.5.14
uses: tauri-apps/tauri-action@73fb865345c54760d875b94642314f8c0c894afa # v0.6.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
NODE_OPTIONS: "--max_old_space_size=4096"
with:
releaseId: ${{ github.event.release.upload_url }}
- name: Get app version (windows)
run: |
$json = (Get-Content "src-tauri\tauri.conf.json" -Raw) | ConvertFrom-Json
$version = $json.package.version
$version = $json.version
echo "Version: ${version}"
echo "TAURI_VERSION=${version}" >> $Env:GITHUB_ENV
echo "${Env:TAURI_VERSION}"
@@ -50,7 +48,7 @@ jobs:
run: Move-Item "src-tauri\target\release\bundle\msi\Cinny_${{ env.TAURI_VERSION }}_x64_en-US.msi.zip.sig" "src-tauri\target\release\bundle\msi\Cinny_desktop-x86_64.msi.zip.sig"
shell: pwsh
- name: Upload tagged release
uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
with:
files: |
src-tauri/target/release/bundle/msi/Cinny_desktop-x86_64.msi
@@ -62,46 +60,44 @@ jobs:
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.0
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: true
- name: Setup node
uses: actions/setup-node@v4.4.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 20.12.2
cache: 'npm'
node-version-file: ".node-version"
package-manager-cache: false
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
uses: dtolnay/rust-toolchain@stable # They use branch based releases
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
- name: Install cinny dependencies
run: cd cinny && npm ci
- name: Install tauri dependencies
run: npm ci
- name: Build desktop app with Tauri
uses: tauri-apps/tauri-action@v0.5.14
uses: tauri-apps/tauri-action@73fb865345c54760d875b94642314f8c0c894afa # v0.6.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
NODE_OPTIONS: "--max_old_space_size=4096"
with:
releaseId: ${{ github.event.release.upload_url }}
- name: Get app version
id: vars
run: echo "tag=$(jq .package.version src-tauri/tauri.conf.json | tr -d '"')" >> $GITHUB_OUTPUT
run: echo "tag=$(jq .version src-tauri/tauri.conf.json | tr -d '"')" >> $GITHUB_OUTPUT
- name: Move deb
run: mv "src-tauri/target/release/bundle/deb/cinny_${{ steps.vars.outputs.tag }}_amd64.deb" "src-tauri/target/release/bundle/deb/Cinny_desktop-x86_64.deb"
run: mv "src-tauri/target/release/bundle/deb/Cinny_${{ steps.vars.outputs.tag }}_amd64.deb" "src-tauri/target/release/bundle/deb/Cinny_desktop-x86_64.deb"
- name: Move AppImage
run: mv "src-tauri/target/release/bundle/appimage/cinny_${{ steps.vars.outputs.tag }}_amd64.AppImage" "src-tauri/target/release/bundle/appimage/Cinny_desktop-x86_64.AppImage"
run: mv "src-tauri/target/release/bundle/appimage/Cinny_${{ steps.vars.outputs.tag }}_amd64.AppImage" "src-tauri/target/release/bundle/appimage/Cinny_desktop-x86_64.AppImage"
- name: Move AppImage.tar.gz
run: mv "src-tauri/target/release/bundle/appimage/cinny_${{ steps.vars.outputs.tag }}_amd64.AppImage.tar.gz" "src-tauri/target/release/bundle/appimage/Cinny_desktop-x86_64.AppImage.tar.gz"
run: mv "src-tauri/target/release/bundle/appimage/Cinny_${{ steps.vars.outputs.tag }}_amd64.AppImage.tar.gz" "src-tauri/target/release/bundle/appimage/Cinny_desktop-x86_64.AppImage.tar.gz"
- name: Move AppImage.tar.gz.sig
run: mv "src-tauri/target/release/bundle/appimage/cinny_${{ steps.vars.outputs.tag }}_amd64.AppImage.tar.gz.sig" "src-tauri/target/release/bundle/appimage/Cinny_desktop-x86_64.AppImage.tar.gz.sig"
run: mv "src-tauri/target/release/bundle/appimage/Cinny_${{ steps.vars.outputs.tag }}_amd64.AppImage.tar.gz.sig" "src-tauri/target/release/bundle/appimage/Cinny_desktop-x86_64.AppImage.tar.gz.sig"
- name: Upload tagged release
uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
with:
files: |
src-tauri/target/release/bundle/deb/Cinny_desktop-x86_64.deb
@@ -114,35 +110,34 @@ jobs:
runs-on: macos-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.0
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: true
- name: Setup node
uses: actions/setup-node@v4.4.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 20.12.2
cache: 'npm'
node-version-file: ".node-version"
package-manager-cache: false
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
uses: dtolnay/rust-toolchain@stable # They use branch based releases
with:
target: aarch64-apple-darwin,x86_64-apple-darwin
targets: aarch64-apple-darwin,x86_64-apple-darwin
- name: Install cinny dependencies
run: cd cinny && npm ci
- name: Install tauri dependencies
run: npm ci
- name: Build desktop app with Tauri
uses: tauri-apps/tauri-action@v0.5.14
uses: tauri-apps/tauri-action@73fb865345c54760d875b94642314f8c0c894afa # v0.6.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
NODE_OPTIONS: "--max_old_space_size=4096"
with:
releaseId: ${{ github.event.release.upload_url }}
args: "--target universal-apple-darwin"
- name: Get app version
id: vars
run: echo "tag=$(jq .package.version src-tauri/tauri.conf.json | tr -d '"')" >> $GITHUB_OUTPUT
run: echo "tag=$(jq .version src-tauri/tauri.conf.json | tr -d '"')" >> $GITHUB_OUTPUT
- name: Move dmg
run: mv "src-tauri/target/universal-apple-darwin/release/bundle/dmg/Cinny_${{ steps.vars.outputs.tag }}_universal.dmg" "src-tauri/target/universal-apple-darwin/release/bundle/dmg/Cinny_desktop-universal.dmg"
- name: Move app.tar.gz
@@ -150,7 +145,7 @@ jobs:
- name: Move app.tar.gz.sig
run: mv "src-tauri/target/universal-apple-darwin/release/bundle/macos/Cinny.app.tar.gz.sig" "src-tauri/target/universal-apple-darwin/release/bundle/macos/Cinny_desktop-universal.app.tar.gz.sig"
- name: Upload tagged release
uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
with:
files: |
src-tauri/target/universal-apple-darwin/release/bundle/dmg/Cinny_desktop-universal.dmg
@@ -164,7 +159,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.0
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Install dependencies
run: npm ci
- name: Run release.json
+52 -14
View File
@@ -1,40 +1,78 @@
name: "Build pull request"
on:
#pull_request:
#types: ['opened', 'synchronize']
pull_request:
types: ['opened', 'synchronize']
jobs:
publish-tauri:
strategy:
fail-fast: false
matrix:
platform: [macos-latest, ubuntu-20.04, windows-latest]
include:
- platform: 'macos-latest'
args: '--target universal-apple-darwin'
- platform: 'ubuntu-22.04'
args: ''
- platform: 'windows-latest'
args: ''
runs-on: ${{ matrix.platform }}
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.0
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: true
- name: Setup node
uses: actions/setup-node@v4.4.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 20.12.2
cache: 'npm'
- name: Install Rust stable
uses: actions-rs/toolchain@v1.0.7
node-version-file: ".node-version"
package-manager-cache: false
- name: install Rust stable
uses: dtolnay/rust-toolchain@stable # They use branch based releases
with:
toolchain: stable
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
- name: Install dependencies (ubuntu only)
if: matrix.platform == 'ubuntu-20.04'
if: matrix.platform == 'ubuntu-22.04'
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
- name: Install cinny dependencies
run: cd cinny && npm ci
- name: Install tauri dependencies
run: npm ci
- name: Build desktop app with Tauri
uses: tauri-apps/tauri-action@v0.5.14
uses: tauri-apps/tauri-action@73fb865345c54760d875b94642314f8c0c894afa # v0.6.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NODE_OPTIONS: "--max_old_space_size=4096"
with:
args: ${{ matrix.args }} --config '{"bundle":{"createUpdaterArtifacts":false}}'
- name: Upload macOS artifacts
if: matrix.platform == 'macos-latest'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: release-artifacts-macos
path: |
src-tauri/target/universal-apple-darwin/release/bundle/macos/Cinny*.app
if-no-files-found: warn
- name: Upload Linux artifacts
if: matrix.platform == 'ubuntu-22.04'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: release-artifacts-linux
path: |
src-tauri/target/release/bundle/deb/Cinny_*.deb
src-tauri/target/release/bundle/rpm/Cinny-*.rpm
src-tauri/target/release/bundle/appimage/Cinny_*.AppImage
if-no-files-found: warn
- name: Upload Windows artifacts
if: matrix.platform == 'windows-latest'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: release-artifacts-windows
path: |
src-tauri/target/release/bundle/msi/Cinny_*_x64_*.msi
src-tauri/target/release/bundle/nsis/Cinny_*_x64-setup.exe
if-no-files-found: warn
+2 -1
View File
@@ -1,3 +1,4 @@
[submodule "cinny"]
path = cinny
url = https://github.com/cinnyapp/cinny.git
url = https://code.lotusguild.org/LotusGuild/cinny.git
branch = lotus
+1
View File
@@ -0,0 +1 @@
24.13.1
+1 -1
View File
@@ -23,7 +23,7 @@ To verify release files, you need to download [minisign](https://jedisct1.github
## Local development
Firstly, to setup Rust, NodeJS and build tools follow [Tauri documentation](https://tauri.app/v1/guides/getting-started/prerequisites).
Firstly, to setup Rust, NodeJS and build tools follow [Tauri documentation](https://v2.tauri.app/start/prerequisites/).
Now, to setup development locally run the following commands:
* `git clone --recursive https://github.com/cinnyapp/cinny-desktop.git`
+1 -1
Submodule cinny updated: 958ae8945d...79f8fabb1b
+4 -29
View File
@@ -1,38 +1,13 @@
{
"defaultHomeserver": 2,
"defaultHomeserver": 0,
"homeserverList": [
"converser.eu",
"envs.net",
"matrix.lotusguild.org",
"matrix.org",
"monero.social",
"mozilla.org",
"xmr.se"
"mozilla.org"
],
"allowCustomHomeservers": true,
"featuredCommunities": {
"openAsDefault": false,
"spaces": [
"#cinny-space:matrix.org",
"#community:matrix.org",
"#space:envs.net",
"#science-space:matrix.org",
"#libregaming-games:tchncs.de",
"#mathematics-on:matrix.org"
],
"rooms": [
"#cinny:matrix.org",
"#freesoftware:matrix.org",
"#pcapdroid:matrix.org",
"#gentoo:matrix.org",
"#PrivSec.dev:arcticfoxes.net",
"#disroot:aria-net.org"
],
"servers": ["envs.net", "matrix.org", "monero.social", "mozilla.org"]
},
"hashRouter": {
"enabled": true,
"basename": "/"
}
}
}
+751 -56
View File
@@ -1,20 +1,31 @@
{
"name": "cinny",
"version": "4.10.1",
"version": "4.12.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "cinny",
"version": "4.10.1",
"version": "4.12.2",
"license": "AGPL-3.0-only",
"dependencies": {
"@tauri-apps/api": "1.6.0"
"@tauri-apps/api": "2.7.0",
"@tauri-apps/plugin-clipboard-manager": "2.3.0",
"@tauri-apps/plugin-dialog": "2.3.2",
"@tauri-apps/plugin-fs": "2.4.1",
"@tauri-apps/plugin-global-shortcut": "2.3.0",
"@tauri-apps/plugin-http": "2.5.1",
"@tauri-apps/plugin-notification": "2.3.0",
"@tauri-apps/plugin-os": "2.3.0",
"@tauri-apps/plugin-process": "2.3.0",
"@tauri-apps/plugin-shell": "2.3.0",
"@tauri-apps/plugin-updater": "2.9.0"
},
"devDependencies": {
"@actions/github": "6.0.0",
"@tauri-apps/cli": "1.6.2",
"node-fetch": "3.3.2"
"@tauri-apps/cli": "2.7.1",
"node-fetch": "3.3.2",
"shx": "0.4.0"
},
"engines": {
"node": ">=16.0.0"
@@ -51,6 +62,44 @@
"node": ">=14"
}
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.stat": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.walk": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@octokit/auth-token": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
@@ -182,23 +231,18 @@
}
},
"node_modules/@tauri-apps/api": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.6.0.tgz",
"integrity": "sha512-rqI++FWClU5I2UBp4HXFvl+sBWkdigBkxnpJDQUWttNyG7IZP4FwQGhTNL5EOw0vI8i6eSAJ5frLqO7n7jbJdg==",
"engines": {
"node": ">= 14.6.0",
"npm": ">= 6.6.0",
"yarn": ">= 1.19.1"
},
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.7.0.tgz",
"integrity": "sha512-v7fVE8jqBl8xJFOcBafDzXFc8FnicoH3j8o8DNNs0tHuEBmXUDqrCOAzMRX0UkfpwqZLqvrvK0GNQ45DfnoVDg==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/tauri"
}
},
"node_modules/@tauri-apps/cli": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.6.2.tgz",
"integrity": "sha512-zpfZdxhm20s7d/Uejpg/T3a9sqLVe3Ih2ztINfy8v6iLw9Ohowkb9g+agZffYKlEWfOSpmCy69NFyBLj7OZL0A==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.7.1.tgz",
"integrity": "sha512-RcGWR4jOUEl92w3uvI0h61Llkfj9lwGD1iwvDRD2isMrDhOzjeeeVn9aGzeW1jubQ/kAbMYfydcA4BA0Cy733Q==",
"dev": true,
"bin": {
"tauri": "tauri.js"
@@ -211,22 +255,23 @@
"url": "https://opencollective.com/tauri"
},
"optionalDependencies": {
"@tauri-apps/cli-darwin-arm64": "1.6.2",
"@tauri-apps/cli-darwin-x64": "1.6.2",
"@tauri-apps/cli-linux-arm-gnueabihf": "1.6.2",
"@tauri-apps/cli-linux-arm64-gnu": "1.6.2",
"@tauri-apps/cli-linux-arm64-musl": "1.6.2",
"@tauri-apps/cli-linux-x64-gnu": "1.6.2",
"@tauri-apps/cli-linux-x64-musl": "1.6.2",
"@tauri-apps/cli-win32-arm64-msvc": "1.6.2",
"@tauri-apps/cli-win32-ia32-msvc": "1.6.2",
"@tauri-apps/cli-win32-x64-msvc": "1.6.2"
"@tauri-apps/cli-darwin-arm64": "2.7.1",
"@tauri-apps/cli-darwin-x64": "2.7.1",
"@tauri-apps/cli-linux-arm-gnueabihf": "2.7.1",
"@tauri-apps/cli-linux-arm64-gnu": "2.7.1",
"@tauri-apps/cli-linux-arm64-musl": "2.7.1",
"@tauri-apps/cli-linux-riscv64-gnu": "2.7.1",
"@tauri-apps/cli-linux-x64-gnu": "2.7.1",
"@tauri-apps/cli-linux-x64-musl": "2.7.1",
"@tauri-apps/cli-win32-arm64-msvc": "2.7.1",
"@tauri-apps/cli-win32-ia32-msvc": "2.7.1",
"@tauri-apps/cli-win32-x64-msvc": "2.7.1"
}
},
"node_modules/@tauri-apps/cli-darwin-arm64": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.6.2.tgz",
"integrity": "sha512-6mdRyf9DaLqlZvj8kZB09U3rwY+dOHSGzTZ7+GDg665GJb17f4cb30e8dExj6/aghcsOie9EGpgiURcDUvLNSQ==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.7.1.tgz",
"integrity": "sha512-j2NXQN6+08G03xYiyKDKqbCV2Txt+hUKg0a8hYr92AmoCU8fgCjHyva/p16lGFGUG3P2Yu0xiNe1hXL9ZuRMzA==",
"cpu": [
"arm64"
],
@@ -240,9 +285,9 @@
}
},
"node_modules/@tauri-apps/cli-darwin-x64": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.6.2.tgz",
"integrity": "sha512-PLxZY5dn38H3R9VRmBN/l0ZDB5JFanCwlK4rmpzDQPPg3tQmbu5vjSCP6TVj5U6aLKsj79kFyULblPr5Dn9+vw==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.7.1.tgz",
"integrity": "sha512-CdYAefeM35zKsc91qIyKzbaO7FhzTyWKsE8hj7tEJ1INYpoh1NeNNyL/NSEA3Nebi5ilugioJ5tRK8ZXG8y3gw==",
"cpu": [
"x64"
],
@@ -256,9 +301,9 @@
}
},
"node_modules/@tauri-apps/cli-linux-arm-gnueabihf": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.6.2.tgz",
"integrity": "sha512-xnpj4BLeeGOh5I/ewCQlYJZwHH0CBNBN+4q8BNWNQ9MKkjN9ST366RmHRzl2ANNgWwijOPxyce7GiUmvuH8Atw==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.7.1.tgz",
"integrity": "sha512-dnvyJrTA1UJxJjQ8q1N/gWomjP8Twij1BUQu2fdcT3OPpqlrbOk5R1yT0oD/721xoKNjroB5BXCsmmlykllxNg==",
"cpu": [
"arm"
],
@@ -272,9 +317,9 @@
}
},
"node_modules/@tauri-apps/cli-linux-arm64-gnu": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.6.2.tgz",
"integrity": "sha512-uaiRE0vE2P+tdsCngfKt+7yKr3VZXIq/t3w01DzSdnBgHSp0zmRsRR4AhZt7ibvoEgA8GzBP+eSHJdFNZsTU9w==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.7.1.tgz",
"integrity": "sha512-FtBW6LJPNRTws3qyUc294AqCWU91l/H0SsFKq6q4Q45MSS4x6wxLxou8zB53tLDGEPx3JSoPLcDaSfPlSbyujQ==",
"cpu": [
"arm64"
],
@@ -288,9 +333,9 @@
}
},
"node_modules/@tauri-apps/cli-linux-arm64-musl": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.2.tgz",
"integrity": "sha512-o9JunVrMrhqTBLrdvEbS64W0bo1dPm0lxX51Mx+6x9SmbDjlEWGgaAHC3iKLK9khd5Yu1uO1e+8TJltAcScvmw==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.7.1.tgz",
"integrity": "sha512-/HXY0t4FHkpFzjeYS5c16mlA6z0kzn5uKLWptTLTdFSnYpr8FCnOP4Sdkvm2TDQPF2ERxXtNCd+WR/jQugbGnA==",
"cpu": [
"arm64"
],
@@ -303,10 +348,26 @@
"node": ">= 10"
}
},
"node_modules/@tauri-apps/cli-linux-riscv64-gnu": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.7.1.tgz",
"integrity": "sha512-GeW5lVI2GhhnaYckiDzstG2j2Jwlud5d2XefRGwlOK+C/bVGLT1le8MNPYK8wgRlpeK8fG1WnJJYD6Ke7YQ8bg==",
"cpu": [
"riscv64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tauri-apps/cli-linux-x64-gnu": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.6.2.tgz",
"integrity": "sha512-jL9f+o61DdQmNYKIt2Q3BA8YJ+hyC5+GdNxqDf7j5SoQ85j//YfUWbmp9ZgsPHVBxgSGZVvgGMNvf64Ykp0buQ==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.7.1.tgz",
"integrity": "sha512-DprxKQkPxIPYwUgg+cscpv2lcIUhn2nxEPlk0UeaiV9vATxCXyytxr1gLcj3xgjGyNPlM0MlJyYaPy1JmRg1cA==",
"cpu": [
"x64"
],
@@ -320,9 +381,9 @@
}
},
"node_modules/@tauri-apps/cli-linux-x64-musl": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.2.tgz",
"integrity": "sha512-xsa4Pu9YMHKAX0J8pIoXfN/uhvAAAoECZDixDhWw8zi57VZ4QX28ycqolS+NscdD9NAGSgHk45MpBZWdvRtvjQ==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.7.1.tgz",
"integrity": "sha512-KLlq3kOK7OUyDR757c0zQjPULpGZpLhNB0lZmZpHXvoOUcqZoCXJHh4dT/mryWZJp5ilrem5l8o9ngrDo0X1AA==",
"cpu": [
"x64"
],
@@ -336,9 +397,9 @@
}
},
"node_modules/@tauri-apps/cli-win32-arm64-msvc": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.6.2.tgz",
"integrity": "sha512-eJtUOx2UFhJpCCkm5M5+4Co9JbjvgIHTdyS/hTSZfOEdT58CNEGVJXMA39FsSZXYoxYPE+9K7Km6haMozSmlxw==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.7.1.tgz",
"integrity": "sha512-dH7KUjKkSypCeWPiainHyXoES3obS+JIZVoSwSZfKq2gWgs48FY3oT0hQNYrWveE+VR4VoR3b/F3CPGbgFvksA==",
"cpu": [
"arm64"
],
@@ -352,9 +413,9 @@
}
},
"node_modules/@tauri-apps/cli-win32-ia32-msvc": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.6.2.tgz",
"integrity": "sha512-9Jwx3PrhNw3VKOgPISRRXPkvoEAZP+7rFRHXIo49dvlHy2E/o9qpWi1IntE33HWeazP6KhvsCjvXB2Ai4eGooA==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.7.1.tgz",
"integrity": "sha512-1oeibfyWQPVcijOrTg709qhbXArjX3x1MPjrmA5anlygwrbByxLBcLXvotcOeULFcnH2FYUMMLLant8kgvwE5A==",
"cpu": [
"ia32"
],
@@ -368,9 +429,9 @@
}
},
"node_modules/@tauri-apps/cli-win32-x64-msvc": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.6.2.tgz",
"integrity": "sha512-5Z+ZjRFJE8MXghJe1UXvGephY5ZcgVhiTI9yuMi9xgX3CEaAXASatyXllzsvGJ9EDaWMEpa0PHjAzi7LBAWROw==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.7.1.tgz",
"integrity": "sha512-D7Q9kDObutuirCNLxYQ7KAg2Xxg99AjcdYz/KuMw5HvyEPbkC9Q7JL0vOrQOrHEHxIQ2lYzFOZvKKoC2yyqXcg==",
"cpu": [
"x64"
],
@@ -383,12 +444,122 @@
"node": ">= 10"
}
},
"node_modules/@tauri-apps/plugin-clipboard-manager": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-clipboard-manager/-/plugin-clipboard-manager-2.3.0.tgz",
"integrity": "sha512-81NOBA2P+OTY8RLkBwyl9ZR/0CeggLub4F6zxcxUIfFOAqtky7J61+K/MkH2SC1FMxNBxrX0swDuKvkjkHadlA==",
"dependencies": {
"@tauri-apps/api": "^2.6.0"
}
},
"node_modules/@tauri-apps/plugin-dialog": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.3.2.tgz",
"integrity": "sha512-cNLo9YeQSC0MF4IgXnotHsqEgJk72MBZLXmQPrLA95qTaaWiiaFQ38hIMdZ6YbGUNkr3oni3EhU+AD5jLHcdUA==",
"dependencies": {
"@tauri-apps/api": "^2.6.0"
}
},
"node_modules/@tauri-apps/plugin-fs": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.4.1.tgz",
"integrity": "sha512-vJlKZVGF3UAFGoIEVT6Oq5L4HGDCD78WmA4uhzitToqYiBKWAvZR61M6zAyQzHqLs0ADemkE4RSy/5sCmZm6ZQ==",
"dependencies": {
"@tauri-apps/api": "^2.6.0"
}
},
"node_modules/@tauri-apps/plugin-global-shortcut": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-global-shortcut/-/plugin-global-shortcut-2.3.0.tgz",
"integrity": "sha512-WbAz0ElhpP+0kzQZRScdCC7UQ7OPH8PAn//fsBNu7+ywihsnVSVOg1L9YhieAtLNtAlnmFI69Yl5AGaA3ge5IQ==",
"dependencies": {
"@tauri-apps/api": "^2.6.0"
}
},
"node_modules/@tauri-apps/plugin-http": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-http/-/plugin-http-2.5.1.tgz",
"integrity": "sha512-SpQ1azXEdQI0UB2NZTIPljJTDEe0bIaKzHYR/k4UQp6yzRYGLC/ktmIgEfQ2RvKAWus8GcYgGr5K6LJPbo/NZw==",
"dependencies": {
"@tauri-apps/api": "^2.6.0"
}
},
"node_modules/@tauri-apps/plugin-notification": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-notification/-/plugin-notification-2.3.0.tgz",
"integrity": "sha512-QDwXo9VzAlH97c0veuf19TZI6cRBPfJDl2O6hNEDvI66j60lOO9z+PL6MJrj8A6Y+t55r7mGhe3rQWLmOre2HA==",
"dependencies": {
"@tauri-apps/api": "^2.6.0"
}
},
"node_modules/@tauri-apps/plugin-os": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-os/-/plugin-os-2.3.0.tgz",
"integrity": "sha512-dm3bDsMuUngpIQdJ1jaMkMfyQpHyDcaTIKTFaAMHoKeUd+Is3UHO2uzhElr6ZZkfytIIyQtSVnCWdW2Kc58f3g==",
"dependencies": {
"@tauri-apps/api": "^2.6.0"
}
},
"node_modules/@tauri-apps/plugin-process": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-process/-/plugin-process-2.3.0.tgz",
"integrity": "sha512-0DNj6u+9csODiV4seSxxRbnLpeGYdojlcctCuLOCgpH9X3+ckVZIEj6H7tRQ7zqWr7kSTEWnrxtAdBb0FbtrmQ==",
"dependencies": {
"@tauri-apps/api": "^2.6.0"
}
},
"node_modules/@tauri-apps/plugin-shell": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-shell/-/plugin-shell-2.3.0.tgz",
"integrity": "sha512-6GIRxO2z64uxPX4CCTuhQzefvCC0ew7HjdBhMALiGw74vFBDY95VWueAHOHgNOMV4UOUAFupyidN9YulTe5xlA==",
"dependencies": {
"@tauri-apps/api": "^2.6.0"
}
},
"node_modules/@tauri-apps/plugin-updater": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-updater/-/plugin-updater-2.9.0.tgz",
"integrity": "sha512-j++sgY8XpeDvzImTrzWA08OqqGqgkNyxczLD7FjNJJx/uXxMZFz5nDcfkyoI/rCjYuj2101Tci/r/HFmOmoxCg==",
"dependencies": {
"@tauri-apps/api": "^2.6.0"
}
},
"node_modules/before-after-hook": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
"integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==",
"dev": true
},
"node_modules/braces": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"license": "MIT",
"dependencies": {
"fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/cross-spawn": {
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
"integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
"dev": true,
"license": "MIT",
"dependencies": {
"nice-try": "^1.0.4",
"path-key": "^2.0.1",
"semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
},
"engines": {
"node": ">=4.8"
}
},
"node_modules/data-uri-to-buffer": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
@@ -404,6 +575,72 @@
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
"dev": true
},
"node_modules/end-of-stream": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
"dev": true,
"license": "MIT",
"dependencies": {
"once": "^1.4.0"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/execa": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
"integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
"dev": true,
"license": "MIT",
"dependencies": {
"cross-spawn": "^6.0.0",
"get-stream": "^4.0.0",
"is-stream": "^1.1.0",
"npm-run-path": "^2.0.0",
"p-finally": "^1.0.0",
"signal-exit": "^3.0.0",
"strip-eof": "^1.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/fast-glob": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.8"
},
"engines": {
"node": ">=8.6.0"
}
},
"node_modules/fastq": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
"integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
"dev": true,
"license": "ISC",
"dependencies": {
"reusify": "^1.0.4"
}
},
"node_modules/fetch-blob": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
@@ -427,6 +664,19 @@
"node": "^12.20 || >= 14.13"
}
},
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/formdata-polyfill": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
@@ -439,6 +689,114 @@
"node": ">=12.20.0"
}
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"license": "MIT",
"dependencies": {
"pump": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/hasown": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
"integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/interpret": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.10"
}
},
"node_modules/is-core-module": {
"version": "2.16.2",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
"integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
"dev": true,
"license": "MIT",
"dependencies": {
"hasown": "^2.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
@@ -448,6 +806,64 @@
"node": ">=0.10.0"
}
},
"node_modules/is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
"integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true,
"license": "ISC"
},
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 8"
}
},
"node_modules/micromatch": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"license": "MIT",
"dependencies": {
"braces": "^3.0.3",
"picomatch": "^2.3.1"
},
"engines": {
"node": ">=8.6"
}
},
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true,
"license": "MIT"
},
"node_modules/node-domexception": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
@@ -485,6 +901,19 @@
"url": "https://opencollective.com/node-fetch"
}
},
"node_modules/npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
"integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
"dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^2.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -494,6 +923,259 @@
"wrappy": "1"
}
},
"node_modules/p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
"integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true,
"license": "MIT"
},
"node_modules/picomatch": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pump": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
"integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
"dev": true,
"license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/rechoir": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
"integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
"dev": true,
"dependencies": {
"resolve": "^1.1.6"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/resolve": {
"version": "1.22.12",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
"integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"is-core-module": "^2.16.1",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/reusify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
"integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
"dev": true,
"license": "MIT",
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
}
},
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"queue-microtask": "^1.2.2"
}
},
"node_modules/semver": {
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver"
}
},
"node_modules/shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
"integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
"dev": true,
"license": "MIT",
"dependencies": {
"shebang-regex": "^1.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/shebang-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
"integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/shelljs": {
"version": "0.9.2",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz",
"integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"execa": "^1.0.0",
"fast-glob": "^3.3.2",
"interpret": "^1.0.0",
"rechoir": "^0.6.2"
},
"bin": {
"shjs": "bin/shjs"
},
"engines": {
"node": ">=18"
}
},
"node_modules/shx": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz",
"integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==",
"dev": true,
"license": "MIT",
"dependencies": {
"minimist": "^1.2.8",
"shelljs": "^0.9.2"
},
"bin": {
"shx": "lib/cli.js"
},
"engines": {
"node": ">=18"
}
},
"node_modules/signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true,
"license": "ISC"
},
"node_modules/strip-eof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
"integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/tunnel": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
@@ -530,6 +1212,19 @@
"node": ">= 8"
}
},
"node_modules/which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"which": "bin/which"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+18 -6
View File
@@ -1,24 +1,36 @@
{
"name": "cinny",
"version": "4.10.1",
"version": "4.12.2",
"description": "Yet another matrix client",
"main": "index.js",
"engines": {
"node": ">=16.0.0"
},
"scripts": {
"tauri": "cp config.json cinny/ && tauri",
"release": "node scripts/release.mjs"
"tauri": "shx cp config.json cinny/ && tauri",
"release": "node scripts/release.mjs",
"bump": "node scripts/update-version.mjs"
},
"keywords": [],
"author": "Ajay Bura",
"license": "AGPL-3.0-only",
"dependencies": {
"@tauri-apps/api": "1.6.0"
"@tauri-apps/api": "2.7.0",
"@tauri-apps/plugin-clipboard-manager": "2.3.0",
"@tauri-apps/plugin-dialog": "2.3.2",
"@tauri-apps/plugin-fs": "2.4.1",
"@tauri-apps/plugin-global-shortcut": "2.3.0",
"@tauri-apps/plugin-http": "2.5.1",
"@tauri-apps/plugin-notification": "2.3.0",
"@tauri-apps/plugin-os": "2.3.0",
"@tauri-apps/plugin-process": "2.3.0",
"@tauri-apps/plugin-shell": "2.3.0",
"@tauri-apps/plugin-updater": "2.9.0"
},
"devDependencies": {
"@actions/github": "6.0.0",
"@tauri-apps/cli": "1.6.2",
"node-fetch": "3.3.2"
"@tauri-apps/cli": "2.7.1",
"node-fetch": "3.3.2",
"shx": "0.4.0"
}
}
+65
View File
@@ -0,0 +1,65 @@
import fs from "fs";
import path from "path";
import { execSync } from "child_process";
const version = process.argv[2];
if (!version) {
console.error("Missing version");
process.exit(1);
}
console.log(`Preparing release ${version}`);
// 1. Update npm versions
execSync(`npm version ${version} --no-git-tag-version`, {
stdio: "inherit"
});
console.log(`Updated package.json and package-lock.json → ${version}`);
// 2. Update Cargo.toml
const cargoToml = "src-tauri/Cargo.toml";
let cargoContent = fs.readFileSync(cargoToml, "utf8");
cargoContent = cargoContent.replace(
/^version\s*=\s*".*"/m,
`version = "${version}"`
);
fs.writeFileSync(cargoToml, cargoContent);
console.log(`Updated ${cargoToml}${version}`);
// 3. Update tauri.conf.json
const tauriConfigPath = "src-tauri/tauri.conf.json";
const tauriConfig = JSON.parse(fs.readFileSync(tauriConfigPath));
tauriConfig.version = version;
fs.writeFileSync(
tauriConfigPath,
JSON.stringify(tauriConfig, null, 2) + "\n"
);
console.log(`Updated ${tauriConfigPath}${version}`);
// 4. Update Cinny web submodule to latest tag
console.log("Updating cinny web submodule");
execSync("git submodule update --init --recursive", { stdio: "inherit" });
execSync("git fetch --tags", { cwd: "cinny", stdio: "inherit" });
const latestCommit = execSync("git rev-list --tags --max-count=1", {
cwd: "cinny",
}).toString().trim();
const latestTag = execSync(`git describe --tags ${latestCommit}`, {
cwd: "cinny",
}).toString().trim();
console.log(`Latest cinny tag: ${latestTag}`);
execSync(`git checkout ${latestTag}`, { cwd: "cinny", stdio: "inherit" });
execSync("git add cinny", { stdio: "inherit" });
console.log("Release preparation complete");
+3733 -1958
View File
File diff suppressed because it is too large Load Diff
+34 -5
View File
@@ -2,7 +2,7 @@
[package]
name = "cinny"
version = "4.10.1"
version = "4.12.2"
description = "Yet another matrix client"
authors = ["Ajay Bura"]
license = "AGPL-3.0-only"
@@ -12,14 +12,24 @@ edition = "2021"
rust-version = "1.61"
[build-dependencies]
tauri-build = { version = "1.5.5", features = [] }
tauri-build = { version = "2", features = [] }
[dependencies]
serde_json = "1.0.109"
serde = { version = "1.0.193", features = ["derive"] }
tauri = { version = "1.8.0", features = ["api-all", "devtools", "updater"] }
tauri-plugin-localhost = "0.1.0"
tauri-plugin-window-state = "0.1.1"
tauri = { version = "2", features = ["devtools", "wry", "tray-icon", "image-png"] }
tauri-plugin-localhost = "2"
tauri-plugin-window-state = "2"
tauri-plugin-clipboard-manager = "2"
tauri-plugin-notification = "2"
tauri-plugin-fs = "2"
tauri-plugin-shell = "2"
tauri-plugin-http = "2"
tauri-plugin-process = "2"
tauri-plugin-os = "2"
tauri-plugin-dialog = "2"
tauri-plugin-opener = "2"
tauri-plugin-deep-link = "2"
[features]
# by default Tauri runs in production mode
@@ -28,3 +38,22 @@ default = [ "custom-protocol" ]
# this feature is used used for production builds where `devPath` points to the filesystem
# DO NOT remove this
custom-protocol = [ "tauri/custom-protocol" ]
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
tauri-plugin-global-shortcut = "2"
tauri-plugin-updater = "2"
tauri-plugin-single-instance = "2"
[target.'cfg(target_os = "windows")'.dependencies]
webview2-com = "0.38"
window-vibrancy = "0.6"
windows = { version = "0.61", features = [
"Win32_Graphics_Gdi",
"Win32_System_Com",
"Win32_UI_Shell",
"Win32_UI_WindowsAndMessaging",
] }
[lib]
name = "app_lib"
crate-type = ["staticlib", "cdylib", "rlib"]
+10
View File
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSCameraUsageDescription</key>
<string>Request camera access for WebRTC calls.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Request microphone access for WebRTC calls.</string>
</dict>
</plist>
+1 -1
View File
@@ -1,3 +1,3 @@
fn main() {
tauri_build::build()
tauri_build::build()
}
+16
View File
@@ -0,0 +1,16 @@
{
"identifier": "desktop-capability",
"platforms": [
"macOS",
"windows",
"linux"
],
"windows": [
"main"
],
"permissions": [
"updater:default",
"global-shortcut:default",
"deep-link:default"
]
}
+91
View File
@@ -0,0 +1,91 @@
{
"identifier": "migrated",
"description": "permissions that were migrated from v1",
"local": true,
"remote": {
"urls": [
"http://localhost:44548"
]
},
"windows": [
"main"
],
"permissions": [
"core:default",
"fs:allow-read-file",
"fs:allow-write-file",
"fs:allow-read-dir",
"fs:allow-copy-file",
"fs:allow-mkdir",
"fs:allow-remove",
"fs:allow-remove",
"fs:allow-rename",
"fs:allow-exists",
"core:window:allow-create",
"core:window:allow-center",
"core:window:allow-request-user-attention",
"core:window:allow-set-resizable",
"core:window:allow-set-maximizable",
"core:window:allow-set-minimizable",
"core:window:allow-set-closable",
"core:window:allow-set-title",
"core:window:allow-maximize",
"core:window:allow-unmaximize",
"core:window:allow-minimize",
"core:window:allow-unminimize",
"core:window:allow-show",
"core:window:allow-hide",
"core:window:allow-close",
"core:window:allow-set-decorations",
"core:window:allow-set-always-on-top",
"core:window:allow-set-content-protected",
"core:window:allow-set-size",
"core:window:allow-set-min-size",
"core:window:allow-set-max-size",
"core:window:allow-set-position",
"core:window:allow-set-fullscreen",
"core:window:allow-set-focus",
"core:window:allow-set-icon",
"core:window:allow-set-skip-taskbar",
"core:window:allow-set-cursor-grab",
"core:window:allow-set-cursor-visible",
"core:window:allow-set-cursor-icon",
"core:window:allow-set-cursor-position",
"core:window:allow-set-ignore-cursor-events",
"core:window:allow-start-dragging",
"core:webview:allow-print",
"shell:allow-execute",
"shell:allow-open",
"dialog:allow-open",
"dialog:allow-save",
"dialog:allow-message",
"dialog:allow-ask",
"dialog:allow-confirm",
"http:default",
"notification:default",
"global-shortcut:allow-is-registered",
"global-shortcut:allow-register",
"global-shortcut:allow-register-all",
"global-shortcut:allow-unregister",
"global-shortcut:allow-unregister-all",
"os:allow-platform",
"os:allow-version",
"os:allow-os-type",
"os:allow-family",
"os:allow-arch",
"os:allow-exe-extension",
"os:allow-locale",
"os:allow-hostname",
"process:allow-restart",
"process:allow-exit",
"clipboard-manager:allow-read-text",
"clipboard-manager:allow-write-text",
"core:app:allow-app-show",
"core:app:allow-app-hide",
"clipboard-manager:default",
{
"identifier": "opener:allow-open-url",
"allow": [{ "url": "http://*" }, { "url": "https://*" }]
}
]
}
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
{"desktop-capability":{"identifier":"desktop-capability","description":"","local":true,"windows":["main"],"permissions":["updater:default","global-shortcut:default"],"platforms":["macOS","windows","linux"]},"migrated":{"identifier":"migrated","description":"permissions that were migrated from v1","local":true,"windows":["main"],"permissions":["core:default","fs:allow-read-file","fs:allow-write-file","fs:allow-read-dir","fs:allow-copy-file","fs:allow-mkdir","fs:allow-remove","fs:allow-remove","fs:allow-rename","fs:allow-exists","core:window:allow-create","core:window:allow-center","core:window:allow-request-user-attention","core:window:allow-set-resizable","core:window:allow-set-maximizable","core:window:allow-set-minimizable","core:window:allow-set-closable","core:window:allow-set-title","core:window:allow-maximize","core:window:allow-unmaximize","core:window:allow-minimize","core:window:allow-unminimize","core:window:allow-show","core:window:allow-hide","core:window:allow-close","core:window:allow-set-decorations","core:window:allow-set-always-on-top","core:window:allow-set-content-protected","core:window:allow-set-size","core:window:allow-set-min-size","core:window:allow-set-max-size","core:window:allow-set-position","core:window:allow-set-fullscreen","core:window:allow-set-focus","core:window:allow-set-icon","core:window:allow-set-skip-taskbar","core:window:allow-set-cursor-grab","core:window:allow-set-cursor-visible","core:window:allow-set-cursor-icon","core:window:allow-set-cursor-position","core:window:allow-set-ignore-cursor-events","core:window:allow-start-dragging","core:webview:allow-print","shell:allow-execute","shell:allow-open","dialog:allow-open","dialog:allow-save","dialog:allow-message","dialog:allow-ask","dialog:allow-confirm","http:default","notification:default","global-shortcut:allow-is-registered","global-shortcut:allow-register","global-shortcut:allow-register-all","global-shortcut:allow-unregister","global-shortcut:allow-unregister-all","os:allow-platform","os:allow-version","os:allow-os-type","os:allow-family","os:allow-arch","os:allow-exe-extension","os:allow-locale","os:allow-hostname","process:allow-restart","process:allow-exit","clipboard-manager:allow-read-text","clipboard-manager:allow-write-text","core:app:allow-app-show","core:app:allow-app-hide","clipboard-manager:default",{"identifier":"opener:allow-open-url","allow":[{"url":"http://*"},{"url":"https://*"}]}]}}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 332 KiB

+569
View File
@@ -0,0 +1,569 @@
#![cfg_attr(
all(not(debug_assertions), target_os = "windows"),
windows_subsystem = "windows"
)]
use tauri::{
menu::{Menu, MenuItem, PredefinedMenuItem},
tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent},
webview::{NewWindowResponse, PageLoadEvent, WebviewWindowBuilder},
Manager, WebviewUrl,
};
use tauri_plugin_opener::OpenerExt;
/// Bring the main window to the foreground from the tray / a hidden /
/// minimized state. Shared by the tray, single-instance, and deep-link paths.
fn show_main(app: &tauri::AppHandle) {
if let Some(window) = app.get_webview_window("main") {
let _ = window.show();
let _ = window.unminimize();
let _ = window.set_focus();
}
}
/// Hand a `matrix:` / `matrix.to` URL to the web app by dispatching a DOM
/// CustomEvent the client listens for (see useDeepLinkNavigate.ts). Uses
/// `eval` so we don't need the @tauri-apps/api event package on the web side.
fn forward_deeplink(app: &tauri::AppHandle, url: &str) {
show_main(app);
if let Some(window) = app.get_webview_window("main") {
if let Ok(json) = serde_json::to_string(url) {
let _ = window.eval(&format!(
"window.dispatchEvent(new CustomEvent('lotus-deeplink',{{detail:{json}}}))"
));
}
}
}
/// Pull the first `matrix:` link out of a process's CLI args (Windows/Linux
/// pass deep-link URLs as argv to a freshly launched instance).
fn matrix_url_from_args(args: &[String]) -> Option<String> {
args.iter().find(|a| a.starts_with("matrix:")).cloned()
}
// Injected into every page before app scripts load.
// Patches window.Notification to route through tauri-plugin-notification so
// WebView2's default "denied" state never reaches cinny's permission check.
// Also patches navigator.permissions.query so the React hook sees "granted".
const NOTIFICATION_BRIDGE: &str = r#"(function(){
function TauriNotification(title,options){
var opts=options||{};
try{
window.__TAURI_INTERNALS__.invoke('send_notification',{
title:String(title),
body:opts.body!=null?String(opts.body):undefined
}).catch(function(){});
}catch(_){}
}
TauriNotification.prototype=Object.create(EventTarget.prototype);
TauriNotification.prototype.constructor=TauriNotification;
TauriNotification.prototype.close=function(){};
Object.defineProperty(TauriNotification,'permission',{get:function(){return 'granted';},configurable:true});
TauriNotification.requestPermission=function(){return Promise.resolve('granted');};
TauriNotification.maxActions=0;
Object.defineProperty(window,'Notification',{value:TauriNotification,writable:true,configurable:true});
var _q=navigator.permissions.query.bind(navigator.permissions);
navigator.permissions.query=function(desc){
if(desc&&desc.name==='notifications'){
return Promise.resolve(Object.assign(new EventTarget(),{state:'granted',onchange:null}));
}
return _q(desc);
};
})();"#;
#[tauri::command]
fn send_notification(
app: tauri::AppHandle,
title: String,
body: Option<String>,
) -> Result<(), String> {
use tauri_plugin_notification::NotificationExt;
let mut builder = app.notification().builder().title(&title);
if let Some(b) = &body {
builder = builder.body(b);
}
builder.show().map_err(|e| e.to_string())
}
#[derive(serde::Serialize)]
struct UpdateInfo {
available: bool,
version: Option<String>,
}
#[tauri::command]
async fn check_for_update(app: tauri::AppHandle) -> Result<UpdateInfo, String> {
#[cfg(not(any(target_os = "android", target_os = "ios")))]
{
use tauri_plugin_updater::UpdaterExt;
return match app.updater().map_err(|e| e.to_string())?.check().await {
Ok(Some(update)) => Ok(UpdateInfo { available: true, version: Some(update.version) }),
Ok(None) => Ok(UpdateInfo { available: false, version: None }),
Err(e) => Err(e.to_string()),
};
}
#[cfg(any(target_os = "android", target_os = "ios"))]
Ok(UpdateInfo { available: false, version: None })
}
#[tauri::command]
async fn install_update(app: tauri::AppHandle) -> Result<(), String> {
#[cfg(not(any(target_os = "android", target_os = "ios")))]
{
use tauri_plugin_updater::UpdaterExt;
if let Some(update) = app
.updater()
.map_err(|e| e.to_string())?
.check()
.await
.map_err(|e| e.to_string())?
{
update
.download_and_install(|_chunk, _total| {}, || {})
.await
.map_err(|e| e.to_string())?;
}
}
Ok(())
}
#[tauri::command]
fn set_badge_count(count: u32, window: tauri::Window) -> Result<(), String> {
#[cfg(target_os = "windows")]
{
use windows::{
core::{BOOL, PCWSTR},
Win32::{
Foundation::{COLORREF, HWND, RECT},
Graphics::Gdi::{
CreateBitmap, CreateCompatibleDC, CreateDIBSection, CreateFontW, CreatePen,
CreateSolidBrush, DeleteDC, DeleteObject, DIB_RGB_COLORS, DrawTextW, Ellipse,
ReleaseDC, SelectObject, SetBkMode, SetTextColor, BITMAPINFO,
BITMAPINFOHEADER, BI_RGB, CLIP_DEFAULT_PRECIS, DEFAULT_CHARSET, DEFAULT_PITCH,
DEFAULT_QUALITY, DT_CENTER, DT_SINGLELINE, DT_VCENTER, FF_DONTCARE,
FW_BOLD, OUT_DEFAULT_PRECIS, PS_NULL, TRANSPARENT,
},
UI::{
Shell::{ITaskbarList3, TaskbarList},
WindowsAndMessaging::{CreateIconIndirect, DestroyIcon, HICON, ICONINFO},
},
System::Com::{CoCreateInstance, CLSCTX_INPROC_SERVER},
},
};
let hwnd = HWND(window.hwnd().map_err(|e| e.to_string())?.0 as _);
let hicon: Option<HICON> = if count > 0 {
let label = if count > 99 {
"99+".to_string()
} else {
count.to_string()
};
let mut label_wide: Vec<u16> = label.encode_utf16().chain(std::iter::once(0)).collect();
unsafe {
let size = 20i32;
let hdc_screen = windows::Win32::Graphics::Gdi::GetDC(None);
let hdc = CreateCompatibleDC(Some(hdc_screen));
let bmi = BITMAPINFO {
bmiHeader: BITMAPINFOHEADER {
biSize: std::mem::size_of::<BITMAPINFOHEADER>() as u32,
biWidth: size,
biHeight: -size,
biPlanes: 1,
biBitCount: 32,
biCompression: BI_RGB.0,
..Default::default()
},
..Default::default()
};
let mut bits: *mut std::ffi::c_void = std::ptr::null_mut();
let hbm_color =
CreateDIBSection(Some(hdc), &bmi, DIB_RGB_COLORS, &mut bits, None, 0)
.map_err(|e| e.to_string())?;
// Zero-init so undrawn pixels are fully transparent (CreateDIBSection
// does not guarantee zeroed memory; garbage bytes cause a black square).
if !bits.is_null() {
std::ptr::write_bytes(bits as *mut u8, 0, (size * size * 4) as usize);
}
let old_bm = SelectObject(hdc, hbm_color.into());
let hbrush = CreateSolidBrush(COLORREF(0x003030DD));
let old_brush = SelectObject(hdc, hbrush.into());
let hpen = CreatePen(PS_NULL, 0, COLORREF(0));
let old_pen = SelectObject(hdc, hpen.into());
let _ = Ellipse(hdc, 0, 0, size, size);
let hfont = CreateFontW(
14,
0,
0,
0,
FW_BOLD.0 as i32,
0,
0,
0,
DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
(DEFAULT_PITCH.0 | FF_DONTCARE.0) as u32,
windows::core::w!("Segoe UI"),
);
let old_font = SelectObject(hdc, hfont.into());
SetTextColor(hdc, COLORREF(0x00FFFFFF));
let _ = SetBkMode(hdc, TRANSPARENT);
let mut rect = RECT { left: 0, top: 0, right: size, bottom: size };
let label_len = label_wide.len() - 1;
let _ = DrawTextW(
hdc,
&mut label_wide[..label_len],
&mut rect,
DT_CENTER | DT_VCENTER | DT_SINGLELINE,
);
SelectObject(hdc, old_brush);
SelectObject(hdc, old_pen);
SelectObject(hdc, old_font);
SelectObject(hdc, old_bm);
let _ = DeleteObject(hbrush.into());
let _ = DeleteObject(hpen.into());
let _ = DeleteObject(hfont.into());
// GDI drawing leaves the alpha channel at 0 for all pixels.
// Set alpha=255 for every painted pixel so Windows uses per-pixel
// alpha compositing instead of falling back to the opaque mask,
// which would render unpainted corner pixels as a black square.
let pixel_count = (size * size) as usize;
let pixels =
std::slice::from_raw_parts_mut(bits as *mut u32, pixel_count);
for pixel in pixels.iter_mut() {
if *pixel != 0 {
*pixel |= 0xFF00_0000u32;
}
}
let hbm_mask = CreateBitmap(size, size, 1, 1, None);
if hbm_mask.0 as usize == 0 {
let _ = DeleteObject(hbm_color.into());
return Err("CreateBitmap failed".to_string());
}
let icon_info = ICONINFO {
fIcon: BOOL(1),
xHotspot: 0,
yHotspot: 0,
hbmMask: hbm_mask,
hbmColor: hbm_color,
};
let hicon = CreateIconIndirect(&icon_info).map_err(|e| {
let _ = DeleteObject(hbm_color.into());
let _ = DeleteObject(hbm_mask.into());
e.to_string()
})?;
let _ = DeleteObject(hbm_color.into());
let _ = DeleteObject(hbm_mask.into());
let _ = DeleteDC(hdc);
let _ = ReleaseDC(None, hdc_screen);
Some(hicon)
}
} else {
None
};
unsafe {
let taskbar: ITaskbarList3 =
CoCreateInstance(&TaskbarList, None, CLSCTX_INPROC_SERVER)
.map_err(|e| e.to_string())?;
taskbar.HrInit().map_err(|e| e.to_string())?;
taskbar
.SetOverlayIcon(hwnd, hicon.unwrap_or_default(), PCWSTR::null())
.map_err(|e| e.to_string())?;
if let Some(icon) = hicon {
let _ = DestroyIcon(icon);
}
}
}
Ok(())
}
/// Held in managed state so the tray's unread overlay can be updated at runtime.
/// Keeping the TrayIcon handle here also keeps the tray alive.
struct TrayUnreadState {
tray: tauri::tray::TrayIcon,
base_rgba: Vec<u8>,
width: u32,
height: u32,
}
/// Paint a small white-ringed red "unread" dot into the bottom-right corner of
/// an RGBA buffer, in place. Cross-platform (operates on raw pixels).
fn draw_unread_dot(rgba: &mut [u8], width: u32, height: u32) {
let w = width as i32;
let h = height as i32;
if w <= 0 || h <= 0 {
return;
}
let r = ((w.min(h) as f32) * 0.30) as i32;
let ring = ((r as f32) * 0.18).max(1.0) as i32;
let cx = w - r - ((w as f32) * 0.06) as i32;
let cy = h - r - ((h as f32) * 0.06) as i32;
for y in (cy - r - ring).max(0)..(cy + r + ring).min(h) {
for x in (cx - r - ring).max(0)..(cx + r + ring).min(w) {
let dx = x - cx;
let dy = y - cy;
let dist2 = dx * dx + dy * dy;
let idx = ((y * w + x) as usize) * 4;
if idx + 3 >= rgba.len() {
continue;
}
if dist2 <= r * r {
rgba[idx] = 0xDD;
rgba[idx + 1] = 0x30;
rgba[idx + 2] = 0x30;
rgba[idx + 3] = 0xFF;
} else if dist2 <= (r + ring) * (r + ring) {
rgba[idx] = 0xFF;
rgba[idx + 1] = 0xFF;
rgba[idx + 2] = 0xFF;
rgba[idx + 3] = 0xFF;
}
}
}
}
/// Overlay (or clear) the unread dot on the tray icon.
#[tauri::command]
fn set_tray_unread(unread: bool, state: tauri::State<'_, TrayUnreadState>) -> Result<(), String> {
let mut rgba = state.base_rgba.clone();
if unread {
draw_unread_dot(&mut rgba, state.width, state.height);
}
let icon = tauri::image::Image::new_owned(rgba, state.width, state.height);
state.tray.set_icon(Some(icon)).map_err(|e| e.to_string())
}
/// Flash the taskbar button to draw attention (e.g. a new mention while the
/// window is unfocused). Clears automatically once the window is focused.
#[tauri::command]
fn flash_window(window: tauri::Window) -> Result<(), String> {
window
.request_user_attention(Some(tauri::UserAttentionType::Informational))
.map_err(|e| e.to_string())
}
pub fn run() {
let port: u16 = 44548;
let context = tauri::generate_context!();
#[allow(unused_mut)]
let mut builder = tauri::Builder::default();
// Single-instance MUST be registered first: a second launch focuses the
// existing window (and forwards any matrix: link) instead of colliding on
// the localhost port. Desktop-only plugin.
#[cfg(desktop)]
{
builder = builder.plugin(tauri_plugin_single_instance::init(|app, argv, _cwd| {
show_main(app);
if let Some(url) = matrix_url_from_args(&argv) {
forward_deeplink(app, &url);
}
}));
}
builder = builder
.invoke_handler(tauri::generate_handler![
set_badge_count,
set_tray_unread,
flash_window,
send_notification,
check_for_update,
install_update,
])
.plugin(tauri_plugin_localhost::Builder::new(port).build())
.plugin(tauri_plugin_window_state::Builder::default().build())
.plugin(tauri_plugin_opener::init())
.plugin(tauri_plugin_notification::init())
.plugin(tauri_plugin_deep_link::init());
#[cfg(not(any(target_os = "android", target_os = "ios")))]
{
builder = builder.plugin(tauri_plugin_updater::Builder::new().build());
}
builder
.setup(move |app| {
// --- System tray: keeps Lotus Chat running in the background so
// notifications keep arriving after the window is closed-to-tray. ---
let base_icon = app.default_window_icon().cloned();
let open_item = MenuItem::with_id(app, "open", "Open Lotus Chat", true, None::<&str>)?;
let quit_item = MenuItem::with_id(app, "quit", "Quit Lotus Chat", true, None::<&str>)?;
let separator = PredefinedMenuItem::separator(app)?;
let tray_menu = Menu::with_items(app, &[&open_item, &separator, &quit_item])?;
let tray = TrayIconBuilder::with_id("main-tray")
.icon(base_icon.clone().expect("bundled window icon"))
.tooltip("Lotus Chat")
.menu(&tray_menu)
.show_menu_on_left_click(false)
.on_menu_event(|app, event| match event.id.as_ref() {
"open" => show_main(app),
"quit" => app.exit(0),
_ => {}
})
.on_tray_icon_event(|tray, event| {
if let TrayIconEvent::Click {
button: MouseButton::Left,
button_state: MouseButtonState::Up,
..
} = event
{
let app = tray.app_handle();
if let Some(window) = app.get_webview_window("main") {
if window.is_visible().unwrap_or(false) {
let _ = window.hide();
} else {
show_main(app);
}
}
}
})
.build(app)?;
// Keep the tray handle (and base icon pixels) in managed state so
// set_tray_unread can re-render the icon at runtime.
if let Some(img) = base_icon {
let base_rgba = img.rgba().to_vec();
let (width, height) = (img.width(), img.height());
app.manage(TrayUnreadState {
tray,
base_rgba,
width,
height,
});
}
#[cfg(debug_assertions)]
let window_url = WebviewUrl::App(Default::default());
#[cfg(not(debug_assertions))]
let window_url = {
let url = format!("http://localhost:{}", port).parse().unwrap();
WebviewUrl::External(url)
};
let app_handle = app.handle().clone();
let window = WebviewWindowBuilder::new(app, "main".to_string(), window_url)
.title("Lotus Chat")
// First-run defaults; tauri-plugin-window-state restores geometry
// on later launches.
.inner_size(1100.0, 720.0)
.min_inner_size(480.0, 600.0)
.center()
// Start hidden and reveal once the page has painted, to avoid the
// white launch flash.
.visible(false)
.initialization_script(NOTIFICATION_BRIDGE)
.disable_drag_drop_handler()
.on_page_load(|window, payload| {
if matches!(payload.event(), PageLoadEvent::Finished) {
let _ = window.show();
}
})
.on_new_window(move |url, _features| {
let _ = app_handle.opener().open_url(url.as_str(), None::<&str>);
NewWindowResponse::Deny
})
.build()?;
// Close-to-tray: hide instead of exiting; the app is quit explicitly
// from the tray menu.
let window_for_close = window.clone();
window.on_window_event(move |event| {
if let tauri::WindowEvent::CloseRequested { api, .. } = event {
api.prevent_close();
let _ = window_for_close.hide();
}
});
// Failsafe: never leave the window stuck hidden if the page-load
// event doesn't fire for some reason.
let window_for_show = window.clone();
std::thread::spawn(move || {
std::thread::sleep(std::time::Duration::from_secs(8));
let _ = window_for_show.show();
});
// Deep links (matrix:): route both the cold-start case and the
// already-running case (forwarded via single-instance argv) into the
// web client.
{
use tauri_plugin_deep_link::DeepLinkExt;
// Runtime scheme registration is a Linux/Windows-only API; macOS
// registers the scheme from the bundle config at build time.
#[cfg(any(target_os = "linux", target_os = "windows"))]
let _ = app.deep_link().register_all();
let deep_link_handle = app.handle().clone();
app.deep_link().on_open_url(move |event| {
for url in event.urls() {
forward_deeplink(&deep_link_handle, url.as_str());
}
});
if let Some(url) = matrix_url_from_args(&std::env::args().collect::<Vec<_>>()) {
forward_deeplink(&app.handle().clone(), &url);
}
}
// Windows 11 Mica backdrop. The app paints an opaque TDS background,
// so this is subtle (mainly window chrome); harmless if unsupported.
#[cfg(target_os = "windows")]
{
let _ = window_vibrancy::apply_mica(&window, Some(true));
}
// Auto-grant camera, microphone, and notification permissions in WebView2.
#[cfg(target_os = "windows")]
window.with_webview(|webview| {
use webview2_com::{
Microsoft::Web::WebView2::Win32::{
COREWEBVIEW2_PERMISSION_KIND,
COREWEBVIEW2_PERMISSION_KIND_CAMERA,
COREWEBVIEW2_PERMISSION_KIND_MICROPHONE,
COREWEBVIEW2_PERMISSION_KIND_NOTIFICATIONS,
COREWEBVIEW2_PERMISSION_STATE_ALLOW,
},
PermissionRequestedEventHandler,
};
let controller = webview.controller();
if let Ok(core) = unsafe { controller.CoreWebView2() } {
let handler = PermissionRequestedEventHandler::create(Box::new(
|_sender, args| {
if let Some(args) = args {
let mut kind = COREWEBVIEW2_PERMISSION_KIND(0);
unsafe { args.PermissionKind(&mut kind) }?;
if kind == COREWEBVIEW2_PERMISSION_KIND_MICROPHONE
|| kind == COREWEBVIEW2_PERMISSION_KIND_CAMERA
|| kind == COREWEBVIEW2_PERMISSION_KIND_NOTIFICATIONS
{
unsafe {
args.SetState(COREWEBVIEW2_PERMISSION_STATE_ALLOW)
}?;
}
}
Ok(())
},
));
let mut token = Default::default();
let _ = unsafe { core.add_PermissionRequested(&handler, &mut token) };
}
})?;
Ok(())
})
.run(context)
.expect("error while building tauri application");
}
+3 -28
View File
@@ -1,30 +1,5 @@
#![cfg_attr(
all(not(debug_assertions), target_os = "windows"),
windows_subsystem = "windows"
)]
#[cfg(target_os = "macos")]
mod menu;
use tauri::{utils::config::AppUrl, WindowUrl};
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn main() {
let port = 44548;
let mut context = tauri::generate_context!();
let url = format!("http://localhost:{}", port).parse().unwrap();
let window_url = WindowUrl::External(url);
// rewrite the config so the IPC is enabled on this URL
context.config_mut().build.dist_dir = AppUrl::Url(window_url.clone());
context.config_mut().build.dev_path = AppUrl::Url(window_url.clone());
let builder = tauri::Builder::default();
#[cfg(target_os = "macos")]
let builder = builder.menu(menu::menu());
builder
.plugin(tauri_plugin_localhost::Builder::new(port).build())
.plugin(tauri_plugin_window_state::Builder::default().build())
.run(context)
.expect("error while building tauri application")
}
app_lib::run();
}
-41
View File
@@ -1,41 +0,0 @@
use tauri::{AboutMetadata, Menu, MenuItem, Submenu};
//for macOS
pub(crate) fn menu() -> Menu {
Menu::new()
.add_submenu(Submenu::new(
"Cinny",
Menu::new()
.add_native_item(MenuItem::About(
"Cinny".to_string(),
AboutMetadata::new(),
))
.add_native_item(MenuItem::Separator)
.add_native_item(MenuItem::Hide)
.add_native_item(MenuItem::HideOthers)
.add_native_item(MenuItem::ShowAll)
.add_native_item(MenuItem::Separator)
.add_native_item(MenuItem::Quit),
))
.add_submenu(Submenu::new(
"Edit",
Menu::new()
.add_native_item(MenuItem::Undo)
.add_native_item(MenuItem::Redo)
.add_native_item(MenuItem::Separator)
.add_native_item(MenuItem::Cut)
.add_native_item(MenuItem::Copy)
.add_native_item(MenuItem::Paste)
.add_native_item(MenuItem::SelectAll),
))
.add_submenu(Submenu::new(
"View",
Menu::new()
.add_native_item(MenuItem::EnterFullScreen),
))
.add_submenu(Submenu::new(
"Window",
Menu::new()
.add_native_item(MenuItem::Minimize)
.add_native_item(MenuItem::Zoom),
))
}
+64 -65
View File
@@ -1,77 +1,76 @@
{
"package": {
"productName": "Cinny",
"version": "4.10.1"
},
"build": {
"distDir": "../cinny/dist",
"devPath": "http://localhost:8080",
"beforeDevCommand": "cd cinny && npm start",
"beforeBuildCommand": "cd cinny && npm run build"
},
"tauri": {
"bundle": {
"active": true,
"targets": "all",
"identifier": "in.cinny.app",
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
],
"resources": [],
"externalBin": [],
"copyright": "",
"category": "SocialNetworking",
"shortDescription": "Yet another matrix client",
"longDescription": "",
"bundle": {
"active": true,
"targets": "all",
"windows": {
"certificateThumbprint": null,
"digestAlgorithm": "sha256",
"timestampUrl": "",
"webviewInstallMode": {
"type": "downloadBootstrapper"
},
"nsis": {
"installMode": "currentUser"
},
"wix": {
"bannerPath": "wix/banner.bmp",
"dialogImagePath": "wix/dialogImage.bmp"
}
},
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
],
"resources": [],
"externalBin": [],
"copyright": "",
"category": "SocialNetworking",
"shortDescription": "Yet another matrix client",
"longDescription": "",
"macOS": {
"frameworks": [],
"minimumSystemVersion": "",
"exceptionDomain": "",
"signingIdentity": null,
"providerShortName": null,
"entitlements": null
},
"linux": {
"deb": {
"depends": []
},
"macOS": {
"frameworks": [],
"minimumSystemVersion": "",
"exceptionDomain": "",
"signingIdentity": null,
"providerShortName": null,
"entitlements": null
},
"windows": {
"certificateThumbprint": null,
"digestAlgorithm": "sha256",
"timestampUrl": "",
"wix": {
"bannerPath": "wix/banner.bmp",
"dialogImagePath": "wix/dialogImage.bmp"
}
}
},
"createUpdaterArtifacts": "v1Compatible"
},
"build": {
"beforeBuildCommand": "cd cinny && npm run build",
"frontendDist": "../cinny/dist",
"beforeDevCommand": "cd cinny && npm start",
"devUrl": "http://localhost:8080"
},
"productName": "Lotus Chat",
"mainBinaryName": "cinny",
"version": "4.12.2",
"identifier": "org.lotusguild.lotus-chat",
"plugins": {
"updater": {
"active": true,
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDM1N0Y0RThCQTJEQzY1NTkKUldSWlpkeWlpMDUvTlVjejMzN0E1U0FiaVpLK05QVkRXdWlMMm1NNUprMXAvTGZSbU5maVovNmwK",
"endpoints": [
"https://github.com/cinnyapp/cinny-desktop/releases/download/tauri/release.json"
],
"dialog": true,
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDE2NDc3NDBGMTAzNTk1NUYKUldSZmxUVVFEM1JIRnRuMjVRTkFOQ21lUFI5KzRMU0s4OWtBS1RNRUVCNE9LcE9GcExNZ2M2NHoK"
"https://code.lotusguild.org/LotusGuild/cinny-desktop/releases/download/latest/release.json"
]
},
"allowlist": {
"all": true
},
"windows": [
{
"title": "Cinny",
"width": 1280,
"height": 905,
"center": true,
"resizable": true,
"fullscreen": false,
"fileDropEnabled": false
"deep-link": {
"desktop": {
"schemes": ["matrix"]
}
],
}
},
"app": {
"security": {
"csp": "script-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' img-src: 'self'"
"csp": "default-src 'self' blob: data: filesystem: ws: wss: http: https: tauri:; script-src 'self' 'unsafe-eval' 'unsafe-inline' blob: data: filesystem: ws: wss: http: https: tauri:; style-src 'self' 'unsafe-inline' blob: data: filesystem: http: https:; img-src 'self' data: blob: filesystem: http: https:; media-src 'self' blob: data: mediastream:; connect-src 'self' blob: ipc: ws: wss: http: https: http://ipc.localhost"
}
}
}
}
BIN
View File
Binary file not shown.
+53
View File
@@ -0,0 +1,53 @@
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
int main(int argc, char **argv) {
const char *appdir = "/root/linuxdeploy-root";
char apprun[256], ldbin[256], new_path[4096], new_ldpath[4096];
struct stat st;
snprintf(apprun, sizeof(apprun), "%s/AppRun", appdir);
snprintf(ldbin, sizeof(ldbin), "%s/usr/bin/linuxdeploy", appdir);
/* Strip --appimage-extract-and-run: AppImage runtime flag, not a linuxdeploy flag */
char **new_argv = malloc((argc + 1) * sizeof(char *));
int new_argc = 0;
new_argv[new_argc++] = argv[0];
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "--appimage-extract-and-run") != 0)
new_argv[new_argc++] = argv[i];
}
new_argv[new_argc] = NULL;
setenv("APPDIR", appdir, 1);
char *old_path = getenv("PATH");
snprintf(new_path, sizeof(new_path), "%s/usr/bin:%s", appdir, old_path ? old_path : "");
setenv("PATH", new_path, 1);
char *old_ldpath = getenv("LD_LIBRARY_PATH");
snprintf(new_ldpath, sizeof(new_ldpath), "%s/usr/lib:%s/usr/lib/x86_64-linux-gnu:%s",
appdir, appdir, old_ldpath ? old_ldpath : "");
setenv("LD_LIBRARY_PATH", new_ldpath, 1);
/* Write diagnostic log visible in the always() post-step */
FILE *log = fopen("/tmp/ld-wrapper.log", "w");
if (log) {
fprintf(log, "APPDIR=%s\n", appdir);
fprintf(log, "AppRun exists: %s\n", stat(apprun, &st) == 0 ? "yes" : "NO");
fprintf(log, "linuxdeploy exists: %s\n", stat(ldbin, &st) == 0 ? "yes" : "NO");
fprintf(log, "argc=%d new_argc=%d\n", argc, new_argc);
fprintf(log, "args:");
for (int i = 0; i < new_argc; i++) fprintf(log, " [%s]", new_argv[i]);
fprintf(log, "\nPATH=%s\n", getenv("PATH") ? getenv("PATH") : "(null)");
fclose(log);
}
if (stat(ldbin, &st) == 0)
execv(ldbin, new_argv);
execv(apprun, new_argv);
return 1;
}