Symbiotica Template Editor
The full template editor that lives inside your workflow — order, layout, and sheet in one node
- events
- spec
- template
- base sheet
- task sheet
- bundle_json
- skeleton
- prompts
- width
- height
- sheets
- sheet_prompts
- ref_1
- ref_2
- ref_3
- ref_4
- ref_5
- ref_6
- ref_7
- ref_8
- ref_9
- ref_10
This is the node where Symbiotica's order pipeline gets hands-on. Where the Template Builder packs reference art automatically, the Template Editor hands you an actual full-screen editor - zoom/pan canvas, draggable and resizable numbered regions, a project-assets tree, per-region task references, and pack settings - and turns what you draw into the same kind of template bundle. It's an entire texture-packing app living inside ComfyUI, which is either exactly what you want or deeply overkill, depending on whether you're running this pipeline at all.
If you're a beginner who just googled the node: this is not a general-purpose tool. It's built for Symbiotica's game-asset order workflow. But it's also the friendliest way into that workflow, because it reads the order itself - you point it at a client project folder and it does the rest.
How it works
The key design choice: the node reads the order on its own. Give it project_path (the folder containing orders/ and reference-assets/) and month, and it loads the .xlsx order directly - no Order Read → Event Specs chain needed. The optional events and spec inputs are legacy: they still work, but they're ignored when project_path is set. Blank feature means "the event this order leads with."
Two execution paths:
- Fresh from the catalog: with no saved sheet, it builds a paired base sheet + task sheet from the sprite catalog, using the
assignmentsJSON (task asset name → catalog path) to place things. The base sheet is the style source; the task sheet carries the client's design references on the same region layout. - From a saved editor sheet: once you've edited and saved in the "Open template editor" app,
sheet_fileandregions_jsontake over. The saved PNG is the base sheet, your regions are the layout, and the task sheet gets repainted from the client refs onto it. No packing needed.
Either way you get the same bundle shape, and the node saves everything under output/templates/.
The inputs you'll actually touch
Most inputs are marked advanced and managed by the editor UI (selected_sheets, assignments, sheet_file, regions_json are all "managed by the editor/node UI"). The human ones:
project_path,month,feature- point at the project, pick the month, done.scene_prompt- an overall scene/style instruction that rides along in the bundle. Feed it to your edit node or LLM downstream.preset_model/resolution/aspect_ratio- sizing presets, same as the Builder.
The outputs - this is where it shines
template,base sheet,task sheet,bundle_json- the core bundle.skeleton- layout facts for an LLM to turn into the edit prompt: one numbered element per region with itsbox_2dplacement, reference image number, and the client's brief. It deliberately carries no framing; your LLM's system prompt owns that.prompts- the order's client prompts, one recipe per row ("row 1 / Prep) … Ready) … Serving) …"), the text the recipe workflow feeds the LLM alongside the sheet.sheets+sheet_prompts- the sheets you ticked in the editor's grid, index-aligned. Wiresheetsto Save Image andsheet_promptsto Show Text and downstream runs once per sheet.ref_1…ref_10- per-region reference crops from the task sheet, numbered for the Regional Prompt Builder's sockets.
Install
Part of the Symbiotica pack - install once, get every node:
cd ComfyUI/custom_nodes
git clone https://github.com/symbiotica-ai/comfyui-nodes.git symbiotica
pip install -r symbiotica/requirements.txt
Restart ComfyUI, or ComfyUI Manager → search Symbiotica → install. No models download for this node; the pack's heavy dependency (faster-whisper) only matters if you use the transcription node.
Common issues
- "no sprite catalog - set project_path to a folder that has a reference-assets/ subfolder" - you're on the fresh-from-catalog path without a catalog. The usual editor flow saves a
sheet_fileinstead; that error is telling you it can't build fresh here. - "could not read sheet … re-save from the template editor" - the saved sheet file is stale or moved. Re-save.
- Invalid JSON in
assignmentsorregions_json- the node raises with a clear message; these are normally written by the UI, so if you hand-typed them, that's on you.
If you're not running an order pipeline, skip this node. If you are, it replaces a spreadsheet plus a texture-packer plus a conversation with the client - one node, one run.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| project_path | STRING | The client project folder — the one that contains orders/ and reference-assets/ | |
| month | STRING | Which month's order to build (the .xlsx files under orders/) | |
| feature | STRING | Which event the editor is building (set by the editor's Event selector) | |
| selected_sheets | STRING | [] | JSON list of saved sheets ticked in the editor's grid — emitted on the 'sheets' output (managed by the editor) |
| assignments | STRING | {} | JSON: task asset name -> catalog rel path (managed by the node UI) |
| preset_model | COMBO | qwen-image | 5 options: nano-banana-pro, nano-banana-2, imagen-4, qwen-image, custom |
| resolution | COMBO | 1K | 4 options: 0.5K, 1K, 2K, 4K |
| aspect_ratio | COMBO | 1:1 | 14 options: 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, +8 |
| algorithm | COMBO | shelf | 3 options: shelf, maxrects, grid |
| distribute_by_folder | BOOLEAN | true | — |
| eventsopt | SYMBIOTICA_ORDER_EVENTS | Legacy: the whole order from an Order Read node (else read from project + month here) | |
| specopt | SYMBIOTICA_EVENT_SPEC | Legacy: one event's spec from Event Specs (ignored when project/events set) | |
| groupopt | STRING | Template group slug filter (empty = all groups with refs) | |
| sheet_nameopt | STRING | — | |
| max_widthopt | INT | 204864–8192 | Sheet width when preset_model=custom |
| max_heightopt | INT | 204864–8192 | — |
| backgroundopt | STRING | #808080 | Hex fill; empty = transparent |
| sheet_fileopt | STRING | Saved editor sheet (managed by the editor) | |
| regions_jsonopt | STRING | [] | — |
| scene_promptopt | STRING | — |
Outputs (20)
| Name | Type | Description |
|---|---|---|
| template | SYMBIOTICA_TEMPLATE | — |
| base sheet | IMAGE | — |
| task sheet | IMAGE | — |
| bundle_json | STRING | — |
| skeleton | STRING | The layout facts for an LLM to turn into the edit prompt: one numbered element per region with its box_2d placement, reference image number, and the client's brief. Carries no framing of its own — the LLM's system prompt owns that. |
| prompts | STRING | The order's client prompts, one recipe per row ("row 1\nPrep) … Ready) … Serving) …") — the text the recipe/grid workflow feeds its LLM alongside the sheet. |
| width | INT | — |
| height | INT | — |
| sheets | IMAGE | The saved sheets ticked in the editor's grid, as a batch — wire to Save Image, or use each as an img2img base. Downstream runs once per sheet. |
| sheet_prompts | STRING | Client prompts for each ticked sheet, 1:1 with `sheets` (same order). Wire to Show Text next to `sheets`→Save Image: one save + one prompt block per sheet, however many you ticked (food, decorations, appliances…). |
| ref_1 | IMAGE | Region 1's reference crop from the task sheet |
| ref_2 | IMAGE | Region 2's reference crop from the task sheet |
| ref_3 | IMAGE | Region 3's reference crop from the task sheet |
| ref_4 | IMAGE | Region 4's reference crop from the task sheet |
| ref_5 | IMAGE | Region 5's reference crop from the task sheet |
| ref_6 | IMAGE | Region 6's reference crop from the task sheet |
| ref_7 | IMAGE | Region 7's reference crop from the task sheet |
| ref_8 | IMAGE | Region 8's reference crop from the task sheet |
| ref_9 | IMAGE | Region 9's reference crop from the task sheet |
| ref_10 | IMAGE | Region 10's reference crop from the task sheet |