Back to case studies

Case study · 2026

SuperHype: human-in-the-loop employee advocacy for LinkedIn

A platform that turns one announcement into genuine, varied LinkedIn advocacy from your team: each post AI-drafted to the person's voice, approved by a real human, and published on a stagger through the official API, so a coordinated push never reads as a bot pod.

Sole Developer · Product Owner

Stack

Python 3.13 · FastAPI · SQLAlchemy 2.0 · asyncpg · Alembic · ARQ · PostgreSQL · Redis · React 18 · TypeScript · Vite · Tailwind · LinkedIn API · Slack · Google OAuth · Docker

Outcomes

  • Two advocacy workflows (Amplify and Distribute) that expand one seed into per-person actions across a roster, with no manual row assignment.
  • Per-persona AI generation: distinct on-voice post variations and interaction text, with a comment-quality floor and a hard ban on buzzwords and em dashes.
  • Official LinkedIn API only: every action runs on the member's own consented account, tokens Fernet-encrypted at rest, with randomized-stagger pacing and daily caps.
  • Full human-in-the-loop approval from the web app or a bundled Slack DM, plus an append-only audit row on every externally triggered mutation.

What I owned

End-to-end: product design, backend architecture, the per-persona LLM generation, the LinkedIn and Slack integrations, the frontend, and deployment.

What shipped

A human-in-the-loop employee advocacy platform for LinkedIn:

  • Two workflows: Amplify points a roster at one existing post (each person does a like, a comment, and a reshare); Distribute turns a seed into a distinct on-voice post per participant, then has everyone engage with everyone else’s post, with an optional author self-comment (“link in the comments”).
  • Per-persona generation tuned to each teammate’s voice, governed by an admin-editable global rules document plus optional per-campaign rules.
  • Approval loop: everyone approves, edits, or skips their own actions from the web app or a bundled Slack DM (one Approve all / Skip all for everything they owe a campaign). Nothing publishes without them.
  • Authentic pacing: approved posts publish on a randomized stagger with per-account spacing and daily caps; publishing is idempotent and never double-posts on retry.
  • Onboarding and roles: Google login (company domain only), a mandatory LinkedIn connect step, cumulative viewer/editor/admin roles with per-participant ownership, and a weighted contribution leaderboard.

Architecture

A monorepo with two deployables and managed datastores. The backend is Python 3.13 with async FastAPI, SQLAlchemy 2.0 over asyncpg, Alembic, Pydantic v2, and an ARQ worker, following strict layering (view → controller → service → repository → model). PostgreSQL holds state; Redis backs the job queue and OAuth state. Generation, launch fan-out, and publishing all run as ARQ jobs. The frontend is Vite + React 18 + TypeScript with Tailwind and shadcn/ui. External integrations are the LinkedIn API, Google OAuth, an OpenAI-compatible LLM gateway, and Slack.

Lessons

The hard part of advocacy tooling isn’t generation; it’s consent and authenticity. Running every action through each member’s own official API token, requiring real human approval, and pacing posts so a coordinated push never reads as a bot pod is exactly what separates genuine advocacy from the spam that makes advocacy feel gross. Human-in-the-loop here is a feature, not a compromise.

Links