Releases: KamalTD/Vibrante-Node
Vibrante-Node v2.2.1
Release Notes — Vibrante-Node v2.2.1
Release date: 2026-05-15
Type: Patch — exe build bug fixes
Previous release: v2.2.0
Summary
Two bugs that only manifested in the frozen Windows exe (not in dev mode) are fixed in this release.
Bug Fixes
About Dialog crash — AttributeError: 'QTextEdit' object has no attribute 'setOpenExternalLinks'
Symptom: Opening Help → About Vibrante-Node in the exe build crashed with:
AttributeError: 'QTextEdit' object has no attribute 'setOpenExternalLinks'
Root cause: The _show_about() fallback branch (shown when the LICENSE file cannot be found) called text_edit.setOpenExternalLinks(True) on a QTextEdit instance. setOpenExternalLinks is a method of QLabel and QTextBrowser, not QTextEdit.
Fix: Changed the license display widget from QTextEdit to QTextBrowser. QTextBrowser is a subclass of QTextEdit with identical API plus full support for setOpenExternalLinks(True). All existing calls (setReadOnly, setFont, setLineWrapMode, setPlainText, setHtml) continue to work unchanged.
File: src/ui/window.py
About Dialog always showed "LICENSE file not found" fallback in exe build
Symptom: Even after installing the exe, the About dialog displayed:
"LICENSE file not found. See https://vibrante-node.com for full license terms."
instead of the actual license text.
Root cause: The LICENSE file was not included in the PyInstaller datas list in vibrante_node.spec. When resource_path('LICENSE') was called at runtime, it looked for the file at sys._MEIPASS/LICENSE (_internal/LICENSE) — but the file was never bundled there.
Fix: Added ('LICENSE', '.') to the datas list in vibrante_node.spec. PyInstaller now copies LICENSE into _internal/ alongside splash.png, logo.png, and the other bundled assets. resource_path('LICENSE') finds it correctly in the frozen exe.
File: vibrante_node.spec
Migration Notes
No breaking changes. No configuration changes required.
Both fixes are transparent to the user — the About dialog now opens correctly and shows the full license text. No workflow, node, or settings files are affected.
Files Modified
| File | Change |
|---|---|
src/ui/window.py |
QTextEdit → QTextBrowser in _show_about(); added QTextBrowser to local import |
vibrante_node.spec |
Added ('LICENSE', '.') to datas; version comment updated to v2.2.1 |
file_version_info.txt |
Version 2.2.1.0 |
src/main.py |
Version bump to v2.2.1 |
Vibrante-Node v2.1.1 — Windows Publisher Fix & Theme Fixes
Overview
v2.1.1 patch release: Scripting Console theme fix, Houdini plugin LICENSE, Windows VERSIONINFO in exe (fixes "Unknown publisher" on Windows 11), and contact info cleanup.
Bug Fixes
Scripting Console — Theme Not Applied on Switch
- Added
ScriptingConsole.apply_theme(is_dark)updating code editor, debug output, and Git status panels. _apply_dark_theme()/_apply_light_theme()inwindow.pynow cascade to the console.
Windows 11 — "Unknown publisher" on Exe Launch
- Added
file_version_info.txt(PyInstaller VSVersionInfo format) embedded viaversion=invibrante_node.spec. - Exe now carries CompanyName, ProductName, version 2.1.1.0, and copyright metadata.
SmartScreen / UAC elevation dialogs still require a code-signing certificate.
Changes
plugins/houdini/LICENSE— standalone commercial license for the Houdini plugin.- About dialog shows Houdini plugin license text.
- Contact email replaced with
[email protected]throughout. - Official website
https://vibrante-node.comadded to all relevant locations.
Upgrade Notes
No workflow format changes. All .json workflow files are compatible with v2.1.1.
Vibrante-Node v2.0.0
Release Notes — Vibrante-Node v2.0.0
Release date: 2026-05-10
Build: Python 3.10 / PyInstaller — Windows 64-bit
Overview
v2.0.0 is a major feature release that introduces the Subgraph / Group Node system, Live Wire Inspector, Autosave & Crash Recovery, Canvas Search, Mini-map, Recent Files, Node Execution Timing, and a Ctrl+C crash fix. It consolidates all v1.8.6, v1.8.7, v1.9.0, and post-1.9.0 work into a single stable release with a clean version number reflecting the scope of the changes.
New Features
Subgraph / Group Node (Ctrl+Shift+G)
Select two or more connected nodes and press Ctrl+Shift+G (or Edit → Group Selection) to collapse them into a single GroupNode that stores the complete subgraph as an embedded workflow.
- The inner graph is preserved in full inside the collapsed node's parameters — saved and loaded transparently with the parent workflow.
- Dynamic ports are created automatically from the boundary edges: one input per external-to-group connection, one output per group-to-external connection.
- Double-click the GroupNode to open the subgraph in a new tab for live editing. Changes are written back to the parent GroupNode in real time (undo / redo included).
exec_outfires when the inner graph finishes without an unhandled exception.exec_failfires only on unhandled exceptions inside the inner graph — semantic failures (e.g. a DCC node returningsuccess=False) are routed by the inner graph's own exec pins and do NOT triggerexec_fail.- Inner node logs are forwarded through the GroupNode's logger so they appear in the main log panel.
- Keyboard shortcut:
Ctrl+Shift+G(Ctrl+G is reserved for Wrap in Backdrop).
Live Wire Value Inspector
Hover over any connected wire during or after execution to see the last value that flowed through it as a tooltip (port_name: repr(value), capped at 300 characters).
- Values persist after execution ends — inspect the final state of every wire without re-running.
- Values are cleared automatically at the start of each new execution run.
- Wire hit area is 12 px wide (up from 2 px) so wires are easy to hover.
Autosave & Crash Recovery
A QTimer fires every 2 minutes and writes all non-empty open tabs to ~/.vibrante_node_autosave.json.
- On the next launch, if the autosave file exists, a restore dialog is offered.
- On a clean exit (
closeEvent), the autosave file is deleted — the dialog only appears after a crash or force-close. - Autosave is skipped during active execution to avoid capturing mid-run state.
Recent Files (File → Open Recent)
The File menu now has an Open Recent submenu listing the last 10 saved or loaded workflows.
- Files that no longer exist on disk are shown grayed-out (disabled).
- Clear Recent Files wipes the list.
- The list is rebuilt each time the File menu opens so it is always current.
Canvas Search Bar (Ctrl+F)
Press Ctrl+F (or Edit → Find in Canvas…) to open a floating search bar at the top of the canvas.
- Type to filter nodes by display name or
node_id. - The matched node is selected and the view pans to it.
- Enter / ▼ cycles forward; Shift+Enter / ▲ cycles backward.
- Match counter shows "X / N". Escape closes.
Mini-map (Ctrl+M)
A 200×150 px thumbnail of the full canvas is always visible in the bottom-right corner of each NodeView.
- A blue semi-transparent rectangle shows the current viewport position.
- Click or drag on the mini-map to pan the main view.
- Toggle with Ctrl+M or Window → Toggle Mini-map.
- Respects dark / light theme.
Node Execution Timing
The log panel now shows how long each node took to execute — e.g. Node 'Get Asset' finished in 0.34s.
Bug Fixes
GroupNode: exec_fail False Positive
exec_fail previously fired whenever any inner node returned a result that looked like a failure (e.g. maya_headless returning success=False). This caused false-positive "Group inner execution reported failure" errors even when the inner graph handled the failure correctly via its own exec routing.
Fix: exec_fail now fires only when an unhandled exception propagates out of an inner node (i.e. node_error signal is emitted by the sub-executor). Semantic outcomes are the inner graph's responsibility.
GroupNode: Injected Input Values Lost on Exec Ports
Group input values were injected into GroupInNode.parameters["value"], but "value" is an output port — the engine's clear_outputs() call resets all output-port-named parameters to None before execute() runs. Input values were therefore always None by the time the inner node ran.
Fix: Injection now uses parameters["_injected_value"] (not a port name, immune to clear_outputs()). GroupInNode.execute() reads from this key.
GroupNode: Inner Node Logs Discarded
All log messages from nodes inside a GroupNode were silently dropped — sub_executor.node_log was never connected.
Fix: node_log is connected to _forward_log which routes inner messages through the GroupNode's own logger with a [node_label] prefix.
GroupNode: exec_out Not Forwarded Through GroupOutNode
GroupOutNode was use_exec=False, meaning the inner exec chain could not route through it. If an inner exec chain needed to flow node-A → group_out → (end), the exec pin on group_out was ignored.
Fix: GroupOutNode is now use_exec=True with exec_in / exec_out ports. It calls set_output("exec_out", True) so the inner exec chain routes correctly. Legacy subgraphs without exec wiring on group_out still work — the node runs as a data entry node when no exec connection is present.
GroupNode: Subgraph Edits Not Persisted
Opening a subgraph in a new tab and editing it (adding nodes, changing connections) did not update the parent GroupNode. The __workflow__ parameter was never written back.
Fix: _open_subgraph_tab sets a _sync_callback on the subgraph NodeScene. The callback fires on every push_history(), undo(), and redo() call and writes the current workflow dict back to group_widget.node_definition.parameters["__workflow__"], then pushes the parent scene's history so the parent workflow is also saved correctly.
GroupNode: [ERROR] Group node has no internal workflow. After Save/Load
After editing a subgraph and saving the parent workflow, reloading it produced "Group node has no internal workflow." The __workflow__ key was silently dropped from the JSON file.
Root cause: push_history() uses model_dump() which returns Python UUID objects. _serializable_params() calls json.dumps() internally — UUID objects raise TypeError and the entire __workflow__ key is dropped silently.
Fix: _sync_back now calls WorkflowModel.model_validate(workflow_dict).model_dump(mode='json') before storing, converting all UUID objects to strings — matching the format group_selection() uses when first creating the GroupNode.
KeyboardInterrupt Crash (Ctrl+C in Terminal)
Pressing Ctrl+C in the terminal while the app was running caused a traceback crash through NodeView.event() at the C++/Python boundary of Qt's event loop.
Fix (two layers):
signal.signal(signal.SIGINT, lambda *_: app.quit())inmain()intercepts SIGINT before it reaches Qt's event loop.- A 200 ms
QTimerwakes the Python interpreter periodically so the signal is processed promptly. NodeView.event()wrapssuper().event(event)intry/except KeyboardInterruptas a safety net, callingapp.quit()for a clean shutdown.sys.excepthooknow exits cleanly onKeyboardInterruptinstead of writing a crash log.
Keyboard Shortcuts
| Shortcut | Action |
|---|---|
Ctrl+Shift+G |
Group / collapse selected nodes into a subgraph |
Ctrl+F |
Open canvas search bar |
Ctrl+M |
Toggle mini-map |
Tab |
Open node-search popup |
Ctrl+E |
Edit selected node in Node Builder |
Ctrl+R |
Reload selected node from disk |
Ctrl+Shift+R |
Reload all nodes |
F5 |
Run workflow |
F |
Focus selected nodes |
Ctrl+B |
Toggle bypass on selected nodes |
Ctrl+G |
Wrap selection in backdrop |
Ctrl+C / Ctrl+V |
Copy / Paste nodes |
Delete |
Delete selected items |
Ctrl+Wheel |
Zoom canvas |
Upgrade Notes
- Existing workflows containing GroupNodes saved before v2.0.0 may need to be re-grouped if the
__workflow__key was previously lost due to the UUID serialization bug. QScintillaremains a required dependency (pip install QScintilla). It is bundled in the Windows release build.- No breaking API changes for custom nodes or automation scripts.
Vibrante-Node v1.8.5
Release Notes — Vibrante-Node v1.8.5
Release date: 2026-05-05
Build: Python 3.10 / PyInstaller — Windows 64-bit
Overview
v1.8.5 is a polish and bugfix release focused on the code editor, Node Builder UX, and the node canvas widget layer.
New Features
Professional Code Editor (QScintilla)
All code editors across the application have been replaced with QsciScintilla (QScintilla), providing a full IDE-grade editing experience:
- Syntax highlighting with Dracula-dark and One-Light palettes
- Line numbers, code folding (boxed-tree style), and brace matching
- Auto-completion for Python keywords, builtins, and node API symbols
- Real-time syntax error markers in the gutter
- Ctrl+Wheel zoom
- Theme switches apply instantly to all open editors
Node Builder UX Overhaul
- Window is now maximizable with full minimize / maximize / close buttons
- Python Algorithm editor is the hero panel — it takes all available horizontal space; configuration and AI chat panels are compact side panes
- Left configuration panel is scrollable so all fields remain accessible when narrow
- Exec port checkboxes now correctly add / remove
add_exec_input/add_exec_outputlines in generated code;use_exec=Truewhen any exec port is active,use_exec=Falseonly when both are off
Theme System
- Dracula Theme (renamed from "Dark Theme") and One-Light theme now persist immediately on switch — no need to close the app
- Theme cascades to all open dialogs (Script Editor, Node Builder, Export dialog) via
QApplication.topLevelWidgets() - Global Fusion style applied for consistent QSS rendering on Windows (border-radius, custom scrollbars, etc.)
- Comprehensive dark stylesheet covers all widget types:
QCheckBoxwith indicator,QComboBoxwith dropdown,QSlider,QScrollBar,QTabBar,QMenuBar, and more
Bug Fixes
Canvas Dropdown Menu
- Dropdown menus in canvas node widgets now close on the first outside click
- Fixed crash when selecting an item from the dropdown (C++ object destroyed mid-signal emission)
- Fixed dropdown arrow not rendering after theme stylesheet was applied
- Fixed multiple clicks required to dismiss —
_MenuCloserapp-level event filter intercepts mouse press events before QGraphicsView can consume them
Canvas Slider Widget
- Slider groove, filled track, and handle are now visible with proper QSS (
::groove,::sub-page,::handle)
Node Search Popup (Tab)
- Single click now adds exactly one node — removed
itemDoubleClicked+itemActivateddual-signal setup that caused double adds on double-click
Code Editor Theme Init
- Editors in Script Editor and Node Builder now open with the correct saved theme on first show — palette is baked into the lexer before
setLexer()is called so no black-on-white flash occurs
Keyboard Shortcuts
| Shortcut | Action |
|---|---|
Tab |
Open node-search popup |
Ctrl+E |
Edit selected node in Node Builder |
Ctrl+R |
Reload selected node from disk |
Ctrl+Shift+R |
Reload all nodes |
F5 |
Run workflow |
F |
Focus selected nodes |
Ctrl+C / Ctrl+V |
Copy / Paste nodes |
Delete |
Delete selected items |
Ctrl+Wheel |
Zoom code editor font |
Upgrade Notes
QScintillais now a required dependency (pip install QScintilla). It is bundled in the Windows release build.- The
src/utils/highlighter.pymodule (old QSyntaxHighlighter) is no longer used by any editor but is kept for backward compatibility with third-party scripts.
Vibrante-Node v1.8.4
Release date: 2026-05-01
Build: Python 3.10 / PyInstaller — Windows 64-bit
Overview
v1.8.4 bundles the post-v1.8.3 feature work that landed on the main branch: node reload-from-disk, init-first scene ordering, edit/add toolbar shortcuts, and a new in-app HTML help system. It also corrects the for_loop execution model and introduces an additional output port on list_item_picker.
New Features
Node Reload from Disk
Edit a node's JSON definition file, then reload all live canvas instances without re-adding the node.
Ctrl+R— Reload selected node from disk. Ports are rebuilt, saved parameter values are re-applied, and connections whose port names still exist are preserved. Connections to removed ports are dropped.Ctrl+Shift+R— Reload All Nodes: re-reads every registered JSON node from disk and refreshes all live instances in every open scene.- Right-click → "Reload Node" — same as
Ctrl+Rfor the selected node. NodeRegistry.get_source_path(node_id)— returns the on-disk JSON path the node was loaded from.NodeRegistry.reload_node_definition(node_id)— re-reads and re-registers the definition from disk.NodeWidget.reload_definition(new_definition)— swaps the definition in-place and rebuilds the widget.NodeScene.reload_node_type(node_id)— orchestrates reload for all instances in the scene.
Edit Node Shortcut
Ctrl+E— Opens the Node Builder pre-loaded with the selected node's definition. After the builder closes, the node is automatically reloaded so canvas instances reflect any saved changes immediately.- Right-click → "Edit Node" — same action from the context menu.
Toolbar Additions
Five new toolbar buttons added to the main toolbar:
- Add Node — opens the node-search popup at the canvas centre (same as
Tab). - Add Sticky Note — adds a sticky note at the canvas centre.
- Add Network Box — adds a backdrop/network box at the canvas centre.
- Edit Selected Node — opens Node Builder (
Ctrl+E). - Reload Selected Node — reloads from disk (
Ctrl+R).
Init-First Scene Ordering
When loading a workflow, nodes with init_priority > 0 (marked as Init First) are now created and wired up before all other nodes. This guarantees authentication or server-connect nodes are fully initialized before any downstream node is instantiated.
HTML Help System
All documentation is now shipped as styled HTML files in the docs/ folder. The Help menu opens these HTML files directly in the system browser, providing properly rendered headings, tables, and code blocks instead of raw Markdown text.
Bug Fixes
for_loop — exec_out Now Fires Once
for_loop previously fired exec_out once per index (acting as its own loop body). This caused issues when the downstream chain had side effects. for_loop now fires exec_out once after the full indices list is ready. Use a loop_body node connected to indices + exec_out to iterate per item.
on_parameter_changed — Reactive Execution Propagation
When a node's execute produces an output that propagates to a downstream node mid-run, on_parameter_changed is now correctly called on the target instance. This allows reactive nodes (e.g. TwoWaySwitchNode, GetVariable) to update their own outputs when upstream data changes during execution — without the double-propagation bug fixed in v1.8.3.
list_item_picker — Added port_1 Output
A second output port port_1 of type any has been added to list_item_picker.
Keyboard Shortcuts Summary
| Shortcut | Action |
|---|---|
Tab |
Open node-search popup at canvas centre |
Ctrl+E |
Edit selected node in Node Builder |
Ctrl+R |
Reload selected node from disk |
Ctrl+Shift+R |
Reload all nodes from disk |
F5 |
Run workflow |
F |
Focus on selected nodes |
Ctrl+C / Ctrl+V |
Copy / Paste selected nodes |
Delete |
Delete selected items |
Upgrade Notes
for_loopusers: If your graph relied onfor_loopfiringexec_outper iteration, insert aloop_bodynode betweenfor_loop.exec_out→loop_body.exec_inand connectfor_loop.indices→loop_body.items. Theloop_bodyfiresexec_outonce per item.- The
docs/folder is now required alongside the executable. It is included automatically in the PyInstaller build.
Vibrante-Node v1.8.3
Release Notes — Vibrante-Node v1.8.3
Release date: 2026-04-30
Build: Python 3.10 / PyInstaller
Overview
v1.8.3 is a targeted bugfix patch that fixes incorrect on_parameter_changed calls being fired during node execution, which caused cascading side effects, premature data propagation, and unexpected flow triggers in complex graphs.
Bug Fixes
Engine — on_parameter_changed Called During Execution (engine.py)
-
on_parameter_changedcalled during pre-execute input sync — Before calling a node'sexecute, the engine synced incoming connection values and calledon_parameter_changedfor each one. Nodes likeTwoWaySwitchNodethat callset_outputinsideon_parameter_changedwould then eagerly propagate intermediate/stale values to downstream nodes beforeexecutehad run, causing incorrect or double-propagated results. Fixed by removing theon_parameter_changedcall from the pre-execute sync phase — parameters are already set directly andexecutereceives the correct values ininputs. -
on_parameter_changedcalled during reactive output propagation — When a node calledset_outputduring itsexecute, the engine's output handler firedon_parameter_changedon every downstream data node. This caused cascadingset_outputcalls from downstreamon_parameter_changedimplementations while the upstream node'sexecutewas still running, potentially triggering flow execution at unexpected times. Fixed by removing theon_parameter_changedcall from the reactive data propagation in the output handler. Downstream data nodes still receive updated parameter values (the direct parameter assignment is kept) and are correctly pulled via_run_single_node_implwhen a flow node needs them.
Nodes not affected: WhileLoopNode, ForEachNode — these read condition, break_condition, and continue_condition directly from self.parameters, which are still updated reactively by the engine's output handler.
Vibrante-Node v1.8.2
Release Notes — Vibrante-Node v1.8.2
Release date: 2026-04-27
Build: Python 3.10 / PyInstaller
Overview
v1.8.2 is a targeted bugfix patch fixing a dropdown parameter value mismatch that caused execute to receive an empty string instead of the actually selected item.
Bug Fixes
Dropdown Parameter Value (node_widget.py)
- Dropdown returns empty string in
execute—add_inputinitialisesparameters[name]to""forstringtype ports. When the widget was built,setCurrentText("")found no match in the combobox and left it visually at index 0, butparameters[name]stayed"". Callingself.get_parameter(name)or readinginputs[name]inexecutetherefore returned""instead of the displayed item. Fixed by always syncingparameters[name]fromw.currentText()after the initial-value setup, so the stored value always matches what is shown in the UI.
Vibrante-Node v1.8.1
Release Notes — Vibrante-Node v1.8.1
Release date: 2026-04-26
Build: Python 3.10 / PyInstaller
Overview
v1.8.1 is a targeted bugfix patch addressing reactive data-flow issues in the node widget and a code-preservation bug in the Node Builder.
Bug Fixes
Reactive Data Flow (node_widget.py)
on_parameter_changedstale value — Downstream nodes were receiving the previous output value on the first change after a wire was plugged. Root cause:_propagate_all_outputs()ran synchronously before theon_parameter_changedcoroutine had a chance to execute and update outputs viaset_output(). Bothset_parameterand_update_paramnow awaiton_parameter_changedto completion before triggering downstream propagation.
Node Builder (node_builder.py)
- Execute method reset on port edit — Editing inputs or outputs in the Node Builder table was silently overwriting user-written code inside the
async def executemethod. The[SET-OUTPUT-START/END]and[EXEC-OUT-START/END]blocks were being regenerated on every table/metadata change. These blocks are now only regenerated when the exec checkboxes change (update_exec_hintsflag), preserving custom execute logic during port edits.
Vibrante-Node v1.8.0
Release Notes — Vibrante-Node v1.8.0
Release date: 2026-04-23
Build: Python 3.10 / PyInstaller
Overview
v1.8.0 is a stability and bugfix release focused on the VFX pipeline workflows. All known execution errors across the Maya, Houdini, Blender, Prism, and Deadline nodes have been resolved, and the engine has been hardened against edge-case crashes.
Bug Fixes
Engine
result or {}guard —NetworkExecutornow protectsnode_results.update(result)against nodes that returnNonefromexecute(), preventingTypeError: 'NoneType' object is not iterablecrashes.
Flow Control
for_loop— Was firingexec_outonly once (last index). Now iterates correctly in a Python loop, callingset_output('current_index', i)thenset_output('exec_out', True)per index._executed_nodescache invalidation — Pure data nodes are now discarded from the cache when their inputs change reactively, forcing them to recompute each loop iteration instead of serving stale results.- Bypass flag — Bypassed nodes now correctly skip
execute()and pass exec flow through to downstream nodes.
Prism Nodes
prism_get_export_path- Added
"3d"and"2d"as validoutput_typealiases (previously only"3drender"/"2drender"were recognised). version_pathoutput now returns the full file path of the first matching file inside the version directory, not the directory itself. Falls back to the directory path when no file exists yet.- Added new
version_diroutput for the directory path.
- Added
prism_create_product_version— Data outputs (version_path,success) are now emitted viaset_output()beforeexec_outfires, so downstream nodes receive values before continuing.- Prism shot/sequence getter nodes — All six nodes (
prism_get_shots,prism_get_shots_by_sequence,prism_get_sequence_by_project,prism_get_sequences_by_project,prism_get_sequence_by_project,prism_get_shot_by_sequence) updated to use Prism v2.1.0 flat-listgetShots()API.
Deadline Nodes
deadline_job_status— Two barereturnstatements insideexecute()replaced withreturn {}to preventNoneTypecrashes in the engine.
Houdini Nodes
houdini_headless- Added upfront
os.path.isfile(hython)check with a clear error message instead of the cryptic[WinError 2]when the executable path is wrong. import_alembiccontext logic inverted: now defaults to/objfor any value except the explicit string"/stage", preventing accidental LOP imports.import_objandimport_fbxcontext checks hardened with the same inversion.
- Added upfront
houdini_action_import_alembic— Context value normalised with(value or "/obj").strip()to preventNonefalling through to the/stagebranch.
Blender Nodes
blender_headless- Fixed
SyntaxError: unterminated string literalin the runner script:'\n'inside a triple-quoted Python string was being written as a real newline to the temp.pyfile. Replaced withchr(10). bpy.ops.wm.alembic_export: Blender 4+ renamedframe_start/frame_endtostart/end. Runner now triesstart/endfirst and falls back to the old names.- Added
os.makedirs(..., exist_ok=True)before FBX, Alembic, and USD exports so missing output directories don't silently fail.
- Fixed
UI
- Delete / F key conflicts —
keyPressEventin bothscene.pyandview.pynow checksQApplication.focusWidget()and bails early if focus is on a text widget, preventing accidental node deletion or focus-fitting while typing in parameters, sticky notes, or backdrop titles.
VFX Workflow Files
Six production VFX workflow templates added/updated under vfx_workflows/:
| File | Description |
|---|---|
01_prism_project_overview.json |
Project/shot/asset browser |
02_maya_asset_publish.json |
Maya headless asset publish to Prism |
03_multi_shot_alembic_export.json |
Multi-shot alembic export loop via Maya |
04_deadline_render_pipeline.json |
Deadline Maya render submission + job status polling |
05_houdini_fx_pipeline.json |
Houdini FX sim + Prism cache registration |
06_blender_multi_format_export.json |
Blender FBX / Alembic / USD multi-format export |
Release: v1.7.0
Release Notes — Vibrante-Node v1.7.0
Release date: 2026-04-19
Build: Python 3.10 / PyInstaller 6.19
Overview
v1.7.0 is a major Prism Pipeline integration overhaul. All Prism getter nodes have been audited and standardised, department/task/path resolution is now fully dynamic (read from the project's pipeline.json), and two new path-resolution nodes have been added.
New Features
prism_get_scene_path
Resolves the filesystem path for a scene file from entity + department + task + application + version inputs.
- Scans
Scenefiles/<dept>/<task>/using the project's configured folder structure - Filters by application extension (Blender →
.blend, Houdini →.hip/.hiplc/.hipnc, Maya →.ma/.mb, Nuke →.nk, etc.) version=latestpicks the highest_v####file; explicit version resolves exact match- If no file exists, constructs the expected filename from Prism's template (
<seq>-<shot>_<task>_<version><ext>) - Outputs:
scene_path,task_path,version,exists
prism_get_export_path
Resolves output paths for exports, renders, and playblasts.
output_type:export→Export/,3drender→Renders/3dRender/,2drender→Renders/2dRender/,playblast→Playblasts/- Scans identifier folder for existing version directories;
version=latestreturns highest - Outputs:
identifier_path,version_path,version,file_pattern,exists file_patternuses Prism naming:<seq>-<shot>_<identifier>_<version>.####.exr
src/utils/prism_config.py — Dynamic Project Config Reader
New shared utility replacing all hardcoded department abbreviation dictionaries.
- Reads
globals.departments_shot/globals.departments_assetfrompipeline.json - Config discovery: entity
pathwalk-up →project['configPath']→ core's current project → user Prism2 dir - Respects
PRISM_LAUNCHER_CONFIGenvironment variable for non-standard installs - API:
get_departments(),resolve_dept_folder(),resolve_dept_name(),get_entity_scenefiles_root(),build_abbrev_map() versionPaddingread from project globals for correctv0001/v0004formatting
prism_get_departments — New Outputs
- Added
default_tasksoutput: list of default task names per department (frompipeline.json) - Added
abbreviationsoutput: raw folder names (anm,cfx, …) alongside full names
Bug Fixes
Entity dict enrichment — path/location/paths fields
prism_get_shot_by_sequence and prism_get_shot_by_name previously emitted a minimal entity dict {type, sequence, shot}. Prism's getScenefiles() silently returns empty without the path field. All shot-outputting nodes now emit the full dict:
{"type": "shot", "sequence": "seq_0001", "shot": "shot_001",
"path": "G:/Prism/.../shot_001", "location": "global", "paths": [...]}prism_get_scene_files — Disk fallback
getScenefiles() returns empty even with a correctly enriched entity. Added disk scanner that reads Scenefiles/<dept>/<task>/ directly, filters out *versioninfo.json and *preview.jpg, sorts by version, and returns file dicts with path, version, task, department.
prism_get_departments — Wrong data source
Was calling getCategories() which returns Prism UI tabs (Scenefiles/Renders/Exports) not departments. Fixed to read from pipeline.json globals first, then scan Scenefiles/ as fallback.
prism_get_tasks — Crash on getTaskNames
Prism's decorator re-raises exceptions as BaseException, bypassing except Exception. Removed the broken getTaskNames fallback. Tasks are now resolved via disk scan of Scenefiles/<dept>/ with config-driven abbreviation mapping.
Department resolution — All nodes
Removed hardcoded DEPT_ABBREVS dictionaries from prism_get_tasks, prism_get_entity_path, prism_get_scene_files. All nodes now use prism_config.resolve_dept_folder() which reads the actual project's department list.
prism_get_entity_info — Missing path output
Added path output port that passes through entity['path'] for downstream nodes.
prism_get_shot_info — Broken getEntityPath call
Removed calls to non-existent getEntityPath/getShotPath API methods. entity_path now reads directly from entity.get('path').
prism_get_sequences_by_project — Inconsistent output type
Was outputting a list of strings. Now outputs a list of dicts {name, project_path, project_name} matching the shape expected by prism_get_shot_by_sequence.
Audit: None defaults
12 nodes (prism_get_media_versions, prism_get_product_versions, prism_get_plugin, prism_import_product, prism_send_cmd, prism_trigger_callback, prism_eval, prism_register_callback, and others) returned None for output ports on error. Changed to safe empty defaults ({} or "").
prism_core_info — Runtime crash
Removed stray exec_out emission on a use_exec=False node.
prism_build_entity / prism_create_entity — Incomplete entity dicts
Shot entities now include path, location, paths; asset entities include path.
prism_get_shots — getShots() unpack crash
sequences, shots = core.entities.getShots() crashes when Prism returns a single list after changeProject(). Fixed with try/except unpack pattern across all affected nodes.
Nodes Changed
| Node | Change |
|---|---|
prism_get_shot_by_sequence |
Entity enrichment: path/location/paths |
prism_get_shot_by_name |
Entity enrichment: path/location/paths |
prism_get_departments |
Config-driven, added abbreviations + default_tasks outputs |
prism_get_tasks |
Config-driven, disk fallback, removed crashing getTaskNames |
prism_get_scene_files |
Disk fallback scanner |
prism_get_entity_path |
Config-driven dept resolution |
prism_get_entity_info |
Added path output |
prism_get_shot_info |
Uses entity.path directly |
prism_get_sequences_by_project |
Outputs sequence dicts not strings |
prism_get_shots |
getShots unpack fix |
prism_get_shots_by_sequence |
getShots unpack fix |
prism_get_asset_by_name |
Asset entity includes path |
prism_get_scene_files |
DEPT_ABBREVS → prism_config |
prism_core_info |
Remove stray exec_out |
prism_build_entity |
Full entity dict fields |
prism_create_entity |
Full entity dict fields |
prism_get_current_scene |
Full entity dict reconstruction |
| 12× misc nodes | None → safe empty defaults |