Skip to content

Brand Kit Scripts

Automation that generates brand assets. Run everything with /opt/hermes/.venv/bin/python (PIL is in that venv).

Script Purpose Usage
build_banner_concept.py Regenerates the no-text post banner frame in all three sizes (concepts + demos). Run with no arguments. /opt/hermes/.venv/bin/python build_banner_concept.py
compose_article_banner.py One-off banner: brand frame + your image in the well. compose_article_banner.py <well_image> <output.png> [landscape\|square\|portrait]
generate_ai_image.py Generates a suburb/lifestyle image for the well via the LiteLLM image model. generate_ai_image.py "<prompt>" <4:5\|1:1\|16:9\|9:16> <output.png>

Paths (rewired 2026-10-26)

  • Assets resolve to the canonical in-bundle copies first (X.Resources/MeridianRealty/), falling back to the host mirror /opt/data/brand-kit/ — via asset() in build_banner_concept.py. Never hard-code the mirror alone.
  • Outputs are written inside this bundle: assets/generated/banners/ (banners) and assets/generated/ai-images/ (AI images). Nothing generated goes to the asset store or the repo root.
  • Fonts: brand_font(weight, size) loads Helvetica Neue LT Std from /opt/data/fonts/meridian/ (black / bold / roman / kindness), falling back to Liberation Sans with a warning if the brand font is absent. The banner frame itself is text-free; use brand_font() for any text you add, and remember the host install currently holds only 55 Roman / 75 Bold / 95 Black / Kindness Things — 45 Light, 46 Light Italic and Buffalo arrived on 2026-10-26 (bundle corp-identity/Fonts/) and are not installed yet, and the condensed weights and Addington CF are still not on file.
  • AI image model: generate_ai_image.py reads the alias from BRAND_IMAGE_MODEL (default Nostics_Image). Check GET http://litellm:4000/v1/models before relying on it — the old gemini-3.1-flash-image alias was retired (2026-10-15). If no image alias works, reuse an existing image from assets/generated/ai-images/ rather than stalling a post.

Verification habit

After regenerating, pixel-check the output before shipping: band 32,52,98, accent line 248,165,56, well no longer the placeholder tint 232,235,242. Then look at the image itself — pixel checks pass on a tone-on-tone logo or a stretched face crop.