Desktop focused — arrow keys move, Enter opens, Escape closes a window or leaves.

Justin Schwaitzberg

Digital Media Artist & DeveloperBuffalo, NY

About

I approach Digital Media Arts from a technical angle. Whether that is simulation in Unreal Engine 5 or motion capture with Rokoko Vision, I like using new tools to find out where their limits actually are.

I taught myself Java at twelve and never really stopped programming, which is why I keep ending up at the point where the art and the pipeline meet.

I graduated summa cum laude from Canisius with a 4.0, researched motion capture for gait science through the Canisius Earning Excellence Program, and my post-production work has aired on BTPM PBS and other Western New York stations.

Skills

Real-time & 3D
Unreal Engine, Unity, Blender, Maya, Reallusion, Rokoko Vision
Post-production
Premiere, After Effects, Photoshop, Audition
Programming
Python, C, C++, Java, JavaScript, iOS, Android, AWS

Reel

Demo ReelPost-production, virtual production and motion graphics work. Streams at 854x480; the download is the 1920x1080 master.
Hype VideoA live sports hype video, edited for Buffalo Toronto Public Media. Streams at 854x480 and 60 fps; the download is the 1920x1080 master.

Selected work

Green Screen Keying

2025Compositor. After Effects, Premiere.

Placeholder — keying and spill suppression reel.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio praesent libero sed cursus ante dapibus diam.

Sed nisi nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum praesent mauris fusce nec tellus sed augue semper porta.

Mauris massa vestibulum lacinia arcu eget nulla class aptent taciti sociosqu ad litora torquent per conubia nostra.

Virtual Sets

2025Environment / Tech Art. Unreal Engine 5.

Placeholder — real-time virtual set construction.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio praesent libero sed cursus ante dapibus diam.

Sed nisi nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum praesent mauris fusce nec tellus sed augue semper porta.

Mauris massa vestibulum lacinia arcu eget nulla class aptent taciti sociosqu ad litora torquent per conubia nostra.

Motion Graphics

2024Animator. After Effects.

Placeholder — broadcast package and lower thirds.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio praesent libero sed cursus ante dapibus diam.

Sed nisi nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum praesent mauris fusce nec tellus sed augue semper porta.

Mauris massa vestibulum lacinia arcu eget nulla class aptent taciti sociosqu ad litora torquent per conubia nostra.

Motion Capture for Gait Science

2024Researcher. Rokoko Vision, Blender.

Placeholder — Canisius Earning Excellence research.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio praesent libero sed cursus ante dapibus diam.

Sed nisi nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum praesent mauris fusce nec tellus sed augue semper porta.

Mauris massa vestibulum lacinia arcu eget nulla class aptent taciti sociosqu ad litora torquent per conubia nostra.

Digital Signage System

2017Developer. Python, Raspberry Pi.

Placeholder — multi-location signage running on Pis.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio praesent libero sed cursus ante dapibus diam.

Sed nisi nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum praesent mauris fusce nec tellus sed augue semper porta.

Mauris massa vestibulum lacinia arcu eget nulla class aptent taciti sociosqu ad litora torquent per conubia nostra.

Department Web Platform

2017Developer. Django, React.

Placeholder — internal site, Django API and React front end.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio praesent libero sed cursus ante dapibus diam.

Sed nisi nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum praesent mauris fusce nec tellus sed augue semper porta.

Mauris massa vestibulum lacinia arcu eget nulla class aptent taciti sociosqu ad litora torquent per conubia nostra.

Experience

Adjunct ProfessorCanisius University

Current

Teach Game Character Design, built around Reallusion Character Creator and iClone, plus Blender and Unreal.

Production AssistantBuffalo Toronto Public Media

Current

Camera operation, technical directing, lighting and editing — podcasts, live sports recaps, hype videos.

Administrative TechnicianHorizon Health Services

2021–2022

Ran toxicology testing across five locations. Replaced five ad-hoc tracking systems with one standardised Excel workbook.

Temporary EmployeeIvoclar Vivadent (via AeroTek)

2020

SAP CRM and Excel work for a contact-list migration. Wrote a JavaScript tool to normalise pasted addresses.

InternUB Enterprise Application Systems

2018

Docker and Selenium batch testing across University at Buffalo sites.

Programming ContractorUB Department of Surgery

2017

Built an internal department site — Django backend serving a React front end. Also built digital signage software running on Raspberry Pis.

Teaching AssistantDigital Media Academy

2015

Taught beginner and intermediate programming to two age groups, and helped write curriculum materials.

Education

  • Canisius University, Buffalo, NY (2022–2025) — B.S. Digital Media Arts, minor Computer Science. GPA 4.0, summa cum laude.
  • Rensselaer Polytechnic Institute, Troy, NY (2016–2017)
  • Milton Academy, Milton, MA (2012–2016)

