Back to portfolio

Unified 3D model manager

How a small, art-heavy team moved off ad-hoc folders into a single pipeline: validation, versioning, map placement, Blender handoff, QA at release scale, and safe paths from staging to production tilesets.

3D building model review page with map preview
Model review: building in map context with the same preview stack we use for production-shaped assets.

Context

When the team is small and you iterate quickly with engineers, lightweight sharing is enough: corporate drives, Dropbox-style tools, whatever gets GLBs from A to B. A purpose-built 3D content system sounds right on paper, but it implies IT integration, dedicated support, and industry-grade ops before you even know whether the product bet pays off.

We did not start there. We started with S3 and a direction everyone could agree on: iterations had to stay artist-friendly, we had to see models in context, and uploads had to fit the same processing path the map actually uses - not a random preview mesh.

Early browser preview of a 3D building on the map
One of the first 3D building renders in the web preview - long before the pipeline had releases, QA lanes, and the rest of the manager surface.

First wedge: upload, validate, ship to the map

The first version was intentionally simple: a web UI on top of S3 to upload a model and preview it. In the beginning, review and validation were mostly manual - humans in the loop before anything reached processing. As the pipeline matured, we added automated checks in the same surface so only assets that pass the bar move into the internal processing path, through existing internal tools, and into tilesets - optimized, production-shaped geometry on the basemap without a parallel “fake” pipeline.

Early on, success meant “upload, inspect, pull back from object storage if needed.” As model count and headcount grew (the 3D org moved toward dozens of people), it was obvious we needed storage and workflows at scale, not a bigger spreadsheet.

Table of 3D building models with metadata in the internal tool
One list for the fleet: model metadata and status without opening drive folders.

Inventory

The web surface became the system of record for what exists, what passed checks, and what belongs to which release - before anyone opens Blender or a ticket.

Constraints we owned deliberately

The company has patterns like Git LFS for large binaries in Git workflows. We did not put this pipeline on that stack. We stayed on S3 as the store and grew the web app and integrations around it - checks, versioning handoff, Jira, production paths - without asking artists to treat the map pipeline like a generic Git repo.

We also chose not to build a full-blown internal “project management product” for every model status. Roadmap and conversation already lived in company-standard channels; we did not want a walled garden that isolated our artists and managers from the rest of the org. The bet was to plug into that ecosystem - concretely via Jira for release-scoped work - while owning the pieces only we could: map integration, validation, and deploy mechanics.

Hardening the core

We invested in validation that tightened over time - from manual gates to automated server-side checks - plus versioning, how models attach to the map, and ways to verify them end to end. Those foundations mattered long before the UI looked “enterprise.”

Web uploader showing automated validation results and errors for a 3D model
Auto-validation in the web tool: structured checks and clear failures before an asset enters processing or tilesets.

General availability and production releases

As the program approached general availability, “it works in a demo” stopped being enough. We needed a release workflow for production tilesets: dependencies, sign-offs, and coordination with other teams - so pushing buildings live stayed predictable and safe, not a heroic manual transfer.

After the bureaucratic and technical prerequisites were in place, we designed the release path from staging-style environments into production tilesets. That turned an ad-hoc upload tool into something operators could trust.

Figma prototype of the main map view screen with navigation, 3D model controls, and style selectors
Figma prototype of the main screen once the foundation was solid: map view, color controls, style selectors, and dev tools. We adopted an existing component library to keep development fast and the interface consistent.

Blender: fewer handoffs, fewer surprises

Manual export-and-upload loops lose information. We extended an existing Blender validation add-on that already encoded our slightly non-standard pipeline rules, then layered direct upload into cloud storage so artists could send approved work straight into the same funnel the web tool consumed.

Checks run in the add-on and again on the receiving service - defense in depth for a pipeline where a silent mismatch is expensive.

QA and Jira at release scale

Automation catches a lot; it does not catch everything. As throughput grew, we brought in QA reviewers who could apply a checklist and a second pair of eyes - especially for issues our detectors still miss.

We shipped a QA-facing interface: move between models in a release, upload and download where needed, and open work for artists when something fails review.

Releases in Jira sync with releases in the tooling, so we always see which models belong to which train, whether content is ahead or behind the release, and what still blocks ship. That visibility replaced tribal knowledge in chat threads.

What the platform became

What began as “upload and validate” grew into a coordinated building-tools surface - a few major capabilities working together:

  • Placement and intake. Lists of candidate locations (from internal ranking and data work) flow into locations in the tool. Work ties to Jira so tasks land with the right 3D teams and leads can balance load across two artist groups.
  • Preview and upload. Models pass through local preprocessing so previews match what the map will render - both in Mapbox GL JS and native clients we care about.
  • Icons. Pipelines generate snapshots from 3D so artists can tune icons and priorities; a building can carry the right iconography for its zoom and importance tier.
  • Release management. Review what is in a release and promote assets across environments - development, staging, pre-production, production - so demos and hardening happen without mixing unrelated states.
  • Debug. Shared style foundations let us inspect locations, compare sources, and forward findings into Jira when something breaks in the wild.
UX flow diagram showing the full 3D model lifecycle: upload, review, QA, staging, and production deployment across user roles
UX flow for the 3D model lifecycle: from upload through review, QA, and role-based staging to production deployment - the map of decisions and handoffs the tool had to support.
Landmark icon review editor with 3D building snapshots
Landmark icons: review and tune snapshots so map icons match building priority and zoom behavior.

Review modes

Beyond static preview, we added ways to stress-test readability: lighting presets, color overrides for materials and logical parts, split view with Jira context while orbiting a landmark, fast model-to-model review, and compare mode after search - so QA and art can stay in one surface end to end.

Who uses it

Today the stack is not “just for 3D.” Alongside artists, leads, managers, and QA, rendering engineers, map designers tuning styles, motion designers, and other designers contributing to the product use the same previews and workflows - one place to reason about how 3D reads on the map.

Outcome

We traded chaotic folders for a single system of record on S3 with a web front end, Jira-aligned releases, and automated checks where we used to rely on manual review alone. Environment-aware releases and Blender integration reduced broken or mismatched uploads; Jira-linked releases gave everyone a shared picture of what ships when. The product kept pace as requirements, technical bars, and team size all grew - without turning the team into a separate island from the rest of the company.