Skip to main content

weft

Pull the thread, not the world.

pip install "weft-usd[usd]"            # once published; until then, from a clone:
pip install -e ".[usd]"                # [usd] pulls usd-core; the core runs dep-free

weft rels   myscene.usda               # what relationships are in here, natively?
weft data   myscene.usda               # the whole stage as a table, nothing loaded
weft pull  'material:…' --context myscene.usda --follow material:binding:full

Opening a USD stage means loading everything and drilling down. weft inverts that: stand at any point — a name, an identity, an attribute, a place — and pull the threads you care about. A thread is any relationship: a material binding, a mount contract, electrical:feeds, or a kind your team defines. Hierarchy is just one thread on the spool.

$ weft pull 'where:finish=translucent' --context lab.usda --mask-out pull.mask
$ usdrecord --mask "$(tr '\n' ',' < pull.mask)" lab.usda out.png

Twenty-six pieces of glassware render, floating at their exact production transforms, from a scene that was never loaded. No path appeared in the question. Run as written against Animal Logic's ALab — real production geometry, not a fixture — in examples/alab/README.md.

Addresses

weft pull id:hero-car                        # identity — no path, survives restructures
weft pull id:occ:weld-47                     # one placement, restructure-proof
weft pull role:propSocket                    # by contract role
weft pull 'where:finish=translucent'         # by attribute
weft pull 'near:id:rack-R42,5'               # within 5 units of a thing, by name
weft pull bottle01 --follow up:electrical:feeds*8   # trace upstream, 8 hops
weft pull path:/root/shelf01/bottle_0004     # location — the fallback, not the default

Three rules keep pulls trustworthy:

  • What you didn't pull is declared, never silently absent — every boundary is counted by kind, and omissions are classed inert (a grey material) or meaning-changing (a physics joint that would silently re-anchor to the world).
  • Every answer carries a receipt — seeds, follow rules, cost, and a digest; a pull is verifiable by recompute-and-compare.
  • Compatibility is measured, not asserted — a republish is checked against every consumer's own declared tolerance, not just the provider's promise.

USD as data

Point weft at a stage you didn't build and see it as data — no authoring, no schema changes, no load:

weft rels  shot.usda            # the native relationship kinds, with counts
weft data  shot.usda            # prims x columns: type, bbox, centroid, ...
weft data  shot.usda --select 'where:bbox_volume>1e6' --load \
                     --columns point_count,poly_count,byte_cost

Most of that data is derived, not authored — weft reads what USD already encodes: hierarchy, UsdCollectionAPI, and material bindings resolved per purpose (full/preview) and inheritance. On ALab that surfaces ~13,600 material relationships and 114 collections for free. Relationships authored anywhere — a native rel electrical:feeds, a UsdPhysics joint, your team's own — are followed (--follow), sliced, and certified with no declaration; weft consumes what your DCC authored rather than asking you to author again. A weft__kinds block is an optional annotation (a lens, an omission class), not a place relationships get made.

Runs on any USD file, today

No server, no schema changes, no buy-in:

$ weft pull 'chemistry_bottle01*' --context shot.usda --follow Mount
$ weft who 'name:glass' --context shot.usda    # what depends on this prim?
$ python -m deps breaks ./assets hub.usda       # what breaks if I republish?
$ python -m absent shot.usda                    # what silently resolves to nothing?

deps sees edges no stock USD API reports (bindings, connections, class arcs) and answers the reverse question USD can't. absent finds the silences USD ships with — stale overrides, bindings to deactivated materials — that none of its 28 validators catch.

usdview plugin

The same pull/who reasoning, live in the viewer: a "Weft" menu adds Ask… (resolve a seed against the open stage and select the results), Solo threads (pull the current selection's threads and deactivate everything outside the mask — a view solo, not a population mask), Restore world (undo it), and Who depends on this? (incoming edges onto the selection, browsable by depth). A docked receipt panel shows the last pull's resolutions, members, and boundary, with buttons to copy the member mask or save a full manifest.

$ export PXR_PLUGINPATH_NAME=/path/to/weft/extras/usdview:$PXR_PLUGINPATH_NAME
$ export PYTHONPATH=/path/to/weft/extras/usdview:/path/to/weft:$PYTHONPATH
$ usdview shot.usda

Both PXR_PLUGINPATH_NAME (so libplug finds extras/usdview/plugInfo.json) and PYTHONPATH (so import weftViewer — its declared module name — resolves) need extras/usdview itself, since the plugin's __init__.py lives one level inside it, in extras/usdview/weftViewer/; PYTHONPATH additionally needs the weft repo root, since the plugin imports weft.ask and weft.pull directly against the live stage. Code, not memory: a python usdview plugin is loaded with a plain import <Name> off PYTHONPATH (pxr/base/plug/plugin.cpp, PlugPlugin::_Load()), so plugInfo.json's own directory plays no part in the import — only in libplug's discovery of the JSON file itself, via PXR_PLUGINPATH_NAME (pxr/usdImaging/usdviewq/plugin.py's loadPlugins()).

