frame0
The package downloads a prebuilt .deb from a non-standard host (files.frame0.app), which is not a common code forge or vendor domain, and installs it without verifying the origin or integrity beyond the checksum; this creates a supply-chain risk if the host is compromised or the package is tampered with in transit.
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:44
source=("https://files.frame0.app/releases/linux/x64/frame0_${pkgver}_amd64.deb")
llm_review
An AI model (qwen/qwen3-235b-a22b-2507) reviewed this and agrees it is MEDIUM (confidence 90%): The package downloads a prebuilt .deb from a non-standard host (files.frame0.app), which is not a common code forge or vendor domain, and installs it without verifying the origin or integrity beyond the checksum; this creates a supply-chain risk if the host is compromised or the package is tampered with in transit.
PKGBUILD
1 offending line(s) highlighted# Maintainer: PanNNN <cool.panjianhao@gmail.com>
pkgname=frame0
pkgver=1.7.0
pkgrel=1
pkgdesc="A sleek Balsamiq-alternative wireframing tool for modern apps"
arch=('x86_64')
url="https://frame0.app"
license=('LicenseRef-Frame0-EULA' 'MIT')
options=('!strip' '!debug')
depends=(
'alsa-lib'
'at-spi2-core'
'cairo'
'dbus'
'expat'
'fontconfig'
'glib2'
'glibc'
'gtk3'
'libcups'
'libdrm'
'libgcc'
'libnotify'
'libstdc++'
'libx11'
'libxcb'
'libxcomposite'
'libxdamage'
'libxext'
'libxfixes'
'libxkbcommon'
'libxrandr'
'mesa'
'nspr'
'nss'
'pango'
'systemd-libs'
'xdg-utils'
)
optdepends=(
'libpulse: PulseAudio/PipeWire audio output'
'libsecret: store credentials in the system keyring'
)
source=("https://files.frame0.app/releases/linux/x64/frame0_${pkgver}_amd64.deb")
sha256sums=('637e311783d906f05363087f2805ba6b93d443f66f3175b02582dee5b3085c89')
package() {
# makepkg already extracts the .deb; data.tar may be .xz or .zst depending on upstream
bsdtar -xf "${srcdir}"/data.tar.* -C "${pkgdir}"
# Debian-only metadata
rm -rf "${pkgdir}/usr/share/lintian"
# Licenses (Frame0 itself is under its EULA: https://frame0.app/legals/license)
install -Dm644 "${pkgdir}/usr/share/doc/${pkgname}/copyright" \
"${pkgdir}/usr/share/licenses/${pkgname}/LICENSE.electron"
install -Dm644 "${pkgdir}/usr/lib/${pkgname}/LICENSES.chromium.html" \
"${pkgdir}/usr/share/licenses/${pkgname}/LICENSES.chromium.html"
}
Changes since previous scan
--- PKGBUILD @ 2026-10-26 00:12+++ PKGBUILD @ 2026-11-01 00:21@@ -1,34 +1,60 @@ # Maintainer: PanNNN <cool.panjianhao@gmail.com> pkgname=frame0-pkgver=1.2.0+pkgver=1.7.0 pkgrel=1-pkgdesc="A Balsamiq-alternative wireframming tool for modern apps"+pkgdesc="A sleek Balsamiq-alternative wireframing tool for modern apps" arch=('x86_64') url="https://frame0.app"-license=('custom')+license=('LicenseRef-Frame0-EULA' 'MIT')+options=('!strip' '!debug') depends=(- "gtk3"- "nss"- "libnotify"- "libxtst"- "xdg-utils"- "at-spi2-core"- "libdrm"- "mesa"- "libxcb"- "glib2"+ 'alsa-lib'+ 'at-spi2-core'+ 'cairo'+ 'dbus'+ 'expat'+ 'fontconfig'+ 'glib2'+ 'glibc'+ 'gtk3'+ 'libcups'+ 'libdrm'+ 'libgcc'+ 'libnotify'+ 'libstdc++'+ 'libx11'+ 'libxcb'+ 'libxcomposite'+ 'libxdamage'+ 'libxext'+ 'libxfixes'+ 'libxkbcommon'+ 'libxrandr'+ 'mesa'+ 'nspr'+ 'nss'+ 'pango'+ 'systemd-libs'+ 'xdg-utils' ) optdepends=(- 'pulseaudio'+ 'libpulse: PulseAudio/PipeWire audio output'+ 'libsecret: store credentials in the system keyring' ) source=("https://files.frame0.app/releases/linux/x64/frame0_${pkgver}_amd64.deb")-sha256sums=('1fd9cbad0ccecfb0bd839dd15408a6343e0ad01168f983cca57d9d74b14896ce')+sha256sums=('637e311783d906f05363087f2805ba6b93d443f66f3175b02582dee5b3085c89') package() {- cd "${srcdir}"- # Extract the .deb file- ar x frame0_${pkgver}_amd64.deb- # Extract the data.tar.xz file- bsdtar -xf data.tar.xz -C "${pkgdir}"+ # makepkg already extracts the .deb; data.tar may be .xz or .zst depending on upstream+ bsdtar -xf "${srcdir}"/data.tar.* -C "${pkgdir}"++ # Debian-only metadata+ rm -rf "${pkgdir}/usr/share/lintian"++ # Licenses (Frame0 itself is under its EULA: https://frame0.app/legals/license)+ install -Dm644 "${pkgdir}/usr/share/doc/${pkgname}/copyright" \+ "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE.electron"+ install -Dm644 "${pkgdir}/usr/lib/${pkgname}/LICENSES.chromium.html" \+ "${pkgdir}/usr/share/licenses/${pkgname}/LICENSES.chromium.html" } Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-11-01 00:21:48 | Medium | 2 |
| 2026-10-31 00:07:41 | Medium | 2 |
| 2026-10-30 00:29:30 | Medium | 2 |
| 2026-10-29 00:13:55 | Medium | 2 |
| 2026-10-28 00:06:54 | Medium | 2 |
| 2026-10-27 00:23:28 | Medium | 2 |
| 2026-10-26 15:45:54 | Medium | 2 |
| 2026-10-26 00:12:40 | Medium | 2 |
| 2026-10-25 00:20:48 | Medium | 2 |
| 2026-10-24 00:14:55 | Medium | 2 |
| 2026-10-23 00:02:19 | Medium | 2 |
| 2026-10-22 00:13:10 | Medium | 2 |
| 2026-10-21 00:12:50 | Medium | 2 |
| 2026-10-20 00:10:31 | Medium | 2 |
| 2026-10-19 00:03:55 | Medium | 2 |
| 2026-10-18 00:06:55 | Medium | 2 |
| 2026-10-17 00:21:55 | Medium | 2 |
| 2026-10-16 00:12:47 | Medium | 2 |
| 2026-10-15 00:28:05 | Medium | 2 |
| 2026-10-14 00:06:47 | Medium | 2 |