UI Theme QA
hashgraph-online/awesome-codex-plugins
A skill your agent uses to find and fix undisciplined Control-node UI in a Godot project — spacing that follows no ladder, font sizes with no modular scale, near-duplicate colours, and text that…
Control the Unreal Editor level viewport — camera type/position, view mode, FOV, exposure, layout, and rendering settings (ViewportService).
$ npx skills add kevinpbuckley/VibeUE --skill viewport -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install kevinpbuckley/VibeUE viewport --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/kevinpbuckley/VibeUE.git skills-src && mkdir -p .claude/skills && cp -r skills-src/Content/Skills/viewport .claude/skills/viewport && rm -rf skills-srcUse ~/.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/
Install the "viewport" agent skill from https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/viewport into .claude/skills/viewport/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "viewport", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/viewportType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add kevinpbuckley/VibeUE --skill viewport -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install kevinpbuckley/VibeUE viewport --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kevinpbuckley/VibeUE.git skills-src && mkdir -p .agents/skills && cp -r skills-src/Content/Skills/viewport .agents/skills/viewport && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "viewport" agent skill from https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/viewport into .agents/skills/viewport/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "viewport", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add kevinpbuckley/VibeUE --skill viewport -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install kevinpbuckley/VibeUE viewport --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kevinpbuckley/VibeUE.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/Content/Skills/viewport .cursor/skills/viewport && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "viewport" agent skill from https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/viewport into .cursor/skills/viewport/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "viewport", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/kevinpbuckley/VibeUE.git --path Content/Skills/viewport--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add kevinpbuckley/VibeUE --skill viewport -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install kevinpbuckley/VibeUE viewport --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kevinpbuckley/VibeUE.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/Content/Skills/viewport .gemini/skills/viewport && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "viewport" agent skill from https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/viewport into .gemini/skills/viewport/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "viewport", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install kevinpbuckley/VibeUE viewportInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add kevinpbuckley/VibeUE --skill viewport -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/kevinpbuckley/VibeUE.git skills-src && mkdir -p .github/skills && cp -r skills-src/Content/Skills/viewport .github/skills/viewport && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "viewport" agent skill from https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/viewport into .github/skills/viewport/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "viewport", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add kevinpbuckley/VibeUE --skill viewport -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install kevinpbuckley/VibeUE viewport --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kevinpbuckley/VibeUE.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/Content/Skills/viewport .opencode/skills/viewport && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "viewport" agent skill from https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/viewport into .opencode/skills/viewport/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "viewport", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
viewportControl the Unreal Editor level viewport — camera type/position, view mode, FOV, exposure, layout, and rendering settings (ViewportService).
Viewport is an agent skill from kevinpbuckley/VibeUE. Control the Unreal Editor level viewport — camera type/position, view mode, FOV, exposure, layout, and rendering settings (ViewportService). Use when the user asks to move the editor camera, change the view mode (Lit/Unlit/Wireframe), set FOV/exposure, switch viewport layout, or frame the level for a screenshot.
Its SKILL.md is about 3.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including scripts.
It sits in Frontend & Design, covering Game development and UI design. The repository describes itself as: Unreal Engine Vibe Coding tool. The licence is MIT.
2 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit dc051be. It shows what the files ask for, not the result of running them.
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.
Ships 1 file in scripts/, which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Viewport loads about 3.9k tokens when it runs. Until then it costs about 81 tokens; SKILL.md has 1,372 words of instructions outside code blocks.
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.
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); the scripts in this folder are not scanned.
The full file from kevinpbuckley/VibeUE at commit dc051be, republished under its MIT licence (© kevinpbuckley). 1,372 words, ~3,942 tokens.
.claude/skills/viewport/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.| Method | Description |
|---|---|
get_viewport_info() | Get full viewport state (type, camera, FOV, exposure, layout) |
set_viewport_type(type) | Switch perspective/orthographic views |
get_viewport_type() | Get current view type as string |
set_view_mode(mode) | Switch rendering mode (lit, wireframe, unlit, etc.) |
get_view_mode() | Get current rendering mode |
set_fov(degrees) | Set field of view (5-170, default 90) |
get_fov() | Get current FOV |
set_near_clip_plane(distance) | Set near clipping plane (-1 = engine default) |
set_far_clip_plane(distance) | Set far clipping plane (0 = infinity) |
set_exposure(fixed, ev100) | Set fixed/auto exposure with EV100 value |
set_exposure_game_settings() | Reset exposure to auto (game settings) |
set_game_view(enable) | Toggle Game View (hides editor icons) |
set_allow_cinematic_control(allow) | Allow Sequencer to control viewport camera |
set_realtime(enable) | Toggle realtime rendering |
set_camera_speed(speed) | Set camera movement speed (1-8) |
set_viewport_layout(name) | Switch viewport layout (single, quad, etc.) |
get_viewport_layout() | Get current layout name |
capture_scene(location, rotation, width, height, out_png, ortho_width=0, fov=90, manual_ev100=0) | Synchronous SceneCapture2D → PNG that works while the editor is backgrounded (see below) |
🔀 Camera get/set moved to the engine.
ViewportServiceno longer hasset_camera_location/set_camera_rotation. Reading and positioning the viewport camera is now Unreal 5.8's nativeEditorAppToolset(GetCameraTransform/SetCameraTransform, plusFocusOnActorsto frame actors) — reach it withcall_tool(rundescribe_toolsetonEditorAppToolsetfor exact action names/params).ViewportServicestill owns view type, view mode, FOV, clip planes, exposure, game view, layout, realtime, and camera speed.
The most common cause of an all-black (or blown-out white) capture is the level, not the camera and not the asset you just built. Two things to check before you start debugging geometry:
new_level() has no lighting at all — no sun, no sky, no atmosphere. Use
new_level_from_template(path, "/Engine/Maps/Templates/Template_Default") instead (see the
level-actors skill). If you must light an empty level by hand you need a DirectionalLight that
genuinely points down — unreal.Rotator(roll=0, pitch=-48, yaw=125), and note the argument
order is (roll, pitch, yaw), so a positionally-passed pitch aims the sun at the sky and the scene
stays black — plus a SkyLight with real_time_capture, and a SkyAtmosphere.auto_exposure_method = AEM_MANUAL; then auto_exposure_bias is a
brightness stop — higher is brighter, and the usable window is narrow (0 was pitch black and
13.5 blown out in one scene; 7.5 was correct). Tune it by capturing, not by reasoning.Keep the volume out of frame (move it far below the set) — an unbound volume still applies globally but its bounds box draws in the editor viewport.
set_viewport_typeOnly these exact strings are accepted (case-insensitive):
| String | View |
|---|---|
"perspective" | Perspective (3D) |
"top" | Top-down (XY) |
"bottom" | Bottom-up (-XY) |
"left" | Left side (-XZ) |
"right" | Right side (XZ) |
"front" | Front (-YZ) |
"back" | Back (YZ) |
# ✅ CORRECT
unreal.ViewportService.set_viewport_type("perspective")
unreal.ViewportService.set_viewport_type("top")
# ❌ WRONG — these are not valid strings
unreal.ViewportService.set_viewport_type("ortho")
unreal.ViewportService.set_viewport_type("iso")set_view_mode| String | Rendering Mode |
|---|---|
"lit" | Default fully lit |
"unlit" | No lighting |
"wireframe" | Wireframe overlay |
"detaillighting" | Detail lighting |
"lightingonly" | Lighting only (no textures) |
"lightcomplexity" | Light complexity heatmap |
"shadercomplexity" | Shader complexity heatmap |
"pathtracing" | Path tracing |
"clay" | Clay rendering |
set_viewport_layout| Name | Layout |
|---|---|
"OnePane" | Single viewport (default) |
"TwoPanesHoriz" | Two side-by-side |
"TwoPanesVert" | Two stacked |
"ThreePanesLeft" | Large left + 2 right |
"ThreePanesRight" | Large right + 2 left |
"ThreePanesTop" | Large top + 2 bottom |
"ThreePanesBottom" | Large bottom + 2 top |
"FourPanesLeft" | Large left + 3 |
"FourPanesRight" | Large right + 3 |
"FourPanesTop" | Large top + 3 |
"FourPanesBottom" | Large bottom + 3 |
"FourPanes2x2" | Quad view (2x2 grid) |
"Quad" | Alias for FourPanes2x2 |
Setting FOV has no effect in orthographic views. Always switch to perspective first:
unreal.ViewportService.set_viewport_type("perspective")
unreal.ViewportService.set_fov(75.0)When set_realtime(False), the viewport only repaints on interaction. All ViewportService methods force a redraw after changes, so this is transparent to Python callers — but be aware users won't see continuous animation/particles until realtime is re-enabled.
⚠️ Multi-pane read-back caveat:
get_viewport_info().is_realtimereflects the active pane. In a multi-pane layout (e.g.FourPanes2x2) where the active pane isn't the primary,set_realtime(True)can succeed yetis_realtimereads backFalse. Verify realtime inOnePanelayout, or don't rely on the read-back to gate logic when in a split layout. (Other fields like view type / FOV / camera read back correctly across layouts.)
CaptureViewport / CaptureEditorImage (and HighResShot) return a stale frame when the
MCP-driven editor is minimised or backgrounded — the level viewport does not pump frames. The
reliable path is ViewportService.capture_scene(...): it spawns a transient ASceneCapture2D,
renders one frame synchronously with CaptureScene(), reads the pixels back and writes the PNG
in-call. No viewport pumping, no editor_invalidate_viewports() + sleep dance.
import unreal
# Perspective grab of a spot in the level (works even when the editor window is hidden)
res = unreal.ViewportService.capture_scene(
unreal.Vector(1200, -800, 900), # camera location
unreal.Rotator(pitch=-20, yaw=45, roll=0), # kwargs — Rotator positional order is (roll,pitch,yaw)
1280, 720, # width, height (px)
"C:/temp/shot.png", # absolute path, or relative → Saved/VibeUE/Captures
manual_ev100=-6.0) # 0 = auto (black when hidden); negative EV = brighter fixed exposure — see below
if res.b_success:
print("wrote", res.output_path, res.file_size_bytes, "bytes")
else:
print("failed:", res.error_message)Baked-in facts (measured — these are why the hand-rolled recipe existed):
SCS_FINAL_COLOR_LDR, which yields alpha 255. SCS_BASE_COLOR
writes alpha 0, producing a PNG that renders as a blank white page in most viewers even
though the file is a full-size capture. capture_scene forces the exported alpha to 255 regardless,
so its PNGs are always opaque. (Check the file size, not just the preview — a truly empty PNG is a
few KB.)RTF_RGBA8. The engine default (RTF_RGBA16f, a float format)
writes non-PNG bytes; capture_scene never uses it.manual_ev100=0 (default) to keep the engine's automatic exposure — fine
for a foreground / PIE window, but black when the editor is hidden (no converged eye adaptation).
A backgrounded editor needs a fixed exposure: pass manual_ev100 != 0 and capture_scene
switches to a manual exposure decoupled from the physical camera, where the value is the exposure
TARGET in EV100 — exactly like a camera's metered EV: higher EV100 is DARKER (it assumes a
brighter scene and stops down), lower/negative is brighter. Measured on a daylit scene from a
backgrounded editor (mean RGB luminance): 0 (auto) → 16.4, +4 → 4.3, -4 → 43.8, -6 → 63.4,
-8 → 86.0. A daylit backgrounded scene reads well around -6 to -8; try -4 first for bright
scenes. Tune by capturing.Note: the engine reads its underlying
AutoExposureBiasas apow(2,bias)exposure compensation (so its docs say "positive brightens"), but in this decoupled-Manual SceneCapture path the observed, repeatable behaviour is the opposite — higher = darker — so treatmanual_ev100as a camera EV target. Do not carry over any old "bias ~10–14 to brighten" advice; that was from a build that left the physical camera coupled, and here a large positive value is near-black.
Minimap / top-down map recipe (orthographic, north-up):
import unreal
# Ortho capture centred over the map, looking straight down, north-up.
# ortho_width = the world-space span you want to cover (e.g. the landscape size in uu).
map_size = 500000.0 # uu across
res = unreal.ViewportService.capture_scene(
unreal.Vector(0, 0, 100000), # high above centre; Z only needs to clear geometry
unreal.Rotator(pitch=-90, yaw=-90, roll=0), # pitch=-90 looks down; yaw=-90 makes +X point up = north-up
2048, 2048,
"minimap.png", # → Saved/VibeUE/Captures/minimap.png
ortho_width=map_size,
manual_ev100=-6.0) # fixed exposure for a hidden editor; LOWER (more negative) = brighterortho_width > 0 selects orthographic projection (and fov is ignored); ortho_width == 0
(default) is perspective using fov.(pitch=-90, yaw=-90, roll=0) yields a north-up image (world +X points to the top).
This is a convention of the caller's rotation, not something the API forces — pass a different yaw to
rotate the map.TextRenderActor at rotation (roll=0, pitch=90, yaw=90) reads correctly in
this north-up view.import unreal
info = unreal.ViewportService.get_viewport_info()
view_mode = unreal.ViewportService.get_view_mode()
print(f"Type: {info.viewport_type}")
print(f"View Mode: {view_mode}")
print(f"Location: {info.location}")
print(f"Rotation: {info.rotation}")
print(f"FOV: {info.fov}")
print(f"Layout: {info.layout}")
print(f"Realtime: {info.is_realtime}")
print(f"Game View: {info.is_game_view}")import unreal
for view in ["top", "front", "right", "perspective"]:
unreal.ViewportService.set_viewport_type(view)import unreal
# Switch to quad (2x2) layout
unreal.ViewportService.set_viewport_layout("Quad")
# Switch back to single pane
unreal.ViewportService.set_viewport_layout("OnePane")import unreal
# Perspective with narrow FOV for minimal distortion
unreal.ViewportService.set_viewport_type("perspective")
unreal.ViewportService.set_fov(60.0)
unreal.ViewportService.set_game_view(True)
unreal.ViewportService.set_exposure(True, 1.0) # Fixed exposure
unreal.ViewportService.set_realtime(True)import unreal
# Switch to wireframe to inspect mesh topology
unreal.ViewportService.set_view_mode("wireframe")
# Return to normal lit view
unreal.ViewportService.set_view_mode("lit")Camera placement now lives in the engine EditorAppToolset (SetCameraTransform), called via
call_tool. From Python you can still drive it through the editor subsystem:
import unreal
# Move camera to a bird's-eye view (location, rotation)
# ⚠️ Rotator positional order is (Roll, Pitch, Yaw) — always use kwargs
unreal.get_editor_subsystem(unreal.UnrealEditorSubsystem).set_level_viewport_camera_info(
unreal.Vector(0, 0, 5000), unreal.Rotator(pitch=-90))To frame specific actors instead of guessing coordinates, prefer the engine
EditorAppToolset.FocusOnActors action (or load the level-actors skill for
ActorService.get_actor_view_camera, which auto-computes a framing position from bounds).
import unreal
# Tighten near clip for close-up work
unreal.ViewportService.set_near_clip_plane(1.0)
# Set far clip to avoid rendering distant objects
unreal.ViewportService.set_far_clip_plane(50000.0)
# Reset to defaults
unreal.ViewportService.set_near_clip_plane(-1) # Engine default
unreal.ViewportService.set_far_clip_plane(0) # Infinityimport unreal
# Fix exposure for consistent lighting review
unreal.ViewportService.set_exposure(True, 1.0)
# Adjust to bright/dark scene
unreal.ViewportService.set_exposure(True, -2.0) # Darker
unreal.ViewportService.set_exposure(True, 4.0) # Brighter
# Return to auto exposure (game settings)
unreal.ViewportService.set_exposure_game_settings()execute_python_code)scripts/set_camera.txt — position the editor camera and set the view mode.CaptureViewport through call_tool needs BOTH optional params present ({"captureTransform":{}, "annotations":{}}); captureTransform is ignored (it always frames the world origin), and the ~1 MB base64 result must be decoded to a file before it can be viewed.HighResShot never fires. Call PerformanceService.set_background_throttling(False) first; asset thumbnails still render fine while backgrounded.CaptureEditorImage returns the previous frame unless you call editor_invalidate_viewports() and wait briefly first.capture_scene for a real off-screen render instead of hand-building a SceneCapture2D; a backgrounded editor has no converged eye adaptation, so fix the exposure (AEM_MANUAL, bias ~10-14) or the shot comes out black.© kevinpbuckley, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (scripts) in Content/Skills/viewport of kevinpbuckley/VibeUE.
Open the folder on GitHubat commit dc051be
Viewport 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Viewport this skillkevinpbuckley/VibeUE | 730 | — | ~3.9k | Automated safety check: Pass | MIT | |
| UI Theme QAhashgraph-online/awesome-codex-plugins | 1.3k | — | ~1.8k | Automated safety check: Pass | Apache-2.0 | |
| iOS Hig Design Guidedavepoon/buildwithclaude | 3.6k | — | ~735 | Automated safety check: Pass | MIT | |
| Frontend Design Principlespretend1111/claude-desktop-app | 496 | 1 repos | ~824 | Automated safety check: Pass | Custom licence | |
| Iconsconnorshea/vglist | 160 | — | ~321 | Automated safety check: Pass | MIT | |
| Godot UI Themingthedivergentai/GD-Agentic-Skills | 821 | — | ~3.7k | Automated safety check: Pass | LGPL-3.0 |
hashgraph-online/awesome-codex-plugins
A skill your agent uses to find and fix undisciplined Control-node UI in a Godot project — spacing that follows no ladder, font sizes with no modular scale, near-duplicate colours, and text that…
davepoon/buildwithclaude
Build, update, and apply iOS design specifications using Apple Human Interface Guidelines (HIG) source data.
pretend1111/claude-desktop-app
Gives practical design rules for polished HTML, CSS and JavaScript interfaces and browser games, covering spacing, type, color, components, motion and responsive breakpoints.
connorshea/vglist
How to add icons to the vglist frontend using Lucide via @lucide/vue.
thedivergentai/GD-Agentic-Skills
Expert blueprint for UI themes using Theme resources, StyleBoxes, custom fonts, and theme overrides for consistent visual styling.
Ohh-889/skyroc
Create beautiful, accessible user interfaces with shadcn/ui components (built on Radix UI + Tailwind), Tailwind CSS utility-first styling, and canvas-based visual designs.
kevinpbuckley/VibeUE
Previews, validates and bakes bone-rotation edits on Unreal Engine AnimSequences, enforcing a coordinate space and a constraint-checked preview-validate-bake loop.
kevinpbuckley/VibeUE
Creates and edits Unreal Engine Animation Montages through AnimMontageService: sections, slots, segments, branching points, notifies and blend settings.
kevinpbuckley/VibeUE
Creates and edits AnimSequence keyframes and bone tracks in Unreal Engine through AnimSequenceService, following an inspect, preview, validate and bake workflow with correct bone-space handling.
kevinpbuckley/VibeUE
Imports files into Unreal Engine, exports textures, reads the Content Browser selection and checks open assets via VibeUE, plus mesh reimport material fixes.
kevinpbuckley/VibeUE
Changes Unreal Engine console variables, scalability levels and raw INI values through VibeUE's Python API, now that registered settings moved to the engine's own toolset.
kevinpbuckley/VibeUE
Creates and wires Unreal Engine Enhanced Input assets through VibeUE's InputService: Input Actions, Mapping Contexts, key bindings, triggers and modifiers.
Categories
Control the Unreal Editor level viewport — camera type/position, view mode, FOV, exposure, layout, and rendering settings (ViewportService). Viewport is an agent skill from kevinpbuckley/VibeUE. Control the Unreal Editor level viewport — camera type/position, view mode, FOV, exposure, layout, and rendering settings (ViewportService).
Viewport fits situations like: the user asks to move the editor camera; change the view mode (Lit/Unlit/Wireframe); set FOV/exposure; switch viewport layout.
Run `npx skills add kevinpbuckley/VibeUE --skill viewport -a claude-code`. Or copy the skill folder (Content/Skills/viewport in kevinpbuckley/VibeUE) into .claude/skills/viewport in your project. Claude Code loads it when a task matches its description.
Run `npx skills add kevinpbuckley/VibeUE --skill viewport -a codex`. Or copy the skill folder (Content/Skills/viewport in kevinpbuckley/VibeUE) into .agents/skills/viewport in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add kevinpbuckley/VibeUE --skill viewport -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/viewport, .gemini/skills/viewport, .github/skills/viewport and .opencode/skills/viewport in your project.
SKILL.md names no scripts, command-line tools or credentials: Viewport is instructions for the agent only. Our summary lists: Python 3.
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.
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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Viewport is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.9k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Viewport: UI Theme QA (hashgraph-online/awesome-codex-plugins, 1.3k stars), iOS Hig Design Guide (davepoon/buildwithclaude, 3.6k stars), Frontend Design Principles (pretend1111/claude-desktop-app, 496 stars) and Icons (connorshea/vglist, 160 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
kevinpbuckley (a GitHub user) maintains it in kevinpbuckley/VibeUE, which has 730 GitHub stars. The repository holds 39 skills in this directory. The repository was last updated on October 7, 2026.
Source: kevinpbuckley/VibeUE on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.