One Brand CDN, Many Independent Sites

By Daniel Ensminger

Week of published 3 min read

Centralizing x70’s identity assets removed a quiet source of drift across the ecosystem, while leaving each product free to keep its own layout, copy, and release cycle.

By early June, x70 had enough separate websites that the same logo existed in several repositories under several filenames.

That works until one asset changes. Then the brand update becomes a scavenger hunt: find every copy, remember which one is intended for a light background, update every favicon, and hope an old avatar does not survive in a forgotten footer.

I moved the shared identity assets to design.x70.one and gave the other projects a small typed asset module. It is not a broad design system runtime. It is a deliberately narrow source of truth for the pieces that are supposed to be identical.

Name assets by their purpose

Files called logo-final-4.png make sense only to the person who exported them. Consumers need semantic names.

The shared module exposes concepts such as:

  • the ecosystem icon;
  • the company header mark for a light background;
  • the company header mark for a dark background;
  • wide transparent marks for each appearance;
  • master, header-size, and small personal avatars.

That vocabulary moves the decision out of every component. A header asks for the mark designed for its background instead of importing a mystery file and trying dark:invert until it looks acceptable.

The distinction matters because inversion is not the same thing as an intentional light or dark asset. Transparent edges, antialiasing, and internal tones can all behave differently. Serving the correct source also avoids a theme-change flash where the browser briefly shows the wrong treatment.

Centralize identity, not product design

A shared CDN can become a temptation to make every sibling site look identical. That would solve drift by erasing the reason the products are separate.

The boundary I kept is:

  • logos, icons, avatars, and ecosystem identity are shared;
  • typography tokens and broad brand guidance can be documented centrally;
  • page hierarchy, interaction design, product terminology, screenshots, and release decisions stay inside each repository.

The Portfolio should not inherit the Admin dashboard’s layout. Social should not become a recolored agency landing page. Skirack needs a product narrative that a link directory does not.

Consistency is strongest when it applies to the elements users reasonably expect to be the same.

A URL is still a dependency

Moving an image out of a repository does not make it free.

Every consuming Next.js project has to allow the remote host. The CDN needs stable paths, correct caching, and backwards-compatible changes. An outage can remove the brand from several sites at once. A destructive replacement can make an old deployment look different without changing its commit.

Those are real trade-offs. The shared asset surface stays small partly to keep that dependency understandable. Product media remains local to the project that owns it, where the image and the copy can be reviewed together.

For identity assets, the central dependency is worth it. A logo correction can reach the ecosystem without producing a dozen almost-identical binary commits.

Theme-aware markup should be boring

The consuming component renders the light-background and dark-background versions explicitly, then lets CSS show the correct one. Width and height are declared, the image keeps its aspect ratio, and the asset is loaded from the same host in every repository.

There is no runtime color analysis and no client-side theme callback required. That simplicity matters for a header because the brand is often visible before the rest of the page is interactive.

The result is operational clarity

The largest benefit was not visual. It was knowing where to look.

When a standard x70 logo or avatar is wrong, the Design site owns the source. When a product screenshot is wrong, the product repository owns it. When the spacing around the mark is wrong, the consuming component owns the layout.

That is a small architecture, but it removes a surprising amount of ambiguity: one identity source, many independently designed products.

👍
❤️
🔥
👏
🤯

Get infrequent updates on new projects.

By subscribing you consent to email updates. You can unsubscribe anytime. See our Privacy Policy.