tinyterraNodes adds an image viewer and a scriptable XY plot to ComfyUI
A selection of nodes for Stable Diffusion ComfyUI
At a glance
- What is it?
- This is a bundle of custom nodes for the ComfyUI Stable Diffusion interface, and the two that matter most are a fullscreen image viewer built on the node's own output history and an advanced XY plot whose axes are written as a small text syntax against node ids and widget names. Everything else is interface polish: autocomplete popups, widgets that hide themselves, and node repositioning on the grid.
- Who is it for?
- tinyterraNodes fits a ComfyUI user who runs large parameter sweeps and needs to see the results side by side, or who wants a proper viewer for a node's output history instead of hunting through saved files. It does not fit a workflow that only needs a single image, since the value is in the sweep and the review loop.
- Can I use it commercially?
- Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 159 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A clone into custom_nodes, and nothing to configure
tinyterraNodes is a selection of custom nodes for ComfyUI, the node based interface for Stable Diffusion. It is installed the way ComfyUI custom components usually are, by cloning the repository into the ComfyUI custom_nodes directory with a git clone of the GitHub URL, and then restarting the interface so the nodes register.
That is the entire installation. There is no configuration file to edit, no account, no model to download. The repository layout supports that impression: an __init__.py at the root, a ttNpy directory for the Python side, a js directory for the browser side, an images directory for the node icons, a ttNdev.py file, and an arial.ttf font file that is bundled so the image viewer does not depend on a font being present on the machine.
The project metadata in pyproject.toml describes what the bundle is for: a customizable xyPlot, various pipe nodes, a fullscreen image viewer based on node history, dynamic widgets, interface customization, and more. It also carries a ComfyUI specific block with a publisher id of tinyterra, a display name of tinyterraNodes and an icon, and an empty model list, which is the declaration that this package ships no weights of its own.
Several of the features are enabled by default and can be switched off, and the switches are shown in the README as configuration keys under a ttNodes section, for example a flag for embed autocomplete and one for dynamic widgets. So the defaults are opinionated, and the escape hatch is documented next to the feature it turns off.
The image viewer reads the node's own output history
The ttN Image Viewer is the feature that makes this bundle more than a plotting utility, and it is enabled by default.
The idea is that the viewer contains all the images generated by the selected node during the current ComfyUI session. It is reached from the node right-click context menu, which gains entries to open a fullscreen viewer and to open a popout viewer, plus entries to set and clear a default fullscreen node, so the viewer can be opened with a shortcut even when nothing is selected.
Two keyboard shortcuts open the two views, and the viewer itself has its own shortcut set: the up arrow toggles the UI overlay and the down arrow toggles slideshow mode, the left and right arrows move between images with shift moving five at a time and ctrl jumping to the first or last image, the mouse scroll zooms the current image while ctrl and scroll selects the image to the left or right, and dragging repositions the current image with a double click resetting the position. Escape closes the viewer and F fits the image to the window.
Slideshow mode has two behaviours. Toggled on, it automatically jumps to new images as they are generated if the last image is the one selected, on a black background, and the user interface hides after a set time. Toggled off, it holds the currently selected image, on a light background.
The UI overlay is a navigable preview of all the images of the selected nodes, and it also toggles the image viewer settings button. The important limitation is that the viewer's content is the current session's history, so it is a review tool for a run in progress rather than a browser for your entire output directory.
XY plot axes are written as a tiny language
The advanced XY(Z) plot node is the other headline feature, and its distinguishing feature is that the axes are written as text rather than configured through dropdowns.
The syntax has two parts. An axis header is an axis number and a label in angle brackets, and each setting under it is a node id, a widget name and a value in square brackets:
<1:v_label>
[2:ckpt_name='model.safetensors']
<2:custom label>
[2:ckpt_name='checkpoint.xyz']
[2:vae_name='someVae.xyz']
[4:text='Summer sunset']The node takes a pipeKSampler or SDXL input to generate the plots using any previous input nodes, and any value not set by the plot is taken from the corresponding node, so the plot only overrides what it names.
The label field is a small formatting language of its own. A custom string is used as a custom axis label. The v_label form is a concatenation of the values being set, so two settings with that label would show the model name on one line and the checkpoint, the VAE and the prompt on the next. The tv_label form concatenates the option title and the value, so each line reads like ckpt_name: model.safetensors. The itv_label form adds the node id in brackets.
Because the plot refers to nodes by id, the README suggests enabling an id plus nickname badge in the ComfyUI Manager settings so you can read the ids off the canvas, and it adds an autocomplete that activates when the plot node is connected to a sampler, listing the available nodes and options and offering to add the code for a new axis.
Search, replace and append inside the plot syntax
The plot syntax has a few conveniences that make it usable for real sweeps rather than only for fixed grids.
If you include a value in the form of a search and replace pair, the current value of the node is used and the search is performed against it, and you can include more than one to replace different strings. That means a plot can take the value already in a widget and modify it, which is how you sweep a strength parameter relative to its current setting instead of typing absolute values.
There is also an append form. If you include the append marker in the widget name, the plot value is appended to the original instead of overwriting it, so a LoRA entry can be added to what is already configured rather than replacing it.
Beyond the text syntax there is node based plotting, which the README describes as a way to avoid requiring the syntax to be written manually. The range node produces an int or float range easily, and the string node produces delimited string ranges.
There is Z-axis support for multi plotting, which creates extra XY plots with the z-axis value changes as a base. So the node can sweep a third dimension by producing a set of plots rather than a single flat grid, which is what you need when a parameter only makes sense in combination with another one.
Interface tweaks that are enabled by default
The remaining features are smaller, but they are the ones most users will actually notice every day.
Autocomplete is enabled by default and covers three things. There is a popup that autocompletes embedding filenames in text widgets, triggered by typing the word embedding, a popup that autocompletes categories from the noodlesoup set, triggered by typing a double underscore, and a popup in the ttN loras input that autocompletes LoRAs from a list. The first of these can be turned off with the embed autocomplete flag.
Dynamic widgets are enabled by default and automatically hide and show widgets depending on their relevancy, so a node whose input is not connected does not clutter the canvas with the controls for that input. It too has an on and off switch.
The ttNinterface group adds entries to the node right-click context menu for setting specific node width and height values above the minimum for that node, and for setting a default background color for every node added. It also adds support for ctrl and arrow key node movement, which aligns the selected nodes to the ComfyUI grid spacing and moves them in the arrow direction by one grid step, with shift multiplying that by ten. Finally it adds a reload node entry that creates a new instance of the node at the same position, size, colour and title, attempting to retain the widget values, which is useful when a node or widget definition has changed and you want a fresh copy without retyping the configuration.
The through-line is that these are conveniences for someone who lives in the canvas all day rather than features you would find in a changelog of a general purpose tool.
Version numbers that do not line up, and a GPL licence
The release and version information on this repository is worth reading carefully, because the numbers disagree.
The published releases are v1.1.1-main and v1.1.0-main, both from 2023-09-24, and v1.0.0-main from 2023-07-02. The version in the project file is 2.0.11. The last push was on 2026-05-17, and the repository is not archived.
So the tagged history stops in 2023 while the code has moved on considerably, and the project file carries a 2.x version that has never been tagged. The package name in the project file is also different from the release titles, since the project is called comfyui_tinyterranodes while the releases are named tinyterraNodes. None of this is necessarily a problem for a custom node, which is usually installed by cloning the repository rather than by installing a release, but it does mean there is no reliable tag to pin and no changelog entry that tells you what changed.
The licence is GPL-3.0, which is a meaningful difference from the permissive licences that many ComfyUI custom nodes use. For personal use and for most hobby workflows it makes no practical difference, since you are not distributing the software. If you intend to redistribute this code, or to bundle it in something you ship, the copyleft obligations apply to the distributed work, and that is the question to put to a lawyer rather than to the README.
The upstream interface is ComfyUI itself, and the README does not state a minimum ComfyUI version or a list of supported versions, so a plugin that talks to a node graph has an implicit dependency on the host's custom node API continuing to work as it does now.
Editorial conclusion
tinyterraNodes fits a ComfyUI user who runs large parameter sweeps and needs to see the results side by side, or who wants a proper viewer for a node's output history instead of hunting through saved files. It does not fit a workflow that only needs a single image, since the value is in the sweep and the review loop. Before you install, clone into the ComfyUI custom_nodes directory as the README describes and expect to restart the interface, and note the version skew, since the project file declares 2.0.11 while the newest published release tag is v1.1.1-main from 2023, so treat the main branch as the source of truth. The project is GPL-3.0 licensed and the last push was on 2026-05-17.
Frequently asked questions
How do I install tinyterraNodes in ComfyUI?
Navigate to the ComfyUI custom_nodes directory and run the git clone of the GitHub repository URL, then restart ComfyUI so the nodes register. The package ships no models of its own, and several features are enabled by default with configuration flags to turn them off.
What does the tinyterraNodes image viewer show?
It shows all the images generated by the selected node during the current ComfyUI session, in a fullscreen or popout viewer opened from the node right-click context menu, with a slideshow mode that jumps to new images as they are generated and a UI overlay that previews the node's images.
How is the advanced XY plot configured in tinyterraNodes?
With a small text syntax. An axis is written as an axis number and label in angle brackets, and each setting as a node id, widget name and value in square brackets, for example an axis header of 1:v_label with a setting of 2:ckpt_name='model.safetensors'. Labels can be custom strings or one of the v_label, tv_label and itv_label concatenation forms.
What can I change in the values an XY plot sets in tinyterraNodes?
You can use a search and replace form to modify the node's current value, including more than one search, and you can use an append marker on the widget name to append the plot value to the original instead of overwriting it. The plot also supports Z-axis multi plotting and node based range and string nodes so you need not write the syntax by hand.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/tinyterra-comfyui-tinyterranodes)Was this useful?