Every megabyte is a drop-off
A brand experience competes with a back button. Asset streaming, texture budgets and load ordering are commercial decisions before they are technical ones.
Technology lead for Digital Village (VLGE) across browser-delivered 3D brand experiences for global beauty brands. Unity development, Photon Fusion multiplayer, a real-time avatar pipeline, WebGL delivery, UX flow, performance optimisation and the technical foundations underneath all of it.
The brands belong to Digital Village’s clients rather than to us, so they are not named here. Two of the experiences are still live, and Digital Village publishes them openly — so you can open one in a browser tab and judge the engineering rather than take this page on trust.
Every decision on this kind of work traces back to one tension. The brand side wants skin that reads as skin, hair that moves, garments that drape, and an environment that looks like the campaign. The delivery side is a browser: no install, a download budget measured in seconds of patience, a memory ceiling you will hit, and a graphics API a generation behind what the art was authored for.
Technology leadership on a project like this is not choosing the most impressive technique. It is deciding where the budget goes — and, more often, where it does not.
A brand experience competes with a back button. Asset streaming, texture budgets and load ordering are commercial decisions before they are technical ones.
Browser 3D fails hard, not gracefully. Staying under the ceiling on mid-range devices constrains avatar counts, texture resolution and scene complexity from the first day of the build.
Faces and hair carry a beauty experience. Foliage, architecture and props do not. The wireframe above shows exactly where the triangles went.
A brand experience is judged on how it feels, but it stands or falls on a handful of infrastructure choices made early, when nobody is looking at it yet.
Generated digital human avatars with a dedicated hair system, so faces are produced by a pipeline with a controllable budget rather than hand-authored one at a time. That is what makes personalisation and variety affordable instead of a per-character cost.
A networked layer carrying avatar presence and identity through the world. A branded environment with nobody in it reads as a screensaver; other people in it reads as an event.
Responsive WebGL templating, proper text input handling from the browser into the engine, and an optimisation pass over the build. None of it shows up in a pitch deck. All of it decides whether the thing is usable on a phone.
Geospatial and AR toolkits were brought in alongside the browser work, so brand environments could extend to real-world placement rather than being locked to a screen.
Visitors gather things as they explore — roses, seeds, petals, cards — with the counts on screen. A branded space with nothing to do in it is a corridor; a small loop gives a reason to reach the second room.
On-screen movement and action controls in a portrait layout, rather than a desktop build rotated sideways. That decision constrains the camera, the UI scale and the environment scale, so it has to be made early.
A brand world has to hold three different jobs at once: a place worth walking through, people worth seeing, and a product moment that does not feel like an advert bolted onto a garden.



What this proves: browser-delivered brand 3D is an engineering discipline with a fixed budget, not a rendering problem. The projects that fail are usually the ones that treated the budget as a late optimisation task rather than the design constraint.
The visible half of this work is an environment with avatars in it. The half that decided whether it shipped was the architecture underneath: keeping twenty people in a room agreeing with one another, getting a photoreal avatar down to a budget a phone can hold, and giving a Unity client somewhere to save a world to.



Host and client architecture, NetworkRunner lifecycle, host migration, network object spawning, player and avatar synchronisation, and a chat system. Sessions were designed around roughly twenty concurrent users, with lobby capacity management and automatic scaling investigated beyond that. Desynchronisation between clients was its own debugging effort, and stress tests ran many avatars at once rather than two.
Photon pricing was analysed as part of the design: concurrent users against monthly actives, regional traffic, bandwidth overages and the expected cost at several thousand users. A multiplayer architecture that works technically and is unaffordable at scale has not been designed, only demonstrated.
The source characters were far too expensive for a mobile WebGL build, so the pipeline was specified rather than accepted: six base avatars, full-body humanoids with Mecanim-compatible skeletons and Mixamo-compatible animation, swappable hair and garments, FBX delivery with a Unity-ready hierarchy, and stated texture and polygon budgets. The targets settled around five to ten thousand triangles per character — roughly one to two thousand for the face, three to four for the body, one for hair and three to four for a garment — with albedo, normal, opacity and packed ambient-occlusion, roughness and metallic maps.
Baking every cosmetic option into every character multiplies the asset count until the build will not download. Makeup was specified instead as reusable masks and layers applied at runtime across any avatar, which turns an art pipeline into something that scales with the catalogue rather than with the catalogue times the cast.
The Garden Grower loop — buying seeds, planting, timed growth, rose rarity, harvesting, a petal currency, boosts, cosmetic unlocks, achievements, challenges, leaderboards and prestige — was specified to share a generic inventory and reward architecture. A good part of that work was arguing for less implementation rather than more: seeds, petals, roses, boosters and cosmetics are the same shape of thing and did not need five separate systems.
Alongside V-BLDR, the world-building product, the backend thinking moved from the existing GraphQL setup toward a plain Node.js REST API: authentication and token refresh, users, worlds and world state, assets and uploads, projects and sessions. That meant JWT handling, C# DTOs on the Unity side, file and image upload, error handling, API versioning, environment separation and AWS deployment with S3 storage behind a CDN — and asset bundles delivered the same way, with versioning, manifests, cache invalidation and a small initial payload.
The title on the engagement ended up as Technology Lead, and that is closer to the work than any description built around an engine. Most of it was decisions, specifications and the coordination between people who would otherwise have built incompatible halves of the same product.
The coordination ran between the Unity team, the backend developers, the 3D and art team, the specialist digital-human vendor, infrastructure, and product and management. The avatar budget above is a good example of why: it is simultaneously an art decision, an engine decision and a download decision, and it is only settled by someone holding all three.
Feature branches into dev as the working integration branch, then pull requests into staging and on into production, with the latter two protected from direct changes. Unglamorous, and the difference between a release you can reason about and one you cannot.
Technical interviews and assessment for Unity developers, backend developers and UI and UX candidates, deciding who progressed, and helping establish the engineering practices they would arrive into.
The interesting question is rarely whether it can be built. It is what has to be given up to make it load, and who decides. That is worth settling before the art is signed off, not after.