Announcing Beacon: Self-improving memory for coding agents
← All skills
Skill

write-voyager-plugin

skill:voyager-crew/voyager#write-voyager-plugin

Voyager plugin authoring: write and check a local plugin (a JSON manifest plus CSS) for the Voyager browser extension. Use when the user wants to change how Gemini, AI Studio, ChatGPT, Claude, DeepSeek or Kimi looks or is laid out through Voyager; to add a small feature Voyager ships as a primitive (copy button, word count, collapse, diagrams, draft save, Ctrl+Enter send, timeline); or to check or fix a plugin that fails to import.

Verdict
Suspicious

Risky behavior the analysis could not rule out.

Analyzed Oct 27, 2026, 22:20 UTC at a8adddf

Dispute security verdict

If you believe this verdict is incorrect, submit a dispute and we'll review it.

4
findings
high
highest severity
1
threat classes
4,224
files scanned
56/56
checks satisfied
0
package advisories

Why this verdict

  • suspicious: finding skill:docs/public/skills/write-voyager-plugin:docs/public/skills/write-voyager-plugin/SKILL.md:14:SUPPLY
  • suspicious: finding skill:docs/public/skills/write-voyager-plugin:docs/public/skills/write-voyager-plugin/SKILL.md:27:SUPPLY
  • suspicious: finding skill:docs/public/skills/write-voyager-plugin:docs/public/skills/write-voyager-plugin/SKILL.md:28:SUPPLY
  • suspicious: finding skill:docs/public/skills/write-voyager-plugin:docs/public/skills/write-voyager-plugin/SKILL.md:30:SUPPLY

Security findings 4

Supply chain

highContextual riskhigh confidence

The skill conditionally instructs the agent to fetch its instruction files from the mutable remote host voyager.nagi.fun whenever the local copies are missing, so the instructions the agent follows can be changed server-side after review.

fetch it from https://voyager.nagi.fun/skills/write-voyager-plugin/<path>
conceal:remotetrigger:conditionalvector:instruction
Counter-argument considered

The quote matches the claim: the skill body instructs the agent to pull its companion instruction files from voyager.nagi.fun whenever local copies are absent. Strongest counter-case is that the fetch is openly declared in the same sentence (undeclared gate fails), but disclosure is not a listed carve-out and nothing pins, checksums, or verifies the remote content, so the post-review server-side mutation vector stands.

Supply chain

mediumContextual riskmedium confidence

The workflow directs the agent to run npx create-voyager-plugin@latest init and check before and after writing the plugin, downloading and executing the unpinned latest version of an npm package from the registry at runtime.

`npx create-voyager-plugin@latest init my-plugin --site <site>`
vector:instruction
Counter-argument considered

Step 1 of the workflow is a concrete instruction to npx-install and execute create-voyager-plugin at the unpinned @latest tag; the carve-out covers pinned official-registry installs only, and the manual 'Without Node' fallback neither removes the npx instruction nor pins a version, so the claim survives despite being openly declared.

Supply chain

mediumContextual risklow confidence

The workflow instructs the agent to run the npm package create-voyager-plugin at the unpinned @latest tag to scaffold and check the plugin, downloading and executing mutable remote code as an authoring step.

npx create-voyager-plugin@latest init my-plugin --site <site>
vector:instruction
Counter-argument considered

The quote is the same init instruction as the prior finding, so this is largely duplicative, but no listed refutation ground applies: the quote means exactly what the claim says, the unpinned @latest execution is not a carve-out (only pinned installs are), and no mitigation pins or verifies the package, so it stands.

Supply chain

mediumContextual riskhigh confidence

The skill's mandatory workflow instructs the agent to execute `npx create-voyager-plugin@latest` (init and check), downloading and running whatever code is currently published under that npm name with no version pin, so supply-chain code execution beyond authoring JSON+CSS is introduced and cannot be verified at the pinned commit.

Run `npx create-voyager-plugin@latest check my-plugin`.
vector:codevector:instruction
Counter-argument considered

Step 3 mandatorily runs the checker via the unpinned @latest tag, so whatever code npm currently serves under that name is downloaded and executed; the 'offline' wording describes the check itself, not the registry download, and no pin or verification exists, so the unverifiable-at-commit execution claim holds. The behavior is declared, but declaration alone is not a carve-out here.

Open questions 3

What the analysis could not settle from the code alone.

Whether voyager.nagi.fun and the npm package create-voyager-plugin are authentic vendor-controlled channels for Voyager cannot be verified from the artifact; if they are not, the remote doc fetch and the npx execution become attacker-controlled.
Supply chain
Detector DET:c4ce564cdce7838c cites the claim 'No web fonts, no remote images.' at SKILL.md line 14, but the shown span at that line contains only the remote-fetch instruction; the claim text is not visible in any shown unit, so the alleged contradiction between a no-remote-resources claim and fetching reference files from voyager.nagi.fun cannot be confirmed or refuted from the evidence shown.
Supply chain
Detector DET:0d047508f206c9e9 claims a PERSIST contradiction in sites/gemini.md (a 'counterBadge' description contradicted by file_write '/'), but the counterBadge text appears nowhere in the shown span and the visible line-28 content only explains how draftSave keys drafts by pathname; no file-write instruction is visible, so the lead is unconfirmed.
Persistence

Execution chain 23

What it calls, runs, installs, reads and writes, with the line that does it.

Network calls 1

Packages 2

npm:create-voyager-plugin@latest
npm:create-voyager-plugin@latest

URLs 19

https://*.frame.claudeusercontent.com/*
https://voyager.nagi.fun/plugin.schema.json
https://voyager.nagi.fun/skills/write-voyager-plugin/
https://voyager.nagi.fun/skills/write-voyager-plugin/SKILL.md

Coverage gaps 5

Parts of the artifact the static analysis could not fully examine.

context:unanalyzable_binary binary content is only byte-scanned
docs/public/assets/default-model.mp4
context:unanalyzable_binary binary content is only byte-scanned
docs/public/assets/hide-gem-list.mp4
context:unanalyzable_binary binary content is only byte-scanned
docs/public/assets/hide-my-stuff.mp4
context:unanalyzable_binary binary content is only byte-scanned
docs/public/assets/sidebar-auto-hide.mp4
context:unanalyzable_binary binary content is only byte-scanned
docs/public/favicon.ico