devin-desktop

MEDIUM
maintainer bermudi 30 votes scanned 2026-09-17 03:24:22.735270
View on AUR
Why flagged

Package downloads a prebuilt .deb from a non-official, obfuscated APT repository URL which is not associated with the project's main domain, creating a supply-chain risk if the host is compromised or malicious.

Triggered rules

Medium Recently orphaned & re-adopted orphaned_readopted

This package was orphaned and re-adopted within the last 30 days — a window where ownership transfers can introduce malicious changes.

Medium AI review llm_review

An AI model (qwen/qwen3-235b-a22b-2507) reviewed this and agrees it is MEDIUM (confidence 85%): Package downloads a prebuilt .deb from a non-official, obfuscated APT repository URL which is not associated with the project's main domain, creating a supply-chain risk if the host is compromised or malicious.

PKGBUILD

1# Maintainer: bermudi <github.igizp@dabg.uk>
2# Contributor: Luiz Silva <luizsv.dev@gmail.com>
3# Contributor: Webarch <contact@webarch.ro>
4# Auto-updated by GitHub Actions (see .github/workflows/devin-desktop.yml)
5
6pkgname=devin-desktop
7pkgver=3.10.31
8pkgrel=1
9pkgdesc="A team of agents for every engineer — Devin Desktop"
10arch=('x86_64')
11url="https://devin.ai/desktop"
12license=('LicenseRef-Devin Desktop')
13
14# APT repository configuration (stable channel).
15# Update workflow rewrites pkgver, the first sha256sums entry, and (if it
16# changes) _apt_pool. Everything else here is static — do not hand-merge this
17# file from a template.
18_apt_base="https://windsurf-stable.codeiumdata.com/wVxQEIWkwPUEAGf3/apt"
19_apt_pool="pool/main/d/devin-desktop"
20_upstream_ver="${pkgver}" # stable versions carry no channel suffix
21_debfile="Devin-linux-x64-${_upstream_ver}.deb"
22
23depends=(
24 'electron42'
25 'glibc'
26 'gtk3'
27 'libglvnd'
28 'vulkan-driver'
29 'alsa-lib'
30 'libsecret'
31 'libxss'
32 'libxkbfile'
33 'libnotify'
34 'ripgrep'
35 'fd'
36 'xdg-utils'
37)
38makedepends=()
39optdepends=(
40 'bash-completion: for bash shell completions'
41 'zsh: for zsh shell completions'
42)
43options=('!strip' '!debug')
44
45source=(
46 "${pkgname}-${pkgver}.deb::${_apt_base}/${_apt_pool}/${_debfile}"
47 'devin-desktop.desktop'
48 'devin-desktop-url-handler.desktop'
49 'devin-desktop.sh'
50)
51
52sha256sums=(
53 'e4a8701930b08944efcb5f308604382e4ae57af16f750b8b46fd0244022fdb3f'
54 '74b6568385dbcbb8c0f118bd81c526ab019f91726dd7b7b15742c1ac0228cd13'
55 '9fffea94a75faca248102cd830508932a674f469c1b42d48e2387db45b81cb33'
56 'a6d17d4f506181b3061dbdc882e258ca494a5f84636694bba1742c3a8c7f1c5e'
57)
58
59prepare() {
60 cd "$srcdir"
61
62 # Clean up any previous extraction
63 rm -rf deb-extract
64
65 # Extract the .deb file (ar archive)
66 mkdir -p deb-extract
67 cd deb-extract
68 ar x "../${pkgname}-${pkgver}.deb"
69
70 # Extract the data archive (contains the actual files)
71 mkdir -p data
72 if [[ -f data.tar.xz ]]; then
73 tar -xf data.tar.xz -C data
74 elif [[ -f data.tar.zst ]]; then
75 tar -xf data.tar.zst -C data
76 elif [[ -f data.tar.gz ]]; then
77 tar -xf data.tar.gz -C data
78 fi
79}
80
81build() {
82 cd "$srcdir/deb-extract/data"
83
84 # The deb installs to usr/share/<name>/ — find the real install dir.
85 local _installdir
86 for _candidate in "usr/share/devin-desktop" "usr/share/windsurf"; do
87 if [[ -d "$_candidate" ]]; then
88 _installdir="$_candidate"
89 break
90 fi
91 done
92 if [[ -z "$_installdir" ]]; then
93 _installdir=$(find usr/share -maxdepth 1 -type d -not -path "usr/share" | head -1)
94 fi
95 if [[ -z "$_installdir" || ! -d "$_installdir/resources/app" ]]; then
96 echo "Error: Installation directory not found!" >&2
97 return 1
98 fi
99
100 # Detect the Electron major version required by this release.
101 # Primary: package.json devDependency. Fallback: mine the bundled binary.
102 local _electron_major
103 _electron_major=$(sed -n '/"electron":/s/.*"electron": *"\{0,1\} *\([0-9]\+\).*/\1/p' "$_installdir/resources/app/package.json" | head -1)
104 if [[ -z "$_electron_major" ]]; then
105 _electron_major=$(strings "$_installdir/devin-desktop" | sed -n 's|Electron/\([0-9]\+\).*|\1|p' | head -1)
106 fi
107 if [[ -z "$_electron_major" ]]; then
108 echo "Error: Could not detect Electron version from package.json or bundled binary" >&2
109 return 1
110 fi
111 printf 'electron%s\n' "$_electron_major" > "$srcdir/.electron-dep"
112
113 # Generate the launcher script with the correct Electron version.
114 sed -e "s|@@ELECTRON@@|electron${_electron_major}|g" \
115 "$srcdir/$pkgname.sh" > "$srcdir/launcher"
116}
117
118package() {
119 cd "$srcdir/deb-extract/data"
120
121 # The deb installs to usr/share/<name>/ — find the real install dir.
122 local _installdir
123 for _candidate in "usr/share/devin-desktop" "usr/share/windsurf"; do
124 if [[ -d "$_candidate" ]]; then
125 _installdir="$_candidate"
126 break
127 fi
128 done
129 if [[ -z "$_installdir" || ! -d "$_installdir" ]]; then
130 echo "Error: Installation directory not found!" >&2
131 return 1
132 fi
133
134 # AppStream metadata and MIME registration shipped in the deb.
135 if [[ -f "usr/share/appdata/$pkgname.appdata.xml" ]]; then
136 install -Dm644 "usr/share/appdata/$pkgname.appdata.xml" \
137 "$pkgdir/usr/share/metainfo/$pkgname.appdata.xml"
138 fi
139 if [[ -f "usr/share/mime/packages/$pkgname-workspace.xml" ]]; then
140 install -Dm644 "usr/share/mime/packages/$pkgname-workspace.xml" \
141 "$pkgdir/usr/share/mime/packages/$pkgname-workspace.xml"
142 fi
143
144 # Copy app resources to /opt/<pkgname>
145 install -dm755 "$pkgdir/opt/$pkgname"
146 cp -a "$_installdir"/. "$pkgdir/opt/$pkgname/"
147
148 # Strip bundled Electron runtime — keep only resources/ (the app).
149 cd "$pkgdir/opt/$pkgname"
150 find . -mindepth 1 -maxdepth 1 -not -name resources -exec rm -rf {} +
151 cd "$srcdir/deb-extract/data"
152
153 # Replace the bundled ripgrep with the system binary. VS Code moved it to
154 # ripgrep-universal in 3.6; retain the prior layout for older releases.
155 local _ripgrep_binary _candidate
156 for _candidate in \
157 "node_modules/@vscode/ripgrep-universal/bin/linux-x64/rg" \
158 "node_modules/@vscode/ripgrep/bin/rg"; do
159 if [[ -f "$pkgdir/opt/$pkgname/resources/app/$_candidate" ]]; then
160 _ripgrep_binary="$_candidate"
161 break
162 fi
163 done
164 if [[ -z "$_ripgrep_binary" ]]; then
165 error "bundled ripgrep binary not found in a supported upstream layout"
166 return 1
167 fi
168 ln -sf /usr/bin/rg "$pkgdir/opt/$pkgname/resources/app/$_ripgrep_binary"
169
170 # Replace bundled fd (windsurf extension) and xdg-open with system
171 # binaries when upstream ships them.
172 if [[ -f "$pkgdir/opt/$pkgname/resources/app/extensions/windsurf/bin/fd" ]]; then
173 ln -sf /usr/bin/fd "$pkgdir/opt/$pkgname/resources/app/extensions/windsurf/bin/fd"
174 else
175 echo "Note: no bundled fd found; skipping system-fd symlink" >&2
176 fi
177 if [[ -f "$pkgdir/opt/$pkgname/resources/app/node_modules/open/xdg-open" ]]; then
178 ln -sf /usr/bin/xdg-open "$pkgdir/opt/$pkgname/resources/app/node_modules/open/xdg-open"
179 else
180 echo "Note: no bundled xdg-open found; skipping system-xdg-open symlink" >&2
181 fi
182
183 # Install the launcher script as the main executable.
184 install -Dm755 "$srcdir/launcher" "$pkgdir/opt/$pkgname/$pkgname"
185 install -dm755 "$pkgdir/usr/bin"
186 ln -sf "/opt/$pkgname/$pkgname" "$pkgdir/usr/bin/$pkgname"
187
188 # Desktop entries (patched to point at /opt)
189 install -Dm644 "$srcdir/$pkgname.desktop" "$pkgdir/usr/share/applications/$pkgname.desktop"
190 install -Dm644 "$srcdir/$pkgname-url-handler.desktop" "$pkgdir/usr/share/applications/$pkgname-url-handler.desktop"
191
192 # Shell completions
193 if [[ -f "$pkgdir/opt/$pkgname/resources/completions/bash/$pkgname" ]]; then
194 install -Dm644 "$pkgdir/opt/$pkgname/resources/completions/bash/$pkgname" \
195 "$pkgdir/usr/share/bash-completion/completions/$pkgname"
196 fi
197 if [[ -f "$pkgdir/opt/$pkgname/resources/completions/zsh/_$pkgname" ]]; then
198 install -Dm644 "$pkgdir/opt/$pkgname/resources/completions/zsh/_$pkgname" \
199 "$pkgdir/usr/share/zsh/site-functions/_$pkgname"
200 fi
201
202 # Icon — try the known deb icon names
203 local _icon
204 for _icon in "devin.png" "devin-desktop.png" "code.png"; do
205 if [[ -f "$pkgdir/opt/$pkgname/resources/app/resources/linux/$_icon" ]]; then
206 install -Dm644 "$pkgdir/opt/$pkgname/resources/app/resources/linux/$_icon" \
207 "$pkgdir/usr/share/pixmaps/$pkgname.png"
208 break
209 fi
210 done
211
212 # Drift assertion: if upstream bumps the Electron major, fail loudly
213 # instead of shipping a broken package. Bump the electron entry in
214 # depends above when this fires.
215 local _electron_dep
216 _electron_dep=$(cat "$srcdir/.electron-dep" 2>/dev/null)
217 if [[ -n "$_electron_dep" ]] && ! printf '%s\n' "${depends[@]}" | grep -qxF "$_electron_dep"; then
218 error "upstream now requires %s; bump the electron entry in PKGBUILD depends" "$_electron_dep"
219 return 1
220 fi
221}
222

