일회성·반복 리마인더를 상시 구동 머신의 launchd/cron에 걸고 디스코드 DM으로 받는다. 유료 자동화 슬롯을 쓰지 않는 방법.
npx skills add https://github.com/bam-bam-2/solo-skills --skill discord-reminder
Use the remote-host instead of Aside routine slots for scheduled reminders.
~/Projects/<프로젝트>/<slug>.sh on remote-host with mode 700.~/Projects/<프로젝트>/discord_bot/.env. Never print or copy token values.BAMBAM_USER_ID. Include a non-empty User-Agent header to avoid Cloudflare blocking.~/Library/LaunchAgents/com.bambam.reminder-<slug>.plist.StartCalendarInterval with Year, Month, Day, Hour, and Minute.StartInterval on this remote-host. Verified 2026-08-16: everyStartInterval LaunchAgent in the gui/501 domain sits at
pended nondemand spawn = interval and does not fire, including one that
had previously run 2,429 times. StartCalendarInterval jobs fire normally.
For an every-N-minutes job, list the minutes explicitly, e.g.
[{Minute: 0}, {Minute: 5}, ... {Minute: 55}] for a 5-minute cadence.
~/Projects/<프로젝트>/<slug>.log.plutil -lint <plist>launchctl bootout gui/$(id -u)/<label> if an old copy existslaunchctl bootstrap gui/$(id -u) <plist>launchctl print gui/$(id -u)/<label>plutil -p <plist> to verify the exact schedulelaunchctl print showing the job loaded is notproof — watch runs increment across two scheduled ticks, or check the job's
own log for two consecutive scheduled entries. A job can load cleanly and
never spawn.
Use concise reminder text that says what happened, what the user should do next, and any account or product distinction needed to avoid a wrong action.
scripts/make-reminder.sh — 일회성 리마인더를 launchd에 등록합니다.
export DISCORD_BOT_TOKEN=... DISCORD_USER_ID=...
./scripts/make-reminder.sh cancel-check "2026-09-02 10:00" "구독 해지 확인하기"
지정한 시각에 DM이 한 번 가고 잡이 스스로 내려갑니다.
StartInterval이 아니라 StartCalendarInterval을 쓰는 이유는 아래 함정 항목을 보세요.
Take bam-bam-2/discord-reminder from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.