futo-notes-bin
The package downloads a prebuilt AppImage from a non-whitelisted but project-owned GitLab instance (gitlab.futo.org), which is used to extract and install binaries; while the host is not standard, it is plausibly official and the AppImage checksum is verified, reducing risk from arbitrary code execution but still presenting a supply-chain risk if the source were swapped.
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:15
source=("LICENSE.md::https://gitlab.futo.org/futo-notes/futo-notes/-/raw/v${pkgver}/LICENSE.md")
llm_review
An AI model (qwen/qwen3-235b-a22b-2507) reviewed this and agrees it is MEDIUM (confidence 95%): The package downloads a prebuilt AppImage from a non-whitelisted but project-owned GitLab instance (gitlab.futo.org), which is used to extract and install binaries; while the host is not standard, it is plausibly official and the AppImage checksum is verified, reducing risk from arbitrary code execution but still presenting a supply-chain risk if the source were swapped.
PKGBUILD
1 offending line(s) highlighted# Maintainer: Nico <d3sox at protonmail dot com>
_pkgname=futo-notes
pkgname=${_pkgname}-bin
pkgver=1.9.1
pkgrel=1
pkgdesc="Fast, private, local-first notes"
arch=('x86_64')
url="https://notes.futo.tech"
license=('LicenseRef-SourceFirst-1.1')
depends=('hicolor-icon-theme' 'desktop-file-utils')
provides=("${_pkgname}")
conflicts=("${_pkgname}")
options=('!strip')
_appimage="${pkgname}-${pkgver}-x86_64.AppImage"
source=("LICENSE.md::https://gitlab.futo.org/futo-notes/futo-notes/-/raw/v${pkgver}/LICENSE.md")
source_x86_64=("${_appimage}::https://gitlab.futo.org/api/v4/projects/488/packages/generic/${_pkgname}/v${pkgver}/FUTO-Notes-${pkgver}-x86_64.AppImage")
noextract=("${_appimage}")
sha256sums=('808950f8388f37b47a07217fbb90ef2e3512fd60abd492f1abe4ea1507857a8a')
sha256sums_x86_64=('758f3838c0edf720d306ffca87e623a07a3e0a1ad4874bbef0a0e156d9fa76ab')
prepare() {
chmod +x "${_appimage}"
"./${_appimage}" --appimage-extract
}
package() {
install -dm755 "${pkgdir}/opt/${_pkgname}"
cp -a squashfs-root/usr "${pkgdir}/opt/${_pkgname}/"
cp -a squashfs-root/apprun-hooks "${pkgdir}/opt/${_pkgname}/"
install -Dm755 squashfs-root/AppRun "${pkgdir}/opt/${_pkgname}/AppRun"
install -Dm755 squashfs-root/AppRun.wrapped "${pkgdir}/opt/${_pkgname}/AppRun.wrapped"
install -Dm644 "squashfs-root/FUTO Notes.png" "${pkgdir}/opt/${_pkgname}/FUTO Notes.png"
ln -s "usr/share/applications/FUTO Notes.desktop" "${pkgdir}/opt/${_pkgname}/FUTO Notes.desktop"
install -dm755 "${pkgdir}/usr/bin"
install -Dm755 /dev/stdin "${pkgdir}/usr/bin/${_pkgname}" <<EOF
#!/usr/bin/env bash
exec /opt/${_pkgname}/AppRun "\$@"
EOF
install -Dm644 "squashfs-root/usr/share/applications/FUTO Notes.desktop" \
"${pkgdir}/usr/share/applications/${_pkgname}.desktop"
sed -i \
-e "s|^Exec=.*|Exec=${_pkgname}|" \
-e 's|^Categories=.*|Categories=Office;Utility;|' \
"${pkgdir}/usr/share/applications/${_pkgname}.desktop"
install -dm755 "${pkgdir}/usr/share/icons/hicolor"
cp -a squashfs-root/usr/share/icons/hicolor/. "${pkgdir}/usr/share/icons/hicolor/"
install -Dm644 "$srcdir/LICENSE.md" "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
}
Changes since previous scan
--- PKGBUILD @ 2026-10-22 00:13+++ PKGBUILD @ 2026-11-01 00:21@@ -1,7 +1,7 @@ # Maintainer: Nico <d3sox at protonmail dot com> _pkgname=futo-notes pkgname=${_pkgname}-bin-pkgver=1.9.0+pkgver=1.9.1 pkgrel=1 pkgdesc="Fast, private, local-first notes" arch=('x86_64')@@ -16,7 +16,7 @@ source_x86_64=("${_appimage}::https://gitlab.futo.org/api/v4/projects/488/packages/generic/${_pkgname}/v${pkgver}/FUTO-Notes-${pkgver}-x86_64.AppImage") noextract=("${_appimage}") sha256sums=('808950f8388f37b47a07217fbb90ef2e3512fd60abd492f1abe4ea1507857a8a')-sha256sums_x86_64=('234ba7f4115740bca8838246a9f4b809d9f77aea9c48b1dc4ff040bb67d81fcf')+sha256sums_x86_64=('758f3838c0edf720d306ffca87e623a07a3e0a1ad4874bbef0a0e156d9fa76ab') prepare() { chmod +x "${_appimage}"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 00:12:40 | Medium | 2 |
| 2026-10-25 00:20:48 | Medium | 2 |
| 2026-10-24 00:14:55 | Medium | 2 |
| 2026-10-23 17:38:05 | Medium | 2 |
| 2026-10-23 00:02:19 | Medium | 2 |
| 2026-10-22 19:36:04 | Medium | 2 |
| 2026-10-22 00:13:10 | Low | 2 |
| 2026-10-21 00:12:50 | Low | 2 |
| 2026-10-20 17:28:05 | Medium | 1 |
| 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 |