Agent skill

Godot Screenshot

by rayxuln in rayxuln/hastur-operation-plugin

Take screenshots of the Godot editor window or the running game window via the Hastur broker-server remote executor.

MITAuto-check passedGame Development

Install Godot Screenshot

skills CLI
$ npx skills add rayxuln/hastur-operation-plugin --skill godot-screenshot -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install rayxuln/hastur-operation-plugin godot-screenshot --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/rayxuln/hastur-operation-plugin.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/godot-screenshot .claude/skills/godot-screenshot && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
godot-screenshot
GitHub stars
241
Token cost
~3.2k tokens
SKILL.md length
1,092 words
Files
1
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Take screenshots of the Godot editor window or the running game window via the Hastur broker-server remote executor.

  • Works in 3 steps: godot-remote-executor skill loaded —… → Auth token and base URL — same… → At least one connected executor — editor…
  • The user asks to capture
  • SKILL.md covers Prerequisites, How Viewport Capture Works, Screenshot Workflows and Complete Workflow: Editor +…, plus 4 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Godot Screenshot is an agent skill from rayxuln/hastur-operation-plugin. Take screenshots of the Godot editor window or the running game window via the Hastur broker-server remote executor. Use this skill whenever the user asks to capture, save, or take a screenshot of the Godot editor or game runtime — including phrases like "截图", "screenshot", "capture screen", "save a picture of the editor/game", "snap the viewport", or any request involving saving the visual state of a running Godot instance. Also trigger when the user wants to automate periodic screenshots or compare visual…

Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Game Development, covering Game development. It works with Godot. The repository describes itself as: A plugin providing ability for executing any code on Godot Editor. So that any coding agent can do any operations with Godot Editor. This version is for GDScript. It can execute… The licence is MIT.

When your agent uses it

  • The user asks to capture
  • Take a screenshot of the Godot editor
  • Game runtime — including phrases like 截图
  • Save a picture of the editor/game

Example prompts

  • “screenshot”
  • “capture screen”
  • “save a picture of the editor/game”
  • “/godot-screenshot”

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. godot-remote-executor skill loaded — understand the executor API, snippet mode, auth tokens, and error handling
  2. Auth token and base URL — same credentials used by godot-remote-executor
  3. At least one connected executor — editor for editor screenshots, game for game screenshots

What it can do on your machine

Read from SKILL.md and the folder at commit eedff7f. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are gdscript).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Godot Screenshot loads about 3.2k tokens when it runs. Until then it costs about 179 tokens; SKILL.md has 1,092 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~179
When it runs · the whole SKILL.md, loaded when a task matches
~3.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from rayxuln/hastur-operation-plugin at commit eedff7f, republished under its MIT licence (© rayxuln). 1,092 words, ~3,220 tokens.

