"Everything is fine. I'm BoJack Horseman."
A BoJack Horsemanβthemed Slack bot for the #horsin-around channel. Talent file a Wit Entry via /pitch, earn an EP-ID, get roasted by the audience, and climb the Cringe-o-Meter leaderboard.
| Feature | Description |
|---|---|
π€ /pitch |
Opens the Take the Stage modal β submit your best material |
| π Stage Entry Card | Every submission gets a branded card with live vote counts and a Cringe-o-Meter |
| π³οΈ Voting | Community votes Certified Cringe or It's Fine I Guess β card updates in real time |
| π Wit-ness Record | Per-member stats modal: episodes filed, cringe %, career rating, episode history |
| π Encore Queue | Daily 3-entry limit β overflow entries auto-post the next morning |
| π‘ Daily Broadcast | Bot personas (BoJack & Princess Carolyn) post curated material on a randomised schedule |
| β Weekly Special | Curated show quotes posted weekly, alternating between personas |
| π£ Mr. PB Announcements | Fortnightly educational posts + automatic milestone celebrations |
| π‘οΈ Cringe Warden | Bouncer deletes non-text posts and DMs the talent with a nudge |
| π Warden's Watch | Health monitoring with startup heartbeat to a private logs channel |
app/
βββ commands.py # /pitch slash command
βββ modals.py # Modal submissions & Wit-ness Record
βββ actions.py # Vote button handlers
βββ events.py # Message events & bouncer
βββ db/
β βββ database.py # SQLite β jokes, criminal_records, state tables
βββ services/
β βββ slack_service.py # All Slack API calls
β βββ pitch_service.py # External joke API fetchers (icanhazdadjoke, JokeAPI)
β βββ validation.py # Content validation pipeline
β βββ queue_service.py # Encore retry warden (background thread)
β βββ show_runner.py # Scheduled broadcasts (background thread)
β βββ monitoring.py # Warden's Watch health monitoring
βββ utils/
βββ blocks.py # All Slack Block Kit card builders
βββ config.py # Config loader (config.json + env)
βββ constants.py # Content blocklist
βββ personas.py # Persona routing (BoJack / Princess Carolyn)
βββ show_quotes.json # Curated weekly special quotes
βββ announcements.json # Mr. PB fortnightly announcement topics
- Python 3.14+
- A Slack workspace with a bot app configured (Socket Mode enabled)
uvfor dependency management
git clone https://github.com/CynthiaWahome/horsin-around.git
cd horsin-around
uv synccp .env.example .envOpen .env and fill in your tokens. Every variable is documented with an inline comment β .env.example is the source of truth.
| Scope | Purpose |
|---|---|
chat:write |
Post messages |
chat:write.customize |
Custom username + avatar per post |
chat:write.public |
Post to channels without joining |
reactions:write |
Add emoji reactions |
users:read |
Fetch member profiles |
channels:history |
Read message timestamps for reaction tracking |
im:write |
Send DMs (welcome message) |
Socket Mode also requires an App-Level Token with connections:write.
uv run python3 main.pyuv run pytest tests/ -vTESTING_BYPASS_LIMIT=true| Persona | Source | Schedule |
|---|---|---|
| π΄ BoJack Horseman | icanhazdadjoke.com | Odd days |
| π± Princess Carolyn | JokeAPI v2 | Even days |
| πΆ Mr. Peanutbutter | Internal content | Announcements & milestones |
Pull requests are welcome. This is a small Slack community tool β keep changes focused and test-covered. Run uv run pytest tests/ -v before opening a PR. CI will enforce it anyway, but it's faster to catch things locally.
If you're adding to the content blocklist, edit app/utils/constants.py. If you're changing validation logic, make sure tests/test_validation.py covers the new behaviour.
Three characters who never got a writing credit: a horse with a drinking problem, his overachieving agent, and a golden labrador who has never once noticed when the room is uncomfortable.
They provided the vibes. The code wrote itself. (It did not write itself. π€¦ββοΈ)