<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>VJ UNION: vdmo</title>
    <description>The latest articles on VJ UNION by vdmo (@vdmo).</description>
    <link>https://vjun.io/vdmo</link>
    <image>
      <url>https://vjun.io/uploads/user/profile_image/6/aa3afc14-7e99-4aeb-869a-e40dac95394a.jpg</url>
      <title>VJ UNION: vdmo</title>
      <link>https://vjun.io/vdmo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://vjun.io/feed/vdmo"/>
    <language>en</language>
    <item>
      <title>PCHI 2.0: When Mathematics Conducts the Live Show</title>
      <dc:creator>vdmo</dc:creator>
      <pubDate>Thu, 24 Sep 2026 17:40:40 +0000</pubDate>
      <link>https://vjun.io/vdmo/pchi-20-when-mathematics-conducts-the-live-show-116g</link>
      <guid>https://vjun.io/vdmo/pchi-20-when-mathematics-conducts-the-live-show-116g</guid>
      <description>&lt;p&gt;&lt;a href="https://vdmo.live" rel="noopener noreferrer"&gt;vdmo.live&lt;/a&gt; presents &lt;a href="https://pchi.life" rel="noopener noreferrer"&gt;pchi.life&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For years, the live audiovisual stack has been a beautiful, fragile spiderweb. Resolume driving layers and clips. TouchDesigner generating procedural geometry or reactive particles. Ableton holding the pulse. Unreal Engine handling high-fidelity 3D. Tracking systems, lighting desks, custom OSC maps, and increasingly, generative AI agents whispering suggestions into the mix.&lt;/p&gt;

&lt;p&gt;It works—until it doesn’t. A silent desync, a parameter that drifts, a generative agent that “creatively” pushes opacity past 1.0 or sends a tentacle into the audience’s face. Convention holds the system together. When something breaks, debugging becomes archaeology.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PCHI 2.0&lt;/strong&gt; (Peachy) proposes something different: move from convention-based to mathematics-based scene management. One shared language. Verified state. Equilibrium by design.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vjun.io/uploads/articles/qfpb9mcyvfwufc1wlhqk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://vjun.io/uploads/articles/qfpb9mcyvfwufc1wlhqk.jpg" alt="pchi.life website" width="1080" height="2047"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  One Language for the Whole Creative Stack
&lt;/h3&gt;

&lt;p&gt;PCHI is an open protocol for scene state. It standardizes messages for objects, control parameters, musical context, artist tracking, and more. Every message carries its own mathematical signature—PIR invariants (Prime Integer Relations)—rooted in the Prouhet–Thue–Morse sequence.&lt;/p&gt;

&lt;p&gt;These aren’t decorative checksums. They encode equilibrium checks (a residual that should sit near (10^{-12})), coherence gaps that surface drift, and curvature signatures that describe the smoothness of transitions. The Conductor (PrimeSwarm Engine, written in Rust) receives proposed updates, verifies the invariants, applies Only-Lang governance rules, and only then broadcasts a coherent, validated state to every connected tool via UDP, WebSocket, or TCP.&lt;/p&gt;

&lt;p&gt;Many tools. One truth.&lt;/p&gt;

&lt;p&gt;Existing bridges already make this practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Python OSC bridge for Resolume Arena that calculates PIR values on the fly.&lt;/li&gt;
&lt;li&gt;A TouchDesigner Python CHOP that surfaces scene objects, BPM/beat/kick/snare, and equilibrium status as channels.&lt;/li&gt;
&lt;li&gt;A Max for Live device that watches Ableton’s musical state and injects verified musical context.&lt;/li&gt;
&lt;li&gt;Schemas in both human-readable JSON and high-performance FlatBuffers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result feels less like duct-taping software together and more like placing every tool inside the same mathematical spacetime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Math People Should Care
&lt;/h3&gt;

&lt;p&gt;The Prouhet–Thue–Morse sequence is one of those quietly profound objects: aperiodic, cube-free, deeply linked to automatic sequences, combinatorics on words, and even quantum information ideas. PCHI embeds a practical use of its sign sequence into the real-time critical path of a live performance system.&lt;/p&gt;

&lt;p&gt;Equilibrium is no longer “the operator is watching the scopes.” It is a computed residual. Disequilibrium is caught before the frame is rendered. For anyone who has ever found beauty in invariant theory, discrepancy, or the way discrete mathematics can enforce continuous harmony, this is a concrete aesthetic application.&lt;/p&gt;

&lt;p&gt;It also opens a clean interface for safe generative AI. Only-Lang is a simple rule DSL that lets you declare hard mathematical boundaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if kraken_tentacle.wobbliness &amp;gt; 0.8
then
    kraken_tentacle.wobbliness = 0.8
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creative freedom remains. Clear boundaries are enforced at the protocol level rather than hoped for in prompt engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why AV Creatives Should Care
&lt;/h3&gt;

&lt;p&gt;Live shows are increasingly multi-tool and multi-agent. The cost of silent failure rises with every additional node. PCHI does not replace your favorite software; it gives them a shared, verifiable nervous system.&lt;/p&gt;

&lt;p&gt;You keep working in the environments you already love. The Conductor becomes the single source of truth. AI agents can propose changes without the risk of catastrophic divergence. Musical context from Ableton can drive visuals with mathematical confidence that the systems are still in phase. Tracking data and scene transforms stay coherent across Resolume, TouchDesigner, and Unreal.&lt;/p&gt;

&lt;p&gt;In short: creativity without the chaos of unmanaged state.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Larger Gesture
&lt;/h3&gt;

&lt;p&gt;There is a long tradition of artists who treated mathematics not as constraint but as material—Escher’s tessellations, the geometric rigor of the Renaissance, contemporary practices that treat code and invariants as sculptural medium. PCHI sits in that lineage while remaining ruthlessly practical for the people who actually have to make a show happen at 11 p.m. with an audience in the room.&lt;/p&gt;

&lt;p&gt;It is still early (the repository is open, the bridges exist, the schemas are public). But the direction is clear: treat the live creative system as something that can be proven coherent rather than merely assumed coherent.&lt;/p&gt;

&lt;p&gt;Different tools. Same universe.&lt;/p&gt;

&lt;p&gt;Explore the protocol, schemas, Conductor, and integrations at &lt;a href="https://pchi.life" rel="noopener noreferrer"&gt;pchi.life&lt;/a&gt; and the open repository. The math is already in the messages. The question is what you will build once every part of the stack speaks the same verified language.&lt;/p&gt;

</description>
      <category>pchi</category>
      <category>scene</category>
      <category>creative</category>
      <category>stack</category>
    </item>
    <item>
      <title>GPU Laser Vision -Turning Live Video into Real-Time Laser Paths and Projector Art</title>
      <dc:creator>vdmo</dc:creator>
      <pubDate>Fri, 28 Aug 2026 11:16:32 +0000</pubDate>
      <link>https://vjun.io/vdmo/gpu-laser-vision-turning-live-video-into-real-time-laser-paths-and-projector-art-olc</link>
      <guid>https://vjun.io/vdmo/gpu-laser-vision-turning-live-video-into-real-time-laser-paths-and-projector-art-olc</guid>
      <description>&lt;p&gt;For VJs, installation artists, and anyone chasing the intersection of computer vision, GPU compute, and physical light, a new open-source project has landed that feels purpose-built for our world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/JoshuaBatty/gpu-laser-vision" rel="noopener noreferrer"&gt;GPU Laser Vision&lt;/a&gt; by Joshua Batty is a real-time Rust pipeline that takes 720p video (or live sources in future iterations) and converts it into segmented projector output &lt;em&gt;and&lt;/em&gt; coloured laser geometry ready for an Ether Dream DAC. It runs two parallel vision paths side-by-side—classic custom CUDA edge detection and modern YOLO11 instance segmentation—then extracts contours, recovers original colours, and packs scanner-safe paths.&lt;/p&gt;

&lt;p&gt;The result sits comfortably in the nannou creative-coding ecosystem (Batty is a co-founder of nannou) and already supports fullscreen secondary-display projector isolation plus laser streaming.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Matters for VJs and Live Visual Artists
&lt;/h3&gt;

&lt;p&gt;Most of us already push pixels, particles, and shaders. Few of us have a clean, open, high-performance bridge from camera/video → semantic understanding → actual laser scanners or isolated projector silhouettes without heavy custom engineering or proprietary tools.&lt;/p&gt;