Download SKILL.mdSave it as .claude/skills/godot-screenshot/SKILL.md (or your agent's skills folder).
name
godot-screenshot
description
Take screenshots of the Godot editor window or the running game window via the Hastur broker-server remote executor. Use this skill whenever the user asks to capture, save, or take a screenshot of the Godot editor or game runtime — including phrases like "截图", "screenshot", "capture screen", "save a picture of the editor/game", "snap the viewport", or any request involving saving the visual state of a running Godot instance. Also trigger when the user wants to automate periodic screenshots or compare visual output across runs. This skill depends on the godot-remote-executor skill — always load that skill first to understand the executor API, auth requirements, and code execution mechanics.

Godot Screenshot

This skill captures screenshots from a running Godot editor or game instance and saves them as PNG files. It depends on the godot-remote-executor skill — load it first so you understand how to discover executors, authenticate, and execute GDScript code.

Prerequisites

Before using this skill, you must have:

  1. godot-remote-executor skill loaded — understand the executor API, snippet mode, auth tokens, and error handling
  2. Auth token and base URL — same credentials used by godot-remote-executor
  3. At least one connected executor — editor for editor screenshots, game for game screenshots

How Viewport Capture Works

The Godot API for capturing screenshots relies on the viewport's texture. The correct approach is:

gdscript
var tree = Engine.get_main_loop() as SceneTree
var img = tree.root.get_texture().get_image()

This grabs the root Viewport's texture, converts it to an Image, and then you can call img.save_png(path) to write it to disk.

Why tree.root and not get_viewport()? Because in snippet mode your code runs inside a RefCounted instance (not a Node). The get_viewport() convenience method only exists on Node — it is NOT available on RefCounted, EditorInterface, or other non-Node objects. Always use Engine.get_main_loop() to get the SceneTree, then access tree.root to get the root Viewport.

Similarly, EditorInterface does not have a get_viewport() method either. The universal approach that works in all contexts is Engine.get_main_loop().root.

Screenshot Workflows

Editor Screenshot

This captures the entire Godot editor window.

Preconditions: An editor executor (type: "editor") must be connected.

gdscript
var tree = Engine.get_main_loop() as SceneTree
var img = tree.root.get_texture().get_image()

var dict = Time.get_datetime_dict_from_system()
var date_str = "%04d-%02d-%02d" % [dict["year"], dict["month"], dict["day"]]
var time_str = "%02d-%02d-%02d" % [dict["hour"], dict["minute"], dict["second"]]

var rel_path = ".temp/" + date_str + "-" + time_str + "-editor.png"
var abs_path = ProjectSettings.globalize_path("res://" + rel_path)

var dir_abs = ProjectSettings.globalize_path("res://.temp")
if not DirAccess.dir_exists_absolute(dir_abs):
	DirAccess.make_dir_recursive_absolute(dir_abs)

var err = img.save_png(abs_path)
executeContext.output("path", rel_path)
executeContext.output("result", "OK" if err == OK else "Error: " + str(err))
Game Screenshot

This captures the running game window.

Preconditions: A game executor (type: "game") must be connected. The game must already be running with the GameExecutor autoload registered.

gdscript
var tree = Engine.get_main_loop() as SceneTree
var img = tree.root.get_texture().get_image()

var dict = Time.get_datetime_dict_from_system()
var date_str = "%04d-%02d-%02d" % [dict["year"], dict["month"], dict["day"]]
var time_str = "%02d-%02d-%02d" % [dict["hour"], dict["minute"], dict["second"]]

var rel_path = ".temp/" + date_str + "-" + time_str + "-game.png"
var abs_path = ProjectSettings.globalize_path("res://" + rel_path)

var dir_abs = ProjectSettings.globalize_path("res://.temp")
if not DirAccess.dir_exists_absolute(dir_abs):
	DirAccess.make_dir_recursive_absolute(dir_abs)

var err = img.save_png(abs_path)
executeContext.output("path", rel_path)
executeContext.output("result", "OK" if err == OK else "Error: " + str(err))

If no game executor is available, you may need to launch the game first. See the "Launching the Game" section below.

Complete Workflow: Editor + Game Screenshots

When the user wants both screenshots, follow this sequence:

  1. Discover executors — GET /api/executors to find connected editor and game executors
  2. Take editor screenshot — execute the editor screenshot code on the editor executor
  3. Check for game executor — if no game executor is present, ask the user if they want to launch the game
  4. Launch game if needed — see "Launching the Game" below
  5. Wait for game executor — poll /api/executors every few seconds until a type: "game" executor appears
  6. Enable "Ignore Error Breaks" — see "Debugger Pitfalls" below; do this proactively before executing code on the game executor
  7. Take game screenshot — execute the game screenshot code on the game executor

Launching the Game

If the game is not running and the user wants it started, execute on the editor executor:

gdscript
var ei = Engine.get_singleton('EditorInterface')
ei.play_current_scene()
executeContext.output("result", "done")

After launching, wait ~5 seconds for the game process to start and the GameExecutor autoload to connect to the broker-server. Poll GET /api/executors until a type: "game" executor appears.

Other launch options:

  • ei.play_main_scene() — play the project's main scene
  • ei.play_custom_scene("res://path/to/scene.tscn") — play a specific scene

Debugger Pitfalls (Critical)

When executing code on the game executor, runtime errors will trigger Godot's built-in debugger, which automatically pauses the game process. This causes the executor request to time out (HTTP 504 after 30 seconds) because the game is frozen and cannot complete the execution.

Symptoms
  • POST /api/execute returns HTTP 504 timeout when targeting the game executor
  • The game window appears frozen
  • The editor's debugger panel shows the game is paused at a breakpoint/error
Prevention: Enable "Ignore Error Breaks"

Before executing any code on the game executor, proactively enable the "Ignore Error Breaks" setting. This prevents the debugger from pausing on script errors. Execute the following on the editor executor:

gdscript
var tree = Engine.get_main_loop() as SceneTree
var stack_trace_toolbar_path = tree.root.get_node("/root/@EditorNode@18094/@Panel@14/@VBoxContainer@15/DockHSplitMain/@VBoxContainer@28/DockVSplitCenter/@EditorBottomPanel@7422/Debugger/@TabContainer@8422/Session 1/@TabContainer@8425/Stack Trace/@HBoxContainer@8426")
var ignore_btn = stack_trace_toolbar_path.get_node("@Button@8432") as Button
ignore_btn.set_toggle_mode(true)
ignore_btn.set_pressed(true)
ignore_btn.emit_signal("pressed")
executeContext.output("ignore_error_breaks", "enabled")

Important caveat about this button:

The "Ignore Error Breaks" button (@Button@8432) is a plain Button with toggle_mode set to false by default. This means:

  • emit_signal("pressed") does NOT toggle its visual/functional state
  • set_pressed(true) is silently ignored because toggle_mode is false
  • set_pressed_no_signal(true) is also silently ignored

The only reliable way to activate it programmatically is:

  1. First call set_toggle_mode(true) to enable toggle behavior
  2. Then call set_pressed(true) to set the pressed state
  3. Then call emit_signal("pressed") to trigger the internal handler

Without step 1, steps 2 and 3 have no effect on the button state.

Note on node paths: The hardcoded node paths in the debugger toolbar (e.g., @EditorBottomPanel@7422, @TabContainer@8422) contain auto-generated numeric suffixes that may change between Godot sessions or versions. If the path stops working, you need to re-discover the debugger nodes by walking the editor's scene tree. The general path structure is:

/root/@EditorNode@.../@Panel@.../@VBoxContainer@.../DockHSplitMain/@VBoxContainer@.../DockVSplitCenter/@EditorBottomPanel@.../Debugger/@TabContainer@.../Session 1/@TabContainer@.../Stack Trace/@HBoxContainer@...

To re-discover the path, search for the "Stack Trace" tab and its toolbar by walking the tree looking for nodes named "Stack Trace" or buttons with tooltip "Ignore Error Breaks":

gdscript
var tree = Engine.get_main_loop() as SceneTree
var ei = Engine.get_singleton('EditorInterface')
var base = ei.get_base_control()

var stack = [[base, 0]]
var results = []
while stack.size() > 0:
	var pair = stack.pop_back()
	var node = pair[0]
	var depth = pair[1]
	if depth > 25:
		continue
	if node.name.find("Stack Trace") != -1:
		results.append(str(node.get_path()) + " (" + node.get_class() + ")")
	for child in node.get_children():
		stack.append([child, depth + 1])
for r in results:
	executeContext.output("stack_trace_node", r)

Then look for the @HBoxContainer child of the "Stack Trace" node — that's the toolbar. Enumerate its children to find buttons and their tooltips:

gdscript
var toolbar = tree.root.get_node("<path to Stack Trace's HBoxContainer>")
for child in toolbar.get_children():
	if child is BaseButton:
		executeContext.output("button", child.name + " tooltip=" + child.tooltip_text)

Match by tooltip text: "Ignore Error Breaks" for the ignore button, "Continue" for the continue button.

Show full SKILL.md (317 more words)Show less
Recovery: Unpause a Frozen Game

If the game is already paused by the debugger, you need to:

  1. Click "Continue" on the debugger toolbar (via the editor executor)
  2. Then enable "Ignore Error Breaks" as described above

The "Continue" button is in the same toolbar. After discovering the toolbar path (see above), find the button with tooltip "Continue" and activate it:

gdscript
var toolbar = tree.root.get_node("<path to Stack Trace's HBoxContainer>")
var continue_btn = toolbar.get_node("@Button@...")  # the one with tooltip "Continue"
continue_btn.emit_signal("pressed")

The Continue button is a normal (non-toggle) button, so emit_signal("pressed") works correctly.

Saving Files

Directory Creation

Always ensure the target directory exists before saving. The .temp/ directory may not exist in the project:

gdscript
var dir_abs = ProjectSettings.globalize_path("res://.temp")
if not DirAccess.dir_exists_absolute(dir_abs):
	DirAccess.make_dir_recursive_absolute(dir_abs)
Path Resolution

Use ProjectSettings.globalize_path("res://...") to convert a res:// path to an absolute filesystem path that Image.save_png() can write to. GDScript's Image.save_png() requires an absolute path.

File Naming Convention

Use the pattern <date>-<time>-<target>.png for filenames:

  • Date format: YYYY-MM-DD
  • Time format: HH-MM-SS
  • Target: editor or game

Example: .temp/2026-04-10-21-45-11-editor.png

Use Time.get_datetime_dict_from_system() to get the current date and time:

gdscript
var dict = Time.get_datetime_dict_from_system()
var date_str = "%04d-%02d-%02d" % [dict["year"], dict["month"], dict["day"]]
var time_str = "%02d-%02d-%02d" % [dict["hour"], dict["minute"], dict["second"]]
Always Check save_png Return Value

Image.save_png() returns an Error enum. Always check it:

gdscript
var err = img.save_png(abs_path)
executeContext.output("result", "OK" if err == OK else "Error: " + str(err))

Error code 7 (ERR_FILE_NOT_FOUND) typically means the directory doesn't exist. Error code 9 (ERR_FILE_BAD_PATH) means the path is malformed. See the Error enum table in the godot-remote-executor skill for the full list.

Pitfalls Summary

PitfallCauseSolution
get_viewport() not foundSnippet mode runs in RefCounted, not NodeUse Engine.get_main_loop().root
EditorInterface.get_viewport() not foundEditorInterface has no get_viewport() methodUse Engine.get_main_loop().root
Game screenshot request times out (504)Debugger auto-paused the game on a runtime errorEnable "Ignore Error Breaks" before executing game code
"Ignore Error Breaks" button won't activateButton has toggle_mode=false, set_pressed is ignoredCall set_toggle_mode(true) first, then set_pressed(true), then emit_signal("pressed")
Game not paused but executor not respondingGame might be in a tight loop or crashedStop and restart the game via editor
save_png returns error 7Target directory doesn't existCreate directory with DirAccess.make_dir_recursive_absolute()
Node paths stop workingAuto-generated node names change between sessionsRe-discover by walking the scene tree and matching by name/tooltip

© rayxuln, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/godot-screenshot of rayxuln/hastur-operation-plugin.

Open the folder on GitHubat commit eedff7f

Compare with similar skills

Godot Screenshot next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Godot Screenshot compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Godot Screenshot this skillrayxuln/hastur-operation-plugin241—~3.2kAutomated safety check: PassMIT
Godot Gdscript Patterns925236118/AlphaAgent10310 repos~5kAutomated safety check: PassMIT
2D Map and Scene Generator0x0funky/agent-sprite-forge4.4k—~2.9kAutomated safety check: PassMIT
Godot UI Integrationzimo-xiao-zheng/godot-ui-integration285—~1.5kAutomated safety check: PassMIT
Godot Wechat Minigame Adaptergodothub/godot-minigame187—~1.5kAutomated safety check: PassMIT
AI Game Art Pipelineybuild-ai/ai-game-art-pipeline-skill297—~1.1kAutomated safety check: PassMIT

Similar skills

  • Godot Gdscript Patterns

    925236118/AlphaAgent

    Master Godot 4 GDScript patterns including signals, scenes, state machines, and optimization.

    103 GitHub starsUsed in 10 repos~5k tokens
    Game DevelopmentAuto-check passed
  • 2D Map and Scene Generator

    0x0funky/agent-sprite-forge

    Plans and builds 2D game maps and scenes, from tilemaps and parallax backgrounds to HD-2D plates, with collision checks, a playable HTML preview and Tiled, Godot or LDtk export.

    4.4k GitHub stars~2.9k tokensUpdated 4 days ago
    Game DevelopmentAuto-check passed
  • Godot UI Integration

    zimo-xiao-zheng/godot-ui-integration

    Build or revise Godot UI from an approved design, separated art, or a visual reference when scene structure, gameplay binding, and runtime visual verification all matter.

    285 GitHub stars~1.5k tokensUpdated 1 mo ago
    Game DevelopmentAuto-check passed
  • Godot Wechat Minigame Adapter

    godothub/godot-minigame

    Apply the bundled self-contained Godot WeChat Mini Game adapter kit to an official Godot checkout.

    187 GitHub stars~1.5k tokensUpdated 25 days ago
    Game DevelopmentAuto-check passed
  • AI Game Art Pipeline

    ybuild-ai/ai-game-art-pipeline-skill

    Provider-neutral open-source skill for planning and producing game-runtime art assets and animation: static props/icons, canonical character sheets, combat sprites, 3D/video motion references…

    297 GitHub stars~1.1k tokensUpdated 3 mo ago
    Game DevelopmentAuto-check passed
  • MCP Driver

    RandallLiuXin/GodotMaker

    Runtime debugging and live project inspection via godot-mcp.

    550 GitHub starsUsed in 1 repo~1.1k tokens
    Game DevelopmentAuto-check passed

Works with

Questions about Godot Screenshot

What does Godot Screenshot do?

Take screenshots of the Godot editor window or the running game window via the Hastur broker-server remote executor. Godot Screenshot is an agent skill from rayxuln/hastur-operation-plugin. Take screenshots of the Godot editor window or the running game window via the Hastur broker-server remote executor.

When should I use Godot Screenshot?

Godot Screenshot fits situations like: the user asks to capture; take a screenshot of the Godot editor; game runtime — including phrases like 截图; save a picture of the editor/game.

How do I install Godot Screenshot in Claude Code?

Run `npx skills add rayxuln/hastur-operation-plugin --skill godot-screenshot -a claude-code`. Or copy the skill folder (.claude/skills/godot-screenshot in rayxuln/hastur-operation-plugin) into .claude/skills/godot-screenshot in your project. Claude Code loads it when a task matches its description.

How do I install Godot Screenshot in Codex?

Run `npx skills add rayxuln/hastur-operation-plugin --skill godot-screenshot -a codex`. Or copy the skill folder (.claude/skills/godot-screenshot in rayxuln/hastur-operation-plugin) into .agents/skills/godot-screenshot in your project. Codex loads it when a task matches its description.

Can I use Godot Screenshot in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add rayxuln/hastur-operation-plugin --skill godot-screenshot -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/godot-screenshot, .gemini/skills/godot-screenshot, .github/skills/godot-screenshot and .opencode/skills/godot-screenshot in your project.

What does Godot Screenshot need to run?

SKILL.md names no scripts, command-line tools or credentials: Godot Screenshot is instructions for the agent only.

Does Godot Screenshot access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Godot Screenshot safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Godot Screenshot use?

Godot Screenshot is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Godot Screenshot use?

About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Godot Screenshot?

Skills that share tags, products or a category with Godot Screenshot: Godot Gdscript Patterns (925236118/AlphaAgent, 103 stars), 2D Map and Scene Generator (0x0funky/agent-sprite-forge, 4.4k stars), Godot UI Integration (zimo-xiao-zheng/godot-ui-integration, 285 stars) and Godot Wechat Minigame Adapter (godothub/godot-minigame, 187 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Godot Screenshot?

rayxuln (a GitHub user) maintains it in rayxuln/hastur-operation-plugin, which has 241 GitHub stars. The repository was last updated on April 11, 2026.

Source: rayxuln/hastur-operation-plugin on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.