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 ships first (alien creatures, spacefarers, mechs, starships, stations, wrecks and worlds, each drawn across a full morphology) with fantasy and horror next. Every field independently lockable.
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 ships first; fantasy and horror are next, on the same coherence engine (roadmap).

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.
This is a beta, and I want to hear from you
SceneWeaver works, but it is new and the vocabulary is still being tuned. 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, quartermasters, 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 disabled shuttlecraft 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.


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: cephalopodand 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'skindtoNoneand 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 two nodes
Both live under conditioning/sceneweaver.
| 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. |
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.

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/:
| Workflow | What it shows |
|---|---|
| sceneweaver-krea2.json | The basic pattern: Scene Weaver + a Scene Entity, a style prefix joined on with StringConcatenate, straight into the encoder. |
| sceneweaver-krea2-stylebook.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. To see
what a pool already holds:
python scripts/builtin_options.py subkind --kind "alien creature"
What's next
Sci-fi ships first, but 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. Fantasy and horror are next:
unicorns, trolls, centaurs, gorgons, goblins and the undead, each drawn across the
same full morphology, and each wireable into any other genre's scene. The design
brainstorm is in
docs/genre-roadmap.md.
Which genre do you want first? 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.