&lt;p&gt;GPU Laser Vision gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Two complementary perceptions&lt;/strong&gt;: dense classical edges (fast, detailed, fragmented) versus clean person silhouettes from YOLO11n-seg.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Colour recovery&lt;/strong&gt; so the laser or projector inherits the source palette instead of flat white or arbitrary tints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live comparison dashboard&lt;/strong&gt; (nannou + egui) showing intermediate stages, thresholds, performance numbers, and source selection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Physical outputs ready to go&lt;/strong&gt;: person isolation on a secondary display, and Ether Dream streaming at up to 30k points/sec with scanner-aware packing (different strategies for dense CUDA edges vs coherent YOLO contours).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Performance on an RTX 5090 is already production-relevant for many setups. With a 1280×720 @ 25 fps source the processing callback sits in the 14.8–15.6 ms range (roughly 64–68 fps of compute headroom). The custom CUDA edge pipeline alone is ~1.8–1.9 ms; YOLO11n segmentation is 9.1–10.1 ms. The media itself is currently the limiting factor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture at a Glance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Custom CUDA path&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
RGBA → grayscale → Scharr magnitude + gradients → live threshold + colour sampling along the gradient normal → compact host copy → path tracing into open paths, closed loops, and points. Everything runs as a captured CUDA graph with persistent buffers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Neural path&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Upload/resize/normalize/letterbox on CUDA → fixed 640×640 YOLO11n-seg TorchScript (LibTorch) → strongest person mask restored to 720p → one-pixel contour + green-spill replacement → same path tracer.&lt;/p&gt;

&lt;p&gt;Both routes feed the same geometry, colour, display, and point-count surfaces so the comparison stays honest. Projector output isolates the detected person against black. Laser output is explicitly gated and disabled by default—important for safety.&lt;/p&gt;
&lt;h3&gt;
  
  
  Getting It Running
&lt;/h3&gt;

&lt;p&gt;Requirements are Linux or WSL2 + NVIDIA GPU, Nix with flakes, and a 720p demo clip. CUDA, nightly Rust, LibTorch/PyTorch, FFmpeg, etc. are pinned by the flake—no system CUDA toolkit needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/JoshuaBatty/gpu-laser-vision.git
&lt;span class="nb"&gt;cd &lt;/span&gt;gpu-laser-vision
nix develop &lt;span class="nt"&gt;--command&lt;/span&gt; uv run scripts/export_yolo.py   &lt;span class="c"&gt;# YOLO11n-seg → TorchScript&lt;/span&gt;
&lt;span class="c"&gt;# place your 1280×720 clip at assets/jcvd_green_screen_720p.mp4&lt;/span&gt;
nix develop &lt;span class="nt"&gt;--command&lt;/span&gt; cargo oxide run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optional Ether Dream: set &lt;code&gt;ETHER_DREAM_IP&lt;/code&gt; if discovery fails (common under WSL). Secondary display automatically enables the projector isolation window.&lt;/p&gt;

&lt;p&gt;The interface lets you tweak Scharr thresholds live, switch CUDA vs YOLO geometry for the laser, inspect grayscale/Scharr/mask stages, and monitor FPS + stage timings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Current Scope and Roadmap
&lt;/h3&gt;

&lt;p&gt;The full chain—source → GPU vision → projector / Ether Dream—is already implemented. Next work targets production installation realities: live camera capture, projector/scanner calibration, venue safety integration, and documenting finished light performances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safety note (please read it twice):&lt;/strong&gt; Laser hardware needs proper scan-rate limits, blanking, interlocks, and venue-specific controls. On-screen paths alone are &lt;em&gt;not&lt;/em&gt; a complete laser-safety system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why You Should Care Right Now
&lt;/h3&gt;

&lt;p&gt;This is the kind of project that lowers the barrier between “I can track a person in Resolume/TouchDesigner/Isadora” and “I can drive a real laser scanner or isolated projection with the same contours and original colours at interactive rates.” It is written in Rust with careful CUDA graphs and Nsight-profiled kernels, licensed AGPL-3.0, and sits in the same creative-coding lineage as nannou.&lt;/p&gt;

&lt;p&gt;If you work with lasers, projection mapping, interactive installations, or simply want a high-performance vision playground that already speaks laser geometry, clone it, throw a green-screen clip at it, and start playing.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/JoshuaBatty/gpu-laser-vision" rel="noopener noreferrer"&gt;https://github.com/JoshuaBatty/gpu-laser-vision&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you already experimented with computer-vision-driven lasers or person isolation in a live context? Drop your experiences, hardware setups, or questions below—let’s talk about what production-ready versions of tools like this need next.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>cuda</category>
      <category>lazer</category>
      <category>video</category>
    </item>
    <item>
      <title>Daniel Aagentah - what I learned open-sourcing 5 years of audio-visuals</title>
      <dc:creator>vdmo</dc:creator>
      <pubDate>Wed, 26 Aug 2026 19:33:58 +0000</pubDate>
      <link>https://vjun.io/vdmo/daniel-aagentah-what-i-learned-open-sourcing-5-years-of-audio-visuals-53k7</link>
      <guid>https://vjun.io/vdmo/daniel-aagentah-what-i-learned-open-sourcing-5-years-of-audio-visuals-53k7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Daniel Aagentah: hello friends, it's been about six months since I posted my last video on the project so I thought this would be a good time to reflect on what I've learned so far and outline some new features. I've had a lot of very kind words on the project since and I'd love to see what other people are implementing and creating with it. Thank you for being here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/aagentah/nw_wrld" rel="noopener noreferrer"&gt;https://github.com/aagentah/nw_wrld&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nwworld</category>
      <category>js</category>
      <category>vj</category>
      <category>visuals</category>
    </item>
    <item>
      <title>Processing.org Rust Core</title>
      <dc:creator>vdmo</dc:creator>
      <pubDate>Wed, 26 Aug 2026 10:01:10 +0000</pubDate>
      <link>https://vjun.io/vdmo/processingorg-rust-core-5478</link>
      <guid>https://vjun.io/vdmo/processingorg-rust-core-5478</guid>
      <description>&lt;p&gt;&lt;strong&gt;Processing is experimenting with a Rust core for modern rendering, and it could open new doors for artists, educators, and creative coders.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rustfoundation.org/media/built-with-rust-processing-foundation/" rel="noopener noreferrer"&gt;https://rustfoundation.org/media/built-with-rust-processing-foundation/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more than two decades, Processing has been one of the most welcoming entry points into programming for people who think visually. Artists, designers, students, and educators have used it to sketch ideas in code, generate generative art, prototype interactive installations, and learn the fundamentals of computation through immediate visual feedback. Built primarily around Java (with modes and ports for JavaScript, Python, and others), it has always prioritized accessibility and rapid iteration over raw systems-level performance.&lt;/p&gt;

&lt;p&gt;That landscape is shifting. The Processing community is exploring a new experimental foundation called libprocessing: a native implementation of the core Processing API written in Rust and powered by the Bevy game engine, with WebGPU as its rendering backend. The project aims to support desktop, mobile, and web targets over time. A talk at Libre Graphics Meeting 2026 framed this as a way to modernize Processing’s rendering while expanding what the project can become.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Rust?
&lt;/h3&gt;

&lt;p&gt;Rust brings several practical advantages that map well to creative coding’s evolving needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance and modern graphics.&lt;/strong&gt; Older OpenGL-based approaches are showing their age. WebGPU and contemporary GPU APIs enable better use of current hardware, including more efficient rendering, compute capabilities, and future-proofing for higher-resolution or more complex visuals. Rust’s low-level control and zero-cost abstractions help deliver that without the usual C/C++ complexity tax.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform and embeddable potential.&lt;/strong&gt; Because Rust compiles to native code and can expose a C-compatible interface (via FFI), the same core can be called from Java (the traditional Processing environment), Python, or other languages. There is also work toward WebAssembly bindings, which could eventually strengthen browser-based creative tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety and reliability.&lt;/strong&gt; Memory safety without a garbage collector reduces entire classes of crashes and subtle bugs—valuable when sketches grow into longer-running installations, generative systems, or tools shared with students.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access to a rich ecosystem.&lt;/strong&gt; Building on Bevy gives Processing a modern application and graphics framework to draw from, while still aiming to preserve the immediate-mode, procedural style that makes Processing feel like sketching.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is still early and explicitly labeled experimental and unstable. The goal is not a full rewrite that discards the familiar Processing experience, but a shared native core that different language front-ends can use. In principle this could keep the friendly “setup and draw” workflow while improving the underlying engine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits for the creative community
&lt;/h3&gt;

&lt;p&gt;Creative coders often hit practical limits: sketches that become sluggish with complex geometry or particle systems, difficulty targeting new platforms cleanly, or friction when moving from a classroom prototype to a more robust interactive piece. A stronger native core addresses several of these pain points.&lt;/p&gt;

&lt;p&gt;Artists and generative practitioners could work with more ambitious real-time visuals or higher-fidelity output without abandoning the approachable API they already know. Educators might eventually offer students a path that starts with the same friendly syntax and later reveals higher-performance or systems-oriented options. Tool builders and library authors could create new language bindings or hybrid applications more easily if a stable C ABI layer emerges.&lt;/p&gt;

