The Interactive & Immersive HQ

Do’s and Don’ts of Application Stacking For Creative Technology

In creative technology, no single tool does it all, especially when building immersive experiences that combine visuals, sound, data, and interactivity. Enter application stacking: the strategy of using multiple creative tools in sync to produce cohesive, flexible, and powerful systems.

Stacking can help you build bigger and smarter, but if done wrong, it can become fragile and overcomplicated. Here’s how to do it right.

What Is Application Stacking?

Application stacking is a modular approach to installation programming. Instead of forcing one tool to handle everything, you divide responsibilities across several specialized apps. Each piece of software plays a role (input, logic, output) and the system works like a pipeline.

A typical stack includes:

  • Input Layer: APIs, sensors, MIDI, web data
  • Middleware: Logic, cleanup, transformation
  • Output: Visuals, audio, projection, web streaming

Example: For a race broadcast, we used Node.js to parse live telemetry → TouchDesigner to visualize the data in real time → OBS to stream it to Twitch.

Each tool in the stack focused on what it did best, and backups were in place at every layer. That’s the power of a smart stack.

Application Stacking

Keep It Lean: 2–3 Apps Max

Most successful stacks stay lean—2 to 3 core apps.

  • Input Handler (e.g., Node.js, Max/MSP)
  • Creative Engine (e.g., TouchDesigner, Unity, Unreal, Notch)
  • Output Manager (e.g., OBS, Resolume, MadMapper)

You can stretch to four if needed, but each added app brings more complexity—more CPU load, more potential points of failure, and more communication overhead. You can increase this with additional computers but this will increase complexity as well. Simpler stacks are faster to troubleshoot and easier to optimize.

Before adding a tool, ask: “What does this do that another app can’t?” If there’s no clear answer, cut it.

Middleware: Control, Logic & Flexibility

Middleware sits between input and output—handling logic, cleaning data, and routing messages. It’s also the best place to build live control interfaces and centralized behavior logic.

Use tools like:

  • Node.js – great for parsing APIs and serving WebSocket/UIs
  • TouchDesigner– great for dynamically smoothing, visualizing, and routing data as well as rapid prototyping
  • Max/MSP or Pure Data – powerful for audio + visual logic
  • Custom web UIs – for control dashboards or operator panels

Middleware can:

  • Normalize data ranges
  • Buffer or smooth noisy signals
  • Prioritize incoming events
  • Expose live control panels via OSC, MIDI, or browser dashboards

Middleware = the brains of the stack.

Diagram Your Signal Flow

Before you build, map your signal flow. Know what connects to what, in what direction, and using what protocol.

Example:

API → (HTTP) → Node.js → (WebSocket) → TouchDesigner → (NDI) → OBS → Twitch

Label each arrow with the protocol used (OSC, MIDI, WebSocket, NDI). This makes the system easier to debug and communicate with collaborators.

A clean flow avoids latency, race conditions, and mystery bugs. It also helps highlight where backups or error handlers are needed.

Assign Clear Roles

Not every app is equal in the stack. Define who’s in charge of what.

  • Timing master – e.g., Ableton, Max, Unreal
  • Visual engine – e.g., TouchDesigner, Notch
  • Output host – e.g., OBS, Resolume, MadMapper

Choose one tool per role. Avoid overlap because two apps fighting for control leads to instability. Think of it as a production team where everyone has a job. Keep roles distinct and intentional.

Clean Your Inputs Early

The earlier you sanitize your input, the better. Whether you’re dealing with sensors, APIs, or MIDI, garbage in means garbage out.

First-layer apps (like Node.js or Max) should:

  • Smooth jitter
  • Clamp weird values
  • Normalize ranges (e.g., 0–1023 → 0–1)
  • Translate formats (e.g., JSON → OSC)

Bad input doesn’t just break visuals, it causes false triggers, crashes, and sync issues. Clean once, clean early, clean often.

Run Apps Asynchronously

When stacking multiple apps, don’t assume they’ll stay perfectly in sync. Instead, aim for asynchronous design: each app runs at its own pace, pulling or receiving the latest data as needed.

Use:

  • Buffered communication (e.g., WebSocket, OSC, shared memory)
  • Loose coupling between apps
  • Fail-safes like last-known-state or fallback modes

This makes your stack fault-tolerant. If one app hiccups, the rest keep going. Only use tight lockstep timing when absolutely necessary (like multi-projector frame sync).

For the Game of Thrones Bleed for the Throne experience, wireless headphones synced to video via UDP from TouchDesigner for up to 40 people. An iPod app used beacons to detect the room the guest was in, receive the UDP for that room, and sync playback, auto-correcting if connection was lost to keep the experience seamless.

Application Stacking

Watch Your Resources

More apps = more demand on your system. Even if apps run smoothly alone, they may compete for GPU, CPU, or memory when stacked.

Tips:

  • Don’t exceed ~70% total system usage
  • Monitor performance in each app
  • Stagger startup times
  • Split heavy components across machines or use TouchDesigner’s Engine COMP to run parts in separate processes
  • Avoid sudden spikes—like all apps loading media at once

A well-performing stack is not only functional, but also responsive under pressure.

Get Our 7 Core TouchDesigner Templates, FREE

We’re making our 7 core project file templates available – for free.

These templates shed light into the most useful and sometimes obtuse features of TouchDesigner.

They’re designed to be immediately applicable for the complete TouchDesigner beginner, while also providing inspiration for the advanced user.

Output Matters

Your output layer is what the audience sees. Treat it like a mission-critical system.

Whether it’s:

  • OBS streaming to Twitch
  • Resolume blending multiple inputs
  • MadMapper controlling projection across 3D surfaces
  • A Notch block rendering a final pass

This layer should be stable, testable, and capable of fallback. Output systems often support standby media, black-out triggers, or emergency override commands. If the project is a big production, this system may be a whole other computer.

Plan what happens when input drops. Avoid letting upstream failures ripple downstream.

Design for Failure

No matter how polished your system is, design for what you will do if things break.

  • Use watchdog scripts to auto-restart apps
  • Cache fallback data
  • Create keyboard shortcuts or OSC triggers for backup modes
  • Run secondary instances or backup NUCs
  • Test loss scenarios: What happens if one app dies?

You may not need all of the above, but a little rehearsal and planning for critical issues will let you sleep a lot easier and you will thank yourself if issues do arise. Application stacking also gives you the ability to build in fallbacks inside each step of your pipeline.

Application Stacking

Final Thoughts

Application stacking is one of the most powerful approaches in creative technology, but only when done with intent.

The best stacks are:

  • Lean (2–3 core apps)
  • Mapped and documented
  • Resilient to failure
  • Clear in roles and responsibilities
  • Built with flexibility and live control in mind

Whether you’re building an interactive lobby wall, a data-reactive stage visual, or a public-facing installation: stack smart, not heavy.

Diagram it. Clean it. Stress test it. And always build with failure in mind.