Extensions/SceneWeaver
ComfyUI Extension

SceneWeaver

One click, one whole coherent scene: the place, what is standing in it, and what it is doing - written as prose a text encoder can follow, where every detail agrees with every other one. A multi-genre scene engine: sci-fi (alien creatures, spacefarers, mechs, starships, stations, wrecks, worlds) fantasy (dragons, mythic beasts, giants, goblins, centaurs, elves, undead, golems, castles, airships) and horror (ghouls, vampires, banshees, cryptids, eldritch horrors, cultists, cursed objects, haunted houses, with a gore filter that starts on No gore), each drawn across a full morphology, with entities that wire across genres. Every field independently lockable.

By EnragedAntelope·Created 21 days ago·Updated 2 days ago· 4
EnragedAntelope/comfyui-sceneweaver
Nodes6
On cloudLocal install
Categoryconditioning/sceneweaver
Stars4
Updated2 days ago
Readme

SceneWeaver for ComfyUI

One click. A whole, coherent scene - the place, the thing standing in it, and what that thing is doing. Not a wildcard salad. Sentences your text encoder can actually follow, where every detail agrees with every other one.

SceneWeaver is a scene engine built to span genres. Sci-fi, fantasy and horror ship now, all on the same coherence engine. And the genres mix: wire a fantasy gorgon into a sci-fi station, a sci-fi mech into a dragon's hoard, or an alien into a haunted chapel.

Six scenes generated by SceneWeaver

Nothing above was hand-written. No prompt engineering, no wildcard files, no LLM call. Six seeds on a node whose every dropdown was left on Random.

I want to hear from you

The vocabulary is always being tuned, and your renders are how it gets better. Open an issue or start a discussion - the three things I most need:

  • What came out incoherent? A creature with the wrong anatomy, a ship parked somewhere ships can't park, a description that contradicts itself. Paste the prompt_text - that alone is enough for me to reproduce it.
  • What are you seeing too much of? If every third scene is an asteroid field, or the same three hull shapes keep coming back, tell me. Bias is hard to see from the inside.
  • What's missing? Kinds, creature types, environments, situations, controls, settings - say the word and it's a data change, not a rewrite.

Why it's different

Most prompt randomizers hand you a comma-pile: starship, red, damaged, space, detailed, 8k. SceneWeaver writes prose, and it knows what it is describing.

A science fiction scene set in a spacecraft hangar deck. A juvenile branching
crystalline lattice, an alien creature, is stalking prey through the corridors.
It is a plant-form, covered in plum-violet fungal tissue. It has a single filter
stalk and four spore vent fronds.
A science fiction scene set in a twin sun binary. A rebuilt corvette starship is
fleeing through an asteroid field. It has a cylindrical drum hull, clad in
rust-brown ceramic ablative shell. It shows four ice-blue reactor exhaust ports.

A starship is clad in its material. A creature is covered in one. A spacefarer wears one. A nebula, having no surface at all, is never given one to describe. That grammar is data, not a template - which is why a second genre will be a data module rather than a rewrite.

And it is deep. Every entity is drawn across a whole morphology - silhouette, material, primary and accent colour, markings, surface detail, appendages and how many, emitters and how many and what colour they glow, armament, sensors, apertures. That is the difference between two seeds giving you two visibly different ships and two seeds giving you two paraphrases of one ship.

Things it makes

Alien creatures that are actually alien - cephalopods and arachnoids, sure, but also fungal colonies, crystalline growths, gelatinous masses, colonial swarms, plasma drifters, lithovores, spore-caste drones, sessile brooders, mimic forms and hive castes, each with anatomy that matches its body plan.

Spacefarers with a job and a face - pilots, salvagers, xenobiologists, void order priests, cyborg operatives, and non-human crew like tendril-faced navigators, four-armed quartermasters, tusked mercenaries and crested pilots.

Mechs and robots - siege mechs, scout walkers, terraforming walkers, exosuit walkers, welding drones, medical automatons, swarm drones.

Ships, stations, wrecks, worlds and artifacts - from strike carriers and generation ships to gate rings, monoliths, resonant lattice spires, collapsing stars and stripped-out hulks.

And a situation for each one. Entities are never just standing there. They are towing a crippled courier starship in a tractor beam, going down under a mass of smaller units, spinning a habitat ring up to speed, kneeling to read a bootprint, lashing out with a hooked limb. An action in progress is what makes a still frame a scene.

