Symbiotica Prompt Block
Edit one block of the prompt book without leaving the canvas
- project_path
- text
Most prompt systems keep your text in a text node, which lives in a workflow, which gets shared and duplicated until "the lighting prompt" exists in nine different files. Symbiotica Prompt Block is the pack's answer: one block of the prompt book - a shared rule, an image-model block, or an asset type - edited right on the canvas, saved to <project>/prompts/ where every queue reads the same copy.
Several of these side by side are the book. They look like the string-literal graphs they replace, except the source of truth is a file, not a widget.
How it works
A block is a .md file under your project's prompts/ folder. This node is a window onto one of them. Type blocks live at prompts/<Category>.md, shared rules at prompts/_rules/, image-model blocks at prompts/_image/. A block file can hold up to three versions split by <!-- version: name --> markers, with the top of the file staying the default.
Wire the Prompt Book's project_path output in and chain block to block through project - one wire feeds the whole row instead of every node fanning back to the book. Each block appends to the text passing through it, so the last block in a row carries the entire composed prompt.
The inputs
project_path(required) - the project folder holding the book. Wire the Prompt Book'sprojectoutput, or the previous block's passthrough.block(required) - which block this node edits, e.g.Chair.mdor_rules/02-inputs.md. The panel's picker fills this in.slot- which slot of the category's recipe this edits. Set for you automatically whentext_incomes from a Prompt Recipe: wiretext_3in and this becomes 3.category(optional) - wire Asset Focus'scategoryhere and this node edits whatever_recipes/<category>.jsonnames inslot. Switch asset type and the block on screen follows, with nothing to pick. Whencategoryis wired,blockis ignored.text_in(optional) - wire a Prompt Recipe'stext_Nin to preview and edit that prompt. With nocategory, it's the legacy chain input: the previous block's text, which this node appends its own block to.
The outputs
project_path- passthrough, so blocks chain on one wire.text- this node's block, ready for the LLM. Chained, it's everything so far:text_inplus this block, blank-line separated.
Install
One pack, one install - search Symbiotica in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/symbiotica-ai/comfyui-nodes.git symbiotica
pip install -r symbiotica/requirements.txt
Restart after. This node needs no API key and downloads nothing - it reads and writes markdown.
Gotchas
The mental model to keep: the block file is the truth, and this node is just a comfortable editor for it. Editing here needs no restart - Category Prompts re-reads the book when a file changes. If you hand-edit the same file in an external editor at the same time, last writer wins, same as anywhere. And a block written with a version marker you never picked will keep serving its top version until you switch slots, which trips people the first time they see an edit "not take."
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| project_path | STRING | Client project folder holding the prompt book. Wire the Prompt Book's `project` output, or a neighbouring block's `project` passthrough. | |
| block | STRING | Which block this node edits: a type block (Chair.md), a shared rule (_rules/02-inputs.md) or an image block (_image/01-image-model.md). The panel's picker fills this in. Ignored while `category` is wired — then the recipe names the block. | |
| slot | COMBO | 1 | Which slot of the category's recipe this node edits. Set for you when `text_in` comes from a Prompt Recipe — wiring `text_3` in makes this 3. |
| categoryopt | STRING | Wire Asset Focus's `category` here and this node edits whatever `_recipes/<category>.json` names in `slot` — switch asset type and the block on screen follows, with nothing to pick. | |
| text_inopt | STRING | Wire the Prompt Recipe's `text_N` here to preview and edit that prompt. With no `category` wired it is the old chain input instead: the previous block's `text`, which this node appends its own block to. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| project_path | STRING | Passthrough of the project, so blocks chain on one wire instead of fanning every node back to the book. |
| text | STRING | This node's block, ready for the LLM. Chained (no `category` wired) it is everything so far: text_in plus this block, blank-line separated, so the LAST block in a row carries the whole prompt. |