sverchok-core-concepts
Quick Reference
What Is Sverchok
Sverchok is a parametric/algorithmic design add-on for Blender implementing a dataflow programming paradigm within the node editor. Data flows from output sockets to input sockets through noodle connections.
- 500+ nodes across 18+ categories for geometry generation, transformation, analysis
- Python scripting: SNLite, SN Functor B, Formula nodes for custom logic
- Extension ecosystem: IfcSverchok, TopologicSverchok, Sverchok-Extra
- External API: Full programmatic access via
bpy.data.node_groups
Critical Warnings
NEVER call process() directly on a node — ALWAYS use the update system via updateNode or tree.force_update().
NEVER modify socket data in-place from sv_get() when deepcopy=True was not used — this mutates the upstream node's cached output and corrupts the entire downstream chain.
NEVER skip init_tree() context manager when programmatically building node trees — without it, every link/node addition triggers a full tree update, causing O(n²) performance.
NEVER store socket data references across frame changes — the socket data cache is cleared on each update cycle.
ALWAYS use updateNode as the update= callback on bpy.props properties — this is the ONLY correct way to trigger re-evaluation when a property changes.
ALWAYS check tree.sv_process before assuming a tree will update — trees with processing disabled silently ignore all events.
Decision Tree
Need to create geometry programmatically?
├── Simple primitives → Generator nodes (Box, Sphere, Cylinder, etc.)
├── From vertex/face data → Script nodes (SNLite) or List/Vector nodes
├── Parametric/repeating → Use Number + List nodes to drive generators
└── Complex algorithm → SNLite node with custom Python
Need to debug update issues?
├── Tree not updating at all → Check tree.sv_process is True
├── Node shows red/error → Read node.US_error for the error message
├── Partial updates → Check if upstream node has data (sv_get raises SvNoDataError?)
├── Animation not working → Check tree.sv_animate is True
└── Performance issues → Check node.US_time values, enable draft mode
Need to access Sverchok trees via script?
├── Get tree → bpy.data.node_groups['TreeName'] (type: SverchCustomTreeType)
├── Get node → tree.nodes['NodeName']
├── Read output → node.outputs[0].sv_get()
├── Force update → tree.force_update()
└── Build tree → Use tree.init_tree() context manager
Essential Patterns
Pattern 1: Access a Sverchok Node Tree
# Blender 4.0+/5.x with Sverchok v1.4.0+
import bpy
# Get existing Sverchok tree
tree = bpy.data.node_groups.get("MyTree")
if tree is None or tree.bl_idname != 'SverchCustomTreeType':
raise RuntimeError("Sverchok tree 'MyTree' not found")
# Check tree state
print(f"Processing enabled: {tree.sv_process}")
print(f"Animation mode: {tree.sv_animate}")
print(f"Draft mode: {tree.sv_draft}")
Pattern 2: Build a Node Tree Programmatically
# Blender 4.0+/5.x with Sverchok v1.4.0+
import bpy
# Create new Sverchok tree
tree = bpy.data.node_groups.new("ParametricGrid", 'SverchCustomTreeType')
# ALWAYS use init_tree() to suppress updates during construction
with tree.init_tree():
# Add nodes
num_node = tree.nodes.new('SvNumberNode')
num_node.location = (0, 0)
grid_node = tree.nodes.new('SvPlaneNode')
grid_node.location = (200, 0)
viewer = tree.nodes.new('SvViewerDrawMk4')
viewer.location = (400, 0)
# Create links
tree.links.new(num_node.outputs[0], grid_node.inputs[0])
tree.links.new(grid_node.outputs['Vertices'], viewer.inputs['vertices'])
# Force initial evaluation after construction
tree.force_update()
Pattern 3: Read Data from Node Outputs
# Blender 4.0+/5.x with Sverchok v1.4.0+
import bpy
tree = bpy.data.node_groups["MyTree"]
node = tree.nodes["MyGeneratorNode"]
# Read output socket data
# sv_get() returns nested lists: [[data_object_1], [data_object_2], ...]
try:
vertices = node.outputs['Vertices'].sv_get()
# vertices structure: [[(x,y,z), (x,y,z), ...], [...], ...]
# Outer list = objects, inner list = vertices per object
for obj_idx, obj_verts in enumerate(vertices):
print(f"Object {obj_idx}: {len(obj_verts)} vertices")
except Exception:
print("No data available — node may not have been processed yet")
Pattern 4: Trigger Updates Correctly
# Blender 4.0+/5.x with Sverchok v1.4.0+
from sverchok.data_structure import updateNode
import bpy
# On a custom node: ALWAYS use updateNode as property callback
class MyCustomNode(SverchCustomTreeNode, bpy.types.Node):
bl_idname = 'SvMyCustomNode'
bl_label = 'My Custom Node'
my_param: bpy.props.FloatProperty(
name="Parameter",
default=1.0,
update=updateNode # CORRECT: triggers PropertyEvent -> tree update
)
def process(self):
# Called by the update system — NEVER call directly
value = self.my_param
result = [[value * i for i in range(10)]]
self.outputs['Result'].sv_set(result)
Pattern 5: Data Nesting Convention
# Sverchok v1.4.0+ data nesting convention
# ALL socket data follows this structure:
# Level 0 (outermost): list of objects
# Level 1: data per object (vertices, edges, faces, values)
# Level 2+: individual data items
# Vertices: [[(x,y,z), (x,y,z), ...]] : 1 object, N vertices
# Edges: [[(i,j), (i,j), ...]] : 1 object, N edges
# Faces: [[(i,j,k,...), ...]] : 1 object, N faces
# Numbers: [[1.0, 2.0, 3.0]] : 1 object, N values
# Multiple objects:
# Vertices: [[(v1), (v2)], [(v3), (v4)]] : 2 objects
# match_long_repeat handles mismatched list lengths between inputs
from sverchok.data_structure import match_long_repeat
verts_list = [[(0,0,0), (1,0,0)], [(2,0,0), (3,0,0), (4,0,0)]]
scale_list = [[2.0]] # Only 1 value for 2 objects
# match_long_repeat repeats the shorter list to match the longer
matched = match_long_repeat([verts_list, scale_list])
# Result: verts unchanged, scale becomes [[2.0], [2.0]]
Pattern 6: Socket Data Cache Operations
# Sverchok v1.4.0+: core/socket_data.py
# Socket data is stored in a global dict: socket_data_cache[SockId] = data
# SockId = hash of node.node_id + socket.identifier + direction
# Writing data to an output socket (inside process())
self.outputs['Vertices'].sv_set(vertex_data)
# Reading data from an input socket (inside process())
# deepcopy=True (default): safe, returns independent copy
vertices = self.inputs['Vertices'].sv_get(deepcopy=True)
# deepcopy=False: ONLY when you will NOT mutate the data (performance gain)
vertices = self.inputs['Vertices'].sv_get(deepcopy=False)
# Reading with default value (no error if unconnected)
vertices = self.inputs['Vertices'].sv_get(default=[[]])
Pattern 7: Force Tree Update
# Blender 4.0+/5.x with Sverchok v1.4.0+
import bpy
tree = bpy.data.node_groups["MyTree"]
# Ensure processing is enabled
tree.sv_process = True
# Force complete recalculation (ForceEvent)
tree.force_update()
# Update specific nodes only
tree.update_nodes([tree.nodes["NodeA"], tree.nodes["NodeB"]])
Common Operations
Node Tree Properties
| Property |
Type |
Purpose |
tree.sv_process |
BoolProperty |
Enable/disable tree processing |
tree.sv_animate |
BoolProperty |
Process on frame change |
tree.sv_show |
BoolProperty |
Show viewer outputs in viewport |
tree.sv_draft |
BoolProperty |
Draft mode (reduced quality for speed) |
tree.sv_scene_update |
BoolProperty |
React to scene changes |
Update Event Types
| Event |
Trigger |
Scope |
PropertyEvent |
updateNode callback on bpy.props |
Marks specific node as outdated |
TreeEvent |
Node/link addition or removal |
Re-evaluates entire tree topology |
ForceEvent |
tree.force_update() |
Resets and updates entire tree |
AnimationEvent |
Frame change (requires sv_animate=True) |
Animation-dependent nodes |
SceneEvent |
Scene modification (requires sv_scene_update=True) |
Scene-dependent nodes |
FileEvent |
New file loaded |
Full tree reload |
UndoEvent |
Undo operation |
Restores tree state |
Node Execution Statistics
Each node records after execution:
| Attribute |
Type |
Description |
node.US_is_updated |
bool |
Whether node executed successfully |
node.US_error |
str |
Error message if execution failed |
node.US_error_stack |
str |
Full traceback string |
node.US_time |
float |
Execution time in seconds |
node.US_warning |
str |
Warning messages from logging |
Node Categories (18+ categories, 500+ nodes)
| Category |
Description |
Key Nodes |
| Generators |
Create geometry primitives |
Box, Sphere, Cylinder, Torus, Plane, Circle, Line |
| Transforms |
Move, Rotate, Scale |
Matrix Apply, Mirror, Shear, Bend, Twist |
| Analyzers |
Measure and analyze |
Distance, Area, Volume, BBox, KDTree, Normals |
| Modifier Make |
Construct topology |
Convex Hull, Voronoi, Delaunay, Join, Bridge |
| Modifier Change |
Alter topology |
Subdivide, Dissolve, Merge, Separate, Flip |
| Modifier Deform |
Deform geometry |
Noise, Smooth, Lattice, Proportional Edit |
| List |
List processing |
Join, Split, Shift, Sort, Mask, Filter, Zip, Repeat |
| Number |
Numeric operations |
Number, Range, Random, Map Range, Formula |
| Vector |
Vector operations |
Vector In/Out, Math, Noise, Interpolation |
| Matrix |
Matrix operations |
Matrix In/Out, Apply, Multiply, Invert, Track To |
| Logic |
Flow control |
Switch, Gate, Compare, Logic, Mask |
| Viz |
Visualization |
Viewer Draw, Viewer BMesh, Stethoscope, Spreadsheet |
| Text |
String operations |
Text In/Out, CSV, JSON |
| Scene |
Blender scene access |
Object In/Out, Frame Info, Collection Picker |
| Layout |
Node organization |
Frame, Reroute, WiFi In/Out, Group |
| Script |
Python scripting |
SNLite, SN Functor B, Formula Mk5, Profile Mk3 |
| Curve/Surface/Field |
Advanced geometry |
NURBS, Bezier, Spline, Marching Cubes |
| Solid |
CAD operations (FreeCAD) |
Boolean, Fillet, Chamfer, Shell, Offset |
| Pulga Physics |
Physics simulation |
Particle-based simulations |
| Exchange |
Import/Export |
SVG, DXF, JSON, NumPy, CSV |
Core Architecture Files
| File |
Description |
node_tree.py |
SverchCustomTree, SverchCustomTreeNode, UpdateNodes, NodeUtils |
data_structure.py |
match_long_repeat, fullList, updateNode, multi_socket |
core/sockets.py |
All socket type definitions (SvStringsSocket, etc.) |
core/events.py |
Event classes (TreeEvent, AnimationEvent, etc.) |
core/socket_data.py |
Socket data cache (sv_get_socket, sv_set_socket) |
core/update_system.py |
SearchTree, UpdateTree, control_center |
core/socket_conversions.py |
Automatic type conversion functions |
utils/vectorize.py |
vectorize decorator, DataWalker |
Node Base Class Mixins
| Mixin |
Purpose |
UpdateNodes |
Node lifecycle (sv_init, sv_update, sv_copy, sv_free), process management |
NodeUtils |
Logger shortcuts, tracked UI operators, data retrieval helpers |
NodeDependencies |
Optional library dependency checking |
NodeDocumentation |
Docstring parsing, help link generation |
Reference Links
- references/methods.md — Complete API signatures for SverchCustomTree, SverchCustomTreeNode, socket data cache, SearchTree, update system
- references/examples.md — Working code examples for tree construction, data flow, custom nodes
- references/anti-patterns.md — What NOT to do with Sverchok, with WHY explanations
Official Sources
1---2name: sverchok-core-concepts3description: Use when learning Sverchok fundamentals or debugging node tree execution issues. Prevents the common mistake of expecting immediate execution (Sverchok uses deferred tree-level updates, not per-node). Covers node tree architecture, data flow, socket data cache, update triggers, and the 18+ node categories with 500+ nodes. Keywords: Sverchok, node tree, data flow, socket cache, update trigger, node categories, SverchCustomTreeType, parametric design, node execution, what is Sverchok, visual programming, node-based modeling.4license: MIT5---67# sverchok-core-concepts89## Quick Reference1011### What Is Sverchok1213Sverchok is a parametric/algorithmic design add-on for Blender implementing a **dataflow programming paradigm** within the node editor. Data flows from output sockets to input sockets through noodle connections.1415- **500+ nodes** across **18+ categories** for geometry generation, transformation, analysis16- **Python scripting**: SNLite, SN Functor B, Formula nodes for custom logic17- **Extension ecosystem**: IfcSverchok, TopologicSverchok, Sverchok-Extra18- **External API**: Full programmatic access via `bpy.data.node_groups`1920### Critical Warnings2122**NEVER** call `process()` directly on a node — ALWAYS use the update system via `updateNode` or `tree.force_update()`.2324**NEVER** modify socket data in-place from `sv_get()` when `deepcopy=True` was not used — this mutates the upstream node's cached output and corrupts the entire downstream chain.2526**NEVER** skip `init_tree()` context manager when programmatically building node trees — without it, every link/node addition triggers a full tree update, causing O(n²) performance.2728**NEVER** store socket data references across frame changes — the socket data cache is cleared on each update cycle.2930**ALWAYS** use `updateNode` as the `update=` callback on `bpy.props` properties — this is the ONLY correct way to trigger re-evaluation when a property changes.3132**ALWAYS** check `tree.sv_process` before assuming a tree will update — trees with processing disabled silently ignore all events.3334### Decision Tree3536```37Need to create geometry programmatically?38├── Simple primitives → Generator nodes (Box, Sphere, Cylinder, etc.)39├── From vertex/face data → Script nodes (SNLite) or List/Vector nodes40├── Parametric/repeating → Use Number + List nodes to drive generators41└── Complex algorithm → SNLite node with custom Python4243Need to debug update issues?44├── Tree not updating at all → Check tree.sv_process is True45├── Node shows red/error → Read node.US_error for the error message46├── Partial updates → Check if upstream node has data (sv_get raises SvNoDataError?)47├── Animation not working → Check tree.sv_animate is True48└── Performance issues → Check node.US_time values, enable draft mode4950Need to access Sverchok trees via script?51├── Get tree → bpy.data.node_groups['TreeName'] (type: SverchCustomTreeType)52├── Get node → tree.nodes['NodeName']53├── Read output → node.outputs[0].sv_get()54├── Force update → tree.force_update()55└── Build tree → Use tree.init_tree() context manager56```5758---5960## Essential Patterns6162### Pattern 1: Access a Sverchok Node Tree6364```python65# Blender 4.0+/5.x with Sverchok v1.4.0+66import bpy6768# Get existing Sverchok tree69tree = bpy.data.node_groups.get("MyTree")70if tree is None or tree.bl_idname != 'SverchCustomTreeType':71 raise RuntimeError("Sverchok tree 'MyTree' not found")7273# Check tree state74print(f"Processing enabled: {tree.sv_process}")75print(f"Animation mode: {tree.sv_animate}")76print(f"Draft mode: {tree.sv_draft}")77```7879### Pattern 2: Build a Node Tree Programmatically8081```python82# Blender 4.0+/5.x with Sverchok v1.4.0+83import bpy8485# Create new Sverchok tree86tree = bpy.data.node_groups.new("ParametricGrid", 'SverchCustomTreeType')8788# ALWAYS use init_tree() to suppress updates during construction89with tree.init_tree():90 # Add nodes91 num_node = tree.nodes.new('SvNumberNode')92 num_node.location = (0, 0)9394 grid_node = tree.nodes.new('SvPlaneNode')95 grid_node.location = (200, 0)9697 viewer = tree.nodes.new('SvViewerDrawMk4')98 viewer.location = (400, 0)99100 # Create links101 tree.links.new(num_node.outputs[0], grid_node.inputs[0])102 tree.links.new(grid_node.outputs['Vertices'], viewer.inputs['vertices'])103104# Force initial evaluation after construction105tree.force_update()106```107108### Pattern 3: Read Data from Node Outputs109110```python111# Blender 4.0+/5.x with Sverchok v1.4.0+112import bpy113114tree = bpy.data.node_groups["MyTree"]115node = tree.nodes["MyGeneratorNode"]116117# Read output socket data118# sv_get() returns nested lists: [[data_object_1], [data_object_2], ...]119try:120 vertices = node.outputs['Vertices'].sv_get()121 # vertices structure: [[(x,y,z), (x,y,z), ...], [...], ...]122 # Outer list = objects, inner list = vertices per object123 for obj_idx, obj_verts in enumerate(vertices):124 print(f"Object {obj_idx}: {len(obj_verts)} vertices")125except Exception:126 print("No data available — node may not have been processed yet")127```128129### Pattern 4: Trigger Updates Correctly130131```python132# Blender 4.0+/5.x with Sverchok v1.4.0+133from sverchok.data_structure import updateNode134import bpy135136# On a custom node: ALWAYS use updateNode as property callback137class MyCustomNode(SverchCustomTreeNode, bpy.types.Node):138 bl_idname = 'SvMyCustomNode'139 bl_label = 'My Custom Node'140141 my_param: bpy.props.FloatProperty(142 name="Parameter",143 default=1.0,144 update=updateNode # CORRECT: triggers PropertyEvent -> tree update145 )146147 def process(self):148 # Called by the update system — NEVER call directly149 value = self.my_param150 result = [[value * i for i in range(10)]]151 self.outputs['Result'].sv_set(result)152```153154### Pattern 5: Data Nesting Convention155156```python157# Sverchok v1.4.0+ data nesting convention158# ALL socket data follows this structure:159# Level 0 (outermost): list of objects160# Level 1: data per object (vertices, edges, faces, values)161# Level 2+: individual data items162163# Vertices: [[(x,y,z), (x,y,z), ...]] : 1 object, N vertices164# Edges: [[(i,j), (i,j), ...]] : 1 object, N edges165# Faces: [[(i,j,k,...), ...]] : 1 object, N faces166# Numbers: [[1.0, 2.0, 3.0]] : 1 object, N values167168# Multiple objects:169# Vertices: [[(v1), (v2)], [(v3), (v4)]] : 2 objects170# match_long_repeat handles mismatched list lengths between inputs171from sverchok.data_structure import match_long_repeat172173verts_list = [[(0,0,0), (1,0,0)], [(2,0,0), (3,0,0), (4,0,0)]]174scale_list = [[2.0]] # Only 1 value for 2 objects175176# match_long_repeat repeats the shorter list to match the longer177matched = match_long_repeat([verts_list, scale_list])178# Result: verts unchanged, scale becomes [[2.0], [2.0]]179```180181### Pattern 6: Socket Data Cache Operations182183```python184# Sverchok v1.4.0+: core/socket_data.py185# Socket data is stored in a global dict: socket_data_cache[SockId] = data186# SockId = hash of node.node_id + socket.identifier + direction187188# Writing data to an output socket (inside process())189self.outputs['Vertices'].sv_set(vertex_data)190191# Reading data from an input socket (inside process())192# deepcopy=True (default): safe, returns independent copy193vertices = self.inputs['Vertices'].sv_get(deepcopy=True)194195# deepcopy=False: ONLY when you will NOT mutate the data (performance gain)196vertices = self.inputs['Vertices'].sv_get(deepcopy=False)197198# Reading with default value (no error if unconnected)199vertices = self.inputs['Vertices'].sv_get(default=[[]])200```201202### Pattern 7: Force Tree Update203204```python205# Blender 4.0+/5.x with Sverchok v1.4.0+206import bpy207208tree = bpy.data.node_groups["MyTree"]209210# Ensure processing is enabled211tree.sv_process = True212213# Force complete recalculation (ForceEvent)214tree.force_update()215216# Update specific nodes only217tree.update_nodes([tree.nodes["NodeA"], tree.nodes["NodeB"]])218```219220---221222## Common Operations223224### Node Tree Properties225226| Property | Type | Purpose |227|----------|------|---------|228| `tree.sv_process` | `BoolProperty` | Enable/disable tree processing |229| `tree.sv_animate` | `BoolProperty` | Process on frame change |230| `tree.sv_show` | `BoolProperty` | Show viewer outputs in viewport |231| `tree.sv_draft` | `BoolProperty` | Draft mode (reduced quality for speed) |232| `tree.sv_scene_update` | `BoolProperty` | React to scene changes |233234### Update Event Types235236| Event | Trigger | Scope |237|-------|---------|-------|238| `PropertyEvent` | `updateNode` callback on `bpy.props` | Marks specific node as outdated |239| `TreeEvent` | Node/link addition or removal | Re-evaluates entire tree topology |240| `ForceEvent` | `tree.force_update()` | Resets and updates entire tree |241| `AnimationEvent` | Frame change (requires `sv_animate=True`) | Animation-dependent nodes |242| `SceneEvent` | Scene modification (requires `sv_scene_update=True`) | Scene-dependent nodes |243| `FileEvent` | New file loaded | Full tree reload |244| `UndoEvent` | Undo operation | Restores tree state |245246### Node Execution Statistics247248Each node records after execution:249250| Attribute | Type | Description |251|-----------|------|-------------|252| `node.US_is_updated` | `bool` | Whether node executed successfully |253| `node.US_error` | `str` | Error message if execution failed |254| `node.US_error_stack` | `str` | Full traceback string |255| `node.US_time` | `float` | Execution time in seconds |256| `node.US_warning` | `str` | Warning messages from logging |257258### Node Categories (18+ categories, 500+ nodes)259260| Category | Description | Key Nodes |261|----------|-------------|-----------|262| **Generators** | Create geometry primitives | Box, Sphere, Cylinder, Torus, Plane, Circle, Line |263| **Transforms** | Move, Rotate, Scale | Matrix Apply, Mirror, Shear, Bend, Twist |264| **Analyzers** | Measure and analyze | Distance, Area, Volume, BBox, KDTree, Normals |265| **Modifier Make** | Construct topology | Convex Hull, Voronoi, Delaunay, Join, Bridge |266| **Modifier Change** | Alter topology | Subdivide, Dissolve, Merge, Separate, Flip |267| **Modifier Deform** | Deform geometry | Noise, Smooth, Lattice, Proportional Edit |268| **List** | List processing | Join, Split, Shift, Sort, Mask, Filter, Zip, Repeat |269| **Number** | Numeric operations | Number, Range, Random, Map Range, Formula |270| **Vector** | Vector operations | Vector In/Out, Math, Noise, Interpolation |271| **Matrix** | Matrix operations | Matrix In/Out, Apply, Multiply, Invert, Track To |272| **Logic** | Flow control | Switch, Gate, Compare, Logic, Mask |273| **Viz** | Visualization | Viewer Draw, Viewer BMesh, Stethoscope, Spreadsheet |274| **Text** | String operations | Text In/Out, CSV, JSON |275| **Scene** | Blender scene access | Object In/Out, Frame Info, Collection Picker |276| **Layout** | Node organization | Frame, Reroute, WiFi In/Out, Group |277| **Script** | Python scripting | SNLite, SN Functor B, Formula Mk5, Profile Mk3 |278| **Curve/Surface/Field** | Advanced geometry | NURBS, Bezier, Spline, Marching Cubes |279| **Solid** | CAD operations (FreeCAD) | Boolean, Fillet, Chamfer, Shell, Offset |280| **Pulga Physics** | Physics simulation | Particle-based simulations |281| **Exchange** | Import/Export | SVG, DXF, JSON, NumPy, CSV |282283### Core Architecture Files284285| File | Description |286|------|-------------|287| `node_tree.py` | SverchCustomTree, SverchCustomTreeNode, UpdateNodes, NodeUtils |288| `data_structure.py` | match_long_repeat, fullList, updateNode, multi_socket |289| `core/sockets.py` | All socket type definitions (SvStringsSocket, etc.) |290| `core/events.py` | Event classes (TreeEvent, AnimationEvent, etc.) |291| `core/socket_data.py` | Socket data cache (sv_get_socket, sv_set_socket) |292| `core/update_system.py` | SearchTree, UpdateTree, control_center |293| `core/socket_conversions.py` | Automatic type conversion functions |294| `utils/vectorize.py` | vectorize decorator, DataWalker |295296### Node Base Class Mixins297298| Mixin | Purpose |299|-------|---------|300| `UpdateNodes` | Node lifecycle (sv_init, sv_update, sv_copy, sv_free), process management |301| `NodeUtils` | Logger shortcuts, tracked UI operators, data retrieval helpers |302| `NodeDependencies` | Optional library dependency checking |303| `NodeDocumentation` | Docstring parsing, help link generation |304305---306307## Reference Links308309- [references/methods.md](references/methods.md) — Complete API signatures for SverchCustomTree, SverchCustomTreeNode, socket data cache, SearchTree, update system310- [references/examples.md](references/examples.md) — Working code examples for tree construction, data flow, custom nodes311- [references/anti-patterns.md](references/anti-patterns.md) — What NOT to do with Sverchok, with WHY explanations312313### Official Sources314315- https://github.com/nortikin/sverchok316- https://sverchok.readthedocs.io/317- https://github.com/nortikin/sverchok/wiki