Workspace
This node finally turns your ComfyUI output folder into actual projects
- workspace
- codename
- full_path
- model
- clip
- vae
- width
- height
Every ComfyUI regular knows the feeling: three months of generations in one output/ folder, a thousand PNGs with names like ComfyUI_00012_. Then you go looking for Tuesday's portrait and you might as well be spelunking. The fot_Workspace node from comfyui_user_workspaces is a small, honest attempt to fix that - it makes "the project I'm working on" a first-class thing in the graph, instead of a naming convention you have to remember.
It's not a well-known pack. Four nodes, zero Google impressions, nobody on Reddit talking about it. If you found it, you're probably exploring ComfyUI Manager or rescuing a workflow that references it. So here's the straight story: it works, it's light, and for people who juggle multiple jobs or character sets it genuinely reduces the chaos. For everyone else, the built-in Load Checkpoint plus a filename prefix is fine.
What it actually does
fot_Workspace is a project-aware checkpoint loader, plus a little state that rides along one wire. You give it a codename (your project), a checkpoint, and a width/height. It does two things:
- It loads the checkpoint the normal way and hands you
model,clip, andvae- same as the stockLoad Checkpointnode. - It creates a folder at
ComfyUI/output/workspaces/<codename>/, writes aworkspace.jsoninside it with your width, height, and checkpoint name, and passes that whole bundle out as a singleWORKSPACEobject.
That WORKSPACE object is the clever part. It's the same "context bus" pattern you'll see in rgthree's Context and Efficiency Nodes' pipes: a dozen values traveling down one wire instead of forty. Here the bundle carries your project's codename, its output path, dimensions, and (in the model outputs) the actual loaded weights. Downstream nodes in this pack - fot_Folder and fot_WorkspaceReadOnly - know how to unpack it.
The frontend is doing real work too. The codename dropdown is populated live by a small API the pack registers (/comfyui_user_workspaces/get_workspaces), and it auto-refreshes your width/height widgets from the last saved workspace.json. Pick "portraits" and the node remembers this project was 832×1216 last time.
The inputs that matter
- codename - your project name; a dropdown of folders that already exist under
output/workspaces/. There's always adefault. - ckpt_name - the checkpoint to load, straight from your
models/checkpointsfolder. Tooltip from the author: "The name of the checkpoint (model) to load." - width / height - saved into
workspace.jsonand echoed out. Defaults are 640×480, so set them to something real. - codename_override (optional) - lets another node force a codename wire-in instead of the dropdown. Niche; you can ignore it.
The outputs and where they go
It returns eight values, but you'll use three of them. model, clip, vae feed your KSampler exactly like any other loader. full_path (a STRING) plugs straight into a save node's filename - or better, hand the workspace object to fot_Folder and let that build the path. width and height are handy for driving a Latent or Empty Latent Image without re-typing. The workspace object itself is what you wire into the Folder and Workspace Data nodes.
Installing it
The README's Manager instructions are still marked "TODO", and the author notes the pack can't be published to the ComfyUI registry because its internal name starts with an underscore. So the reliable path is a manual clone:
cd ComfyUI/custom_nodes
git clone https://github.com/wgedeon/comfyui_user_workspaces
Then restart ComfyUI. If you cloned manually without ComfyUI Manager, install its one dependency (python_path) - that's the entire requirements list. No models, no CUDA wheels, nothing heavy. Note the README still references the older underscore-prefixed repo name (_comfyui_user_workspaces); both URLs resolve, but use the current name above.
Where people get burned
A couple of honest warnings. First, fot_Workspace is an output node, which means it re-runs on every queue - it never skips like a cached loader would. You pay a checkpoint load per generation, and it rewrites workspace.json every run. On a big SDXL or Flux checkpoint that's real time. Second, if the checkpoint named in a saved workspace no longer exists in your checkpoints folder, the load fails loudly. Third, this is a young pack - the last commit is literally titled "debugging registration" - so treat it as a useful experiment, not infrastructure. It works, but there's not much of a community behind it if something breaks.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| codename | COMBO | default | 1 options: default |
| ckpt_name | COMBO | The name of the checkpoint (model) to load. | |
| width | INT | 640 | — |
| height | INT | 480 | — |
| codename_overrideopt | STRING | — | |
| workspace_hashopt | STRING | — |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| workspace | WORKSPACE | — |
| codename | STRING | — |
| full_path | STRING | — |
| model | MODEL | — |
| clip | CLIP | — |
| vae | VAE | — |
| width | INT | — |
| height | INT | — |