Overview
Proxification is a data organization technique that enables objects to be referenced by multiple overlapping hierarchical systems simultaneously - groups, layers, levels, blocks, instances, materials - without duplicating the objects themselves. This allows rich organizational metadata while keeping payloads efficient. Instead of forcing a single parent-child hierarchy, proxification lets a single wall be:- On “Level 1” (level hierarchy)
- In “Exterior Walls” group (functional grouping)
- On “A-WALL” layer (layer organization)
- Using “Concrete” material (material assignment)
For SDK Consumers: Proxification is primarily important when consuming data from Speckle
(e.g., from connectors like Revit, Rhino, ArchiCAD). When publishing custom data with
specklepy, you typically don’t need to use proxification yourself - the SDK handles it
automatically where needed.
Why Proxification Exists (Beyond Detachment)
Detachment Alone Isn’t Enough
Detachment solves the problem of large individual objects (like meshes with millions of vertices). The SDK automatically detaches these and stores them separately. But detachment doesn’t solve the problem of multiple overlapping organizational hierarchies.The Problem: Single Hierarchy Limitations
Imagine a building model where you need to organize objects by:- Building Level - Level 1, Level 2, Roof
- Functional Group - Exterior Walls, Interior Partitions, Structure
- Drawing Layer - A-WALL, A-DOOR, S-COLS
- Material - Concrete, Steel, Glass
- Instance Type - Standard Door, Window Type A
- Level: “Level 1”
- Group: “Exterior Walls”
- Layer: “A-WALL”
- Material: “Concrete”
- Can only have ONE primary hierarchy (level OR group OR layer)
- Querying “exterior walls on Level 1” requires complex traversal
- Can’t represent that objects belong to multiple organizational systems
- Organizational metadata is either lost or duplicated
The Solution With Proxification
With proxification - MULTIPLE overlapping hierarchies:- Objects stored once, referenced by multiple organizational systems
- Can query “exterior walls on Level 1” efficiently (intersection of two proxy lists)
- Supports overlapping hierarchies (groups + layers + levels + materials)
- Models real-world CAD/BIM organization (blocks, layers, groups all coexist)
- Organizational structure explicit and queryable at root level
Detachment vs Proxification: What’s the Difference?
Both optimize data transfer, but solve different problems:
Detachment: “This single object is too big, store it separately”
Types of Proxification
1. Organizational Proxies
Create overlapping organizational hierarchies - objects can belong to multiple groups, layers, and levels simultaneously.LevelProxy
Organizes objects by building level/storey (architectural hierarchy):GroupProxy
Organizes objects by functional or user-defined groups (can overlap with other hierarchies):ColorProxy
Organizes objects by color/layer (CAD hierarchy, can overlap with levels and groups):2. Material Proxies
Assign render materials to multiple objects without duplication.RenderMaterialProxy
3. Geometry Proxies
Reference geometry stored elsewhere in the graph.DisplayValue Proxies
Some objects store display geometry as references rather than nested objects:4. Instance Proxies
Optimize repeated geometry through instancing:The Resolution Process
Proxification requires a two-step resolution process:Step 1: Build an applicationId Index
Create a mapping from applicationId to actual objects:Step 2: Resolve Proxy References
Use the index to resolve applicationId strings to actual objects:General Proxy Resolution Pattern
This pattern works for all proxy types:Querying Multiple Hierarchies: Intersection Queries
The real power of proxification is querying across multiple organizational systems:Reverse Lookup: Finding an Object’s Proxy
To find which proxy collection an object belongs to:DisplayValue Proxy Resolution
Display geometry can also be proxified in large models:When Proxification Matters
As a Data Consumer (Reading from Connectors)
You WILL encounter proxification when:- Reading BIM/CAD data from Revit, Rhino, ArchiCAD, AutoCAD connectors
- Working with organized models (levels, layers, groups, blocks)
- Need to query by multiple criteria (e.g., “exterior walls on Level 1”)
- Analyzing material assignments across objects
- Understanding instance/definition relationships
- Finding objects by level, group, layer, or material
- Querying intersections (“walls that are both exterior AND on Level 1”)
- Understanding which organizational systems an object belongs to
- Accessing objects that use specific instances or materials
As a Data Producer (Publishing with specklepy)
You typically DON’T need to create proxies when:- Publishing custom data with specklepy
- Creating simple models
- Working with small datasets
- Sending large objects via
operations.send() - Detachable properties are detected
- Objects exceed chunking thresholds
Recommendation: Focus on understanding proxy resolution as a consumer. Let the SDK handle
proxification automatically when publishing data.
Reference Implementation: speckle-blender
The Blender connector (bpy_speckle) implements proxy resolution helpers you can reference:
speckle-blenderrepository for working implementations- Connector source code for practical proxy handling patterns
Best Practices
1. Build Index Once
2. Cache Resolved Proxies
3. Handle Missing References Gracefully
4. Use Sets for Fast Lookup
Summary
Key Concepts:- Proxification = Storing objects separately and referencing by ID
- Proxy collections live at root level with
@prefix - Resolution requires two steps: build index, then resolve references
- All proxy types follow the same resolution pattern
- ✅ Reading BIM data from connectors (common)
- ✅ Analyzing model organization (levels, groups, materials)
- ✅ Working with large models
- ❌ Publishing simple custom data (SDK handles it)
- Build applicationId index
- Get proxy collections from root
- Resolve applicationId strings to objects
- Use resolved objects for analysis
Next Steps
BIM Data Patterns
See proxification in action with Pattern 7
Data Traversal
Learn to navigate object graphs effectively
Objects & Base
Understand applicationId and object identity
Operations
How send() and receive() handle proxification