volt-desktop
Triggered rules
source_untrusted_domain
One or more source=() URLs point to a host outside the trusted allowlist (github.com, gitlab.com, codeberg.org, pypi.org, …).
-
PKGBUILD:16
source=("${pkgname}-${pkgver}.AppImage::https://updates.voltagechat.app/desktop/linux/Volt-${pkgver}.AppImage"
llm_review
An AI model (anthropic/claude-4.6-sonnet-20260217) reviewed this and agrees it is MEDIUM (confidence 72%): The PKGBUILD downloads a prebuilt AppImage binary from updates.voltagechat.app, which is the project's own update server (not a personal/random host), and verifies it with a sha256sum. The binary is then extracted and installed. The concern is real but moderate: this is a closed-source Electron app distributed as a prebuilt binary from the vendor's own update infrastructure rather than built from source. The sha256sum provides integrity but not authenticity (no GPG signature). If the update server were compromised, users would receive a malicious binary. This is a standard pattern for proprietary/closed-source AUR packages (similar to many -bin packages), but the domain is not a well-known major vendor. The medium rating is appropriate: it's an executed binary from a non-mainstream host with no GPG verification, representing a real supply-chain risk, but there is no evidence of malice and the host appears to be the legitimate project's own server.
PKGBUILD
1 offending line(s) highlighted# Maintainer: VoltChat Team <contact@voltagechat.app>
pkgname=volt-desktop
pkgver=1.1.8
pkgrel=1
pkgdesc="VoltChat Desktop Application - Electron-based chat client"
arch=('x86_64')
url="https://voltagechat.app"
license=('custom')
depends=('electron' 'gtk3' 'libnotify' 'nss' 'libxss' 'libxtst' 'xdg-utils' 'at-spi2-core' 'util-linux-libs')
optdepends=('libappindicator-gtk3: system tray support')
provides=('volt-desktop')
conflicts=('volt-desktop-bin')
options=('!strip')
# Source: AppImage from the official update server
source=("${pkgname}-${pkgver}.AppImage::https://updates.voltagechat.app/desktop/linux/Volt-${pkgver}.AppImage"
"volt-desktop.desktop"
"volt-desktop.png")
noextract=("${pkgname}-${pkgver}.AppImage")
sha256sums=('b01ea5855007113fc2a9982f5bcdfd9e04679f0804b4f8e76c8fc77ae8773d0e'
'f1640087071165a04b5913c30391021584504f42bab61c36b7959fb3cdcc8da7'
'f4e59ffb51c7ab41b9f3b1eacd9296801ad684eef88fa862bb44790c5714f56e')
prepare() {
chmod +x "${srcdir}/${pkgname}-${pkgver}.AppImage"
cd "${srcdir}"
"./${pkgname}-${pkgver}.AppImage" --appimage-extract
}
package() {
# Install the extracted AppImage contents
install -dm755 "${pkgdir}/opt/${pkgname}"
cp -r "${srcdir}/squashfs-root/." "${pkgdir}/opt/${pkgname}/"
# Make the main binary executable
chmod 755 "${pkgdir}/opt/${pkgname}/volt-desktop" 2>/dev/null || \
chmod 755 "${pkgdir}/opt/${pkgname}/Volt" 2>/dev/null || true
# Create a wrapper launcher script
install -dm755 "${pkgdir}/usr/bin"
cat > "${pkgdir}/usr/bin/volt-desktop" << 'EOF'
#!/bin/bash
exec /opt/volt-desktop/volt-desktop "$@" 2>/dev/null || \
exec /opt/volt-desktop/Volt "$@"
EOF
chmod 755 "${pkgdir}/usr/bin/volt-desktop"
# Install desktop entry
install -Dm644 "${srcdir}/volt-desktop.desktop" \
"${pkgdir}/usr/share/applications/volt-desktop.desktop"
# Install icon
install -Dm644 "${srcdir}/volt-desktop.png" \
"${pkgdir}/usr/share/pixmaps/volt-desktop.png"
# Also try to install icon from extracted AppImage
if [ -f "${srcdir}/squashfs-root/volt-desktop.png" ]; then
install -Dm644 "${srcdir}/squashfs-root/volt-desktop.png" \
"${pkgdir}/usr/share/pixmaps/volt-desktop.png"
elif [ -f "${srcdir}/squashfs-root/.DirIcon" ]; then
install -Dm644 "${srcdir}/squashfs-root/.DirIcon" \
"${pkgdir}/usr/share/pixmaps/volt-desktop.png"
fi
# Register voltchat:// protocol handler
install -dm755 "${pkgdir}/usr/share/applications"
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-08-03 00:08:14 | MEDIUM | 2 |
| 2026-08-02 00:16:08 | MEDIUM | 2 |
| 2026-08-01 00:11:18 | MEDIUM | 2 |
| 2026-07-31 00:14:10 | MEDIUM | 2 |
| 2026-07-30 00:17:23 | MEDIUM | 2 |
| 2026-07-29 00:25:53 | MEDIUM | 2 |
| 2026-07-28 00:07:28 | MEDIUM | 2 |
| 2026-07-27 00:24:32 | MEDIUM | 2 |
| 2026-07-26 00:07:32 | MEDIUM | 2 |
| 2026-07-25 00:13:44 | MEDIUM | 2 |
| 2026-07-24 00:02:28 | MEDIUM | 2 |
| 2026-07-23 00:14:47 | MEDIUM | 2 |
| 2026-07-22 00:29:32 | MEDIUM | 2 |
| 2026-07-21 00:24:15 | MEDIUM | 2 |
| 2026-07-20 00:19:49 | MEDIUM | 2 |
| 2026-07-19 00:17:08 | MEDIUM | 2 |
| 2026-07-18 00:14:48 | MEDIUM | 2 |
| 2026-07-17 00:06:16 | MEDIUM | 2 |
| 2026-07-16 00:05:41 | MEDIUM | 2 |
| 2026-07-15 00:09:25 | MEDIUM | 2 |