Files
studio/branding/make_favicon.py
T
hanzo-dev 1ff6280992 Rebrand fork to Hanzo Studio: licensing, branding, Engine nodes, fashion workflows
Licensing (GPL-3.0 preserved):
- NOTICE attributes the ComfyUI upstream and the fork's modifications, GPL-3.0.
- README credits upstream ComfyUI prominently and states GPL-3.0.

Branding (frontend served from the comfyui-frontend-package static dir):
- apply-branding.sh installs the Hanzo favicon (svg + multi-res ico), injects
  icon links, sets <title>Hanzo Studio</title>, and patches display strings.
- make_favicon.py renders the committed favicon.ico from favicon.svg.

Hanzo Engine nodes (custom_nodes/hanzo_engine/, OpenAI-compatible HTTP):
- HanzoChat, HanzoImageGen, HanzoVisionCaption, HanzoSaveText. Graceful node
  errors on connection failure.

Fashion/swimwear starter workflows (user/default/workflows/fashion/):
- fashion_product_shot (FLUX.2 klein t2i), fashion_edit_garment
  (Qwen-Image-Edit i2i), fashion_caption_dataset (Hanzo vision caption loop).
  Each carries a Note node with usage and required files.
2026-07-02 23:17:57 -07:00

44 lines
1.3 KiB
Python

#!/usr/bin/env python3
"""Render branding/favicon.svg to a multi-resolution favicon.ico.
Source of truth is favicon.svg (the Hanzo mark). The .ico is a committed build
artifact so that apply-branding.sh can install it without needing a rasterizer
in the Docker image. Re-run this whenever favicon.svg changes:
rsvg-convert must be on PATH (librsvg2-bin); Pillow provides ICO packing.
python3 branding/make_favicon.py
"""
import os
import subprocess
import tempfile
from PIL import Image
HERE = os.path.dirname(os.path.abspath(__file__))
SVG = os.path.join(HERE, "favicon.svg")
ICO = os.path.join(HERE, "favicon.ico")
SIZES = [16, 32, 48, 64, 128, 256]
def render_png(size: int, path: str) -> None:
subprocess.run(
["rsvg-convert", "-w", str(size), "-h", str(size), SVG, "-o", path],
check=True,
)
def main() -> None:
with tempfile.TemporaryDirectory() as tmp:
frames = []
for size in SIZES:
png = os.path.join(tmp, f"favicon-{size}.png")
render_png(size, png)
frames.append(Image.open(png).convert("RGBA"))
base = frames[-1]
base.save(ICO, format="ICO", sizes=[(s, s) for s in SIZES])
print(f"Wrote {ICO} ({os.path.getsize(ICO)} bytes) sizes={SIZES}")
if __name__ == "__main__":
main()