tangent-dev-bin
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://suchnsuch-public.s3.us-east-2.amazonaws.com/${_pkgname^}/Releases/${_pkgname^}-${_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 from an S3 bucket (suchnsuch-public.s3.us-east-2.amazonaws.com) that is controlled by the upstream developer ('Such n Such' is the developer of Tangent Notes). This is a non-standard distribution host rather than GitHub releases or a well-known CDN, but it appears to be the official upstream release channel used by the Tangent Notes project. The AppImage is executed during build (chmod +x then --appimage-extract), and its contents (specifically the app.asar) are installed and run via electron. A sha256sum is provided, which mitigates silent substitution risk but does not eliminate the concern about the trustworthiness of the host itself. The pattern is consistent with a small indie developer self-hosting releases on S3, which is legitimate but does represent a real supply-chain concern: if the S3 bucket is compromised or misconfigured, a malicious AppImage could be served. This is a genuine medium-risk pattern — an executed binary from a personal/unofficial host with a checksum but no additional verification (e.g., GPG signature).
PKGBUILD
1 offending line(s) highlighted# Maintainer: Tomasz Cebula <tomasz.cebula@gmail.com>
pkgname=tangent-dev-bin
_pkgname=${pkgname%-dev-bin}
_pkgver=0.12.2-beta.3
pkgver=${_pkgver/-/}
pkgrel=1
pkgdesc="Open source markdown note-taking app with linked notes and visual map"
arch=('x86_64')
url="https://www.tangentnotes.com"
license=('Apache-2.0')
_electron=electron42
depends=("$_electron")
provides=('tangent')
conflicts=('tangent' 'tangent-bin')
source=("$_pkgname-$pkgver.AppImage::https://suchnsuch-public.s3.us-east-2.amazonaws.com/${_pkgname^}/Releases/${_pkgname^}-${_pkgver}.AppImage"
"tangent.desktop")
noextract=("$_pkgname-$pkgver.AppImage")
sha256sums=('7140bf0e08cb370508428dcc9e57eff88c30948e6b790bdb0daf17f72b7a2b83'
'7bd7e95acdf937c38adaf0456b60e07d501f8235499d13c872f89238fde7bd72')
prepare() {
cd "$srcdir"
# Set execution permissions for AppImage
chmod +x "$_pkgname-$pkgver.AppImage"
# Extract AppImage contents
./"$_pkgname-$pkgver.AppImage" --appimage-extract
# Check if resources directory exists
if [[ ! -d "squashfs-root/resources" ]]; then
echo "Error: resources directory not found!"
exit 1
fi
}
package() {
cd "$srcdir/squashfs-root"
# Create target directories with proper permissions
install -dm755 "$pkgdir/usr/lib/$_pkgname"
install -dm755 "$pkgdir/usr/bin"
install -dm755 "$pkgdir/usr/share/applications"
install -dm755 "$pkgdir/usr/share/pixmaps"
# Copy resources directory with proper permissions
cp -r resources "$pkgdir/usr/lib/$_pkgname/"
# Set proper permissions for all files and directories
find "$pkgdir/usr/lib/$_pkgname" -type d -exec chmod 755 {} \;
find "$pkgdir/usr/lib/$_pkgname" -type f -exec chmod 644 {} \;
# Copy application icon
if [[ -f "tangent_electron.png" ]]; then
install -Dm644 "tangent_electron.png" "$pkgdir/usr/share/pixmaps/$_pkgname.png"
fi
# Copy icons in different sizes
for size in 16 32 48 64 128 256 512; do
if [[ -f "usr/share/icons/hicolor/${size}x${size}/apps/tangent_electron.png" ]]; then
install -Dm644 "usr/share/icons/hicolor/${size}x${size}/apps/tangent_electron.png" \
"$pkgdir/usr/share/icons/hicolor/${size}x${size}/apps/$_pkgname.png"
fi
done
# Create wrapper script
install -Dm755 /dev/stdin "$pkgdir/usr/bin/$_pkgname" << EOF
#!/bin/bash
exec "$_electron" /usr/lib/$_pkgname/resources/app.asar "\$@"
EOF
# Install desktop file
install -Dm644 "$srcdir/$_pkgname.desktop" "$pkgdir/usr/share/applications/$_pkgname.desktop"
}
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 |