Awards and recognition

  • Academic Excellence in Digital Media Arts, Canisius University (2025) — Highest GPA in the graduating Digital Media Arts class.
  • Portfolio Award: Web Design, Canisius University (2025) — Awarded to one senior for work in web design.
  • Speaker, TEDxBeaconStreet, Cambridge, MA (2015)
  • Philanthropy, Alpha Tau Chapter, Pi Kappa Phi (2017–2018) — The Ability Experience — supporting people with disabilities.
  • Founder, Robotics Team, Milton Academy (2012) — Founding member and board member; competed in VEX tournaments.

What this site is built out of

The desktop above is drawn into a canvas, so the diagram in the “This Website” window is a picture. Here is the same thing as ordinary text: four stages, and the technologies in each.

SOURCEwritten and type-checked

TypeScript (strict)

The whole codebase, with no escape hatches.

No `any` anywhere — `unknown` and narrow instead. Every measurement in the 3D scene is a typed constant in one file, because the camera-to-screen ratio decides how many real pixels each virtual scanline gets, and that decides whether any of this is readable.

React (19.2)

The component tree, including the 3D one.

React Compiler lint is enforced, and two of its rules shape most of the scene code: a `useMemo` value may not be mutated, and `ref.current` may not be read during render. Shader uniforms are therefore created once and written through a material ref inside the frame loop.

Next.js (16.3, App Router)

Routing, bundling, and one canvas that never unmounts.

Chosen over Astro because a single WebGL canvas surviving navigation is a layout-level component here and an awkward one across islands. `dynamic(ssr: false)` keeps three.js out of the first bundle; the largest chunk is 199 KB gzipped.

Tailwind CSS (v4)

Only the page around the canvas.

The skip link, the accessibility mirror, the view toggle — the parts that have to be real DOM. Everything inside the monitor is drawn rather than styled, so Tailwind never touches it.

SHIPcompiled once, copied up

Turbopack

The bundler, in development and in the build.

Next 16's default. A cold production build of this project compiles in about half a second, which is most of why the edit-check-capture loop this site was built with is usable at all.

Static export (output: 'export')

No application server, and nothing to run per request.

Fifty-eight files: 3.2 MB of site, plus video that is only fetched if you open it. The scene is client-rendered and every word of content is compile-time data, so there is nothing for a server to do — no Node process, no systemd unit, no proxy hop.

AWS EC2 (Ubuntu)

One small Linux instance, configured by hand.

The virtual-host files live in `deploy/` and are deliberately split in two, port 80 and TLS. One file deadlocks first-time setup: Apache will not start while a config names a certificate certbot has not issued, and certbot needs a running server to answer its challenge.

Apache2 (TLS via Certbot)

Serves the files, and nothing else.

Immutable caching on the hashed assets, and a `default-src 'self'` content security policy with no third-party exceptions at all. There is no analytics, and the fonts are self-hosted, so nothing on the page reaches for another origin.

SCENEruns on your GPU, every frame

three.js (r185)

The cubicle, the desk and the monitor.

Built entirely from primitives — no purchased models, no HDRI, no texture packs. The bezel is a single extruded shape with a hole in it rather than four rails, because rails z-fight where they overlap at the corners and read as four slabs instead of one moulding.

R3F (@react-three/fiber 9.7)

three.js expressed as a React tree.

Taken over vanilla three.js for lifecycle management on a scene with this many interacting parts; a raw `THREE` object still drops into the tree unchanged. The pointer rig runs at frame priority -1, so everything derived from the pointer is current before anything reads it.

WebGL2

The rendering context, and a deliberate one.

WebGPU was considered and deferred: `pmndrs/postprocessing` is not fully ported and several effects need TSL rewrites, and bloom and halation are load-bearing here. Adaptive resolution is floored per quality tier, because resolution is the last thing this scene should trade.

GLSL (hand-written)

The glass: one program, run per pixel per frame.

Barrel distortion, 240 scanline bands, an aperture-grille mask, halation, vignette, grain and a slow flicker. No derivative functions: three r185 is WebGL2-only and dropped the mechanism that emitted the pragma, so the anti-aliasing guard is computed on the CPU and passed in.

SCREENruns on your CPU, only on change

Canvas 2D (→ CanvasTexture)

The desktop is a texture, not a DOM overlay.

The entire OS is drawn into an offscreen canvas and mapped onto the screen mesh. It works because the virtual mouse already mediates interaction — the hit-testing is ours either way — so leaving the DOM costs nothing and buys a real shader over live UI.

zustand (5.x)

Low-frequency state, and only that.

Quality tier, ready flag, reduced motion. Pointer state is pointedly not in here: it changes at pointer frequency, so it lives in a plain mutable module object written by native listeners and read inside the frame loop. A React render per mouse move would be absurd.

GSAP (3.15)

The camera moves.

The transition that finds a phone in your hand and goes into its screen. Its descent follows a quadratic Bézier arced back from the desk, because a straight line from a camera already close to the glass reads as the monitor being yanked out of frame.

Silkscreen (8px)

The bitmap face everything here is set in.

Self-hosted through `next/font`, which hashes the family name — so the canvas reads the real one out of a CSS variable rather than naming it and silently falling back. Every line on the grey is bold: measured through the shader, 8px regular is 3.5:1 and bold is 5.3:1.

Contact