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/— viaasset()inbuild_banner_concept.py. Never hard-code the mirror alone. - Outputs are written inside this bundle:
assets/generated/banners/(banners) andassets/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; usebrand_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 (bundlecorp-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.pyreads the alias fromBRAND_IMAGE_MODEL(defaultNostics_Image). CheckGET http://litellm:4000/v1/modelsbefore relying on it — the oldgemini-3.1-flash-imagealias was retired (2026-10-15). If no image alias works, reuse an existing image fromassets/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.