&lt;p&gt;The broader creative coding world already has strong Rust options (nannou and others), but an official Processing effort carries unique weight: it keeps the large existing community, documentation, teaching materials, and cultural emphasis on accessibility connected to modern technology rather than forcing a complete migration. It also signals that Processing intends to remain relevant as graphics hardware and deployment targets continue to evolve.&lt;/p&gt;

&lt;p&gt;There are trade-offs, of course. Rust’s learning curve is steeper than Processing’s deliberately simplified Java dialect, so most users will continue interacting through higher-level language modes rather than writing Rust directly. The experimental status means features, stability, and documentation will take time. Not every long-standing Processing library will magically transfer overnight. Still, the direction is promising: preserve the creative, exploratory spirit while upgrading the technical foundation.&lt;/p&gt;

&lt;p&gt;In short, Processing’s exploration of a Rust-based rendering core is less about abandoning its roots and more about giving the creative community better tools for the next twenty-five years. Faster, more portable, and more capable visuals—without losing the sense that programming can feel like drawing. For a community that has always valued both art and accessibility, that combination is worth watching closely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;libprocessing integrates Bevy as its core application framework and rendering foundation while preserving Processing’s immediate-mode creative coding style.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;libprocessing is an experimental Rust library that reimplements the core Processing API as a native, cross-platform layer. It sits on top of Bevy (via a project-maintained fork) and uses wgpu (WebGPU) as the rendering backend. The goal is to support desktop, mobile, and web targets eventually, while exposing a C ABI (via cbindgen and FFI) so languages like Java, Python (mewnala via PyO3), and others can call into it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Bevy?
&lt;/h3&gt;