Changes since previous scan

--- PKGBUILD @ 2026-09-17 00:27
+++ PKGBUILD @ 2026-09-17 03:24
@@ -4,7 +4,7 @@
# Auto-updated by GitHub Actions (see .github/workflows/devin-desktop.yml)
pkgname=devin-desktop
-pkgver=3.10.23
+pkgver=3.10.31
pkgrel=1
pkgdesc="A team of agents for every engineer — Devin Desktop"
arch=('x86_64')
@@ -50,7 +50,7 @@
)
sha256sums=(
- 'f6c996b175c7d2d395f5bbec1d3708deda09f88cc9f9740c248351f8fd9e3b3b'
+ 'e4a8701930b08944efcb5f308604382e4ae57af16f750b8b46fd0244022fdb3f'
'74b6568385dbcbb8c0f118bd81c526ab019f91726dd7b7b15742c1ac0228cd13'
'9fffea94a75faca248102cd830508932a674f469c1b42d48e2387db45b81cb33'
'a6d17d4f506181b3061dbdc882e258ca494a5f84636694bba1742c3a8c7f1c5e'

Scan history

Scanned at (UTC)SeverityRules
2026-09-17 03:24:22 Medium 2
2026-09-17 00:27:14 Medium 2
2026-09-16 00:03:17 Medium 2
2026-09-15 17:20:16 Medium 2
2026-09-15 00:25:31 Medium 2
2026-09-14 00:27:57 Medium 2
2026-09-13 00:19:54 Medium 2
2026-09-12 00:25:17 Medium 2
2026-09-11 17:22:59 Medium 2
2026-09-11 00:19:22 Medium 2
2026-09-10 00:22:44 Medium 2
2026-09-09 03:18:52 Medium 2
2026-09-09 00:04:09 Medium 2
2026-09-08 00:18:08 Medium 2
2026-09-07 00:30:15 Medium 2
2026-09-06 00:17:06 Medium 2
2026-09-05 00:16:27 Medium 2
2026-09-04 00:03:13 Medium 2
2026-09-03 00:15:47 Medium 2
2026-09-02 00:02:31 Medium 2

Report a package

Reports go to the AURWatch maintainer (one person) and are read by hand. No login required.

0 / 4000
Your suggestion