9Router Image Generation
decolua/9router
Generates images through a 9Router gateway's image endpoint, with model discovery, the request fields and per-provider quirks for OpenAI, Gemini, MiniMax and others.
Rewrite a narrative beat into a rich photoreal visual description suitable for text-to-image models.
$ npx skills add UfukNode/Noustiny --skill visual-prompt-builder -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install UfukNode/Noustiny visual-prompt-builder --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/UfukNode/Noustiny.git skills-src && mkdir -p .claude/skills && cp -r skills-src/hermes-additions/skills/creative/visual-prompt-builder .claude/skills/visual-prompt-builder && 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 "visual-prompt-builder" agent skill from https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/visual-prompt-builder into .claude/skills/visual-prompt-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-prompt-builder", 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/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/visual-prompt-builderType 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 UfukNode/Noustiny --skill visual-prompt-builder -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install UfukNode/Noustiny visual-prompt-builder --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UfukNode/Noustiny.git skills-src && mkdir -p .agents/skills && cp -r skills-src/hermes-additions/skills/creative/visual-prompt-builder .agents/skills/visual-prompt-builder && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "visual-prompt-builder" agent skill from https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/visual-prompt-builder into .agents/skills/visual-prompt-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-prompt-builder", 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 UfukNode/Noustiny --skill visual-prompt-builder -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install UfukNode/Noustiny visual-prompt-builder --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UfukNode/Noustiny.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/hermes-additions/skills/creative/visual-prompt-builder .cursor/skills/visual-prompt-builder && 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 "visual-prompt-builder" agent skill from https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/visual-prompt-builder into .cursor/skills/visual-prompt-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-prompt-builder", 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/UfukNode/Noustiny.git --path hermes-additions/skills/creative/visual-prompt-builder--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 UfukNode/Noustiny --skill visual-prompt-builder -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install UfukNode/Noustiny visual-prompt-builder --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UfukNode/Noustiny.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/hermes-additions/skills/creative/visual-prompt-builder .gemini/skills/visual-prompt-builder && 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 "visual-prompt-builder" agent skill from https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/visual-prompt-builder into .gemini/skills/visual-prompt-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-prompt-builder", 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 UfukNode/Noustiny visual-prompt-builderInstalls 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 UfukNode/Noustiny --skill visual-prompt-builder -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/UfukNode/Noustiny.git skills-src && mkdir -p .github/skills && cp -r skills-src/hermes-additions/skills/creative/visual-prompt-builder .github/skills/visual-prompt-builder && 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 "visual-prompt-builder" agent skill from https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/visual-prompt-builder into .github/skills/visual-prompt-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-prompt-builder", 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 UfukNode/Noustiny --skill visual-prompt-builder -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install UfukNode/Noustiny visual-prompt-builder --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UfukNode/Noustiny.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/hermes-additions/skills/creative/visual-prompt-builder .opencode/skills/visual-prompt-builder && 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 "visual-prompt-builder" agent skill from https://github.com/UfukNode/Noustiny/tree/main/hermes-additions/skills/creative/visual-prompt-builder into .opencode/skills/visual-prompt-builder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-prompt-builder", 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.
visual-prompt-builderRewrite a narrative beat into a rich photoreal visual description suitable for text-to-image models.
Visual Prompt Builder is an agent skill from UfukNode/Noustiny. Rewrite a narrative beat into a rich photoreal visual description suitable for text-to-image models. Strips every named intellectual-property reference and replaces each character / prop / place with a precise physical description. Output is strict JSON — one ≤60-word prompt (≤90 for climax beats), zero IP names, built for FLUX / Nano Banana / SeeDream.
Its SKILL.md is about 3.1k 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 AI & LLM Engineering, covering Diffusion and image models, Image generation and Intellectual property. It works with Google Gemini. The repository describes itself as: An agent native video creation pipeline that runs on top of Hermes Agent. The licence is MIT.
Read from SKILL.md and the folder at commit 09a0c82. 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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are json).
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.
Visual Prompt Builder loads about 3.1k tokens when it runs. Until then it costs about 95 tokens; SKILL.md has 1,370 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); files beside SKILL.md are not scanned.
The full file from UfukNode/Noustiny at commit 09a0c82, republished under its MIT licence (© UfukNode). 1,370 words, ~3,071 tokens.
.claude/skills/visual-prompt-builder/SKILL.md (or your agent's skills folder).Convert a narrative beat into a frame-specific visual description. The output is eaten by FLUX / SeeDream / Nano Banana as their user prompt. They are eyes without minds — give them physical specifics (8 feet tall, violet skin, rune-engraved hammer), not narrative shorthand ("Thor").
Single beat:
{
"title": "string",
"body": "string",
"seed": "string (optional — story logline)",
"canonBeats": [{ "title": "...", "body": "..." }],
"characters": { "Thor": "a tall blond warrior god..." },
"franchise": "avatar-airbender | marvel | null",
"allow_ip_names": true
}Batch — same fields except title+body are replaced by a beats array:
{
"beats": [{ "title": "...", "body": "..." }, { "title": "...", "body": "..." }],
"seed": "string",
"canonBeats": [...],
"characters": {...},
"franchise": "avatar-airbender",
"allow_ip_names": true
}franchise — slug from the detector (marvel, avatar-airbender, null, …).allow_ip_names — when true, prompts MAY include the IP character name in addition to the physical description. When false, prompts must stay fully IP-free (the existing sanitised form). Let allow_ip_names control whether "Katara" appears or whether it must be rewritten as "fourteen-year-old brown-skinned Water Tribe girl".Single beat → one object:
{
"storyRegister": "<register line — see table>",
"prompt": "<≤60 words (≤90 for climax), ends with storyRegister verbatim>",
"characters_seen": [{ "source_name": "Thor", "visual_description": "..." }]
}Batch → JSON array in input order, same storyRegister for every entry:
[
{ "storyRegister": "...", "prompt": "...", "characters_seen": [...] },
{ "storyRegister": "...", "prompt": "...", "characters_seen": [...] }
]First char { or [, last char } or ]. Nothing else. No step-by-step reasoning, no craft notes, no markdown fences.
Fidelity to body — hardest rule. The prompt must render the body's literal stage action. Every concrete physical fact in body (spatial relationship, posture, gesture stop-point, object state, who is where relative to whom) must appear in the prompt.
"Sokka's finger stops short of touching the blue arrow — he doesn't need to." → prompt MUST say "a stocky arctic polar boy with a warrior's ponytail hovers his index finger a centimetre above a glowing blue arrow tattoo, not touching it" ✓"a boy pointing at a glowing forehead" ✗ (drops the "stops short / not touching" beat — the whole reason this is the beat)
If the body says a gesture was withheld, the prompt shows the withholding, not the completed version. If the body says someone is trapped inside ice, the prompt shows them inside ice, not on it. Treat the body like a stage direction, not a summary.Carry canon state forward — the single biggest continuity failure mode. Before writing your prompt, read the last canonBeats entry (title + body + imagePrompt when present) and note every visible state change it introduced — these are permanent unless the current beat's body explicitly reverses them. Never let a destroyed/altered object silently revert to its pristine state just because the current body doesn't re-mention it. Apply this generically across any franchise:
What counts as a persistent visual state change (all genres):
Examples of the failure this rule prevents (any franchise, any medium):
Rule of thumb: if beat N's image shows the world visibly changed (something broken, someone freed, fire lit, person wounded), beat N+1's prompt must inherit that changed world visually, not reset it. Read canonBeats[canonBeats.length - 1].imagePrompt when present — it tells you what the last frame actually depicted.
Prompt MUST open with the established setting. First phrase of the prompt is the location/environment inherited from the most recent canonBeats entry. Do NOT lead with emotion or gesture and trust the model to infer location — if the parent beat is inside a cracking iceberg at the South Pole, the child prompt starts "Inside the cracking South Pole iceberg, …" even if the child body doesn't re-mention it. Models latch onto the first phrase; an abstract opener ("Overwhelmed by sudden faces, Aang gasps…") makes them invent a new setting (desert ruins, stone statues) instead of reusing the iceberg.
"Aang opens his eyes inside a cracking iceberg" + child body "Overwhelmed by the sudden faces, Aang gasps and airbends, shooting upward" → prompt: "Inside the cracking South Pole iceberg, Aang, a twelve-year-old bald monk boy with a blue arrow tattoo, looks up through the fractured ice at Katara and Sokka; he gasps and airbends violently, a swirling vortex of wind propelling him upward through the shattered shell, …" ✓"Overwhelmed by sudden faces beneath him, Aang gasps and airbends, shoots upward above stone temple ruins, …" ✗ (drops iceberg, drops Katara/Sokka, invents "stone ruins")Resolve ambiguous nouns against canon. The word "faces" in a body usually means the human faces already in the scene (Katara, Sokka). Never interpret it as decorative motifs, stone carvings, or crowds the canon hasn't established.
IP naming rule — conditional on allow_ip_names:
allow_ip_names: true → prompts MAY keep canonical IP names in addition to rich physical descriptions. "Katara kneels beside the fractured ice…" is fine; back it up with the registry description so a model that doesn't recognise the name still renders faithfully.allow_ip_names: false → prompts MUST be IP-free. Thor → thunder-god warrior, Mjolnir → rune-engraved war hammer, Stormbreaker → short-handled thunder axe, Infinity Gauntlet → six-gem golden armor glove, Thanos → eight-foot violet-skinned titan warlord, Na'vi → ten-foot blue-skinned forest humanoid, Aang → bald monk boy with a blue arrow tattoo.Reuse characters[name] verbatim when the beat names that character. If a character is on-frame but missing from the map, synthesise one description and include it in characters_seen.
Every pronoun resolved to its noun phrase. No "he / she / it" in the prompt.
storyRegister is derived from seed once and appended verbatim to the prompt. Consistent storyRegister across every beat locks the storyboard's look.
Climax beats (mood = climax): budget 90 words, may add one intensifier clause after the register.
Non-climax beats: 60 words, no intensifier.
| Seed fingerprint | storyRegister |
|---|---|
| Superhero finale, ensemble (Marvel/DC vibe) | superhero-finale, operatic cosmic, IMAX 70mm color grade, high dynamic range, heroic silhouettes |
| Space opera, starships, alien worlds | space-opera, practical-effects cinematic, anamorphic lens flares, deep navy shadows, amber cockpit glow |
| Anime / bending / cel-shade (Airbender, Naruto, One Piece) | animated-feature, cel-shaded 2D animation, crisp ink outlines, vibrant saturated palette, Studio Mir-style atmospheric shading |
| High fantasy, sword and sorcery | high-fantasy epic, oil-painting detail, volumetric cathedral light, earth-and-ember palette |
| Noir / neo-noir crime | neo-noir, chiaroscuro lighting, desaturated navy and sodium yellow, wet asphalt reflections |
| Horror, supernatural dread | gothic horror, candle-flame key light, cold mist, near-black shadows, shallow focus terror |
| Domestic drama, literary interior | quiet literary drama, natural window light, muted earth tones, medium-format stills |
| Coming-of-age, YA | warm coming-of-age, golden-hour sun, pastel sky, soft grain |
| Period piece / historical | period drama, candle-lit interiors, hand-dyed fabric tones, academy 1.66 framing |
| Cyberpunk megacity | cyberpunk neon-noir, magenta and teal key lights, wet neon reflections, low-angle anamorphic |
| Unclear / default | cinematic, balanced naturalism, 35mm film |
Same row for every beat in the story — do not vary mid-storyboard.
primary subject → their posture/action → what they hold → secondary subjects → setting → lighting → storyRegister (verbatim).
Input:
{
"title": "Thor takes it, burns with it",
"body": "Thor clamps the gauntlet shut; the stones flood his arm. Skin goes white, then blackens.",
"seed": "In the final battle against Thanos, every Avenger must choose what to sacrifice.",
"characters": {"Thor": "a tall blond bearded warrior god, scuffed dark plate armor with crimson cape"}
}Output:
{
"storyRegister": "superhero-finale, operatic cosmic, IMAX 70mm color grade, high dynamic range, heroic silhouettes",
"prompt": "A tall blond bearded warrior god clamps a six-gem golden armor glove on his left fist, skin bleaching white then blackening as radiant light of six stones floods his arm; standing on a ruined temple plaza, dust and embers, low amber rim-light, superhero-finale, operatic cosmic, IMAX 70mm color grade, high dynamic range, heroic silhouettes.",
"characters_seen": [
{"source_name": "Thor", "visual_description": "a tall blond bearded warrior god, scuffed dark plate armor with crimson cape"}
]
}© UfukNode, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in hermes-additions/skills/creative/visual-prompt-builder of UfukNode/Noustiny.
Open the folder on GitHubat commit 09a0c82
Visual Prompt Builder 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 |
|---|---|---|---|---|---|---|
| Visual Prompt Builder this skillUfukNode/Noustiny | 181 | — | ~3.1k | Automated safety check: Pass | MIT | |
| 9Router Image Generationdecolua/9router | 30k | — | ~830 | Automated safety check: Pass | MIT | |
| AI Image Prompts SkillLeoYeAI/openclaw-master-skills | 2.2k | — | ~4.3k | Automated safety check: Pass | MIT | |
| ImageNexus-JPF/note-companion | 869 | 2 repos | ~3.9k | Automated safety check: Pass | MIT | |
| Higgsfield Image ShotsOSideMedia/higgsfield-ai-prompt-skill | 697 | — | ~5.1k | Automated safety check: Pass | MIT | |
| LoRA Space Builderhuggingface/skills | 11k | 2 repos | ~8.4k | Automated safety check: Pass | Apache-2.0 |
decolua/9router
Generates images through a 9Router gateway's image endpoint, with model discovery, the request fields and per-provider quirks for OpenAI, Gemini, MiniMax and others.
LeoYeAI/openclaw-master-skills
Recommend curated prompts from a 10,000+ real-world image generation prompt library.
Nexus-JPF/note-companion
When the user wants to create, generate, edit, or optimize images for marketing — blog heroes, social graphics, product mockups, profile banners, listing visuals, or brand assets.
OSideMedia/higgsfield-ai-prompt-skill
A skill your agent uses when the user wants to generate a cinematic still image on Higgsfield, asks about shot framing, camera angle, or composition for image prompts, needs a specific shot type…
huggingface/skills
Builds and publishes a Gradio demo on Hugging Face Spaces for a LoRA, with the pipeline, UI and settings chosen to match that LoRA's task and model card.
artokun/comfyui-mcp
Build Qwen Image 2512 text-to-image workflows with QwenImageIntegratedKSampler, separate component loading, lightning LoRAs, and fine-tuned model variants
UfukNode/Noustiny
Grades whether a downstream story beat still holds after an upstream insertion, returning a strict JSON verdict of still_valid, needs_rewrite or must_delete.
UfukNode/Noustiny
Turns an ordered list of canon story beats into one continuous piece of present-tense prose with tonal continuity and motif carry-through, never JSON or tool calls.
UfukNode/Noustiny
Expands a one-line author intent into a full story beat that fits between two known nodes of a canon path, returned as strict JSON.
UfukNode/Noustiny
Groups every node of an existing branching story tree into scenes, titles each scene, assigns an act and a one-word motif, and returns the result as JSON.
UfukNode/Noustiny
Classifies a story seed as known, inspired or original IP and returns strict JSON naming the franchise and the image model to use.
UfukNode/Noustiny
Chooses the pace, color palette, transition and length of the opening montage for a Noustiny audiobook storybook when the user leaves those settings open.
Works with
Rewrite a narrative beat into a rich photoreal visual description suitable for text-to-image models. Visual Prompt Builder is an agent skill from UfukNode/Noustiny. Rewrite a narrative beat into a rich photoreal visual description suitable for text-to-image models.
Visual Prompt Builder fits situations like: tasks that involve Diffusion and image models; tasks that involve Image generation; tasks that involve Intellectual property.
Run `npx skills add UfukNode/Noustiny --skill visual-prompt-builder -a claude-code`. Or copy the skill folder (hermes-additions/skills/creative/visual-prompt-builder in UfukNode/Noustiny) into .claude/skills/visual-prompt-builder in your project. Claude Code loads it when a task matches its description.
Run `npx skills add UfukNode/Noustiny --skill visual-prompt-builder -a codex`. Or copy the skill folder (hermes-additions/skills/creative/visual-prompt-builder in UfukNode/Noustiny) into .agents/skills/visual-prompt-builder 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 UfukNode/Noustiny --skill visual-prompt-builder -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/visual-prompt-builder, .gemini/skills/visual-prompt-builder, .github/skills/visual-prompt-builder and .opencode/skills/visual-prompt-builder in your project.
SKILL.md names no scripts, command-line tools or credentials: Visual Prompt Builder is instructions for the agent only.
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. Review the folder before installing.
Visual Prompt Builder is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.1k tokens (SKILL.md is roughly 12k 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 Visual Prompt Builder: 9Router Image Generation (decolua/9router, 30k stars), AI Image Prompts Skill (LeoYeAI/openclaw-master-skills, 2.2k stars), Image (Nexus-JPF/note-companion, 869 stars) and Higgsfield Image Shots (OSideMedia/higgsfield-ai-prompt-skill, 697 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
UfukNode (a GitHub user) maintains it in UfukNode/Noustiny, which has 181 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on May 4, 2026.
Source: UfukNode/Noustiny on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.