&lt;p&gt;Bevy’s design aligns well with Processing’s needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modularity and ECS&lt;/strong&gt; — Bevy is built around an Entity-Component-System architecture rather than a monolithic engine. This lets libprocessing pick only the needed pieces (2D/3D rendering, windowing, input, assets, etc.) and compose them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern graphics&lt;/strong&gt; — Strong commitment to WebGPU/open standards, which replaces the aging OpenGL/JOGL path used by classic Processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform and embeddable&lt;/strong&gt; — Rust + Bevy makes native performance, embedding via C ABI, and targets like desktop (with Wayland/X11/winit), Android, web (via WebAssembly bindings), and more practical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broader ambitions&lt;/strong&gt; — The Bevy community is interested in non-game uses (art, scientific visualization, CAD-like tools), which matches Processing’s creative coding focus.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project depends on a forked Bevy (&lt;code&gt;https://github.com/processing/bevy&lt;/code&gt;, main branch) with a selective feature set (2D/3D Bevy render, UI, picking, scene, winit, multi-threading, fonts, cameras, shader formats, etc.). Patches ensure consistency across Bevy sub-crates. There is a note to eventually return to upstream Bevy once custom needs are resolved.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technology stack layers
&lt;/h3&gt;

&lt;p&gt;From outer to inner:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;cbindgen&lt;/strong&gt; — Generates C headers for FFI consumers (Java via Project Panama or similar, Python, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rust FFI layer&lt;/strong&gt; — &lt;code&gt;extern "C"&lt;/code&gt; functions that map C-compatible types to the libprocessing API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;libprocessing&lt;/strong&gt; — The primary Processing-style API (procedural/immediate-mode).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bevy&lt;/strong&gt; — App structure, ECS, graphics features, windowing, assets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;wgpu&lt;/strong&gt; — Bevy’s rendering hardware interface (WebGPU).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vulkan / Metal / etc.&lt;/strong&gt; — Low-level GPU APIs.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The core architectural challenge: immediate mode on top of retained-mode ECS
&lt;/h3&gt;

&lt;p&gt;Processing sketches are &lt;strong&gt;immediate-mode&lt;/strong&gt;: you call &lt;code&gt;rect()&lt;/code&gt;, &lt;code&gt;background()&lt;/code&gt;, etc., and drawing happens in sequence with global mutable state. Bevy is &lt;strong&gt;retained-mode&lt;/strong&gt;: a scene database of entities + components, systems that query/transform data (often in parallel), and a separate rendering phase that batches work across frames.&lt;/p&gt;

&lt;p&gt;libprocessing deliberately presents the familiar immediate-mode API while implementing it on Bevy’s ECS. This requires inverting several Bevy defaults:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recording instead of immediate execution&lt;/strong&gt; — Draw calls do not spawn entities right away. Intent is recorded as &lt;code&gt;DrawCommand&lt;/code&gt;s into a per-graphics &lt;code&gt;CommandBuffer&lt;/code&gt;. This preserves call order and allows controlled batching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synchronous frame control&lt;/strong&gt; — Bevy normally manages its own main loop and pipelined rendering. libprocessing keeps the &lt;code&gt;App&lt;/code&gt; in a thread-local and calls &lt;code&gt;app.update()&lt;/code&gt; only when the user explicitly flushes (i.e., when a change requires rendering due to data dependencies).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selective rendering&lt;/strong&gt; — Cameras are disabled by default (&lt;code&gt;active&lt;/code&gt; field). A &lt;code&gt;Flush&lt;/code&gt; marker component is added to the relevant surface when rendering is needed. Systems that produce renderable data check for &lt;code&gt;Flush&lt;/code&gt; so they only act on the requested surface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transient geometry&lt;/strong&gt; — Shapes exist only for the frame they are drawn. Mesh entities are spawned on flush and despawned before the next frame. The ECS acts as a temporary staging area rather than a persistent scene graph.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camera write control&lt;/strong&gt; — Cameras use &lt;code&gt;CameraWriteMode::Skip&lt;/code&gt; so intermediate textures are not written to the final &lt;code&gt;RenderTarget&lt;/code&gt; until &lt;code&gt;endDraw&lt;/code&gt; (or equivalent).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As long as camera state is managed correctly, calling &lt;code&gt;app.update()&lt;/code&gt; or individual systems does not trigger unwanted renders or presents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Practical integration details
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Handles, not raw pointers&lt;/strong&gt; — Long-lived data is represented by Bevy &lt;code&gt;Entity&lt;/code&gt; IDs (returned as &lt;code&gt;u64&lt;/code&gt; combining index + generation). Consumers never receive pointers into Rust-owned memory. Destructor functions remove entities and free resources; higher-level language wrappers own the lifetime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Working with Bevy systems and borrows&lt;/strong&gt; — Immediate-mode code frequently needs imperative world mutation. Strategies include:

&lt;ul&gt;
&lt;li&gt;Running systems via &lt;code&gt;run_system_cached_with&lt;/code&gt; that take &lt;code&gt;In&amp;lt;T&amp;gt;&lt;/code&gt; (or tuple) parameters.&lt;/li&gt;
&lt;li&gt;Collecting query results into intermediate collections to release borrows.&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;resource_scope&lt;/code&gt; or temporarily removing/re-adding resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threading model&lt;/strong&gt; — Currently single-threaded on the main thread (important for macOS windowing and simplicity). &lt;code&gt;app.update()&lt;/code&gt; runs the main + render schedules blocking; asset loads via Bevy’s &lt;code&gt;AssetServer&lt;/code&gt; are blocking. Multi-threading may be explored later for performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error handling and safety&lt;/strong&gt; — Designed so FFI consumers cannot easily cause undefined behavior or process crashes through normal calls. Errors are treated as exceptional (often halt). Validation helpers can return user-friendly messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API philosophy&lt;/strong&gt; — Closely follows the existing Processing API but fixes historical issues where practical and exposes useful Bevy capabilities (e.g., more texture formats) even if higher-level modes cannot fully use them yet. Naming is descriptive (&lt;code&gt;processing_graphics_...&lt;/code&gt;, etc.). Learnings from p5.js are considered.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Current status and related pieces
&lt;/h3&gt;

&lt;p&gt;The project is explicitly R&amp;amp;D / highly unstable (recent releases around v0.0.8). It includes examples for 2D/3D primitives, transforms, materials, PBR, particles (CPU and GPU), text, lighting, glTF, MIDI/audio, input, filters, and more. There is also a Python binding (mewnala) and WASM work. Audio integration has used packages like bevy_seedling.&lt;/p&gt;

&lt;p&gt;In short, Bevy supplies the modern, modular, high-performance graphics and app infrastructure. libprocessing carefully layers an immediate-mode Processing façade on top through command buffering, controlled flushing, transient entities, and careful camera management. This keeps the creative, sketch-like experience while unlocking contemporary GPU capabilities and multi-language embedding. The design is still evolving, so details may change as the experimental work matures.&lt;/p&gt;

</description>
      <category>processing</category>
      <category>rust</category>
      <category>bevy</category>
    </item>
    <item>
      <title>I love surprises very much, and this surprise is a good one! Its real, its believable, you can walk across the room and touch it.</title>
      <dc:creator>vdmo</dc:creator>
      <pubDate>Fri, 21 Aug 2026 15:52:14 +0000</pubDate>
      <link>https://vjun.io/vdmo/i-love-surprises-very-much-and-surprise-is-a-good-one-its-real-its-believable-you-can-walk-4j0k</link>
      <guid>https://vjun.io/vdmo/i-love-surprises-very-much-and-surprise-is-a-good-one-its-real-its-believable-you-can-walk-4j0k</guid>
      <description></description>
    </item>
    <item>
      <title>A visual node-based editor for Three.js Shading Language (TSL)</title>
      <dc:creator>vdmo</dc:creator>
      <pubDate>Wed, 04 Feb 2026 05:43:37 +0000</pubDate>
      <link>https://vjun.io/vdmo/a-visual-node-based-editor-for-threejs-shading-language-tsl-5b8j</link>
      <guid>https://vjun.io/vdmo/a-visual-node-based-editor-for-threejs-shading-language-tsl-5b8j</guid>
      <description>&lt;p&gt;Create stunning shaders&lt;br&gt;
without writing code&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.threejsshadergraph.com/"&gt;https://www.threejsshadergraph.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A visual node-based editor for Three.js Shading Language (TSL).&lt;br&gt;
Build complex effects with an intuitive drag-and-drop interface.&lt;/p&gt;

</description>
      <category>threejs</category>
      <category>webgpu</category>
      <category>editor</category>
      <category>shaders</category>
    </item>
    <item>
      <title>MXR App’s Massive UI Overhaul: A Sneak Peek at the Future of Live Show Control</title>
      <dc:creator>vdmo</dc:creator>
      <pubDate>Mon, 26 Jan 2026 06:28:02 +0000</pubDate>
      <link>https://vjun.io/vdmo/mxr-apps-massive-ui-overhaul-a-sneak-peek-at-the-future-of-live-show-control-2ege</link>
      <guid>https://vjun.io/vdmo/mxr-apps-massive-ui-overhaul-a-sneak-peek-at-the-future-of-live-show-control-2ege</guid>
      <description>&lt;p&gt;If you’ve been following the development of the &lt;strong&gt;MXR App&lt;/strong&gt;, you know that the team is dedicated to refining the live performance experience. After an intense period of testing and live shows throughout late 2025, MXR Founder Eric just dropped a major update on the subreddit regarding the future of the platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mixerxr.com/"&gt;https://www.mixerxr.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The verdict? &lt;strong&gt;A major UI redesign is currently underway.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Based on direct feedback from operators in the field, the team is retooling the interface to make it more intuitive, linear, and responsive. While the design is still a work in progress, here is a breakdown of the exciting features currently on the drawing board.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Enhanced Show Control
&lt;/h3&gt;

&lt;p&gt;The biggest takeaway from the recent live testing seems to be usability. When you are in the heat of a performance, you can't be hunting for tiny pixels.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;New Control Tabs:&lt;/strong&gt; Two new tabs are being introduced specifically for "Show Control."&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Larger Interface:&lt;/strong&gt; Expect large buttons designed to make operating MXR significantly easier during live sets.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Better Sliders:&lt;/strong&gt; Critical parameters are getting larger sliders for more precise control.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. A New Way to Sequence
&lt;/h3&gt;

&lt;p&gt;One of the most requested workflow improvements is being addressed with a &lt;strong&gt;New Sequencer Node&lt;/strong&gt;. This addition aims to make programming more linear. Crucially, it is designed to allow changes "on the fly," giving VJs and operators the flexibility to adapt to the music without breaking their flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Advanced Visual Manipulation
&lt;/h3&gt;

&lt;p&gt;The update isn't just about buttons; it’s about what you can put on the screen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Time Dilation:&lt;/strong&gt; A fascinating new feature for ramping animation speeds, allowing for dynamic tempo changes.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Emergency/Accent Controls:&lt;/strong&gt; Dedicated controls for fading to (or strobing) Black or White—essential tools for drops and transitions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Preview Monitors:&lt;/strong&gt; While this is still "TBD" based on performance impact, the team is actively exploring the addition of in-app preview monitors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Grouping for Power Users
&lt;/h3&gt;

&lt;p&gt;For those running complex setups, organization is key. The redesign proposes a heavy focus on grouping:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Light Groups:&lt;/strong&gt; Dedicated controls for managing clusters of lights.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Trigger Groups:&lt;/strong&gt; Manage visibility or FX across multiple elements simultaneously.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Material Groups:&lt;/strong&gt; Trigger material changes across a whole group at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The "Cutting Room Floor" Disclaimer
&lt;/h3&gt;

&lt;p&gt;Eric was careful to note that this design is currently a &lt;strong&gt;work in progress&lt;/strong&gt;. The team is prioritizing performance and stability, meaning some of these features might not make the final cut if they bog down the system.&lt;/p&gt;

&lt;h3&gt;
  
  
  We Need Your Feedback!
&lt;/h3&gt;

&lt;p&gt;The MXR team is looking for community input to decide what to prioritize first. If you are an MXR user, head over to the &lt;code&gt;r/MXR_App&lt;/code&gt; subreddit and let them know which of these features matters most to your workflow.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Stay tuned for more updates as the redesign progresses!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mxr</category>
      <category>unreal</category>
      <category>realtime</category>
      <category>vjsoftware</category>
    </item>
    <item>
      <title>Code-Driven Chaos: Exploring "nw_wrld" – A JavaScript Generative Powerhouse</title>
      <dc:creator>vdmo</dc:creator>
      <pubDate>Sat, 17 Jan 2026 08:16:57 +0000</pubDate>
      <link>https://vjun.io/vdmo/code-driven-chaos-exploring-nwwrld-a-javascript-generative-powerhouse-2a1a</link>
      <guid>https://vjun.io/vdmo/code-driven-chaos-exploring-nwwrld-a-javascript-generative-powerhouse-2a1a</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/6vM_b54pWtg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If you think high-end live visuals are reserved for heavy software like Notch or TouchDesigner, &lt;strong&gt;aagentah&lt;/strong&gt; is here to prove you wrong. &lt;/p&gt;

&lt;p&gt;Their latest project, &lt;strong&gt;nw_wrld&lt;/strong&gt;, is a stunning example of how raw code can create immersive, high-intensity environments. Showcased recently on &lt;a href="https://www.youtube.com/watch?v=6vM_b54pWtg"&gt;YouTube&lt;/a&gt; and open-sourced on &lt;a href="https://github.com/aagentah/nw_wrld"&gt;GitHub&lt;/a&gt;, this project is built entirely using &lt;strong&gt;JavaScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For the VJ Union community, &lt;em&gt;nw_wrld&lt;/em&gt; offers a glimpse into the power of WebGL and creative coding in a live performance context.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Aesthetic: Digital Brutalism
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;nw_wrld&lt;/em&gt; doesn’t lean on stock textures or pre-rendered loops. Its beauty lies in its math. The visual style is a high-speed collision of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Fragmented Geometries:&lt;/strong&gt; Shifting grids and architectural forms that react with violent precision.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Monochromatic Glitch:&lt;/strong&gt; A heavy focus on contrast, strobe effects, and digital noise that feels right at home in a dark warehouse techno set.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Infinite Landscapes:&lt;/strong&gt; Because it’s generative, the "world" never repeats, providing a unique experience for every frame.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical Breakdown: Why JavaScript?
&lt;/h3&gt;

&lt;p&gt;By building &lt;em&gt;nw_wrld&lt;/em&gt; in JavaScript, aagentah taps into the flexibility of the web stack. For VJs, this opens up some unique tactical advantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;WebGL &amp;amp; GLSL Power:&lt;/strong&gt; The project leverages the GPU through WebGL. The heavy lifting is done via shaders (GLSL), allowing for complex particle systems and displacement mapping that run at a smooth 60FPS.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Browser-Based Portability:&lt;/strong&gt; You don't need a $2,000 software license to run this. It runs in a browser. For live setups, this can be easily integrated into Resolume or OBS using &lt;strong&gt;NDI (via scan converter)&lt;/strong&gt; or &lt;strong&gt;Syphon/Spout&lt;/strong&gt; browser extensions.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The "Live Coding" Philosophy:&lt;/strong&gt; Unlike traditional UI-based tools, JS-based projects allow for deep logic manipulation. You can hook into Web Audio APIs for frame-perfect audio reactivity or use Web MIDI to link your physical faders directly to the JS variables.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  A Sandbox for Developers and VJs
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/aagentah/nw_wrld"&gt;GitHub repository&lt;/a&gt; is a goldmine for anyone interested in creative coding. Because it is open-source, VJs can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Fork the World:&lt;/strong&gt; Take the existing codebase and inject your own color palettes or camera movements.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Learn the Logic:&lt;/strong&gt; Study how aagentah handles the sequencing of generative "scenes" using JS logic.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Expand the Input:&lt;/strong&gt; Add your own event listeners—imagine the visuals reacting to live Twitter feeds, Twitch chat, or complex OSC data streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to Integrate it into your VJ Set
&lt;/h3&gt;

&lt;p&gt;If you’re looking to bring the &lt;em&gt;nw_wrld&lt;/em&gt; aesthetic to your next gig:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Clone the Repo:&lt;/strong&gt; Grab the code from GitHub and run it locally.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Screen Capture / Routing:&lt;/strong&gt; Use a tool like &lt;strong&gt;OBS&lt;/strong&gt; or &lt;strong&gt;Web-Spout&lt;/strong&gt; to route the browser window into your main mixing software (Resolume, VDMX, Modul8).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Map it:&lt;/strong&gt; Since it’s JS, you can easily tweak the code to map your MIDI controller to specific parameters within the script.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;nw_wrld&lt;/strong&gt; is a testament to the "Post-Internet" VJ aesthetic. It’s raw, it’s fast, and it’s built on the open web. aagentah has provided the community with a powerful template for what's possible when we step outside of traditional VJ software and start writing the visuals ourselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get Involved:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Watch the Demo:&lt;/strong&gt; &lt;a href="https://www.youtube.com/watch?v=6vM_b54pWtg"&gt;nw_wrld on YouTube&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Get the Code:&lt;/strong&gt; &lt;a href="https://github.com/aagentah/nw_wrld"&gt;aagentah/nw_wrld on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Are you experimenting with JavaScript or WebGL in your live sets? Let’s talk about it in the comments below!&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  VJUnion #CreativeCoding #Javascript #WebGL #GenerativeArt #LiveVisuals #Vjing
&lt;/h1&gt;

</description>
      <category>opensource</category>
      <category>threejs</category>
      <category>js</category>
      <category>live</category>
    </item>
    <item>
      <title>New Timeline in cables.gl</title>
      <dc:creator>vdmo</dc:creator>
      <pubDate>Fri, 14 Nov 2025 14:59:36 +0000</pubDate>
      <link>https://vjun.io/vdmo/new-timeline-in-cablesgl-1g9n</link>
      <guid>https://vjun.io/vdmo/new-timeline-in-cablesgl-1g9n</guid>
      <description>&lt;p&gt;&lt;a href="https://vjun.io/uploads/articles/wo3arv7fxekofmviy8ps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://vjun.io/uploads/articles/wo3arv7fxekofmviy8ps.png" alt="cables.gl timeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What is the Timeline?
&lt;/h1&gt;

&lt;p&gt;The Timeline is a keyframe-based animation editor in cables.gl that lets you animate any numerical parameter in your patch with precision. It brings professional-grade motion control to your workflow — whether you are fine-tuning logic or shaping movement, timing and easing. With an intuitive interface for keyframes, curves, and clips, the Timeline gives you full visual control over how your projects evolve over time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.cables.gl/timeline/"&gt;https://blog.cables.gl/timeline/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/wzpKR7vbCXg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/KMhAjqn_fGg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/BYQ1Ecy-wsU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/zRorQ_ah2eg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/qMKcF54YjJA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>timeline</category>
      <category>cables</category>
      <category>cablesgl</category>
    </item>
    <item>
      <title>The Fabric Project: Bringing High-Fidelity Interactive Graphics Back to macOS</title>
      <dc:creator>vdmo</dc:creator>
      <pubDate>Fri, 24 Oct 2025 14:36:15 +0000</pubDate>
      <link>https://vjun.io/vdmo/the-fabric-project-bringing-high-fidelity-interactive-graphics-back-to-macos-k01</link>
      <guid>https://vjun.io/vdmo/the-fabric-project-bringing-high-fidelity-interactive-graphics-back-to-macos-k01</guid>
      <description>&lt;p&gt;The macOS creative community has been searching for a worthy successor to Quartz Composer ever since Apple deprecated it, and Anton Marini is answering that call with the ambitious &lt;strong&gt;Fabric Project&lt;/strong&gt;—a constellation of modern, open-source tools built on Metal that promises to revive the golden era of node-based visual creation on Apple platforms [10][11][12].&lt;br&gt;
&lt;a href="https://vjun.io/uploads/articles/dehj68dmem02rwitkhji.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://vjun.io/uploads/articles/dehj68dmem02rwitkhji.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Filling the Void Left by Quartz Composer
&lt;/h2&gt;

&lt;p&gt;For over a decade, Quartz Composer was the beating heart of creative coding on macOS, empowering VJs, visual artists, and multimedia creators to build interactive compositions through an intuitive node-based interface [13][14]. When Apple deprecated QC in macOS Catalina due to its reliance on the now-obsolete OpenGL framework, it left a painful gap in the creative toolchain [13][15]. VDMX recently announced they're officially phasing out Quartz Composer support due to mounting instability from OpenGL-to-Metal bridge issues, making the need for a modern replacement more urgent than ever [13][14].&lt;/p&gt;

&lt;p&gt;While Vuo.org has admirably stepped in to fill the Quartz Composer void with a commercial node-based environment that shares many similarities, the Fabric Project represents a distinctly different philosophical approach [1][3][7]. Where Vuo is a polished commercial product built by the team behind the popular Kineme plugins with user-driven development priorities and professional support services, Fabric emerges from a more personal, experimental ethos [4][7]. This is Anton's vision as an artist and tool-maker—open source at its core, Metal-native from day one, and rooted in the hacker spirit of creative exploration rather than commercial sustainability [10][12].&lt;/p&gt;

&lt;p&gt;Enter Anton Marini—better known in the creative tech community as vade—a veteran VJ, creative technologist, and former Quartz Composer power user who understands exactly what the community needs [16][12]. Having worked extensively with visual programming environments and developed plugins for Quartz Composer himself, Anton brings both technical expertise and lived experience to this challenge [11][12].&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Pillars of the Fabric Project
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://fabric-project.github.io/"&gt;https://fabric-project.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Satin: The Foundation
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://vjun.io/uploads/articles/10w6wmy0xxuzqm5j6ky6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://vjun.io/uploads/articles/10w6wmy0xxuzqm5j6ky6.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the heart of the Fabric Project lies &lt;strong&gt;Satin&lt;/strong&gt;, a production-ready 3D graphics framework built on Apple's Metal API, created by Reza Ali [17][18]. Inspired by the elegance of Three.js, Satin provides a comprehensive foundation that includes materials, shaders, geometry systems, and a complete scene graph architecture [17][19]. The framework supports modern rendering techniques including physically-based rendering (PBR), real-time shadows, tessellation, and even ray tracing—bringing cutting-edge graphics capabilities to Apple platforms [17].&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vjun.io/uploads/articles/4ulcwgqwv5qjhlpimllj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://vjun.io/uploads/articles/4ulcwgqwv5qjhlpimllj.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Satin was born from real-world production needs, initially developed for Intel Studios to efficiently render massive point cloud datasets on iOS devices at 60fps without overheating [18]. This performance-first approach means the framework is battle-tested and optimized for real-time creative work [18]. While Reza can no longer continue active development due to professional obligations, Anton has stepped up to carry the torch forward and build upon these solid foundations [11][12].&lt;/p&gt;

&lt;h3&gt;
  
  
  Fabric: The Creative Environment
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://vjun.io/uploads/articles/amozlxlk02zom1hajh0f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://vjun.io/uploads/articles/amozlxlk02zom1hajh0f.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fabric&lt;/strong&gt; is Anton's answer to the node-based editor that the community has been craving—a modern reimagining of Quartz Composer built entirely in Metal, Swift, and SwiftUI [12]. This isn't just a nostalgic recreation; it's a thoughtful evolution that addresses what made QC special while embracing contemporary development practices and Apple's modern frameworks [11][12].&lt;/p&gt;

&lt;p&gt;The editor features everything you'd expect from a professional visual programming environment: mesh, material, geometry, camera, and lighting nodes that connect intuitively to build complex visual systems [12]. It supports PBR shading with proper lighting and shadows, post-processing effects, image processing pipelines, shader loading, and 3D model import [12]. The node-based workflow operates on an efficient pull-based system where nodes request data from connected parent nodes each frame, with intelligent dirty/clean marking to optimize performance [11].&lt;/p&gt;

&lt;p&gt;What makes Fabric particularly exciting is its cross-platform capability—the engine runs on macOS, iOS, iPadOS, tvOS, and even visionOS, opening up possibilities far beyond what Quartz Composer could achieve [12]. The editor itself is macOS-focused, providing the desktop-class workflow that power users demand, while the runtime engine can deploy compositions across the entire Apple ecosystem [12].&lt;/p&gt;

&lt;p&gt;Fabric also introduces an &lt;strong&gt;interchange format&lt;/strong&gt; for saving compositions and an &lt;strong&gt;embeddable SDK&lt;/strong&gt; that allows developers to load and render Fabric documents in their own applications [10]. This means VJ software, live performance tools, interactive installations, and custom applications can all leverage Fabric compositions, creating an ecosystem similar to what existed with Quartz Composer plugins and patches [10].&lt;/p&gt;

&lt;h3&gt;
  
  
  Velvet: Experimental Live Coding
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://vjun.io/uploads/articles/1ayshho5ze278iqpmhbr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://vjun.io/uploads/articles/1ayshho5ze278iqpmhbr.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
For those who prefer code to nodes, &lt;strong&gt;Velvet&lt;/strong&gt; offers something truly unique—an experimental live coding environment written in Swift that takes inspiration from Processing [10]. Velvet allows artists and developers to write Satin code and see it compile and hot-load in real-time, bridging the gap between traditional programming and immediate visual feedback [10].&lt;/p&gt;

&lt;p&gt;This live coding approach is particularly valuable for performance contexts, shader development, and rapid prototyping where the immediacy of seeing code changes reflected instantly can unlock creative workflows that would be impossible with traditional compile-test-debug cycles [10].&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for the macOS Creative Community
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Native Metal Performance
&lt;/h3&gt;

&lt;p&gt;By building exclusively on Metal rather than trying to maintain legacy OpenGL compatibility, the Fabric Project delivers the high-performance, low-latency graphics that real-time visual work demands [11][12]. Metal's direct hardware access and modern shader capabilities enable techniques that simply weren't possible in Quartz Composer's aging OpenGL foundation [13][17].&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Source and Community-Driven
&lt;/h3&gt;

&lt;p&gt;Unlike proprietary solutions, the Fabric Project embraces open-source development, inviting the community to contribute, extend, and shape its evolution [11][12]. Anton is actively seeking to build a community of developers and users who can help maintain and expand the project [10][11]. This collaborative approach means the toolset can grow organically to meet the actual needs of working artists and developers rather than being locked to a single company's roadmap [11].&lt;/p&gt;

&lt;h3&gt;
  
  
  Professional Yet Accessible
&lt;/h3&gt;

&lt;p&gt;Anton's vision strikes a careful balance between being approachable for creative exploration while meeting professional production requirements [11]. The no-code node-based environment lowers the barrier to entry for designers and artists, while the underlying Satin framework provides the depth and extensibility that technical developers need [10][11]. This dual-level approach means beginners can create compelling work immediately while experts can dive deep into custom shader code and advanced rendering techniques [11][12].&lt;/p&gt;

&lt;h3&gt;
  
  
  A Platform for Experimentation
&lt;/h3&gt;

&lt;p&gt;The Fabric Project explicitly aims to "bring back an era of high quality, performant and experimental software to the Apple platforms as first class citizens" [10]. This mission statement resonates deeply with anyone who remembers the creative renaissance that Quartz Composer enabled—when VJs, interaction designers, and digital artists had powerful native tools that felt like they were designed specifically for creative exploration [10][13].&lt;/p&gt;

&lt;h2&gt;
  
  
  The Road Ahead
&lt;/h2&gt;

&lt;p&gt;While Anton describes Fabric as "work in progress," the project is already "relatively capable today" and ready for early adopters to explore [12]. The foundation is solid, the vision is clear, and the development is active [20][12]. Recent updates show Anton optimizing graph evaluation performance and continuing to refine the core engine [20].&lt;/p&gt;

&lt;p&gt;For anyone who remembers the joy of patching together visual systems in Quartz Composer, experimenting with generative graphics in VDMX, or building interactive installations with node-based tools, the Fabric Project represents genuine hope [11][13][12]. It's not trying to be a commercial product with flashy marketing—it's a passionate, technically excellent effort to give the creative community the tools they deserve [10][12].&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Involved
&lt;/h2&gt;

&lt;p&gt;The Fabric Project is actively looking for community members to contribute, test, and help shape its future [10][11][12]. Whether you're a former Quartz Composer user with ideas about workflow, a Metal developer who can contribute code, or an artist eager to push the boundaries of what's possible, your input is welcome [12]. You can explore the project at fabric-project.github.io and connect with Anton and other community members to be part of rebuilding the creative graphics ecosystem on Apple platforms [10][12].&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fabric-project.github.io/"&gt;https://fabric-project.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The golden age of creative coding on macOS isn't just a memory—thanks to Anton Marini and the Fabric Project, it's being reborn for a new generation [10][12].&lt;/p&gt;

&lt;p&gt;Citations:&lt;br&gt;
[1] Looking for an alternative to Quartz Composer? &lt;a href="https://vuo.org/qc"&gt;https://vuo.org/qc&lt;/a&gt;&lt;br&gt;
[2] alternative for mac? : r/quartzcomposer &lt;a href="https://www.reddit.com/r/quartzcomposer/comments/lh5ixw/alternative_for_mac/"&gt;https://www.reddit.com/r/quartzcomposer/comments/lh5ixw/alternative_for_mac/&lt;/a&gt;&lt;br&gt;
[3] Vuo and other visual programming languages &lt;a href="https://vuo.org/taxonomy/term/83"&gt;https://vuo.org/taxonomy/term/83&lt;/a&gt;&lt;br&gt;
[4] Looking for an alternative to Quartz Composer? &lt;a href="https://www.youtube.com/watch?v=upO-3yTYPb4"&gt;https://www.youtube.com/watch?v=upO-3yTYPb4&lt;/a&gt;&lt;br&gt;
[5] VDMX and Vuo &lt;a href="https://docs.vidvox.net/vdmx/vdmx_vuo"&gt;https://docs.vidvox.net/vdmx/vdmx_vuo&lt;/a&gt;&lt;br&gt;
[6] Converting from Quartz Composer - Discussions &lt;a href="https://community.vuo.org/t/converting-from-quartz-composer/6293"&gt;https://community.vuo.org/t/converting-from-quartz-composer/6293&lt;/a&gt;&lt;br&gt;
[7] Looking for an alternative to Quartz Composer? - Tutorials &lt;a href="https://community.vuo.org/t/looking-for-an-alternative-to-quartz-composer/4783"&gt;https://community.vuo.org/t/looking-for-an-alternative-to-quartz-composer/4783&lt;/a&gt;&lt;br&gt;
[8] Alternative for Quartz Composer - Resolume Forum &lt;a href="https://resolume.com/forum/viewtopic.php?t=14971"&gt;https://resolume.com/forum/viewtopic.php?t=14971&lt;/a&gt;&lt;br&gt;
[9] How does Vuo compare to other creative coding ... &lt;a href="https://vuo.org/compare"&gt;https://vuo.org/compare&lt;/a&gt;&lt;br&gt;
[10] Anton Marini (@_vade) / X &lt;a href="https://x.com/_vade"&gt;https://x.com/_vade&lt;/a&gt;&lt;br&gt;
[11] Fabric - A Node based Metal Realtime engine inspired by ... &lt;a href="https://www.reddit.com/r/GraphicsProgramming/comments/1khcowt/fabric_a_node_based_metal_realtime_engine/"&gt;https://www.reddit.com/r/GraphicsProgramming/comments/1khcowt/fabric_a_node_based_metal_realtime_engine/&lt;/a&gt;&lt;br&gt;
[12] Anton Marini's Post &lt;a href="https://www.linkedin.com/posts/antonmarini_github-fabric-projectfabric-node-based-activity-7378820328451624960-ljw1"&gt;https://www.linkedin.com/posts/antonmarini_github-fabric-projectfabric-node-based-activity-7378820328451624960-ljw1&lt;/a&gt;&lt;br&gt;
[13] Sunsetting Quartz Composer in VDMX6 &lt;a href="https://vdmx.vidvox.net/blog/sunsetting-quartz-composer-in-vdmx6"&gt;https://vdmx.vidvox.net/blog/sunsetting-quartz-composer-in-vdmx6&lt;/a&gt;&lt;br&gt;
[14] Quartz Composer — Blog - VDMX - MAC VJ SOFTWARE &lt;a href="https://vdmx.vidvox.net/blog/tag/Quartz+Composer"&gt;https://vdmx.vidvox.net/blog/tag/Quartz+Composer&lt;/a&gt;&lt;br&gt;
[15] Quartz Composer &lt;a href="https://en.wikipedia.org/wiki/Quartz_Composer"&gt;https://en.wikipedia.org/wiki/Quartz_Composer&lt;/a&gt;&lt;br&gt;
[16] Interview: Anton Marini on Visual Expression, Exploring ... &lt;a href="https://cdm.link/interview-anton-marini-on-visual-expression-exploring-glitch-open-community/"&gt;https://cdm.link/interview-anton-marini-on-visual-expression-exploring-glitch-open-community/&lt;/a&gt;&lt;br&gt;
[17] Spring 2021 #OSSTA Lecture: Reza Ali &lt;a href="http://opentranscripts.org/transcript/spring-2021-ossta-lecture-reza-ali/"&gt;http://opentranscripts.org/transcript/spring-2021-ossta-lecture-reza-ali/&lt;/a&gt;&lt;br&gt;
[18] Intel Studios — Real-time Point Cloud Rendering &lt;a href="https://www.syedrezaali.com/intel-studios"&gt;https://www.syedrezaali.com/intel-studios&lt;/a&gt;&lt;br&gt;
[19] GitHub - Hi-Rez/Satin: A 3D Graphics Framework built on ... &lt;a href="https://github.com/Hi-Rez/Satin"&gt;https://github.com/Hi-Rez/Satin&lt;/a&gt;&lt;br&gt;
[20] Optimized Swift code for graph evaluation with Instruments &lt;a href="https://www.linkedin.com/posts/antonmarini_swift-optimization-programming-activity-7383538316492636160--n_U"&gt;https://www.linkedin.com/posts/antonmarini_swift-optimization-programming-activity-7383538316492636160--n_U&lt;/a&gt;&lt;/p&gt;

</description>
      <category>fabric</category>
      <category>metal</category>
      <category>satin</category>
      <category>velvet</category>
    </item>
    <item>
      <title>Geyser: Seamless Inter-Application Graphics &amp; Texture Sharing for Rust</title>
      <dc:creator>vdmo</dc:creator>
      <pubDate>Thu, 23 Oct 2025 04:22:17 +0000</pubDate>
      <link>https://vjun.io/vdmo/geyser-seamless-inter-application-graphics-texture-sharing-for-rust-34np</link>
      <guid>https://vjun.io/vdmo/geyser-seamless-inter-application-graphics-texture-sharing-for-rust-34np</guid>
      <description>&lt;p&gt;Rust's prowess in high-performance computing, especially in graphics and game development, is undeniable. However, a persistent challenge remains: how do you efficiently share complex data, like textures or render targets, between different applications or even different parts of a single, highly modular system? Enter &lt;strong&gt;Geyser&lt;/strong&gt;, an innovative project that's set to revolutionize how Rust applications interact, particularly when it comes to shared graphical resources.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vjun.io/uploads/articles/ggoa25xkdzsrpi5djouk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://vjun.io/uploads/articles/ggoa25xkdzsrpi5djouk.png" alt="compuling-org"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Found at &lt;a href="https://github.com/compiling-org/Geyser"&gt;github.com/compiling-org/Geyser&lt;/a&gt;, Geyser isn't just another web framework. It's a foundational layer designed to enable &lt;strong&gt;type-safe, high-performance inter-application communication&lt;/strong&gt;, with a specific emphasis on the secure and efficient sharing of graphical textures and other GPU resources. While WebGPU integration is on the horizon, its immediate impact is in streamlining sophisticated native graphics workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Geyser (Really)?
&lt;/h3&gt;

&lt;p&gt;At its heart, Geyser is about bridging the communication gap between disparate Rust applications or modules that need to exchange structured data, especially when that data involves GPU-managed assets. Think of it as a highly specialized, type-safe RPC (Remote Procedure Call) system tailored for scenarios where low-latency data transfer and resource sharing are critical.&lt;/p&gt;

&lt;p&gt;Instead of cumbersome serialization/deserialization for every data exchange, Geyser aims to provide mechanisms for direct, efficient sharing, minimizing overhead and maximizing performance. This is particularly crucial for graphics applications where copying large texture data between processes is prohibitively expensive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Innovations and Their Impact
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Type-Safe Inter-Application APIs:&lt;/strong&gt; Geyser leverages Rust's strong type system to define the interfaces between applications. This means that when one application sends data (or a reference to a resource) to another, the types are guaranteed to match at compile time. This eliminates a whole class of runtime errors, making complex multi-application systems significantly more robust. Imagine a render engine passing a processed frame to a display utility, with all data types rigorously checked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/compiling-org/Geyser"&gt;github.com/compiling-org/Geyser&lt;/a&gt;&lt;/p&gt;

</description>
      <category>geyser</category>
      <category>gpu</category>
      <category>crossplatform</category>
      <category>software</category>
    </item>
    <item>
      <title>Workbench 5.0 is Beautiful </title>
      <dc:creator>vdmo</dc:creator>
      <pubDate>Sun, 19 Oct 2025 15:05:36 +0000</pubDate>
      <link>https://vjun.io/vdmo/workbench-50-is-beautiful-j1l</link>
      <guid>https://vjun.io/vdmo/workbench-50-is-beautiful-j1l</guid>
      <description>&lt;p&gt;Blockbench is a free, open‑source low‑poly 3D editor with pixel‑art texturing and a built‑in Animate workspace for bone/keyframe animation, making it a fast path from modeling to motion for real‑time visuals. It exports to production formats like glTF/glb, FBX, and DAE so the same animated assets can run in browsers, game engines, and VJ pipelines, including Three.js playback in the web.[1][2][3][4]&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.blockbench.net"&gt;https://www.blockbench.net&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/JannisX11/blockbench"&gt;https://github.com/JannisX11/blockbench&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Blockbench at a glance
&lt;/h3&gt;

&lt;p&gt;Blockbench focuses on low‑poly modeling with pixel‑art textures, ships a modern, beginner‑friendly UI, and supports deep customization through plugins for advanced users and workflows. It handles standardized exports for general 3D use and has dedicated formats for Minecraft Java and Bedrock when you need game‑specific features and animation integration.[1]&lt;/p&gt;
&lt;h3&gt;
  
  
  Why VJs should care
&lt;/h3&gt;

&lt;p&gt;The glTF/glb export preserves hierarchy, materials, and animation while keeping assets lightweight and web‑friendly, which is ideal for browser‑based shows and real‑time playback. Three.js loads glTF 2.0 directly via GLTFLoader, so your Blockbench animations can be streamed into a scene and driven live with mixers, timelines, or MIDI/OSC bridges.[3][4][5]&lt;/p&gt;
&lt;h3&gt;
  
  
  Animate in Blockbench
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set up a clean bone hierarchy with sensible pivots so each movable piece rotates around the right point; use the Pivot tool and a root bone to control the whole figure.[2]&lt;/li&gt;
&lt;li&gt;Switch to the Animate tab, create a named animation, and keyframe rotation/position/scale on the timeline; Blockbench auto‑generates keyframes when you adjust transforms at new times.[2]&lt;/li&gt;
&lt;li&gt;Use the playhead to preview loops, tweak timing, and refine secondary motion; save your project to keep animation data alongside the model.[2]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/OyYk5QOWeXg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Export for production
&lt;/h3&gt;

&lt;p&gt;glTF/glb is the go‑to for web and Sketchfab, FBX is preferred for Unreal/Unity, and DAE is great for Blender/Unity interchange; OBJ is widely supported but lacks hierarchy/animations and is best for static objects. Blockbench’s export menu lives under File → Export, with guidance for program‑specific setup like pixel‑perfect filtering and alpha modes in DCCs/engines.[3]&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Recommended format&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Browser/Godot/Sketchfab&lt;/td&gt;
&lt;td&gt;glTF/glb, with embedded textures and animation support [3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unreal Engine&lt;/td&gt;
&lt;td&gt;FBX for robust engine import workflows [3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unity&lt;/td&gt;
&lt;td&gt;FBX or DAE depending on pipeline needs [3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blender (rendering)&lt;/td&gt;
&lt;td&gt;glTF for materials/animation fidelity [3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blender (modeling)&lt;/td&gt;
&lt;td&gt;DAE for interchange editing [3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static meshes&lt;/td&gt;
&lt;td&gt;OBJ (no animations) [3]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Play it in Three.js
&lt;/h3&gt;

&lt;p&gt;GLTFLoader loads glTF 2.0 scenes, meshes, materials, skins, morph targets, and embedded animations, keeping asset delivery efficient for the web. AnimationMixer plays AnimationClips on a model, while AnimationAction handles play/pause/loop/blending for clip control and seamless transitions in a live set.[4][5][6]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GLTFLoader&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;three/examples/jsm/loaders/GLTFLoader.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AnimationMixer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;LoopRepeat&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;three&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// load model + animations&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;GLTFLoader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;mixer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;actions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nx"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;models/character.glb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gltf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gltf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;
  &lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nx"&gt;mixer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AnimationMixer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="c1"&gt;// assume multiple clips exported from Blockbench&lt;/span&gt;
  &lt;span class="nx"&gt;gltf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;animations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mixer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clipAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setLoop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;LoopRepeat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="c1"&gt;// play a specific Blockbench clip by name&lt;/span&gt;
  &lt;span class="nx"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;play&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// in your render loop&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;THREE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Clock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getDelta&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mixer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;mixer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;camera&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use mixer.timeScale for tempo sync, or switch actions with crossfading for scene changes while keeping CPU overhead predictable.[5][6]&lt;/p&gt;

&lt;h3&gt;
  
  
  Pro tips for VJ performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keep geometry lean and texture resolutions modest; glTF supports pixel‑perfect filtering for crisp art‑direction in low‑poly/pixel‑art styles.[3]&lt;/li&gt;
&lt;li&gt;Export multiple short loops as separate clips and blend them with AnimationAction to move between states without pops, using clampWhenFinished and blend modes as needed.[6]&lt;/li&gt;
&lt;li&gt;Drive speed with mixer.timeScale for BPM‑locked motion, and pre‑load GLBs to avoid hitches during live transitions.[5]&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Extend with plugins
&lt;/h3&gt;

&lt;p&gt;Plugins are JavaScript files registered with Plugin.register, can target desktop or web variants, and are hot‑loadable for rapid iteration, enabling custom exporters, tools, or QC checks for show pipelines. The Plugin API and reference docs cover metadata, lifecycle hooks, and TypeScript typings for better autocompletion and stability in complex setups. Notably, while Blockbench’s core is GPL‑3.0, plugins/themes may be proprietary or paid, which suits studio toolchains and marketplace distribution.[7][8][1]&lt;/p&gt;

&lt;h3&gt;
  
  
  Open source and builds
&lt;/h3&gt;

&lt;p&gt;Blockbench is GPL‑3.0 licensed; clone the repo, install dependencies, bundle, and run dev to hack features, test plugins, or tailor exports for your venue pipeline. The project ships frequent releases, with recent updates continuing to refine collections, selection, and workflow polish for production use.[1]&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick VJ checklist
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Model low‑poly with clean bone pivots for performant, predictable animation.[2]&lt;/li&gt;
&lt;li&gt;Animate in the Animate tab and preview tight loops with clear clip names.[2]&lt;/li&gt;
&lt;li&gt;Export glTF/glb for web playback; keep textures embedded for simpler deployment.[3]&lt;/li&gt;
&lt;li&gt;Load with Three.js GLTFLoader and play clips via AnimationMixer/AnimationAction.[4][6][5]&lt;/li&gt;
&lt;li&gt;Use mixer.timeScale and action crossfades for tempo‑aware transitions on stage.[6][5]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Blockbench’s approachable modeling, keyframed animation, and glTF export, creating live‑ready 3D loops for browser‑based shows becomes a fast, repeatable pipeline from concept to stage visuals.[4][3][2]&lt;/p&gt;

&lt;p&gt;Here are the links, now displayed as clickable URLs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/JannisX11/blockbench"&gt;https://github.com/JannisX11/blockbench&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blockbench.net/wiki/guides/bedrock-modeling/"&gt;https://www.blockbench.net/wiki/guides/bedrock-modeling/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blockbench.net/wiki/guides/export-formats/"&gt;https://www.blockbench.net/wiki/guides/export-formats/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threejs.org/docs/examples/en/loaders/GLTFLoader.html"&gt;https://threejs.org/docs/examples/en/loaders/GLTFLoader.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threejs.org/docs/api/en/animation/AnimationMixer.html"&gt;https://threejs.org/docs/api/en/animation/AnimationMixer.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threejs.org/docs/api/en/animation/AnimationAction.html"&gt;https://threejs.org/docs/api/en/animation/AnimationAction.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blockbench.net/wiki/api/plugin/"&gt;https://www.blockbench.net/wiki/api/plugin/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blockbench.net/wiki/docs/plugin/"&gt;https://www.blockbench.net/wiki/docs/plugin/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=HY_wjAnSy4I"&gt;https://www.youtube.com/watch?v=HY_wjAnSy4I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/Blockbench/comments/1du5c6v/how_do_i_animate/"&gt;https://www.reddit.com/r/Blockbench/comments/1du5c6v/how_do_i_animate/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLvULVkjBtg2TQWdJvyz-tpAqcwhIhctSP"&gt;https://www.youtube.com/playlist?list=PLvULVkjBtg2TQWdJvyz-tpAqcwhIhctSP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=QdZX1W1IEL0"&gt;https://www.youtube.com/watch?v=QdZX1W1IEL0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blockbench.net"&gt;https://www.blockbench.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blockbench.net/wiki/guides/model-rendering/"&gt;https://www.blockbench.net/wiki/guides/model-rendering/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blockbench.net/wiki/guides/minecraft-particles-sounds/"&gt;https://www.blockbench.net/wiki/guides/minecraft-particles-sounds/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/Blockbench/comments/p9uewn/gltf_in_blockbench_i_dont_know_what_flair_to_use/"&gt;https://www.reddit.com/r/Blockbench/comments/p9uewn/gltf_in_blockbench_i_dont_know_what_flair_to_use/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JannisX11/blockbench-plugins"&gt;https://github.com/JannisX11/blockbench-plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=y0ees2j17AY"&gt;https://www.youtube.com/watch?v=y0ees2j17AY&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blockbench.net/wiki/blockbench/formats/"&gt;https://www.blockbench.net/wiki/blockbench/formats/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blockbench.net/wiki/api/blockbench/"&gt;https://www.blockbench.net/wiki/api/blockbench/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sketchfab.com/tags/blockbench-animation"&gt;https://sketchfab.com/tags/blockbench-animation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/groups/nomadsculpt/posts/1541909993656201/"&gt;https://www.facebook.com/groups/nomadsculpt/posts/1541909993656201/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/77733958/create-brand-new-weapon-with-blockbench-and-a-minecraft-plugin-api"&gt;https://stackoverflow.com/questions/77733958/create-brand-new-weapon-with-blockbench-and-a-minecraft-plugin-api&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mcreator.net/wiki/entity-model-animations"&gt;https://mcreator.net/wiki/entity-model-animations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threejs.org/docs/"&gt;https://threejs.org/docs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sbcode.net/threejs/gltf-loader/"&gt;https://sbcode.net/threejs/gltf-loader/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threejs.org/manual/"&gt;https://threejs.org/manual/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sbcode.net/threejs/loaders-gltf/"&gt;https://sbcode.net/threejs/loaders-gltf/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://henryegloff.com/how-to-load-gltf-animations-as-separate-files-in-three-js/"&gt;https://henryegloff.com/how-to-load-gltf-animations-as-separate-files-in-three-js/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.modelo.io/damf/article/2024/05/22/0852/mastering-three.js-gltfloader--a-complete-guide"&gt;https://www.modelo.io/damf/article/2024/05/22/0852/mastering-three.js-gltfloader--a-complete-guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discourse.threejs.org/t/how-do-i-play-a-glb-animation/60970"&gt;https://discourse.threejs.org/t/how-do-i-play-a-glb-animation/60970&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=WBe3xrV4CPM"&gt;https://www.youtube.com/watch?v=WBe3xrV4CPM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=NsJ0sPa8Za8"&gt;https://www.youtube.com/watch?v=NsJ0sPa8Za8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discourse.threejs.org/t/how-to-use-the-animation-that-comes-with-the-gltf-file-that-i-downloaded-in-sketchfab/51529"&gt;https://discourse.threejs.org/t/how-to-use-the-animation-that-comes-with-the-gltf-file-that-i-downloaded-in-sketchfab/51529&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discourse.threejs.org/t/gltfexporter-and-gltfloader/49883"&gt;https://discourse.threejs.org/t/gltfexporter-and-gltfloader/49883&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threejs.org/docs/api/en/animation/AnimationObjectGroup.html"&gt;https://threejs.org/docs/api/en/animation/AnimationObjectGroup.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/60704912/play-a-gltf-animation-three-js"&gt;https://stackoverflow.com/questions/60704912/play-a-gltf-animation-three-js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discourse.threejs.org/t/playing-list-of-animation-at-once/33530"&gt;https://discourse.threejs.org/t/playing-list-of-animation-at-once/33530&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sbcode.net/threejs/gltf-animation/"&gt;https://sbcode.net/threejs/gltf-animation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pythreejs.readthedocs.io/en/stable/api/animation/AnimationMixer_autogen.html"&gt;https://pythreejs.readthedocs.io/en/stable/api/animation/AnimationMixer_autogen.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threejs.org/examples/"&gt;https://threejs.org/examples/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>workbench</category>
      <category>3d</category>
      <category>animation</category>
      <category>uv</category>
    </item>
  </channel>
</rss>
