commit 648fb030502e70cdca36380fb1fa21fe2f1c2afc Author: jedarden Date: Fri May 22 07:36:31 2026 -0400 Brand kit: logo, hero, and per-platform social assets Canonical sources (source/logo.png, source/hero.png) plus generated profile pictures and banners sized for every major platform, favicons, logo masters, and a reproducible build script (tools/build_assets.py). Co-Authored-By: Claude Opus 4.7 (1M context) diff --git a/README.md b/README.md new file mode 100644 index 0000000..301222f --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +# Jed Arden — Brand Kit + +Canonical logo, hero image, and ready-to-upload social assets for every major +platform. Everything here is generated from two source files so the brand stays +consistent wherever it appears. + +| | Source | Style | +|---|---|---| +| **Logo** | `source/logo.png` | Flat cartoon avatar — red polo, used for all **profile pictures** | +| **Hero** | `source/hero.png` | Photoreal triple-monitor desk scene — red polo, used for all **banners / covers** | + +> The logo (flat illustration) and the hero (photoreal render) are intentionally +> kept as separate assets rather than composited together — mixing the two styles +> in one frame reads as amateurish. Each platform therefore gets a logo-based +> profile picture **and** a hero-based banner. + +## Per-platform assets + +Drop these straight into each platform's upload dialog — they're already at the +exact required pixel dimensions. + +| Platform | Profile picture | Banner / cover | +|---|---|---| +| X / Twitter | `avatars/x-400.png` (400×400) | `banners/x-header-1500x500.png` (1500×500) | +| LinkedIn (personal) | `avatars/linkedin-400.png` (400×400) | `banners/linkedin-personal-1584x396.png` (1584×396) | +| LinkedIn (company) | `avatars/linkedin-400.png` | `banners/linkedin-company-1128x191.png` (1128×191) | +| GitHub | `avatars/github-460.png` (460×460) | `banners/github-social-1280x640.png` (1280×640, repo social preview) | +| Instagram | `avatars/instagram-320.png` (320×320) | — (no banner) | +| Threads | `avatars/threads-320.png` (320×320) | — | +| Facebook | `avatars/facebook-320.png` (320×320) | `banners/facebook-cover-851x315.png` (851×315) · 2× `…-2x-1702x630.png` | +| YouTube | `avatars/youtube-800.png` (800×800) | `banners/youtube-banner-2560x1440.png` (2560×1440, TV-safe) | +| TikTok | `avatars/tiktok-200.png` (200×200) | — | +| Mastodon | `avatars/mastodon-400.png` (400×400) | use `banners/open-graph-1200x630.png` | +| Bluesky | `avatars/bluesky-400.png` (400×400) | use `banners/twitter-card-1200x628.png` | +| Discord | `avatars/discord-512.png` (512×512) | `banners/discord-banner-960x540.png` (960×540) | +| Web / Open Graph | `favicon/` set | `banners/open-graph-1200x630.png` (1200×630) · `banners/twitter-card-1200x628.png` | + +### Favicons (`favicon/`) + +`favicon.ico` (multi-res 16–256), `favicon-16/32/48/192/512.png`, +`apple-touch-icon-180.png`. + +### Logo masters (`logo/`) + +`logo-original.png` (640²) plus `logo-256/512/1024.png` and the source JPG. +Use these when a platform isn't listed above or you need a custom size. + +## Palette + +| Name | Hex | Use | +|---|---|---| +| Polo Red | `#DC3127` | Primary brand color — accents, links, highlights | +| Ink | `#0A0A08` | Outlines, text on light surfaces | +| Canvas Cream | `#EFDECC` | Logo background, light surfaces | +| Skin Tan | `#F5B079` | Illustration only | +| Control-Room Black | `#070506` | Dark surfaces, banner backdrop | + +## Regenerating + +All derived assets are produced from the two sources in `source/`: + +```bash +python3 tools/build_assets.py # requires Pillow +``` + +Edit `source/logo.png` or `source/hero.png` (or the size tables in the script), +re-run, and commit. `source/hero-alt.png` is an alternate desk composition kept +for reference. + +## Usage & rights + +These are the personal brand assets of Jed Arden. The repository is public so the +assets are easy to reference and self-host, but the logo, likeness, and hero +imagery are **not** licensed for reuse, redistribution, or derivative works. +All rights reserved. diff --git a/avatars/bluesky-400.png b/avatars/bluesky-400.png new file mode 100644 index 0000000..5a50412 Binary files /dev/null and b/avatars/bluesky-400.png differ diff --git a/avatars/discord-512.png b/avatars/discord-512.png new file mode 100644 index 0000000..7464bf8 Binary files /dev/null and b/avatars/discord-512.png differ diff --git a/avatars/facebook-320.png b/avatars/facebook-320.png new file mode 100644 index 0000000..79e9992 Binary files /dev/null and b/avatars/facebook-320.png differ diff --git a/avatars/github-460.png b/avatars/github-460.png new file mode 100644 index 0000000..12475fe Binary files /dev/null and b/avatars/github-460.png differ diff --git a/avatars/instagram-320.png b/avatars/instagram-320.png new file mode 100644 index 0000000..79e9992 Binary files /dev/null and b/avatars/instagram-320.png differ diff --git a/avatars/linkedin-400.png b/avatars/linkedin-400.png new file mode 100644 index 0000000..5a50412 Binary files /dev/null and b/avatars/linkedin-400.png differ diff --git a/avatars/mastodon-400.png b/avatars/mastodon-400.png new file mode 100644 index 0000000..5a50412 Binary files /dev/null and b/avatars/mastodon-400.png differ diff --git a/avatars/threads-320.png b/avatars/threads-320.png new file mode 100644 index 0000000..79e9992 Binary files /dev/null and b/avatars/threads-320.png differ diff --git a/avatars/tiktok-200.png b/avatars/tiktok-200.png new file mode 100644 index 0000000..431ce5b Binary files /dev/null and b/avatars/tiktok-200.png differ diff --git a/avatars/x-400.png b/avatars/x-400.png new file mode 100644 index 0000000..5a50412 Binary files /dev/null and b/avatars/x-400.png differ diff --git a/avatars/youtube-800.png b/avatars/youtube-800.png new file mode 100644 index 0000000..d606853 Binary files /dev/null and b/avatars/youtube-800.png differ diff --git a/banners/discord-banner-960x540.png b/banners/discord-banner-960x540.png new file mode 100644 index 0000000..4f09ef9 Binary files /dev/null and b/banners/discord-banner-960x540.png differ diff --git a/banners/facebook-cover-2x-1702x630.png b/banners/facebook-cover-2x-1702x630.png new file mode 100644 index 0000000..2a16b98 Binary files /dev/null and b/banners/facebook-cover-2x-1702x630.png differ diff --git a/banners/facebook-cover-851x315.png b/banners/facebook-cover-851x315.png new file mode 100644 index 0000000..5ce2cac Binary files /dev/null and b/banners/facebook-cover-851x315.png differ diff --git a/banners/github-social-1280x640.png b/banners/github-social-1280x640.png new file mode 100644 index 0000000..64ebd50 Binary files /dev/null and b/banners/github-social-1280x640.png differ diff --git a/banners/linkedin-company-1128x191.png b/banners/linkedin-company-1128x191.png new file mode 100644 index 0000000..19e42eb Binary files /dev/null and b/banners/linkedin-company-1128x191.png differ diff --git a/banners/linkedin-personal-1584x396.png b/banners/linkedin-personal-1584x396.png new file mode 100644 index 0000000..97301f9 Binary files /dev/null and b/banners/linkedin-personal-1584x396.png differ diff --git a/banners/open-graph-1200x630.png b/banners/open-graph-1200x630.png new file mode 100644 index 0000000..2d34a2d Binary files /dev/null and b/banners/open-graph-1200x630.png differ diff --git a/banners/twitter-card-1200x628.png b/banners/twitter-card-1200x628.png new file mode 100644 index 0000000..2219171 Binary files /dev/null and b/banners/twitter-card-1200x628.png differ diff --git a/banners/x-header-1500x500.png b/banners/x-header-1500x500.png new file mode 100644 index 0000000..0a45c12 Binary files /dev/null and b/banners/x-header-1500x500.png differ diff --git a/banners/youtube-banner-2560x1440.png b/banners/youtube-banner-2560x1440.png new file mode 100644 index 0000000..df74fbd Binary files /dev/null and b/banners/youtube-banner-2560x1440.png differ diff --git a/favicon/apple-touch-icon-180.png b/favicon/apple-touch-icon-180.png new file mode 100644 index 0000000..c45e69f Binary files /dev/null and b/favicon/apple-touch-icon-180.png differ diff --git a/favicon/favicon-16.png b/favicon/favicon-16.png new file mode 100644 index 0000000..02b4c59 Binary files /dev/null and b/favicon/favicon-16.png differ diff --git a/favicon/favicon-192.png b/favicon/favicon-192.png new file mode 100644 index 0000000..cb4d7d3 Binary files /dev/null and b/favicon/favicon-192.png differ diff --git a/favicon/favicon-32.png b/favicon/favicon-32.png new file mode 100644 index 0000000..bbbebdc Binary files /dev/null and b/favicon/favicon-32.png differ diff --git a/favicon/favicon-48.png b/favicon/favicon-48.png new file mode 100644 index 0000000..9ef4a6a Binary files /dev/null and b/favicon/favicon-48.png differ diff --git a/favicon/favicon-512.png b/favicon/favicon-512.png new file mode 100644 index 0000000..7464bf8 Binary files /dev/null and b/favicon/favicon-512.png differ diff --git a/favicon/favicon.ico b/favicon/favicon.ico new file mode 100644 index 0000000..b6fffc2 Binary files /dev/null and b/favicon/favicon.ico differ diff --git a/logo/logo-1024.png b/logo/logo-1024.png new file mode 100644 index 0000000..e4f5c19 Binary files /dev/null and b/logo/logo-1024.png differ diff --git a/logo/logo-256.png b/logo/logo-256.png new file mode 100644 index 0000000..edb943b Binary files /dev/null and b/logo/logo-256.png differ diff --git a/logo/logo-512.png b/logo/logo-512.png new file mode 100644 index 0000000..7464bf8 Binary files /dev/null and b/logo/logo-512.png differ diff --git a/logo/logo-original.png b/logo/logo-original.png new file mode 100644 index 0000000..759ca89 Binary files /dev/null and b/logo/logo-original.png differ diff --git a/source/hero-alt.png b/source/hero-alt.png new file mode 100644 index 0000000..e688efc Binary files /dev/null and b/source/hero-alt.png differ diff --git a/source/hero.png b/source/hero.png new file mode 100644 index 0000000..e88aa0f Binary files /dev/null and b/source/hero.png differ diff --git a/source/logo.png b/source/logo.png new file mode 100644 index 0000000..759ca89 Binary files /dev/null and b/source/logo.png differ diff --git a/tools/build_assets.py b/tools/build_assets.py new file mode 100644 index 0000000..fbe2d24 --- /dev/null +++ b/tools/build_assets.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +"""Regenerate every platform asset in the brand kit from the two canonical sources. + +Sources: + source/logo.png -- flat cartoon avatar (red polo), used for all profile pictures + source/hero.png -- photoreal desk scene (red polo), used for all banners/covers + +Run: python3 tools/build_assets.py +""" +from PIL import Image +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +SRC = ROOT / "source" +LOGO = Image.open(SRC / "logo.png").convert("RGB") +HERO = Image.open(SRC / "hero.png").convert("RGB") + +# Brand background (sampled from the logo's cream field) -- used to pad where needed. +CREAM = (242, 232, 213) + + +def save(img, relpath): + out = ROOT / relpath + out.parent.mkdir(parents=True, exist_ok=True) + img.save(out) + print(f" {relpath}: {img.size[0]}x{img.size[1]}") + + +def square(img, size): + """Square profile asset from the (already square) logo.""" + return img.resize((size, size), Image.LANCZOS) + + +def cover(img, tw, th, fy=0.45, fx=0.5): + """Scale-to-cover then crop to (tw,th), biased vertically by fy (0=top,1=bottom).""" + iw, ih = img.size + scale = max(tw / iw, th / ih) + nw, nh = round(iw * scale), round(ih * scale) + im = img.resize((nw, nh), Image.LANCZOS) + left = round((nw - tw) * fx) + top = round((nh - th) * fy) + return im.crop((left, top, left + tw, top + th)) + + +# ---- Profile pictures (from logo) ------------------------------------------- +AVATARS = { + "avatars/x-400.png": 400, + "avatars/linkedin-400.png": 400, + "avatars/github-460.png": 460, + "avatars/instagram-320.png": 320, + "avatars/facebook-320.png": 320, + "avatars/youtube-800.png": 800, + "avatars/tiktok-200.png": 200, + "avatars/mastodon-400.png": 400, + "avatars/bluesky-400.png": 400, + "avatars/threads-320.png": 320, + "avatars/discord-512.png": 512, +} + +# ---- Banners / covers (from hero) ------------------------------------------- +# fy biases the crop band; lower = higher in frame (favours monitors + head). +BANNERS = { + "banners/x-header-1500x500.png": (1500, 500, 0.42), + "banners/linkedin-personal-1584x396.png": (1584, 396, 0.42), + "banners/linkedin-company-1128x191.png": (1128, 191, 0.42), + "banners/facebook-cover-851x315.png": (851, 315, 0.42), + "banners/facebook-cover-2x-1702x630.png": (1702, 630, 0.42), + "banners/youtube-banner-2560x1440.png": (2560, 1440, 0.45), + "banners/discord-banner-960x540.png": (960, 540, 0.45), + "banners/github-social-1280x640.png": (1280, 640, 0.45), + "banners/open-graph-1200x630.png": (1200, 630, 0.45), + "banners/twitter-card-1200x628.png": (1200, 628, 0.45), +} + +# ---- Logo masters & favicons (from logo) ------------------------------------ +LOGO_SIZES = { + "logo/logo-1024.png": 1024, + "logo/logo-512.png": 512, + "logo/logo-256.png": 256, +} +FAVICON_SIZES = { + "favicon/favicon-16.png": 16, + "favicon/favicon-32.png": 32, + "favicon/favicon-48.png": 48, + "favicon/favicon-192.png": 192, + "favicon/favicon-512.png": 512, + "favicon/apple-touch-icon-180.png": 180, +} + + +def main(): + print("avatars:") + for path, size in AVATARS.items(): + save(square(LOGO, size), path) + + print("logo masters:") + for path, size in LOGO_SIZES.items(): + save(square(LOGO, size), path) + save(LOGO, "logo/logo-original.png") + + print("favicons:") + for path, size in FAVICON_SIZES.items(): + save(square(LOGO, size), path) + # multi-resolution .ico + ico = ROOT / "favicon/favicon.ico" + LOGO.resize((256, 256), Image.LANCZOS).save( + ico, sizes=[(16, 16), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)] + ) + print(f" favicon/favicon.ico: multi-res") + + print("banners:") + for path, (w, h, fy) in BANNERS.items(): + save(cover(HERO, w, h, fy=fy), path) + + print("done.") + + +if __name__ == "__main__": + main()