OpenBrand: The Open-Source Engine That Reconstructs a Website’s Brand Identity

From logos and colors to typography and imagery, OpenBrand turns hostile, messy pages into structured brand assets for developers, designers, and AI agents.

7 min read • View on GitHub • More from ethanjyx

A cluttered workbench where a craftsperson assembles a brand identity from scattered clues: a favicon tin, a header-logo blueprint, a color wheel, a blocked browser window, and a fallback tunnel. The scene explains that OpenBrand reconstructs identity from weak signals instead of relying on one clean asset.
OpenBrand treats brand extraction like reconstruction work. When one path is blocked, it keeps gathering evidence until the profile is good enough to use.
Key Takeaways

A brand engine, not a logo scraper

OpenBrand is interesting because it refuses the simplest answer. A favicon, a logo, or a theme color is never treated as the whole truth. Instead, the engine collects clues, scores them, and builds a brand dossier from whatever survives the web’s usual defenses.

That matters because modern sites are messy. They hide assets behind hashed paths, serve thin markup to crawlers, and return 403s when a scraper looks too obvious. OpenBrand is built for that reality, not for the clean demo case.

Why the web keeps refusing to cooperate

The pipeline is less about fetching one asset and more about surviving enough failure modes to assemble a believable brand profile.

The hostile web shows up in a few predictable ways. Some pages block bots outright. Others expose only partial metadata, or bury the real logo in an SVG, a manifest, or a header element that a naive scraper never checks. OpenBrand assumes the first request may fail and designs around that assumption.

Why we built this: while building another product, we needed to pull in customers' brand images as custom backgrounds. It felt like a simple enough problem with no open source solution - so we built one.

hitchyhocker, Project Creator / Hacker News Submitter · Show HN: Open-source, extract any brand's logos, colors, and assets from a URL

How OpenBrand decides what is actually a logo

The clever part lives in the heuristic layer. In src/scraper.ts, OpenBrand does not just ask whether an image exists. It asks whether the image behaves like a logo. That means checking class-name hints, looking for header or footer placement, testing domain matches, and probing dimensions before deciding what gets promoted.

Three competing logo candidates are pinned to a scoring board: a square icon, a wordmark, and a noisy decorative image. Annotation lines point to the reasons they score differently, including placement, domain match, aspect ratio, and class-name hints. The image explains how OpenBrand ranks weak signals instead of trusting one obvious asset.
OpenBrand does not guess from one clue. It accumulates evidence, then chooses the candidate that best fits the website’s structure and geometry.
// The exact details vary by site, but the heuristic idea is simple:
// gather candidates, score them, then keep the best one.

const score = (candidate: Candidate) => {
  let total = 0
  if (candidate.inHeader) total += 3
  if (candidate.className?.includes('logo')) total += 4
  if (candidate.domainMatches) total += 2
  if (candidate.aspectRatio > 1.4) total += 1
  if (candidate.width >= 200) total += 1
  return total
}

const best = candidates.sort((a, b) => score(b) - score(a))[0]

That logic is the project’s real thesis. A brand is not a single asset. It is an inference problem, where weak signals become useful only when they agree with each other.

From URL to brand dossier

The public surface is straightforward. A normalized URL enters the API route, the extraction engine runs, results are cached, and the user gets a structured brand profile back. Underneath that, the system is doing more work than a one-off scraper ever could.

ApproachWhat it gets rightWhere it stops
OpenBrandOpen source, self-hostable, heuristic asset reconstructionDepends on messy web data and rules that must keep evolving
Brand.devManaged convenience and likely deeper black-box coverageClosed source, platform-controlled, less portable
Favicon-only lookupFast and trivialMisses the logo, colors, imagery, and most of the brand surface

That table is the real gap. A favicon-only approach is too shallow. A closed service may be convenient, but it keeps the brand layer inside someone else’s platform. OpenBrand sits in the middle: practical enough to use, open enough to own.

Why the MCP and npm versions matter

Hi everyone, I just open sourced OpenBrand - extract any brand's logos, colors, and assets from just a URL.

hitchyhocker, Project Creator / Hacker News Submitter · Show HN: Open-source, extract any brand's logos, colors, and assets from a URL

The dual identity is the point. As an npm package, OpenBrand can live inside a product’s backend with no platform dependency. As an MCP tool, it becomes directly useful to Claude Code, Cursor, and other agentic workflows that need brand context on demand.

That is more than convenience. It makes brand extraction behave like infrastructure. An agent can ask for a brand profile the same way it asks for a file or a schema. That changes where the tool sits in the stack.

Open source alternative, or infrastructure primitive?

DimensionOpenBrandBrand.dev / favicon-only
LicenseMIT, inspectable, modifiableProprietary or limited
DeploymentSelf-hostable or API-backedUsually hosted only
Integrationnpm package plus MCP serverPlatform-specific access
Data controlFits internal tooling and private workflowsData passes through a vendor boundary
Output depthLogo, colors, imagery, and brand nameOften narrower or opaque

OpenBrand is not trying to win on novelty. It is trying to make the brand layer portable. That is a sharper proposition than a scraper and a more durable one than a demo.

The bigger pattern is easy to miss. As AI tools spread across product, design, and support workflows, they need more than text. They need to recognize a company’s visual identity quickly and reliably. OpenBrand points toward a future where that capability is a utility layer, not a bespoke integration.