← back to Linkedin Voice Agent

references/daily-cadence.md

53 lines

# Daily cadence — the "every day" automation (Steve-gated)

Okara auto-writes a LinkedIn post every day. The local equivalent is a launchd
job that runs Stage 2 each morning and drops fresh drafts in `data/drafts/`.
It is still **draft-only** — a human reviews and publishes. Installing a
scheduled job is a gated action, so run this yourself when you want it on.

## 1. Plist template
Save as `~/Library/LaunchAgents/com.steve.linkedin-voice-agent.plist`
(edit `--profile` to your profile name; adjust the hour in `StartCalendarInterval`):

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>com.steve.linkedin-voice-agent</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/bin/python3</string>
    <string>/Users/macstudio3/.claude/skills/linkedin-voice-agent/scripts/generate.py</string>
    <string>--profile</string><string>steve</string>
    <string>--count</string><string>3</string>
  </array>
  <key>StartCalendarInterval</key>
  <dict><key>Hour</key><integer>7</integer><key>Minute</key><integer>30</integer></dict>
  <key>StandardOutPath</key><string>/tmp/lva-daily.log</string>
  <key>StandardErrorPath</key><string>/tmp/lva-daily.err</string>
</dict>
</plist>
```

## 2. Install / load
```bash
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.steve.linkedin-voice-agent.plist
launchctl kickstart gui/$(id -u)/com.steve.linkedin-voice-agent   # run once now to test
```

## 3. Review + publish (unchanged)
Each morning, read the newest `data/drafts/steve-*.md`, pick a winner, and
publish it via the `linkedin-api` skill (your go):

```bash
python3 ~/.claude/skills/linkedin-api/scripts/post.py --text "<approved draft text>"
```

## Uninstall
```bash
launchctl bootout gui/$(id -u)/com.steve.linkedin-voice-agent
rm ~/Library/LaunchAgents/com.steve.linkedin-voice-agent.plist
```