Files
zeekayandHanzo Dev 5efb05f698 Ship the real Hanzo mark, and stop the page scrolling sideways
The favicon was a white heart. Not a stylised Hanzo mark -- an unrelated
heart glyph, 1150 bytes, 16x16, sitting at /favicon.ico on every origin.
Beside it /favicon.svg drew a three-block descending staircase with a
single hardcoded fill="white", so on a light tab strip it rendered as
nothing at all. And /og-image.png was not an image: 119 bytes of ASCII
reading "This is a placeholder for the PNG file", which is what every
link preview of this site has been sharing.

All three now come from @hanzo/logo, byte-for-byte, no redrawing:

  favicon.svg        the 67x67 block-H, five paths, carrying its own
                     prefers-color-scheme rule -- identical bytes to
                     what hanzo.ai serves today
  favicon.ico        six sizes, white mark on an opaque black tile.
                     Opaque on purpose: a transparent black mark
                     disappears against a dark tab strip, and ICO has
                     no media queries to save it
  og-image.png       the real 1200x630 card
  apple-touch-icon   180x180, previously missing entirely

og:image is now absolute, because scrapers do not resolve relative ones.

The sideways scroll was not the marquee. That was the obvious suspect --
an 11166px logo strip -- but its parent is overflow-hidden and it clips
correctly. Measuring every box against clientWidth and discarding any
with a clipping ancestor left exactly one culprit: a decorative blur at
-right-20 in the hero, which float-and-pulse scales to 1.5x and pushes
to x=1492 in a 1280 viewport. It is display:none below sm, which is why
390px always measured clean and 1280px did not. Clipped at the hero
root with overflow-x-clip rather than -hidden, so it does not become a
scroll container and break sticky positioning.

Two more things measurement turned up that the eye would not:

The marquee had its animation declared twice -- 0 to -25% in Hero.css
next to the markup, and 0 to -100% in index.css. index.css won the
cascade, so the whole 4x-repeated strip travelled fully off screen and
the client row sat blank for the tail of every 80s cycle. One home now.

Thirteen carousel images had spaces in their filenames, two with a
trailing space before the extension. They 404 on the Sites plane while
working on the apex, which was blocking the cutover. Renamed to
kebab-case, references rewritten. Filenames with spaces in URLs are a
defect on their own.

Also: the legal entity read "Hanzo Industries, Inc." in four places
where the estate is "Hanzo AI, Inc.", and the Contact page was still
carrying scaffold contact details -- a personal gmail address, a
Singapore phone number and a different street address than the footer.
Both surfaces now read from src/data/contact.ts so they cannot drift
again. Three testimonial cards on /services pointed at logo files that
have never existed in this repo; the <img> tags are gone, the copy is
untouched, and no logo was invented to fill the hole.

package.json was still "vite_react_shadcn_ts" at 0.0.0 -- the untouched
scaffold project name. Now hanzo-agency at 0.1.4, following the 0.1.3
that shipped as an image. The scaffold's "Image Not Available" placeholder
and a 13KB debug page that was serving publicly are gone too.

Verified in Chromium at 390 and 1280 across seven routes: zero broken
images, zero 404s, zero page errors, and documentElement.scrollWidth
equal to clientWidth on every sample.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-05 16:09:49 -07:00

6.2 KiB