

Research platform

AI-assisted content creation and publishing
Hunter Newby is an active speaker on the industry conference circuit, and every appearance needs a web page, a promotional graphic, social posts, and follow-up. I built an agent-run pipeline that does all of it from a short brief: it composes the graphic against a fixed template that folds in each event’s branding while keeping Newby Ventures front and center, publishes to the CMS through a custom API, drafts and posts to LinkedIn and X, and files the follow-up tasks in our client dashboard.
The part that took the most thought was not the automation. It was deciding what the automation is not allowed to do on its own. Every asset passes a two-tier review before it reaches a person, and nothing publishes without human approval.



BRAND CHECK: PASS (mountain-connect-2025, attempt 1)
Tier 1 — deterministic
[ ok ] D1 Widest title line reaches x=511; event logo column ends at x=426. Gap 85px, clear.
[ ok ] D2 Title block plus panel time ends at y=384; limit is y=515 (3 lines).
[ ok ] D3 Closest title line sits 24.0px from the headshot circle (minimum 20px).
[ ok ] D11 Panel title wraps to 3 lines (comfortable maximum 4). Geometrically legal.
[ ok ] D6 No banned strings.
[ ok ] D8 https://mountainconnect.org returned 200.
Tier 2 — judgment
[ 2/2 ] J1 Balanced composition; the three-line title sits comfortably in its column with hierarchy intact.
[ 2/2 ] J2 Mountain Connect logo reads clearly against the light panel.
[ 2/2 ] J3 Dates (Aug 4-6, 2025), Denver CO, and panel time (Aug 4 @ 3:00 PM) match the brief.
[ 2/2 ] J4 Panel title verbatim (template sets all-caps); no truncation or rewording.
[ 2/2 ] J5 Generated text is concise, factual, peer-to-peer.HEADSHOT_LEFT = 958
HEADSHOT_TOP = 167
HEADSHOT_BOTTOM = 368
HEADSHOT_RADIUS = (HEADSHOT_BOTTOM - HEADSHOT_TOP) / 2
HEADSHOT_CX = HEADSHOT_LEFT + HEADSHOT_RADIUS
HEADSHOT_CY = HEADSHOT_TOP + HEADSHOT_RADIUS
def rect_circle_clearance(left, top, right, bottom, cx, cy, r):
"""Shortest distance from a rect to a circle's edge. Negative means overlap."""
nearest_x = max(left, min(cx, right))
nearest_y = max(top, min(cy, bottom))
return math.hypot(cx - nearest_x, cy - nearest_y) - rdef route(tier1, tier2):
if any(c["result"] == "fail" for c in tier1):
return "flag"
if tier2:
if any(c["score"] == 0 for c in tier2):
return "flag"
if sum(c["score"] for c in tier2) < 8:
return "flag"
return "pass"The point of the system is not to take people out of the work, but to spend their attention where it counts. The pipeline carries the repetitive production so the team’s judgment goes to what actually needs it: whether the composition holds, whether the facts are right, whether it is good enough to carry the client’s name. That is what lets a small team keep a large event calendar moving without letting brand quality slip.
Custom AI assistant

Brand & marketing


