Ernesto Del Valle M.

Technical Art portfolio bridging code architecture with artist-friendly environments. Includes Python pipeline automation, headless rendering scripts, and procedural Geometry Nodes setups. Built to eliminate bottlenecks and scale 3D workflows in Blender.


Project maintained by 3dvm Hosted on GitHub Pages — Theme by mattgraham

Case Study: “The Time Capsule” Environment Manager & Launcher

← Back to Home 🔗 View Full Repository on GitHub

Macuare Hub in action: Single Sign-On (SSO), dynamic environment building, and isolated DCC launching.



1. The Problem: “Dependency Hell” and Security Risks

Updating software mid-production is a massive risk for any studio. Global installations and cross-dependencies often mean that upgrading a tool for a new project completely breaks legacy projects. Artists waste hours dealing with Python AttributeError crashes, missing add-ons, and manual path configurations just to open an older file.

Furthermore, traditional pipelines often rely on saving plain-text SVN or network credentials on local disks, creating significant security vulnerabilities in shared studio environments.

The challenge was twofold: eliminate environment friction entirely (ensuring every project retains its original “DNA” to be opened years later) and secure network credentials without compromising the artist’s user experience.

2. The Solution: A Lightweight “rez-like” Studio Hub

To solve this, I developed the Macuare Hub, a custom environment manager and standalone executable written in Python. Functioning as a lightweight, OS-agnostic alternative to frameworks like rez, this launcher creates an absolute, invisible sandbox for artists.

It acts as a bridge between our production tracker (Kitsu), our version control (SVN), and our hybrid storage (Nextcloud). Based on the project’s JSON manifest, the Hub dynamically extracts specific DCC binaries, isolates required add-ons locally, and injects runtime variables—all without touching the OS global registry.

Macuare Hub - Artist Dashboard
Artist Dashboard built with CustomTkinter. Projects are populated dynamically based on Kitsu assignments.
flowchart TD subgraph Cloud [Studio Cloud Infrastructure] K[🦊 Kitsu API
SSO & Assignments] N[☁️ Nextcloud
Software Vault & Manifests] S[🐘 SVN Server
Production Assets & Shots] end subgraph Workstation [Artist Local Machine] direction TB MH{⚙️ Macuare Hub
Standalone Executable} RAM[(🧠 In-Memory Vault
Volatile Credentials)] SB[📦 Ephemeral Sandbox
./06_conf_LOCAL/] DCC[🎨 Blender Subprocess] end %% Data Flow K <-->|Role Auth / JSON| MH N -->|Downloads Add-ons .zip| MH MH -->|Writes Extensions & Configs| SB MH -->|Stores Passwords temporarily| RAM %% Injection RAM -.->|Injects ENV variables| DCC SB -.->|BLENDER_USER_RESOURCES override| DCC %% DCC connection DCC <-->|Commits/Updates Data| S %% Styling classDef cloud fill:#2c3e50,stroke:#fff,stroke-width:2px,color:#fff; classDef local fill:#34495e,stroke:#fff,stroke-width:2px,color:#fff; classDef hub fill:#e67e22,stroke:#fff,stroke-width:3px,color:#fff; classDef security fill:#e74c3c,stroke:#fff,stroke-width:2px,color:#fff; class K,N,S cloud; class SB,DCC local; class MH hub; class RAM security;

3. Key Pipeline Features

Macuare Hub - TD Project Builder Wizard
Technical Director view: Initializing a new project with specific DCC versions, mandatory extensions, and a custom Splash Screen.

4. Tools & Infrastructure Architecture

Category Technology Used
Language / UI Python 3.12, CustomTkinter (Artist-proof UI)
Production Tracking Kitsu (Gazu API for SSO and Role Validation)
Network / VCS SVN (Apache Subversion), Nextcloud, Git LFS
Core Architecture MVC Pattern, In-Memory Vault, Ephemeral Sandboxing
Distribution PyInstaller (Standalone frozen executable, no Python required for artists)

5. Code Architecture Snapshots

Snapshot 1: Enforcing Absolute Isolation (Sandbox)

Instead of extracting add-ons globally, the Hub builds an ephemeral environment. It hijacks the DCC’s resource paths before launching the subprocess, guaranteeing zero global footprint.

import os
import subprocess
from pathlib import Path

def lanzar_blender(project_root: Path, config_path: Path, svn_user: str, svn_pwd: str, kitsu_user: str, kitsu_pwd: str):
    # ... (Manifest parsing and binary validation omitted) ...

    env = os.environ.copy()
    env["MACUARE_PROJECT_CONFIG"] = str(config_path)
    
    # === ABSOLUTE ISOLATION (SANDBOX) ===
    # Force the DCC to use a local, project-specific folder for all configs and extensions
    sandbox_dir = project_root / "06_conf_LOCAL" / "blender_data"
    sandbox_dir.mkdir(parents=True, exist_ok=True)
    env["BLENDER_USER_RESOURCES"] = str(sandbox_dir)
    
    # Inject RAM-secured credentials
    env["MACUARE_SVN_USER"] = svn_user
    env["MACUARE_SVN_PASSWORD"] = svn_pwd
    env["KITSU_USER"] = kitsu_user
    env["KITSU_PWD"] = kitsu_pwd

    # Launch subprocess with the custom App Template
    cmd = [str(blender_bin), "--app-template", template_name]
    subprocess.Popen(cmd, env=env)

sequenceDiagram autonumber actor Artist participant UI as Macuare Hub GUI participant Vault as RAM Vault (Volatile) participant Core as Env Launcher participant DCC as Blender Artist->>UI: Clicks "Launch Project" UI->>Vault: Check SVN/Kitsu Credentials alt Vault is Empty Vault-->>UI: Missing Credentials UI->>Artist: Prompt JIT Login Modal Artist->>UI: Enters Passwords UI->>Vault: Store in RAM (No Disk IO) end UI->>Core: Trigger Thread (project_config.json) Core->>Vault: Retrieve Credentials Core->>Core: Inject Kitsu/SVN ENV variables Core->>Core: Override BLENDER_USER_RESOURCES Core->>DCC: subprocess.Popen() Note over DCC: DCC boots 100% isolated.
Init script reads ENVs
and auto-authenticates.

Snapshot 2: Just-In-Time (JIT) Credential Interception

To prevent saving passwords on disk, the UI components intercept the launch action. If the RAM Vault is empty, execution pauses, prompts the user, stores the keys in volatile memory, and resumes automatically via callbacks.

    def iniciar_proyecto_hilo(self, project_root: Path, config_path: Path):
        # === JIT INTERCEPTOR FOR SECURE LAUNCH ===
        if not self.vault.has_svn_credentials():
            SVNLoginWindow(
                parent=self.winfo_toplevel(),
                vault_manager=self.vault,
                on_success_callback=lambda: self.iniciar_proyecto_hilo(project_root, config_path)
            )
            return

        # Extract full credentials strictly from RAM
        svn_user, svn_pwd = self.vault.get_svn_credentials()
        kitsu_user, kitsu_pwd = self.vault.get_kitsu_credentials()

        threading.Thread(
            target=lanzar_blender, 
            args=(project_root, config_path, svn_user, svn_pwd, kitsu_user, kitsu_pwd), 
            daemon=True
        ).start()


6. Impact & Pipeline Metrics


← Back to Main Portfolio

Ernesto Del Valle Macuare Pipeline TD & Tools Developer
🔗 LinkedIn 🔗 GitHub 📧 edelvallemacuare@gmail.com