Getting it into your agent
It runs from inside its repository, so the clone comes first — what it calls does not travel with the file alone.
git clone --depth 1 https://github.com/SummerEngine/summer-engine-agentnpx agentmods add skills/summerengine/summer-engine-agent/magic-glowWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/summerengine/summer-engine-agent/magic-glow)<a href="https://agentmods.dev/skills/summerengine/summer-engine-agent/magic-glow"><img src="https://agentmods.dev/badge/skills/summerengine/summer-engine-agent/magic-glow/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/summerengine/summer-engine-agent/magic-glow"><img src="https://agentmods.dev/badge/skills/summerengine/summer-engine-agent/magic-glow.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00082 | $0.05272 |
| Opus 5.5 | $0.00033 | $0.02109 |
| Sonnet 5.5 | $0.00016 | $0.01054 |
| Haiku 4.5 | $0.00008 | $0.00527 |
Grade A, and why
magic-glow scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 411 lines — stays where its author put it; the contents beside it link to each section on GitHub.
magic-glow — Pulsing Light + Drifting Motes
Three layered cues that together read as "magical": a pulsing OmniLight3D (sin-wave energy), drifting additive billboard motes orbiting the source, and optional emission on the source mesh itself. Used for: enchanted items, soul gems, runes, summoning circles, wisps, fairies, magical waypoints. The recipe writes a single controller that builds and animates all three layers from one node.
When to use
- "This sword is enchanted — add a glow."
- "Make the soul gem pulse with light."
- "Magic rune on the floor glowing."
- "Wisp / fairy / firefly companion."
- "The summoning circle is active."
- "Quest item glows so the player notices it."
- Pre-charge phase before casting
lightningormuzzle-flash(charge-up beam).
When NOT to use
- The user wants a static, non-animated glow — just enable emission on the mesh's material; this recipe is overkill.
- The user wants flames, not a glow — use
fire(ormagic-firevariant offire). - The user wants a beam shooting out, not an aura — use
lightningwith theplasma-laservariant. - The user wants a screen-space bloom on the whole scene — that's
WorldEnvironment.glow_*, not a per-object recipe. - The user wants a 2D glow on a UI sprite — use
canvas_itemshader with a radial gradient, not this 3D recipe.
Recipe
1. Files to create
addons/vfx/magic-glow/magic_glow.gd
addons/vfx/magic-glow/magic_glow.tscn
No custom shader — uses canonical additive billboard motes (see _building-blocks/additive-billboard-particles.md) plus an OmniLight3D. Optional: pair with the source mesh's existing material's emission.
2. GDScript controller
addons/vfx/magic-glow/magic_glow.gd:
@tool
class_name MagicGlow
extends Node3D
## Builds: OmniLight3D (pulsing) + GPUParticles3D motes (drifting orbit) + optional mesh emission tween.
## Add as a child of any glowing object.
@export_group("Color")
@export var glow_color: Color = Color(0.55, 0.85, 1.0)
@export_range(0.0, 12.0) var light_energy_base: float = 1.4
@export_range(0.0, 12.0) var light_energy_amplitude: float = 0.8
@export_group("Pulse")
@export_range(0.05, 4.0) var pulse_hz: float = 0.7
@export var pulse_easing: Curve ## leave null for sine; assign for custom
@export_group("Light")
@export_range(0.5, 30.0) var light_range: float = 4.0
@export var light_shadow_enabled: bool = false
@export_group("Motes")
@export_range(0, 256) var mote_count: int = 24
@export_range(0.05, 4.0) var mote_radius: float = 0.6
@export_range(0.5, 8.0) var mote_lifetime: float = 2.0
@export_range(0.01, 0.30) var mote_size: float = 0.06
@export_range(0.0, 8.0) var mote_emission_boost: float = 4.0
@export var mote_drift_up: float = 0.3 ## meters/sec mean upward drift
@export_group("Source mesh emission (optional)")
@export var pulse_source_mesh: NodePath ## point at a MeshInstance3D to tween its emission_energy_multiplier
@export_range(0.0, 12.0) var source_emission_base: float = 1.0
@export_range(0.0, 12.0) var source_emission_amplitude: float = 1.5
var _light: OmniLight3D
var _motes: GPUParticles3D
var _source_mesh: MeshInstance3D
var _source_mat: BaseMaterial3D
var _t: float = 0.0
var _intensity: float = 1.0
func _ready() -> void:
_build_light()
_build_motes()
_resolve_source_mesh()
set_process(true)
func _build_light() -> void:
_light = OmniLight3D.new()
_light.light_color = glow_color
_light.light_energy = light_energy_base
_light.omni_range = light_range
_light.shadow_enabled = light_shadow_enabled
add_child(_light)
func _build_motes() -> void:
if mote_count <= 0:
return
_motes = GPUParticles3D.new()
_motes.amount = mote_count
_motes.lifetime = mote_lifetime
_motes.one_shot = false
_motes.explosiveness = 0.0
_motes.local_coords = true
var pm := ParticleProcessMaterial.new()
pm.emission_shape = ParticleProcessMaterial.EMISSION_SHAPE_SPHERE
pm.emission_sphere_radius = mote_radius
pm.direction = Vector3.UP
pm.spread = 180.0
pm.initial_velocity_min = 0.05
pm.initial_velocity_max = 0.20
pm.gravity = Vector3(0, mote_drift_up * 0.5, 0)
pm.scale_min = mote_size * 0.7
pm.scale_max = mote_size * 1.3
pm.color = glow_color
pm.damping_min = 0.5
pm.damping_max = 1.2
_motes.process_material = pm
var mesh := QuadMesh.new()
mesh.size = Vector2.ONE
# BaseMaterial3D is abstract ("Native class "BaseMaterial3D" cannot be
# constructed as it is abstract"); StandardMaterial3D is the concrete subclass.
var bm := StandardMaterial3D.new()
bm.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
bm.blend_mode = BaseMaterial3D.BLEND_MODE_ADD
bm.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
bm.billboard_mode = BaseMaterial3D.BILLBOARD_PARTICLES
bm.albedo_color = glow_color
bm.emission_enabled = true
bm.emission = glow_color
bm.emission_energy_multiplier = mote_emission_boost
mesh.material = bm
_motes.draw_pass_1 = mesh
add_child(_motes)
func _resolve_source_mesh() -> void:
if pulse_source_mesh.is_empty(): return
var n := get_node_or_null(pulse_source_mesh)
if n is MeshInstance3D:
_source_mesh = n
var m := _source_mesh.get_active_material(0)
if m is BaseMaterial3D:
_source_mat = m
_source_mat.emission_enabled = true
if _source_mat.emission == Color.BLACK:
_source_mat.emission = glow_color
func _process(delta: float) -> void:
_t += delta
var phase: float = (sin(_t * TAU * pulse_hz) + 1.0) * 0.5 # 0..1
if pulse_easing:
phase = pulse_easing.sample(phase)
if _light:
_light.light_energy = (light_energy_base + light_energy_amplitude * phase) * _intensity
if _source_mat:
_source_mat.emission_energy_multiplier = (source_emission_base + source_emission_amplitude * phase) * _intensity
func set_intensity(scale: float) -> void:
## Scale all visible cues 0..1+ (e.g., charge-up: tween from 0 to 1 over a second).
## Held as a separate factor rather than multiplied into light_energy_base /
## light_energy_amplitude: a multiplying version (`light_energy_base *= scale`)
## pins both fields to 0.0 forever after set_intensity(0.0), so the charge-up
## tween from 0 to 1 never brings the glow back.
_intensity = scale
if _motes:
_motes.amount_ratio = scale
func extinguish(fade_seconds: float = 0.6) -> void:
var t := create_tween().set_parallel(true)
t.tween_property(_light, "light_energy", 0.0, fade_seconds)
if _motes:
t.tween_property(_motes, "amount_ratio", 0.0, fade_seconds)
t.chain().tween_callback(queue_free)
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 1mo ago First seen · 411 lines · 82 tokens per session scan A 4e02d00f1955
magic-glow is a skill published in the GitHub repository SummerEngine/summer-engine-agent (59 stars, last pushed 1mo ago), licensed MIT. It adds 82 tokens to every session and 5,272 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-03.
Other skills, from other repositories
self-evolve
Capture reusable patterns from a finished project and lift them into framework-level priors (contracts, modules, skeletons) that future projects inherit. Run only when the user explicitly requests self-evolution; the orchestrator executes the workflow.
artist-self-evolve
Distill stable art-generation patterns from a completed project, so future projects produce comparable assets without re-discovering the prompts. Lead-dispatched only — orchestrator invokes this skill from its self-evolve flow with a game-slug message; do not self-trigger.
vibegame-build
Run VibeGame's standard end-to-end game development workflow with reviewer gates. Use when the user wants to create a game from zero or evolve an existing game across multiple stages.
vibegame-start
Resume a VibeGame orchestrator session after vibegame start. Use at the beginning of a Claude or Codex session to inspect team runtime state, repair missing persistent members, load goal and GDD context, inspect tasks, and ask the user what to do next.
vibegame-edit
Iterate broadly on an existing game, on top of vibegame-build. Use when the user asks to change an existing game's art style, genre, or core rules. Not for local tuning such as numbers or game feel. Orchestrator only.
hearth-feel
Make a Hearth game feel good, not just run — the juice stack (hit-stop, screen shake, flash, particle bursts, layered sound), tween easing, camera effects, anticipation/recovery animation idioms, game-UX conventions (menus, pause, onboarding, difficulty, save etiquette), effect-asserting playtests, and the quality bar…