pomotro
The PKGBUILD runs 'yarn add -D @electron/packager' during prepare(), which fetches an undeclared npm package from the npm registry at build time. However, @electron/packager is the official, well-known Electron packaging tool maintained by the Electron organization (formerly electron-packager), published on the official npm registry. It is a legitimate build-time dependency used only during packaging (not installed into the final package). The actual installed package only contains the app's JS resources and a launcher script wrapping system electron. The concern is real but minor: it's a missing lockfile entry for a well-known official tool, not an unofficial or personal host. This is sloppy packaging (the dependency should be declared in package.json/yarn.lock) but not a meaningful supply-chain risk beyond the general npm ecosystem trust model. The CN mirror detection and substitution is a common pattern in AUR packages targeting Chinese users. Overall this is low severity — non-standard but not a genuine security concern.
Triggered rules
llm_review
The static rules flagged this MEDIUM, but an AI model (anthropic/claude-4.6-sonnet-20260217) reviewed the full PKGBUILD and judged it LOW (confidence 75%): The PKGBUILD runs 'yarn add -D @electron/packager' during prepare(), which fetches an undeclared npm package from the npm registry at build time. However, @electron/packager is the official, well-known Electron packaging tool maintained by the Electron organization (formerly electron-packager), published on the official npm registry. It is a legitimate build-time dependency used only during packaging (not installed into the final package). The actual installed package only contains the app's JS resources and a launcher script wrapping system electron. The concern is real but minor: it's a missing lockfile entry for a well-known official tool, not an unofficial or personal host. This is sloppy packaging (the dependency should be declared in package.json/yarn.lock) but not a meaningful supply-chain risk beyond the general npm ecosystem trust model. The CN mirror detection and substitution is a common pattern in AUR packages targeting Chinese users. Overall this is low severity — non-standard but not a genuine security concern.
1 higher static finding superseded - not the current verdict (shown for transparency)
npm_install_external
Runs `npm/yarn/pnpm install <package>` for a package not in source=(), pulling unpinned, unreviewed code at build time. Severity downgraded: the package declares/looks like a Node.js consumer, where build-time installs are expected.
-
PKGBUILD:79
NODE_ENV=development yarn add -D "@electron/packager"
PKGBUILD
1 offending line(s) highlighted# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
pkgname=pomotro
_pkgname=Pomotro
pkgver=1.2
_electronversion=25
_nodeversion=20
pkgrel=1
pkgdesc="A Desktop Pomodoro Clock.(Use system-wide electron)"
arch=('any')
url="https://github.com/Ranork/Pomotro"
license=('GPL-3.0-only')
conflicts=("${pkgname}")
depends=(
"electron${_electronversion}"
'nodejs'
)
makedepends=(
'gendesk'
'nvm'
'npm'
'yarn'
'git'
)
options=(
'!emptydirs'
)
source=(
"${pkgname}-${pkgver}::git+${url}#tag=v${pkgver}"
"${pkgname}.sh"
)
sha256sums=('48fcc747e90a77a7cb770f46f57a52337f44d21a3a40b3ed26971e94e1c42782'
'f2fe8c189974ffb9d445e9a42bd4f1d5b60185607c3fcafae79ab44be224e013')
_ensure_local_nvm() {
local NVM_DIR="${srcdir}/.nvm"
source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
nvm install "${_nodeversion}"
nvm use "${_nodeversion}"
}
prepare() {
cd "${srcdir}/${pkgname}-${pkgver}"
sed -i -e "
s/@electronversion@/${_electronversion}/g
s/@appname@/${pkgname}/g
s/@runname@/app/g
s/@cfgdirname@/${pkgname}/g
s/@options@//g
" -i "${srcdir}/${pkgname}.sh"
_ensure_local_nvm
gendesk -q -f -n \
--pkgname="${pkgname}" \
--pkgdesc="${pkgdesc}" \
--categories="Utility" \
--name="${_pkgname}" \
--exec="${pkgname} %U"
export ELECTRON_SKIP_BINARY_DOWNLOAD=1
export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/v//g')"
HOME="${srcdir}/.electron-gyp"
mkdir -p "${srcdir}/.electron-gyp"
if [[ "$(curl -s ipinfo.io/country)" == *"CN"* ]]; then
{
echo -e '\n'
echo 'registry "https://registry.npmmirror.com"'
echo 'electron_mirror "https://registry.npmmirror.com/-/binary/electron/"'
echo 'electron_builder_binaries_mirror "https://registry.npmmirror.com/-/binary/electron-builder-binaries/"'
echo "cacheFolder "${srcdir}"/.yarn/cache"
echo "pluginsFolder "${srcdir}"/.yarn/plugins"
echo "globalFolder "${srcdir}"/.yarn/global"
echo 'useHardlinks true'
#echo 'buildFromSource true'
echo 'linkWorkspacePackages true'
echo 'fetchRetries 3'
echo 'fetchRetryTimeout 10000'
echo 'networkConcurrency 32'
} >> .yarnrc
find ./ -type f -name "yarn.lock" -exec sed -i "s/registry.yarnpkg.com/registry.npmmirror.com/g" {} +
fi
sed -i "s/\"electron\": \"[^\"]*\"/\"electron\": \"${SYSTEM_ELECTRON_VERSION}\"/g" package.json
NODE_ENV=development yarn install --cache-folder "${srcdir}/.yarn_cache"
NODE_ENV=development yarn add -D "@electron/packager"
}
build() {
cd "${srcdir}/${pkgname}-${pkgver}"
NODE_ENV=production yarn electron-packager . "${_pkgname}" --platform=linux --out=release --overwrite
}
package() {
install -Dm755 "${srcdir}/${pkgname}.sh" "${pkgdir}/usr/bin/${pkgname}"
install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}"
cp -Pr --no-preserve=ownership "${srcdir}/${pkgname}-${pkgver}/release/${_pkgname}-linux-"*/resources/app "${pkgdir}/usr/lib/${pkgname}"
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/${pkgname}.desktop" -t "${pkgdir}/usr/share/applications"
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}"
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-09-17 00:27:14 | Low | 2 |
| 2026-09-16 00:03:17 | Low | 2 |
| 2026-09-15 00:25:31 | Low | 2 |
| 2026-09-14 00:27:57 | Low | 2 |
| 2026-09-13 00:19:54 | Low | 2 |
| 2026-09-12 00:25:17 | Low | 2 |
| 2026-09-11 00:19:22 | Low | 2 |
| 2026-09-10 00:22:44 | Low | 2 |
| 2026-09-09 00:04:09 | Low | 2 |
| 2026-09-08 00:18:08 | Low | 2 |
| 2026-09-07 00:30:15 | Low | 2 |
| 2026-09-06 00:17:06 | Low | 2 |
| 2026-09-05 00:16:27 | Low | 2 |
| 2026-09-04 00:03:13 | Low | 2 |
| 2026-09-03 00:15:47 | Low | 2 |
| 2026-09-02 00:02:31 | Low | 2 |
| 2026-09-01 00:11:19 | Low | 2 |
| 2026-08-31 00:19:57 | Low | 2 |
| 2026-08-30 00:04:14 | Low | 2 |
| 2026-08-29 00:29:17 | Low | 2 |