The engine

For teams that want ground truth, not just queries: a content-addressed store, immutable revisions, channels, and baselines — with a promotion gate that re-evaluates consumers.

Proven on Animal Logic's ALab (437 real placements, contracts derived, not hand-written): a shelf moved 0.7 cm passes the provider's 1 cm promise and is refused by 19 consumers whose own tolerances are tighter — each named, with what it tolerates. Seeding one bottle with --follow Mount pulls 2 assets instead of 165; the other 163 threads are declared at the boundary.

$ weft save car car.usda -m "first pass"     # immutable, deduped
$ weft promote car v002 --to approved        # gated: measured compatibility
$ weft select 'chassis*' --follow Mount      # a slice, priced before loading

Teams share ways of seeing as versioned content: rule sets (which threads to follow), edge extractors (your soft-reference conventions become real edges), and omission classes — the vocabulary is yours; the machinery stays fixed.

Measured

All from real runs, not projections:

  • Seeding one bottle pulls 2 assets instead of 165 — the other 163 are declared at the boundary, not silently dropped.
  • The translucent pull's 26-placement mask is asserted byte-identical to a hand-built reference in the acceptance suite.
  • A 0.7 cm republish, inside the provider's own 1 cm promise, is refused by 19 consumers — each named, with its own tolerance.
  • 4,296 production layers walked in 1.75 s (23 ms incremental).
  • The whole scene is addressable in ~126 ms without loading it.
  • 25× storage dedup at 64 KiB chunks.

And on ALab opened whole (47,401 composed prims, 14.5 M points), from docs/superpowers/specs/2026-10-05-alab-benchmarks.md:

  • Pulling one asset vs. loading everything: 0.9 % of the prims, 0.25 % of the geometry — ~3× faster, ~2× lighter. The win scales with slice size and crosses to a loss near ~99 %, exactly where it should.
  • Query the whole scene as a table in 0.15 s, 125 MB, zero geometry loaded.
  • A repeated pull of an unchanged context is cached: 0.11 s → 0.003 s (~77×).

Status

A working prototype, tested against real production USD (365 tests, CI on a no-deps "bare" env and a full usd-core env), with no outside users yet. The design docs came first; where measurement disagreed with design, the docs record the correction — see docs/superpowers/specs/ for the full design trail, including an adversarial review that scoped weft to consuming and certifying USD rather than authoring it. The core runs with zero dependencies; usd-core unlocks the USD-facing tools. Apache-2.0; contributions welcome.

Reading

docs/index.html is the single-page design brief. The rest, in reading order:

docs/01-overview.md thesis and cross-industry mapping
docs/02-architecture.md the resolution layer and USD integration points
docs/03-versioning.md revisions, channels, baselines
docs/04-contracts.md generators, archetypes, tolerances
docs/05-contexts.md claims and approval
docs/06-storage.md stores, layout, Merkle hierarchy
docs/07-adoption.md the rung ladder; comparisons to USD / Omniverse / Fabric
docs/09-usd-audit.md what USD already holds, what is genuinely absent
docs/08-open-questions.md what is still undecided
docs/10-slices.md the slice interaction model
specs/weftContracts/schema.usda codeless API schemas for the contract archetypes

The design documents predate the rename and say "JIT-SD" throughout — same project.

Commitments

  • Versions are acts of intent; the only mutable thing is a channel pointer.
  • Couple to contracts, not names — prim paths are an output, not a precondition.
  • Identity is metadata, never an address. Time is an index, never an address.
  • Every rung works solo and offline; no rung requires a higher one.

Metadata

Release files for weft-usd 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for weft-usd 0.1.0
File Size Uploaded Provenance Actions
weft_usd-0.1.0.tar.gz 243.1 kB Without provenance Details for weft_usd-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for weft-usd 0.1.0
File Interpreter ABI Platform Actions
weft_usd-0.1.0-py3-none-any.whl Python 3 none any Details for weft_usd-0.1.0-py3-none-any.whl

Total release size: 431.7 kB

Release files / weft_usd-0.1.0.tar.gz

Download URL weft_usd-0.1.0.tar.gz
Size 243.1 kB
Tags Source
SHA-256 checksum
How to use checksums
8e97350ebcaa32f058a46c5721a6a739263ac21e320580577f041eb45516c8d2
BLAKE2b-256 checksum
How to use checksums
8eeb9b3436ad24091336227ffaa1541631c154ee05f4622ec037e6d4bd8d2d24
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.5

Release files / weft_usd-0.1.0-py3-none-any.whl

Download URL weft_usd-0.1.0-py3-none-any.whl
Size 188.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
99d04ca57ce883778b0837409668b8fc1d550ac4fdaee53be2231b755c5dea59
BLAKE2b-256 checksum
How to use checksums
b7eb05642dd923fb2deca8a535b86509210248dbb8ab47e5256ba69e45ce1ad8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.5

Security for weft-usd 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page