Latest Work I've done so far
UNDP Year Ahead
View ReportI led the development of UNDP's interactive annual report within the Terra team. Scroll-driven storytelling that brings global impact data to life.
Translating the complexity of global development into a narrative that anyone can scroll through and understand.
- Nuxt
- GSAP
- JavaScript
- SCSS
- Scroll Animations
Don't Choose Extinction
View CampaignAt Terra, I led the digital asset production for UNDP's global climate campaign featuring Frankie the dinosaur, voiced by Jack Black, urging world leaders to end fossil fuel subsidies.
A CGI dinosaur crashed the UN General Assembly to tell humans they're heading for extinction. And somehow it worked.
- Campaign Assets
- Motion Design
- Digital Production
- UNDP
ASCII Project
Try ItI always wanted to build something with camera detection on the web. P5.js is a creative coding library that often flies under the radar next to Three.js, and it gave me the perfect excuse. This project captures your webcam feed and renders it entirely in ASCII characters, in real time.
The core is surprisingly simple: P5's createCapture grabs the webcam feed, loadPixels exposes every pixel's RGBA values, and a loop maps each pixel's brightness to a character from a density string like ' .:-=+*#%@'. Brighter pixels get lighter characters, darker ones get denser glyphs. That's the entire illusion. The rest is polish: theme switching, color palettes, and a save-to-image feature.
Sometimes the most rewarding projects are the ones nobody asked for. Just an excuse to explore a technology and see how far you can push a simple idea.
- P5
- JavaScript
- SCSS
- Astro
Clock
See It LiveInspired by 'A Million Times' by Humans Since 1982, an art installation where hundreds of analog clocks form digits together. I saw one at Hotel Domine in Bilbao and couldn't stop thinking about building a web version. Two years and one abandoned repo later, I finally shipped it.
Each digit is a 3×6 grid of mini analog clocks. The hands rotate to specific angles that 'draw' each number: vertical lines, corners, terminators. GSAP staggers the entrance so each clock scales and rotates in from a random position. Behind it all, Three.js particles float and react to mouse movement.
I deliberately chose React and Vite for this one, stepping outside my usual Vue and Astro comfort zone. The trick that makes it work is surprisingly elegant: each clock hand is just a CSS rotation. A pattern map defines every digit as angle pairs. [90, 180] draws a corner, [0, 180] draws a vertical line. When the time changes, all 36 clocks per digit smoothly transition to their new angles simultaneously, and the number just appears.
- React
- Three.js
- GSAP
- Vite
Uruguay is Guay
I'm Uruguayan, and at some point I realized most people outside South America barely know Uruguay exists or they confuse it with Paraguay. So I built an interactive fact slideshow to change that. Each slide reveals something about the country, from having four cows per person to hosting the world's largest barbecue, with WebGL transitions and a form where anyone can submit new facts.
The slideshow runs on a custom animation engine. Each slide transition clips the outgoing image while the incoming one scales up underneath, with staggered character animations on the titles. Behind everything, a Three.js custom shader blends displacement noise between slide images with a chromatic color split that reacts to mouse movement, creating a living backdrop that shifts as you browse. One detail I'm proud of: the transition between slides uses Uruguay's coat of arms as a displacement map, so the image dissolves through the shape of the escudo before the next fact appears.
Building something personal about where you come from hits different. Every detail matters more when it's your own story you're telling.
- Three.js
- GSAP
- SCSS
- Astro
Netwrix
View ProjectAt Terra, I led the technical strategy behind Netwrix.com, rebuilding the platform of a global cybersecurity company with 15+ product lines.
The platform serves millions of users across 15+ product lines. It required a scalable architecture that balances performance with content flexibility. Every component was built for reuse across the entire ecosystem.
- Astro
- Sanity CMS
- JavaScript
- SCSS
- WebGL
- Node.js