Compare commits

...

33 Commits

Author SHA1 Message Date
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
25 changed files with 190 additions and 108 deletions
+1
View File
@@ -0,0 +1 @@
81e1a25de641f0292863b1404cba728c1eadd00d
+122 -65
View File
@@ -10,59 +10,56 @@ env:
REPO: LotusGuild/cinny-desktop
jobs:
prepare-release:
prepare:
runs-on: ubuntu-latest
outputs:
release_id: ${{ steps.create.outputs.release_id }}
version: ${{ steps.create.outputs.version }}
version: ${{ steps.ver.outputs.version }}
release_id: ${{ steps.release.outputs.release_id }}
steps:
- uses: actions/checkout@v4
- name: Compute version
id: ver
run: echo "version=4.12.${{ github.run_number }}" >> $GITHUB_OUTPUT
- name: Create rolling latest release
id: create
- name: Create or update release
id: release
env:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
TOKEN: ${{ secrets.RELEASE_TOKEN }}
run: |
VERSION=$(python3 -c "import json; print(json.load(open('src-tauri/tauri.conf.json'))['version'])")
echo "version=$VERSION" >> $GITHUB_OUTPUT
# Delete existing latest release+tag if present
OLD=$(curl -sf "$GITEA_URL/api/v1/repos/$REPO/releases/tags/latest" \
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)
OLD_ID=$(echo "$OLD" | python3 -c "import sys,json; print(json.load(sys.stdin).get('id',''))" 2>/dev/null || true)
if [ -n "$OLD_ID" ] && [ "$OLD_ID" != "None" ] && [ "$OLD_ID" != "" ]; then
curl -sf -X DELETE "$GITEA_URL/api/v1/repos/$REPO/releases/$OLD_ID" -H "Authorization: token $TOKEN" || true
curl -f -X DELETE "$GITEA_URL/api/v1/repos/$REPO/tags/latest" -H "Authorization: token $TOKEN" || 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
# Create fresh release
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'])")
echo "release_id=$RELEASE_ID" >> $GITHUB_OUTPUT
build-windows:
needs: prepare-release
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: Get version
id: version
- name: Patch version
shell: powershell
run: |
$v = (Get-Content src-tauri\tauri.conf.json | ConvertFrom-Json).version
"version=$v" >> $env:GITHUB_OUTPUT
- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
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
shell: powershell
@@ -78,32 +75,42 @@ jobs:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ''
NODE_OPTIONS: '--max_old_space_size=4096'
run: npm run tauri -- build
run: npm run tauri -- build --bundles nsis
- name: Upload to release
shell: powershell
env:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_ID: ${{ needs.prepare-release.outputs.release_id }}
VERSION: ${{ needs.prepare-release.outputs.version }}
TOKEN: ${{ secrets.RELEASE_TOKEN }}
RELEASE_ID: ${{ needs.prepare.outputs.release_id }}
VERSION: ${{ needs.prepare.outputs.version }}
run: |
$msi = "src-tauri\target\release\bundle\msi"
$releaseId = $env:RELEASE_ID
$VERSION = $env:VERSION
Write-Host "Version: $VERSION Release: $releaseId"
$nsis = "src-tauri\target\release\bundle\nsis"
$files = @(
"$msi\Cinny_${VERSION}_x64_en-US.msi",
"$msi\Cinny_${VERSION}_x64_en-US.msi.zip",
"$msi\Cinny_${VERSION}_x64_en-US.msi.zip.sig"
"$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.msi", "LotusChat-x86_64.msi.zip", "LotusChat-x86_64.msi.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/$RELEASE_ID/assets?name=$($names[$i])" `
Invoke-RestMethod -Uri "$env:GITEA_URL/api/v1/repos/$env:REPO/releases/$releaseId/assets?name=$($names[$i])" `
-Method Post `
-Headers @{ Authorization = "token $TOKEN"; "Content-Type" = "application/octet-stream" } `
-Headers @{ Authorization = "token $env:TOKEN"; "Content-Type" = "application/octet-stream" } `
-Body $bytes
}
build-linux:
needs: prepare-release
needs: prepare
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
@@ -114,11 +121,6 @@ jobs:
with:
node-version-file: .node-version
- name: Get version
id: version
run: |
echo "version=$(python3 -c "import json; print(json.load(open('src-tauri/tauri.conf.json'))['version'])")" >> $GITHUB_OUTPUT
- name: Install system deps
run: |
apt-get update
@@ -138,38 +140,93 @@ jobs:
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 for AppImage bundler
run: |
mkdir -p ~/.cache/tauri
cp tools/AppRun-x86_64 ~/.cache/tauri/AppRun-x86_64
chmod +x ~/.cache/tauri/AppRun-x86_64
- name: Build
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ''
NODE_OPTIONS: '--max_old_space_size=4096'
run: npm run tauri -- build
run: npm run tauri -- build --bundles appimage,deb
- name: Upload to release
env:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_ID: ${{ needs.prepare-release.outputs.release_id }}
VERSION: ${{ steps.version.outputs.version }}
TOKEN: ${{ secrets.RELEASE_TOKEN }}
RELEASE_ID: ${{ needs.prepare.outputs.release_id }}
VERSION: ${{ needs.prepare.outputs.version }}
run: |
deb="src-tauri/target/release/bundle/deb/Cinny_${VERSION}_amd64.deb"
appimage="src-tauri/target/release/bundle/appimage/Cinny_${VERSION}_amd64.AppImage"
declare -A uploads=(
["LotusChat-x86_64.deb"]="$deb"
["LotusChat-x86_64.AppImage"]="$appimage"
["LotusChat-x86_64.AppImage.tar.gz"]="${appimage}.tar.gz"
["LotusChat-x86_64.AppImage.tar.gz.sig"]="${appimage}.tar.gz.sig"
)
for name in "${!uploads[@]}"; do
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 @"${uploads[$name]}"
done
--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
+1 -1
Submodule cinny updated: 71386f4ef2...5469740f4c
+6 -24
View File
@@ -1,29 +1,11 @@
{
"defaultHomeserver": 1,
"homeserverList": ["converser.eu", "matrix.org", "mozilla.org", "unredacted.org", "xmr.se"],
"defaultHomeserver": 0,
"homeserverList": [
"matrix.lotusguild.org",
"matrix.org",
"mozilla.org"
],
"allowCustomHomeservers": true,
"featuredCommunities": {
"openAsDefault": false,
"spaces": [
"#cinny:matrix.org",
"#community:matrix.org",
"#space:unredacted.org",
"#librewolf-community:matrix.org",
"#stickers-and-emojis:tastytea.de",
"#videogames:waywardinn.com",
"#science-space:matrix.org",
"#libregaming-games:tchncs.de",
"#mathematics-on:matrix.org"
],
"rooms": [
"#tuwunel:grin.hu",
"#freesoftware:matrix.org",
"#gentoo:matrix.org"
],
"servers": ["matrixrooms.info", "matrix.org", "mozilla.org", "unredacted.org"]
},
"hashRouter": {
"enabled": true,
"basename": "/"
+4 -1
View File
@@ -17,7 +17,7 @@ tauri-build = { version = "2", features = [] }
[dependencies]
serde_json = "1.0.109"
serde = { version = "1.0.193", features = ["derive"] }
tauri = { version = "2", features = [ "devtools"] }
tauri = { version = "2", features = ["devtools", "wry"] }
tauri-plugin-localhost = "2"
tauri-plugin-window-state = "2"
tauri-plugin-clipboard-manager = "2"
@@ -42,6 +42,9 @@ custom-protocol = [ "tauri/custom-protocol" ]
tauri-plugin-global-shortcut = "2"
tauri-plugin-updater = "2"
[target.'cfg(target_os = "windows")'.dependencies]
webview2-com = "0.38"
[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>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 134 KiB

+40 -11
View File
@@ -3,8 +3,6 @@
windows_subsystem = "windows"
)]
// mod menu;
use tauri::{webview::{NewWindowResponse, WebviewWindowBuilder}, WebviewUrl};
use tauri_plugin_opener::OpenerExt;
@@ -13,21 +11,14 @@ pub fn run() {
let context = tauri::generate_context!();
let builder = tauri::Builder::default();
// #[cfg(target_os = "macos")]
// {
// builder = builder.menu(menu::menu());
// }
builder
.plugin(tauri_plugin_localhost::Builder::new(port).build())
.plugin(tauri_plugin_window_state::Builder::default().build())
.plugin(tauri_plugin_opener::init())
.setup(move |app| {
// Dev: use devUrl from tauri.conf.json (http://localhost:8080) to support HMR
#[cfg(debug_assertions)]
let window_url = WebviewUrl::App(Default::default());
// Release: tauri-plugin-localhost serves bundled frontend assets on this port
#[cfg(not(debug_assertions))]
let window_url = {
let url = format!("http://localhost:{}", port).parse().unwrap();
@@ -35,14 +26,52 @@ pub fn run() {
};
let app_handle = app.handle().clone();
WebviewWindowBuilder::new(app, "main".to_string(), window_url)
.title("Cinny")
let window = WebviewWindowBuilder::new(app, "main".to_string(), window_url)
.title("Lotus Chat")
.disable_drag_drop_handler()
.on_new_window(move |url, _features| {
let _ = app_handle.opener().open_url(url.as_str(), None::<&str>);
NewWindowResponse::Deny
})
.build()?;
// Grant camera and microphone to WebView2 automatically.
// Windows requires an explicit PermissionRequested COM event handler.
#[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_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
{
unsafe {
args.SetState(COREWEBVIEW2_PERMISSION_STATE_ALLOW)
}?;
}
}
Ok(())
},
));
let mut token = Default::default();
let _ = unsafe { core.add_PermissionRequested(&handler, &mut token) };
}
})?;
Ok(())
})
.run(context)
+6 -6
View File
@@ -45,21 +45,21 @@
"beforeDevCommand": "cd cinny && npm start",
"devUrl": "http://localhost:8080"
},
"productName": "Cinny",
"productName": "Lotus Chat",
"mainBinaryName": "cinny",
"version": "4.12.2",
"identifier": "in.cinny.app",
"identifier": "org.lotusguild.lotus-chat",
"plugins": {
"updater": {
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDE2NDc3NDBGMTAzNTk1NUYKUldSZmxUVVFEM1JIRnRuMjVRTkFOQ21lUFI5KzRMU0s4OWtBS1RNRUVCNE9LcE9GcExNZ2M2NHoK",
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDM1N0Y0RThCQTJEQzY1NTkKUldSWlpkeWlpMDUvTlVjejMzN0E1U0FiaVpLK05QVkRXdWlMMm1NNUprMXAvTGZSbU5maVovNmwK",
"endpoints": [
"https://github.com/cinnyapp/cinny-desktop/releases/download/tauri/release.json"
"https://code.lotusguild.org/LotusGuild/cinny-desktop/releases/download/latest/release.json"
]
}
},
"app": {
"security": {
"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:; connect-src 'self' blob: ipc: ws: wss: http: https: http://ipc.localhost"
"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.