Automated Analysis != Safety. This is a Developer Transparency Tool.
Inspector

Cloudron community app transparency reports

Inspect a Cloudron community app `CloudronVersions.json` feed. Repository analysis is derived from the package metadata in that feed, and the report stays intentionally conservative: it surfaces what the package appears to do, but it does not certify safety.

What this checks
CHECKS EXPLAINED
Checks Explained
Metadata links and missing fields
Reads the Cloudron feed metadata, checks whether important links are valid, and notes when required fields are missing.
Dockerfile command patterns
Scans Docker build steps for risky commands such as destructive deletes, world-writable permissions, or remote scripts piped into a shell.
Runtime shell network calls
Looks through startup shell scripts for commands like curl, wget, nc, or ssh that may contact remote systems during runtime.
Privilege escalation and credential leakage
Flags startup-script patterns that touch privileged system paths, invoke sudo, or combine secrets with outbound commands.
Feed vs repo version drift
Compares the version published in CloudronVersions.json with the version found in the package repository when that repository can be identified reliably.
  • Metadata links and missing fields
  • Dockerfile command patterns
  • Runtime shell network calls
  • Privilege escalation and credential leakage
  • Feed vs repo version drift
Refresh
Example inputs
https://communityapps.appx.uk/cloudron-notediscovery/CloudronVersions.json
https://raw.githubusercontent.com/BrutalBirdie/cloudron-tachyon-app/refs/heads/master/CloudronVersions.json
https://communityapps.appx.uk/cloudron-ocular/CloudronVersions.json
Generated Report

Meilisearch

Lightning-fast, typo-tolerant search API for your own apps and data