Creatures and crew generated by SceneWeaver

Machines, ships and worlds generated by SceneWeaver

And in fantasy

Dragons of every build - wyverns, fire drakes, sea serpents, lindworms and hydras - and mythic beasts: unicorns, griffins, phoenixes, manticores, kelpies, krakens, basilisks and treants. Giant-kin from cave trolls to frost giants and ettins; small folk from goblin shamans to pixies; hybrid folk like centaurs, gorgons, naga, minotaurs, merfolk and dryads. People with a calling - knights, rangers, necromancers, bards, dwarf runesmiths, wood elf archers, orc warchiefs. Elementals and spirits, the undead, golems and gargoyles, castles and wizard towers, galleons and airships, and enchanted relics.

The same coherence rules hold: a sleeping dragon is asleep, a petrified troll does not move, a hill giant is twenty feet tall and a pixie six inches, a longship needs open water and a wagon needs a road, a ruined keep shows no lit windows, and nothing burns under the sea.

Fantasy scenes generated by SceneWeaver

And in horror

The dead - ghouls, vampires, bog bodies, drowned revenants. Spirits - banshees, poltergeists, weeping apparitions. Cryptids from werewolves to antlered stalkers and living scarecrows, eldritch horrors, cultists, stalkers and survivors, cursed objects from porcelain dolls to spirit boards, and haunted places. Dread is staged, not splattered: stillness is a situation here, and gore is a filter. The Horror node starts on No gore; switch it to Any or Gore only when you want it.

Horror scenes generated by SceneWeaver

Lock what you want, roll the rest

Every dropdown offers Random, then its values, then None:

  • Random - draw it. This is the default on every field, so an untouched node is already a complete scene generator.
  • a value - lock it. Set Creature type: cephalopod and every scene is a cephalopod, with everything else still rolling around it. Lock the creature type and the hull colour and the environment; leave the rest wild. A locked field is never cut and never overruled.
  • None - omit it. Switch a slot's kind to None and that entity leaves the scene entirely, which is how you get a pure-landscape shot.

Locking is the whole workflow: find a creature you like, pin the two or three fields that made it work, and generate a hundred variations of that.

Coherence is enforced while it draws, not patched afterwards. Pick Type: gas giant and the Form dropdown narrows, live, to sphere shapes - you will not get a gas giant shaped like a spiral coil, or a gelatinous mass wearing a feathered pelt.

Install

ComfyUI Manager - search for SceneWeaver and install.

Manually - clone into your custom_nodes/ directory and restart:

cd ComfyUI/custom_nodes
git clone https://github.com/EnragedAntelope/comfyui-sceneweaver

Keep the directory name comfyui-sceneweaver. There are no dependencies - the pack imports nothing but the Python standard library, so there is no requirements.txt step and nothing to build. Needs ComfyUI 0.25.0+ and Python 3.10+.

The nodes

All of them live under conditioning/sceneweaver. Each genre is its own pair:

| Node | What it's for | |---|---| | Scene Weaver - Sci-Fi | The main node, and complete on its own. Environment, entity, situation, relationships -> prompt_text (prose) + prompt_json (structured). | | Scene Entity - Sci-Fi | Optional. Describes one entity in full depth and emits a SCENE_ENTITY payload you wire into a Scene Weaver slot. | | Scene Weaver - Fantasy | The same main node for fantasy scenes. | | Scene Entity - Fantasy | The same entity node for fantasy. Wire it into a fantasy or a sci-fi Scene Weaver - and a sci-fi entity into a fantasy one. | | Scene Weaver - Horror / Scene Entity - Horror | The same pair for horror, with a gore filter (No gore / Any / Gore only) in place of Peaceful / Conflict. |

<img src="https://raw.githubusercontent.com/EnragedAntelope/comfyui-sceneweaver/main/docs/images/scene-weaver-node.png" alt="The Scene Weaver node in ComfyUI" width="320" align="right">

You do not need the second node to start. Scene Weaver's slot 1 already carries the full entity morphology. Reach for Scene Entity when you want a second entity described just as richly, or when you want to build one creature and reuse it across many scenes.

Wire prompt_text into any text encoder. Wire it into a Show Text node too, so you can read what you got.

<br clear="right">

A Scene Entity wired into a Scene Weaver slot

