Case study · Freelance · Collaborative product
Shrink Model
Smaller assets. A clear view of what changed.
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 stack
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 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.
02Adjustable 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.
03Inspect 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.
04Design 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.
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