Files

4.1 KiB

Email Signature — Sho'Nuff

Current Signature (Jul 2026)

The signature is rendered from /root/.hermes/references/shonuff-email-signature.html. The Sho'Nuff quote is placed as a standalone line in the email body BEFORE the <hr> separator and signature block.

━━━ red 40px accent bar (2px thick, rounded, #cc0000) ━━━

         ┌──────────────────────┐
         │                      │
         │  Circular avatar     │  Sho'Nuff Brown (weight 900)
         │  (base64 embedded)   │  [Random title from shonuff-titles.py]
         │                      │  IT Pro Partner
         │                      │
         │                      │  tel  — —— —— —— ——
         │                      │  @    shonuff@germainebrown.com
         └──────────────────────┘

Latest changes (Jul 6, 2026)

  • Separator: gradient line → solid red 40px bar (#cc0000, 2px, rounded corners)
  • Name color: #222222 → #1a1a1a, weight 700 → 900
  • Phone label: "Tel:" → "tel" (lowercase, gray #bbbbbb)
  • Email label: "Email:" → "@" (minimal)
  • Phone placeholder: underscores → dashed line with letter-spacing
  • Email link: plain blue → dotted underline (#555555)
  • Image: S3 URL → base64 data URI (Wasabi doesn't allow public-read)
  • Layout: labels on same row as values (two-column table)
  • "Who's the Master?" tagline removed from signature block (quote is the email sign-off before the separator instead)
  • Font stack: added Inter first (modern sans-serif)
  • Vertical alignment: top → middle (aligned with image center)

Two placeholders

  • %SHONUFF_IMAGE% — base64 data URI of the character image
  • %SHONUFF_TITLE% — random title from SHONUFF_TITLES list (rotates per send)

Rotating Titles

File: /root/.hermes/references/shonuff-titles.py

13 titles including "Germaine's AI Ops Engineer", "Germaine's Baddest AI Mofo Low Down Around This Town", "Germaine's Full-Time Menace", and more. Load via importlib, pick with random.choice().

Rotating Closing Quotes

File: /root/.hermes/references/shonuff-closings.py

8 quotes. Used as the email sign-off instead of "Thanks" or "Regards". Placed in the email body between the message and the <hr>.

Send Script

File: /root/.hermes/scripts/send-shonuff.py

python3 /root/.hermes/scripts/send-shonuff.py "<to>" "<subject>" "<body>"

The script:

  1. Loads closings + titles from references files, picks random from each
  2. Loads base64 image, substitutes into HTML template
  3. Sends from shonuff@germainebrown.com via mail.germainebrown.com:2525
  4. BCCs g@germainebrown.com on every send
  5. Builds multipart/alternative: text/plain (fallback) + text/html (rich)

Sending Rules

  • All "send me this as an email" requests go from shonuff@germainebrown.com
  • BCC the user on every send
  • Do NOT access Germaine's inbox (g@germainebrown.com) unless asked
  • Sho'Nuff's incoming email is shonuff@germainebrown.com (IMAP monitored)
  • SMTP port 2525 everywhere — netcup blocks 25/465/587
  • Password for shonuff SMTP: in ~/.config/himalaya/shonuff.pass and .env

Image Hosting

The image is embedded as a base64 data URI (NOT external). Stored at /root/.hermes/references/shonuff-image-b64.txt (~78KB). Wasabi S3 does not allow public-read with this IAM user, so data URIs are the only reliable rendering method. Current image used: /root/.hermes/cache/images/shonuff-v2-clean.png (600x800, transparent PNG, signature removed).

Inbox Monitoring

Sho'Nuff's inbox (shonuff@germainebrown.com) is monitored every 15 minutes via a two-stage cron job:

  1. Collect script (scripts/shonuff-inbox-collect.py) — checks for new UNSEEN messages from non-trusted senders via IMAP, extracts sender/subject/body preview, outputs JSON
  2. LLM summary — reads the collected JSON, summarizes each new message in 2-3 sentences, delivers to Germaine via Telegram

Trusted senders (silently skipped): g@germainebrown.com, mailer-daemon@heracles.mxrouting.net