root@construct:~/projects/nike$
<-- back to /projects

Nike Asset Library and AutoCrop

Marketing technology for Nike's global campaigns

ReactTypeScriptPythonAWS Step FunctionsEventBridgeDynamoDB

>Context

From September 2024 to August 2026 I was a Senior Software Engineer in Marketing Technology at Nike, on contract. The job was to give Nike's marketing and creative teams around the world the tools to store, find, prepare and publish campaign assets. These systems serve hundreds of campaigns.

I built the Asset Library as sole engineer. It powers discovery and distribution across more than 16 million digital assets, and asset discoverability rose 461% with it.

I also built AutoCrop, a GenAI service that generates image crops for each media format. Preparing a campaign deliverable went from 6.4 hours to 3.6 hours per designer. And I automated asset generation from Figma auto-layout, with correct typography in every format.

I led front end for two Marketing Technology squads and owned the React/TypeScript app they shared: its architecture, UI patterns and code review standards.

>High-level design

This was contract work, so I describe it by role, without internal names. Nike's marketing and creative teams use three fronts: the Asset Library, where they find and distribute more than 16 million digital assets; the React and Next.js dashboards, where they manage more than 5 million images a week; and AutoCrop, a GenAI service that generates the image crops for each media format.

On AWS, assets come in through an event-driven workflow built on Step Functions, EventBridge, DynamoDB and WebSockets. Ingestion runs in several steps, including enrichment, and each step is idempotent, with retries and failure recovery: under the load of global campaigns, a step that stopped halfway can run again without breaking anything. Asset generation takes a separate path: a converter pulls auto-layout templates through the Figma API, turns them into an internal model used from ingestion to final render, and a flattening service produces the output for each format.

The GenAI asset pipeline I led is written in TypeScript/Node and Python. CI runs on an Nx monorepo: with task-graph caching and incremental builds, build minutes dropped 92%.

Hover or focus a piece: it lights up with its links.
who uses itAWSexternal services2 Asset Library1 Marketing & creative3 Management dashboards5 Final render7 Step-based ingestion4 AutoCrop11 Generative model6 Figma converter9 Event bus12 Figma8 Real-time channel10 Workflow data
12 pieces9 links4 areas

Components

  • Asset Library :: I built it as sole engineer: it is where teams find and distribute more than 16 million digital assets.
  • Management dashboards :: React and Next.js dashboards marketers use to manage more than 5 million images a week.
  • AutoCrop :: GenAI service that generates the image crops for each media format and takes manual cropping off designers.
  • Ingestion workflow :: Event-driven workflow on AWS (Step Functions, EventBridge, DynamoDB, WebSockets), in several steps with enrichment, each idempotent, with retries and failure recovery.
  • Figma converter :: Pulls auto-layout templates through the Figma API and turns them into the internal model used from ingestion to final render.
  • Final render :: Flattening service that produces the final output for each format (editorial, website, campaign, header) with correct typography.
  • Monorepo and CI :: Nx monorepo with task-graph caching and incremental builds, which cut CI build minutes 92%.

>Trade-offs

Every ingestion step is idempotent, with retries and failure recovery.

Alternative rejected: Steps that run once and count on nothing failing halfway.

Why: In an event-driven system any step can run twice. Under the load of global campaigns, a step that stopped halfway has to be safe to run again.

One internal model, converted from Figma auto-layout and used from ingestion to final render.

Alternative rejected: Building each format of an asset from the Figma file, one at a time.

Why: With a single model, the system generates every format variation (editorial, website, campaign, header) with correct typography.

Task-graph caching and incremental builds in the Nx monorepo.

Alternative rejected: A full monorepo build on every change.

Why: It cut CI build minutes 92%.

>Highlights

  • >16M+ digital assets in the Asset Library, which I built as sole engineer
  • >Asset discoverability up 461% with the Asset Library
  • >Designers' prep time down 44% with AutoCrop: 6.4h to 3.6h per campaign deliverable
  • >Time to produce campaign art down 80%, with the GenAI asset pipeline I led
  • >React/Next.js dashboards to manage 5M+ images a week
  • >CI build minutes down 92% on the Nx monorepo
Nike Asset Library and AutoCrop | The Broad Way | Kinho.dev