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 fromSHONUFF_TITLESlist (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:
- Loads closings + titles from references files, picks random from each
- Loads base64 image, substitutes into HTML template
- Sends from shonuff@germainebrown.com via mail.germainebrown.com:2525
- BCCs g@germainebrown.com on every send
- 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.passand.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:
- 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 - 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