storebound@0.8.77
CAUTION· install onlyPublisher claims: "Take a mobile app or game from nothing to Submit for review on Google Play and the App Store: app records, listings in every language, in-app products and subscriptions with regional prices, every store questionnaire (incl. account deletion and App Review" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Nothing executable in the bundle ran; the trace covers the install step only.- Tested
- every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (1 scenario; nothing executable in the bundle ran; the trace covers the install step only) on 2026-11-11 and scored it 72/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Privileged sudo command; Hidden zero-width characters detected; Privileged sudo command. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 1 scenarios · 0 deviationsStatic findings
const anrDev = parseMetricRows(await g.json('POST', `${app}/anrRateMetricSet:query`, metricQuery(['userPerceivedAnrRate', 'distinctUsers'], end, 28, ['deviceModel'])));Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.if (missing) console.log(`\n${missing} folder(s) not found (moved to another computer or folder?): storebound apps relink --dry finds them by path and app name`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…dy) : req.body ? `<${req.body.length} bytes>` : undefined } }); else console.log(`dry run (${decision.why}): nothing sent\n${kind === 'owner' ? `owner only: this ${ownerReason(st, op.id, op.method)}; sending also asks you to type the opera…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.// same code runs on Node 20+ (`npx storebound`, the dist/storebound.mjs bundle) and on Bun (`bunx storebound`, theFix: Pin versions and sources; vendor anything fetched at install time./** One install command of a tool, run only with --yes; sudo / admin commands are printed, never run. */Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// npx / bunx run a cached copy: start the newest storebound instead (cli/lib/self-update.ts)Fix: Pin versions and sources; vendor anything fetched at install time.const crash = parseMetricRows(await g.json('POST', `${app}/crashRateMetricSet:query`, metricQuery(CRASH_METRICS, end, days)));Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.storebound api apple|play <operationId | METHOD path> [--param k=v ...] [--body file.json] [--upload file]Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.const anr = parseMetricRows(await g.json('POST', `${app}/anrRateMetricSet:query`, metricQuery(ANR_METRICS, end, days)));Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.const s = text.replace(/^/, '');Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.console.log('\nTo install what is missing (storebound doctor --install <tool> --yes runs the first one; sudo / admin ones you run yourself):');Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.…i; if command -v storebound >/dev/null 2>&1; then exec storebound mcp; fi; exec npx -y storebound@latest mcp" ] } } } Fix: Pin versions and sources; vendor anything fetched at install time.// never for mcp / serve: a client waits for the handshake on stdout, and a second npx download can outlast its timeoutFix: Pin versions and sources; vendor anything fetched at install time.if (ph.length) note(`credentials: ${ph.join(', ')} still hold template placeholders (env or .storebound/credentials.json): treated as missing; put the real value in or leave it empty`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.const crashDev = parseMetricRows(await g.json('POST', `${app}/crashRateMetricSet:query`, metricQuery(['userPerceivedCrashRate', 'distinctUsers'], end, 28, ['deviceModel'])));Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.storebound desktop, Releases › Send for review: the dry run of the submission with the build picked by number and the confirm stepFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.// storebound api apple|play <operationId | METHOD path> [--param k=v ...] [--body file.json] [--upload file]Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.- CLI: `storebound <command>` (`storebound help`; outside the plugin: `npx storebound` on Node 20+ or `bunx storebound` on Bun); config `storebound.config.ts`, credentials in env or `.storebound/`.Fix: Pin versions and sources; vendor anything fetched at install time.for the App Review demo account (`reviewDemoAccount` in `.storebound/credentials.json`): the owner puts it there.Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.// node_modules; else, under Bun, this toolchain's bin/storebound by absolute path, under Node (`npx storeboundFix: Pin versions and sources; vendor anything fetched at install time.- CLI: `storebound <command>` (`storebound help`; outside the plugin: `npx storebound` on Node 20+ or `bunx storebound` on Bun); config `storebound.config.ts`, credentials in env or `.storebound/`.Fix: Pin versions and sources; vendor anything fetched at install time.<summary>More screens: portfolio, growth charts, prices, checks, TestFlight, console plan</summary> ![Portfolio: every app of every studio with its state on botFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.// install`: the toolchain sits in npx's cache, which can be cleared) `npx -y storebound@<this version> mcp`Fix: Pin versions and sources; vendor anything fetched at install time.if (st.staleness.stale) note(`${store}: ${staleMessage(st.path, st.staleness, st.copied)}. Set build.prebuild (e.g. "npm run build && npx cap sync") so apple build / play build refresh them`);Fix: Pin versions and sources; vendor anything fetched at install time.// MCP command: `bunx storebound mcp` (`npx storebound mcp` when run with Node) when the project has storebound inFix: Pin versions and sources; vendor anything fetched at install time.for the App Review demo account (`reviewDemoAccount` in `.storebound/credentials.json`): the owner puts it there.Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.return { tool, command, runnable: !!command && !/^sudo |\| *(ba)?sh|^Install /.test(command) };Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.const file = join(mkdtempSync(join(tmpdir(), 'storebound-mcp-')), json ? 'output.json' : 'output.txt');Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why./** Shell command run in the project root before the archive / bundle, e.g. "npm run build && npx cap sync" for aFix: Pin versions and sources; vendor anything fetched at install time.e.push('build.prebuild: a shell command run in the project root before apple build / play build, e.g. "npm run build && npx cap sync"');Fix: Pin versions and sources; vendor anything fetched at install time./** Shell command run in the project root before the archive / bundle, e.g. "npm run build && npx cap sync" for aFix: Pin versions and sources; vendor anything fetched at install time.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
No advisories in OSV for storebound@0.8.77 as of 3d ago. This is the package itself, not its dependencies.
What would make this Verified
8 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim crtkafa: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Hidden instructions≈ +6 on the totalRemove HTML comments, zero-width characters and white-on-white text that carry instructions. Everything the agent is meant to read should be visible to the person reading the file.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Hidden zero-width characters detected≈ +4 on the totalKeep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.
- npx invocation of non-well-known package≈ +2 on the totalPin versions and sources; vendor anything fetched at install time.