| name | reddit-competitor-complaints |
| description | Daily Reddit competitor-complaint digest for AI text RPG products (AI Dungeon, Friends & Fables, Voyage, etc.) via PullPush.io. Runs as a launchd cron job, fetches top Reddit threads, ranks by pain-keyword score + engagement + recency, and posts a top-10 digest to Slack. Use when: 'reddit competitor monitor', 'track reddit complaints about X', 'reddit sentiment for Y', 'set up daily reddit digest', 'monitor AI dungeon on reddit', 'launchd reddit job', 'competitor reddit intel'. |
| when_to_use | Use this skill when the user asks to: (1) create a daily or periodic Reddit digest for a list of competitor products, (2) debug a Reddit-monitoring launchd job that's exiting non-zero or posting empty digests, (3) migrate an existing browser-based Reddit scraper to a free, no-auth, captcha-proof backend, (4) troubleshoot `set -uo pipefail` + launchd-env-wrapper.sh double-source bugs in cron wrappers, (5) rank Reddit threads by complaint-likelihood using a pain-keyword lexicon. |
| allowed-tools | ["terminal","edit","read","web"] |
| context | This skill is the canonical home for the
`ai.hermes.schedule.reddit-competitor-complaints` launchd job installed
on Jeffrey's MacBook on 2026-06-23. It captures three durable lessons
from that install:
1. PullPush.io (api.pullpush.io) is the free, no-auth, captcha-proof
Pushshift successor. Use it for any Reddit data work that previously
would have gone through Reddit's anonymous .json (returns 403 from
this MacBook's IP) or through Brave/DDG/Bing Search (all rate-limit
or captcha within 2-4 queries).
2. `launchd-env-wrapper.sh` ends in `exec "$@"`. The cron-wrapper pattern
is `bash -c "source env-wrapper; exec target-script"`. If the target
script ALSO sources the env-wrapper, the env-wrapper's `exec "$@"`
fires in the current shell with the parent script's args (usually
empty) and replaces the target shell with `exec` (no-op) or with
the wrong command. Symptom: `rc=1`, log shows "Target: …" and a
`+ source` line, then nothing else. Fix: do NOT source the env
wrapper inside the target script — the cron wrapper already does.
3. `set -o pipefail` + `head -N` in a `$()` pipeline sends SIGPIPE to
`awk` when `head` closes early, propagating rc=141. Use awk's own
`NR<=N` exit instead.
When this skill is invoked, the agent should (a) read the cron script and
the python script in the canonical locations, (b) confirm the plist is
loaded via `launchctl list | grep reddit-competitor`, and (c) post a
fresh digest to the originating Slack thread to prove the pipeline.
|
reddit-competitor-complaints
Daily 8:00 AM PT launchd job that finds the top 10 Reddit threads
where people complain about (or compare) a list of AI text RPG
competitors, then posts a deduplicated, pain-ranked digest to Slack.
When to use this skill
| User prompt | Action |
|---|
| "set up a daily reddit digest for X, Y, Z" | Edit the SOURCES list in scripts/reddit-competitor-complaints.py, redeploy |
| "my launchd reddit job keeps exiting rc=1" | Read the inner log at ~/.hermes/logs/scheduled-jobs/reddit-competitor-complaints.*.log. If the log shows "Target: …" + a + source launchd-env-wrapper.sh line and nothing else, the target script is double-sourcing the env wrapper. Remove the inner source line. |
| "the digest is empty / engine keeps getting rate-limited" | Confirm the script is calling api.pullpush.io (not Playwright + Brave). If it's calling search engines, migrate per references/pullpush-migration.md. |
| "rank reddit posts by complaint likelihood" | The pain_score(title, body) function in scripts/reddit-competitor-complaints.py is the canonical recipe. Tune PAIN_WORDS and POS_WORDS lexicons. |
Architecture
launchd (8 AM PT daily)
└─ $HOME/.hermes/scripts/reddit-competitor-complaints-wrapper.sh
└─ bash -c "source launchd-env-wrapper.sh >/dev/null 2>&1; exec reddit-competitor-complaints.sh"
└─ python3 reddit-competitor-complaints.py
├─ PullPush.io GET (no auth, no captcha, free)
├─ Pain-score each candidate
├─ Rank: pain × log(engagement) × recency × sub_boost
└─ Print digest between markers:
=== Reddit competitor-complaints digest — <ts> ===
<per-competitor sections>
---
└─ Wrapper extracts digest via awk, posts via chat.postMessage
The 3 production gotchas (read these before touching anything)
1. DO NOT source launchd-env-wrapper.sh inside the target script
The cron wrapper already does this:
bash -c "source '$HOME/.hermes/scripts/launchd-env-wrapper.sh' >/dev/null 2>&1; exec '$HOME/.hermes/scripts/reddit-competitor-complaints.sh'"