Score
60/100
60 reached40 still requires deeper inspection
Automated checks can score at most 70/100. The remaining 30 points require deep inspection.
This tool is for informational purposes only. Use at your own risk.
Safety Flags
1
Fail
1
Unsure
8
Pass
Master Info
packageUrl
Not available
Repository
Not available
Packager
OrcVole
minBox
9.1.0
Version
1.0.3
Tags
searchapideveloper
Detailed Checklist
packageUrl link is present and well formed when required (7/7)
pass
No `packageUrl` declared. This is valid for packages targeting minBoxVersion below 10.
Website link is present and well formed (7/7)
pass
https://github.com/OrcVole/meilisearch-cloudron
Metadata and README links avoid insecure HTTP (7/7)
pass
No HTTP links found.
Metadata and README links avoid URL shorteners (7/7)
pass
No shortener links found.
Cloudron feed version matches the repository manifest (7/7)
pass
Feed and repo both report 1.0.3.
Repository content was fetched for static analysis (7/7)
pass
https://github.com/OrcVole/meilisearch-cloudron @ 9a1eada902ff0ffb0c67d4386daab541a620ee6b
Dockerfile scan did not detect clearly suspicious commands (7/7)
pass
No Dockerfile red flags found.
Runtime shell scripts avoid suspicious outbound network calls (4/7)
unsure
backup-snapshot.sh:75 Network-capable command found in a runtime shell script. backup-snapshot.sh:80 Network-capable command found in a runtime shell script. backup-snapshot.sh:91 Network-capable command found in a runtime shell script. start.sh:261 Network-capable command found in a runtime shell script. start.sh:281 Network-capable command found in a runtime shell script. start.sh:459 Network-capable command found in a runtime shell script. test/gate2.sh:17 Network-capable command found in a runtime shell script. test/gate2.sh:23 Network-capable command found in a runtime shell script. test/gate2.sh:36 Network-capable command found in a runtime shell script. test/gate2.sh:53 Network-capable command found in a runtime shell script. test/secret-scan.sh:227 Network-capable command found in a runtime shell script. test/secret-scan.sh:228 Network-capable command found in a runtime shell script. test/secret-scan.sh:229 Network-capable command found in a runtime shell script. test/secret-scan.sh:232 Network-capable command found in a runtime shell script. test/secret-scan.sh:243 Network-capable command found in a runtime shell script. test/secret-scan.sh:248 Network-capable command found in a runtime shell script. test/smoke.sh:74 Network-capable command found in a runtime shell script. test/smoke.sh:101 Network-capable command found in a runtime shell script. test/smoke.sh:106 Network-capable command found in a runtime shell script. test/smoke.sh:112 Network-capable command found in a runtime shell script. test/smoke.sh:117 Network-capable command found in a runtime shell script. test/smoke.sh:148 Network-capable command found in a runtime shell script.
Runtime shell scripts avoid privilege escalation patterns (0/7)
fail
test/secret-scan.sh:156 Privileged command or direct system-path modification detected in startup script. test/secret-scan.sh:227 Privileged command or direct system-path modification detected in startup script. test/secret-scan.sh:228 Privileged command or direct system-path modification detected in startup script. test/secret-scan.sh:229 Privileged command or direct system-path modification detected in startup script. test/secret-scan.sh:232 Privileged command or direct system-path modification detected in startup script. test/secret-scan.sh:257 Privileged command or direct system-path modification detected in startup script.
Runtime shell scripts avoid credential leakage patterns (7/7)
pass
No credential leakage patterns found in scanned shell scripts.
Raw Findings
Flagged lines are highlighted directly in the code snippet.
28 findings
backup-snapshot.sh:75
medium
Network-capable command found in a runtime shell script.
73
74# Is the instance actually up? A dead app must cost one connection timeout, not ten minutes.
75if ! curl -fsS -m 15 -o /dev/null "${ENDPOINT}/health" 2>/dev/null; then
76 record skipped "no healthy response from ${ENDPOINT}/health; app stopped or unreachable"
77 exit 0
backup-snapshot.sh:80
medium
Network-capable command found in a runtime shell script.
78fi
79
80RESPONSE="$(curl -fsS -m 60 -X POST "${ENDPOINT}/snapshots" \
81 -H "Authorization: Bearer ${KEY}" 2>/dev/null || true)"
82TASK_UID="$(printf '%s' "${RESPONSE}" | jq -r '.taskUid // empty' 2>/dev/null || true)"
backup-snapshot.sh:91
medium
Network-capable command found in a runtime shell script.
89STATUS=unknown
90while (( $(date +%s) < DEADLINE )); do
91 STATUS="$(curl -fsS -m 15 -H "Authorization: Bearer ${KEY}" \
92 "${ENDPOINT}/tasks/${TASK_UID}" 2>/dev/null \
93 | jq -r '.status // "unreachable"' 2>/dev/null || echo unreachable)"
start.sh:261
medium
Network-capable command found in a runtime shell script.
259 return 1
260 fi
261 if curl -fsS -m 5 -o /dev/null "${LOCAL}/health" 2>/dev/null; then healthy=yes; break; fi
262 sleep 2
263 done
start.sh:281
medium
Network-capable command found in a runtime shell script.
279 return 1
280 fi
281 status="$(curl -fsS -m 10 -H "Authorization: Bearer ${MEILI_MASTER_KEY}" \
282 "${LOCAL}/tasks?types=upgradeDatabase&limit=1" 2>/dev/null \
283 | jq -r '.results[0].status // "none"' 2>/dev/null || echo unreachable)"
start.sh:459
medium
Network-capable command found in a runtime shell script.
457 marker_deadline=$(( $(date +%s) + HEALTH_TIMEOUT ))
458 while (( $(date +%s) < marker_deadline )); do
459 if curl -fsS -m 5 -o /dev/null "${LOCAL}/health" 2>/dev/null; then
460 printf '%s\n' "${VERSION}" > "${MARKER}"
461 chown cloudron:cloudron "${MARKER}" || true
test/gate2.sh:17
medium
Network-capable command found in a runtime shell script.
15
16# A. identity: which engine version is actually serving
17V=$(curl -sf "${AU[@]}" "$H/version" | jq -r .pkgVersion)
18note "serving pkgVersion=${V}"
19if [ -n "$WANT" ]; then [ "$V" = "$WANT" ] && ok "version ${V} = expected ${WANT}" || bad "version ${V} != expected ${WANT}"; fi
test/gate2.sh:23
medium
Network-capable command found in a runtime shell script.
21# B. [1.52.0-specific] the new experimental flag exists after, and NOT before.
22# Differential proof: the same jq 'has' check flips across the update.
23EF=$(curl -sf "${AU[@]}" "$H/experimental-features")
24HASTS=$(echo "$EF" | jq 'has("tasksStreamingRoute")')
25if [ "$LEG" = after ]; then
test/gate2.sh:36
medium
Network-capable command found in a runtime shell script.
34
35# C. data preservation: per-index document counts, recorded before, compared after.
36STATS=$(curl -sf "${AU[@]}" "$H/stats")
37echo "$STATS" | jq -S '{indexes: (.indexes | map_values(.numberOfDocuments))}' > "$OUT"
38note "index doc counts: $(jq -c .indexes "$OUT")"
test/gate2.sh:53
medium
Network-capable command found in a runtime shell script.
51# D. [self-datastore migration] the upgradeDatabase task: THE assertion for the supervised
52# upgrade. On the old version the type itself is invalid (400) — that IS the before-leg proof.
53TQ=$(curl -s -o /tmp/gate2-meili-task.json -w '%{http_code}' "${AU[@]}" "$H/tasks?types=upgradeDatabase")
54if [ "$LEG" = after ]; then
55 ST=$(jq -r '.results[0].status // "ABSENT"' /tmp/gate2-meili-task.json)
test/secret-scan.sh:156
high
Privileged command or direct system-path modification detected in startup script.
154 # it does not ship is simply absent. Only then are the container-side hits for these exact paths
155 # dropped, and only for these exact paths, in the same spirit as the pinned SSH keys below.
156 RUNTIME_PATHS=(/etc/hosts /etc/resolv.conf /etc/hostname)
157 RUNFLAGS=(--network=none) # no DNS/hosts wiring either engine can avoid
158 [[ "$CRI" == *podman* ]] && RUNFLAGS+=(--no-hosts) # podman only; docker always injects
test/secret-scan.sh:227
high
Privileged command or direct system-path modification detected in startup script.
225 # hashes whenever the base image digest changes.
226 declare -A PINNED_SSH=(
227 [/etc/ssh/ssh_host_ecdsa_key]=677458f83d985da3fd7cdd208e90e4eac09da5be205425a5f96a6242dc985c33
228 [/etc/ssh/ssh_host_ed25519_key]=0c575ce8d9ba487b05cc473fad4b0650fb950181028e6ac19796f86f56f22a7a
229 [/etc/ssh/ssh_host_rsa_key]=ae0ea8087e90baf138d277ca52b6cf47b5010adc0e5bd84236713eee1b85de85
test/secret-scan.sh:227
medium
Network-capable command found in a runtime shell script.
225 # hashes whenever the base image digest changes.
226 declare -A PINNED_SSH=(
227 [/etc/ssh/ssh_host_ecdsa_key]=677458f83d985da3fd7cdd208e90e4eac09da5be205425a5f96a6242dc985c33
228 [/etc/ssh/ssh_host_ed25519_key]=0c575ce8d9ba487b05cc473fad4b0650fb950181028e6ac19796f86f56f22a7a
229 [/etc/ssh/ssh_host_rsa_key]=ae0ea8087e90baf138d277ca52b6cf47b5010adc0e5bd84236713eee1b85de85
test/secret-scan.sh:228
high
Privileged command or direct system-path modification detected in startup script.
226 declare -A PINNED_SSH=(
227 [/etc/ssh/ssh_host_ecdsa_key]=677458f83d985da3fd7cdd208e90e4eac09da5be205425a5f96a6242dc985c33
228 [/etc/ssh/ssh_host_ed25519_key]=0c575ce8d9ba487b05cc473fad4b0650fb950181028e6ac19796f86f56f22a7a
229 [/etc/ssh/ssh_host_rsa_key]=ae0ea8087e90baf138d277ca52b6cf47b5010adc0e5bd84236713eee1b85de85
230 )
test/secret-scan.sh:228
medium
Network-capable command found in a runtime shell script.
226 declare -A PINNED_SSH=(
227 [/etc/ssh/ssh_host_ecdsa_key]=677458f83d985da3fd7cdd208e90e4eac09da5be205425a5f96a6242dc985c33
228 [/etc/ssh/ssh_host_ed25519_key]=0c575ce8d9ba487b05cc473fad4b0650fb950181028e6ac19796f86f56f22a7a
229 [/etc/ssh/ssh_host_rsa_key]=ae0ea8087e90baf138d277ca52b6cf47b5010adc0e5bd84236713eee1b85de85
230 )
test/secret-scan.sh:229
high
Privileged command or direct system-path modification detected in startup script.
227 [/etc/ssh/ssh_host_ecdsa_key]=677458f83d985da3fd7cdd208e90e4eac09da5be205425a5f96a6242dc985c33
228 [/etc/ssh/ssh_host_ed25519_key]=0c575ce8d9ba487b05cc473fad4b0650fb950181028e6ac19796f86f56f22a7a
229 [/etc/ssh/ssh_host_rsa_key]=ae0ea8087e90baf138d277ca52b6cf47b5010adc0e5bd84236713eee1b85de85
230 )
231 ssh_listing="$("$CRI" run --rm --user 0 "${RUNFLAGS[@]}" --entrypoint /bin/bash "$IMAGE" \
test/secret-scan.sh:229
medium
Network-capable command found in a runtime shell script.
227 [/etc/ssh/ssh_host_ecdsa_key]=677458f83d985da3fd7cdd208e90e4eac09da5be205425a5f96a6242dc985c33
228 [/etc/ssh/ssh_host_ed25519_key]=0c575ce8d9ba487b05cc473fad4b0650fb950181028e6ac19796f86f56f22a7a
229 [/etc/ssh/ssh_host_rsa_key]=ae0ea8087e90baf138d277ca52b6cf47b5010adc0e5bd84236713eee1b85de85
230 )
231 ssh_listing="$("$CRI" run --rm --user 0 "${RUNFLAGS[@]}" --entrypoint /bin/bash "$IMAGE" \
test/secret-scan.sh:232
high
Privileged command or direct system-path modification detected in startup script.
230 )
231 ssh_listing="$("$CRI" run --rm --user 0 "${RUNFLAGS[@]}" --entrypoint /bin/bash "$IMAGE" \
232 -c 'for f in /etc/ssh/ssh_host_*_key; do [ -e "$f" ] && sha256sum "$f"; done' 2>/dev/null)"
233 found=0; pinned_ok=0
234 while IFS= read -r line; do
test/secret-scan.sh:232
medium
Network-capable command found in a runtime shell script.
230 )
231 ssh_listing="$("$CRI" run --rm --user 0 "${RUNFLAGS[@]}" --entrypoint /bin/bash "$IMAGE" \
232 -c 'for f in /etc/ssh/ssh_host_*_key; do [ -e "$f" ] && sha256sum "$f"; done' 2>/dev/null)"
233 found=0; pinned_ok=0
234 while IFS= read -r line; do
test/secret-scan.sh:243
medium
Network-capable command found in a runtime shell script.
241 shp="$(printf '%s\n' "$shp" | grep -vF "$f:" || true)" # drop ONLY this verified exact path
242 else
243 emit ssh-key "$f sha256=$h is NOT a pinned base host key (new, changed or extra: treat as a leak)"
244 fi
245 done <<< "$ssh_listing"
test/secret-scan.sh:248
medium
Network-capable command found in a runtime shell script.
246 echo " host keys: $found found, $pinned_ok pinned-ok, ${#PINNED_SSH[@]} expected"
247 [[ "$found" -eq "${#PINNED_SSH[@]}" && "$pinned_ok" -eq "${#PINNED_SSH[@]}" ]] \
248 || emit ssh-key "host key count mismatch: $found found, $pinned_ok pinned-ok, ${#PINNED_SSH[@]} expected"
249
250 # DISTRO-GENERATED PLACEHOLDER KEYS. Some Debian packages mint a self-signed key in their
test/secret-scan.sh:257
high
Privileged command or direct system-path modification detected in startup script.
255 # Nothing else is exempt: a key at any other path is still a finding, including a second key in
256 # the same directory. Add a path here only after confirming the package does not reference it.
257 PLACEHOLDER_KEYS=(/etc/ssl/private/ssl-cert-snakeoil.key /etc/prosody/certs/localhost.key)
258 for k in "${PLACEHOLDER_KEYS[@]}"; do
259 if printf '%s' "$shp" | grep -qF "$k:"; then
test/smoke.sh:74
medium
Network-capable command found in a runtime shell script.
72 local n="$1" code
73 for i in $(seq 1 "$n"); do
74 code=$(curl -s -m 5 -o /dev/null -w '%{http_code}' "$B/health" 2>/dev/null || echo 000)
75 [ "$code" = "200" ] && return 0
76 sleep 2
test/smoke.sh:101
medium
Network-capable command found in a runtime shell script.
99# 3. THE SECURITY CONTRACT: production mode. Every route but /health must demand a key. A 200 on
100# /indexes without a key means the API is open to anyone who can reach the domain.
101code=$(curl -s -m 5 -o /dev/null -w '%{http_code}' "$B/indexes" 2>/dev/null || echo 000)
102[ "$code" = "401" ] || [ "$code" = "403" ] && ok "/indexes rejects an unkeyed request (HTTP $code)" \
103 || bad "/indexes returned HTTP $code without a key (expected 401/403 — is MEILI_ENV=production?)"
test/smoke.sh:106
medium
Network-capable command found in a runtime shell script.
104
105# 4. The key actually works, so 3 is not merely "everything is broken".
106code=$(curl -s -m 5 -o /dev/null -w '%{http_code}' -H "Authorization: Bearer ${KEY}" "$B/indexes" 2>/dev/null || echo 000)
107[ "$code" = "200" ] && ok "/indexes accepts the master key" || bad "/indexes rejected the master key (HTTP $code)"
108
test/smoke.sh:112
medium
Network-capable command found in a runtime shell script.
110# assertion that proves the store is writable and the engine actually works, rather than that
111# it merely answered a health probe.
112curl -s -m 10 -X POST "$B/indexes/smoke/documents" \
113 -H "Authorization: Bearer ${KEY}" -H 'content-type: application/json' \
114 -d '[{"id":1,"title":"smoke test document"}]' >/dev/null 2>&1
test/smoke.sh:117
medium
Network-capable command found in a runtime shell script.
115hit=0
116for i in $(seq 1 20); do
117 r=$(curl -s -m 5 -X POST "$B/indexes/smoke/search" -H "Authorization: Bearer ${KEY}" \
118 -H 'content-type: application/json' -d '{"q":"smoke"}' 2>/dev/null)
119 echo "$r" | grep -q '"id":1' && { hit=1; break; }
test/smoke.sh:148
medium
Network-capable command found in a runtime shell script.
146 [ -n "$KEY2" ] && [ "$KEY" = "$KEY2" ] && ok "master key survived a restart unchanged" \
147 || bad "master key CHANGED across a restart — every client API key would be invalidated"
148 code=$(curl -s -m 5 -o /dev/null -w '%{http_code}' -H "Authorization: Bearer ${KEY}" "$B/indexes/smoke" 2>/dev/null || echo 000)
149 [ "$code" = "200" ] && ok "indexed data survived the restart" || bad "index missing after restart (HTTP $code)"
150else
0.0.11