Run website reposting with the agent you already use.
A practical plugin of Markdown skills, slash commands, templates, and state-file rules. The current harness uses its logged-in browser automation to repost between websites it can safely operate, with a simple default scheduler, source-item fanout for backfills, and room for custom pair/job layouts.
What this is
Skill-only plugin
The repository contains instructions the agent reads at runtime. There is no daemon, binary, queue worker, SDK integration, or hidden publisher.
Current-harness first
OpenClaw uses OpenClaw tools. Claude-compatible harnesses use their own registered tools. The agent that receives the task owns the run unless the user explicitly chooses a different harness.
Generic by design
Works with any website the agent can safely operate through the logged-in browser. LinkedIn, X, Bluesky, Threads, and Facebook are documented example surfaces, not a closed list.
State and schedules
Pair configs, posted history, dedupe proofs, source fanout manifests, custom-rule decisions, audits, learnings, and optional scheduler intent live under ~/.repost-with-agent/.
Quick start
- Clone or register the directory-source plugin.
OpenClaw points at this repo path and enablesrepost-with-agent; Claude-compatible loaders point at.claude-plugin/. - Create a source → destination pair.
Run/pair create. New pairs start safe:preview-onlyand disabled until explicitly approved. - Validate in the logged-in browser profile.
The agent checks source and destination sessions, account identity, candidate text, URLs, and preview/publish readiness. - Run one pair manually.
/repost-run <pair-id>scrapes, applies custom rules, dedupes, expands URLs, drafts/posts, writes state, and sends a confirmation. - Schedule the default sweep, source fanout, or customize it.
/repost-setup-croninstalls one daily all-enabled-pairs job that invokes/repost-run allsequentially by default. Source-level backfill jobs process one source item across all enabled destinations; users can also ask for per-pair jobs, subset jobs, dry/preview jobs, or custom cadences.
mode: "live-approved", a successful preview/publish proof, and a configured notification.delivery route. Silent publishes are treated as bugs.Runtime workflow
- Read
~/.repost-with-agent/pairs.json, the per-pair history, audit, andlearnings.md. - Open the configured logged-in browser profile and scrape recent source posts using the current harness's browser automation.
- Apply user-defined
customRulesand existingconsidered.jsonldecisions before any publish work. - Check global cross-pair dedupe, local per-pair history, destination-feed fuzzy string matches, and Layer 2 semantic similarity.
- Expand shortened URLs with the harness shell, prepare the destination draft, and verify the intended posting identity.
- Publish only if the pair mode permits it, append proof ledgers, write audit events, update learnings, and send the publish confirmation.
Safety and dedupe
Conservative by default
- No stealth, CAPTCHA bypass, 2FA bypass, or anti-detection tricks.
- Browser automation operates only on transparent logged-in sessions.
- New pairs default to disabled
preview-only. - New websites need preview validation, account identity checks, destination-specific dedupe, and learnings/custom rules.
- Stop on unclear account ownership, site-policy/ToS issues, private data exposure, or brittle/unverified DOM flows.
Duplicate guardrails
- Global ledger:
global-posted.jsonlprevents alternate routes from reposting the same underlying content. - Layer 1: exact source IDs plus normalized fuzzy string matching against destination posts.
- Layer 2: the agent compares candidate meaning against recent destination posts and skips semantic duplicates.
- Custom rules: user preference skips go to
considered.jsonl, not publish ledgers.
Slash commands
Pair management
/pair list— summarize configured pairs./pair show <id>— inspect config, history, and audit./pair create— create a new pair safely./pair edit <id>— update an existing pair.
Running and scheduling
/repost-run <pair-id>— run one pair end-to-end./repost-run all— default sweep for every enabled listen-for-future pair; live jobs publish only live-approved pairs, while preview/dry sweeps and subsets follow the scheduler prompt./repost-backfill source:<platform> ...— source-item fanout historical walk: one source item across all enabled destinations./repost-backfill <pair-id> ...— destination-specific historical repair/job when explicitly requested./repost-setup-cron— install the default all-pairs sweep or a custom per-pair/subset/dry schedule.
State files
Runtime state is user-owned and append-heavy. The plugin docs tell the agent how to read and write it; the repo itself does not run code against it.
~/.repost-with-agent/
├── pairs.json
├── global-posted.jsonl
├── considered.jsonl
├── source-fanouts/<source-platform>/<source-item>.json
└── pairs/<pair-id>/
├── posted.jsonl
├── audit.jsonl
├── learnings.md
├── backfill-state.json
└── logs/