Gayanuka Bulegoda / Portfolio

Explore

Book a call Request CV / Resume

Based in Sri Lanka Working worldwide

grbulegoda@gmail.com

Case study · Freelance · Collaborative product

Shrink Model

Smaller assets. A clear view of what changed.

ROLE: Project lead · Team & delivery managementTIMELINE: Jan to Aug 2026STATUS: Live product

Overview

The project at a glance

A collaborative GLB optimisation product I led and managed, connecting configurable compression, visual comparison, and temporary-file cleanup in one web workflow.

Maximum supported GLB upload
500 MB
Draco and Meshopt geometry compression
2 codecs
Original and output with synchronised cameras
Side by side
Scope & contribution

Shrink Model helps creators optimise GLB assets and inspect the result before using it. I led and managed the collaborative team across a Next.js web application, a NestJS compression API, and an interactive comparison viewer. The product brings upload, settings, validation, preview, and download into a single workflow, with completed models kept in the browser and temporary server files cleaned up after processing.

Technology stackApplication · Processing · Preview & storage · Data & delivery

Application

  • Next.js
  • TypeScript
  • Zustand

Processing

  • NestJS
  • glTF-Transform
  • Draco
  • Meshopt
  • Sharp

Preview & storage

  • Babylon.js
  • IndexedDB

Data & delivery

  • PostgreSQL
  • Prisma
  • Redis
  • Docker
  • GitHub Actions

The story

Decisions behind the delivery

01Make the trade-off visibleProduct direction

A smaller file is only useful if the asset still looks and behaves as intended. I led the team around that practical requirement: give creators control over compression, then let them compare the original and the result. The scope joined the interface, processing service, authentication, and viewer into one product rather than treating compression as an isolated operation.

02Adjustable settings, validated outputProcessing

The API accepts self-contained GLB 2.0 files up to 500 MB. The pipeline cleans the document with glTF-Transform, applies Draco or Meshopt geometry compression, and optionally optimises textures with Sharp. Presets offer a starting point while individual settings remain adjustable. Output checks cover the container, surviving meshes and scenes, finite accessor values, and requested compression extensions before the result is delivered.

03Inspect the result in contextInteraction

The Babylon.js viewer compares the original and compressed assets with synchronised cameras, with orbit controls, animation playback, and desktop first-person exploration. The viewer loads when a preview is needed. IndexedDB preserves completed files across reloads, and the sign-in flow restores a pending upload so authentication does not discard the creator's work.

04Design the whole file lifecycleDelivery

The Next.js application and NestJS API deploy independently through Docker and GitHub Actions. The API streams the result and cleans up temporary input and output files when the request settles, with an orphan sweep for interrupted processes. PostgreSQL supports account data; the product does not maintain a permanent model library on the server. This connected delivery was a team effort under my project leadership and management.

Next case studySLA Sentinel

Overview

Shrink Model helps creators optimise GLB assets and inspect the result before using it. I led and managed the collaborative team across a Next.js web application, a NestJS compression API, and an interactive comparison viewer. The product brings upload, settings, validation, preview, and download into a single workflow, with completed models kept in the browser and temporary server files cleaned up after processing.

Maximum supported GLB upload
500 MB
Draco and Meshopt geometry compression
2 codecs
Original and output with synchronised cameras
Side by side

01 · Product direction

Make the trade-off visible

A smaller file is only useful if the asset still looks and behaves as intended. I led the team around that practical requirement: give creators control over compression, then let them compare the original and the result. The scope joined the interface, processing service, authentication, and viewer into one product rather than treating compression as an isolated operation.

02 · Processing

Adjustable settings, validated output

The API accepts self-contained GLB 2.0 files up to 500 MB. The pipeline cleans the document with glTF-Transform, applies Draco or Meshopt geometry compression, and optionally optimises textures with Sharp. Presets offer a starting point while individual settings remain adjustable. Output checks cover the container, surviving meshes and scenes, finite accessor values, and requested compression extensions before the result is delivered.

03 · Interaction

Inspect the result in context

The Babylon.js viewer compares the original and compressed assets with synchronised cameras, with orbit controls, animation playback, and desktop first-person exploration. The viewer loads when a preview is needed. IndexedDB preserves completed files across reloads, and the sign-in flow restores a pending upload so authentication does not discard the creator's work.

04 · Delivery

Design the whole file lifecycle

The Next.js application and NestJS API deploy independently through Docker and GitHub Actions. The API streams the result and cleans up temporary input and output files when the request settles, with an orphan sweep for interrupted processes. PostgreSQL supports account data; the product does not maintain a permanent model library on the server. This connected delivery was a team effort under my project leadership and management.

Next case study

SLA Sentinel