A Scene Entity feeding slot 1. The wire replaces that slot's descriptive fields; the scene keeps ownership of where the entity is and what it is doing.

Getting good results

A coherent prompt is half of a good image. A model handed a contradiction - a wreck with its engines firing, a tiny creature holding a starship, a diver eating lunch at the bottom of a trench - spends the image trying to reconcile it, and you get mush. SceneWeaver's job is to make sure every word agrees with every other word, so your model spends all of its capacity drawing one believable scene. Your checkpoint and LoRAs then decide how that scene looks: the same prompt through two models gives two different worlds, and both hold together.

There is no style in the output, on purpose. SceneWeaver says nothing about lighting, lens, medium, film stock, mood or artist. A prompt with no rendering frame gets drawn as bare scene content - so you have to supply the style, either through your model/LoRA choice or by adding it to the prompt. The maintainer's own graphs prefix every prompt with:

cinematic film-quality slightly-grainy analog film still.

That one line is the difference between a flat render and the images at the top of this page.

Start with one entity. The Entities control goes to 4, and the prose stays correct at every setting - but most current image models lose coherence as you add subjects. One entity has by far the highest hit rate, two is usually fine, and three or four is where models start blending subjects together. Turn it up when you want a crowd and expect to cherry-pick.

Pair it with a style - Stylebook

Because SceneWeaver deliberately owns no rendering vocabulary, it composes cleanly with a style pack instead of fighting one. Stylebook is built for exactly this split: Stylebook describes the rendering, SceneWeaver describes the subject. Wire Stylebook's style in front of SceneWeaver's prompt_text and the two never argue about the same words.

Any style prompt, LoRA trigger or hand-written rendering clause works just as well - Stylebook is simply the one designed around the same rule.

The one deliberate exception: a hull colour, a creature's skin colour and an engine's glow belong to the subject, so SceneWeaver owns those. A colour grade - teal-and-orange, bleach bypass - is rendering, and it doesn't.

Example workflows

Two working graphs ship in example_workflows/. Each carries the Scene Weaver and Scene Entity pair for all three genres, so swap whichever you want into the encoder:

| Workflow | What it shows | |---|---| | sceneweaver-krea2_example.json | The basic pattern: Scene Weaver + a Scene Entity, a style prefix joined on with StringConcatenate, straight into the encoder. | | sceneweaver-krea2-stylebook_example.json | The same graph with Stylebook supplying the style instead of a hard-coded prefix. |

Both are the maintainer's real Krea2 graphs, so they carry a specific checkpoint, VAE and CLIP plus two third-party packs (Krea2T-Enhancer and ShowText|pysssss from custom-scripts). Swap in your own model and sampler - they are here to show the wiring, not to be run as-is.

Your own vocabulary

Drop a user_options.json beside the pack to add your own values to any pool - your own creature types, environments, situations. It is gitignored, so it survives a git pull, and user_options.example.json shows the shape. Sci-fi values go at the top level; fantasy and horror values go in a "fantasy" or "horror" section.

A key under a field says where the value goes. A kind ("dragon") adds it to the pools that kind's subkinds really read. Two fields take a group instead: key a new environment by its band ("wilds", "orbit") and it inherits what that band affords; key a new subkind by its group ("serpent wyrm") and it inherits that group's body, parts and situations. A bad entry is logged in the ComfyUI console and skipped - it never stops the nodes loading. To see what a pool already holds:

python scripts/builtin_options.py subkind --kind "alien creature"
python scripts/builtin_options.py subkind --kind dragon --pack fantasy
python scripts/builtin_options.py subkind --kind cryptid --pack horror

What's next

The genre boundary is a seam in the data layer, not an assumption baked into the engine - the grammar, the vocabulary and the coherence rules all live in a genre module, which is how fantasy and horror arrived as data. Ideas under consideration, not promised: a time of day control for fantasy and horror, and a tone control for fantasy. They are written up in docs/genre-roadmap.md.

Want a fourth genre, or something else entirely? Tell me in the discussions.

Development

python -m unittest discover -s tests -t . -v
python tests/validate_data.py
python scripts/sample_distribution.py --seeds 1000
npm ci && npm run test:frontend
python -m ruff check .

AGENTS.md is the contributor guide; docs/architecture.md covers the genre seam, the generation pipeline and the measured distribution baseline.

Licence

MIT - see LICENSE.