v4.5.1 · skill-only · OpenClaw-compatible

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.

Any safe logged-in website LinkedIn example X example Bluesky example Threads example Facebook example

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

  1. Clone or register the directory-source plugin.
    OpenClaw points at this repo path and enables repost-with-agent; Claude-compatible loaders point at .claude-plugin/.
  2. Create a source → destination pair.
    Run /pair create. New pairs start safe: preview-only and disabled until explicitly approved.
  3. Validate in the logged-in browser profile.
    The agent checks source and destination sessions, account identity, candidate text, URLs, and preview/publish readiness.
  4. Run one pair manually.
    /repost-run <pair-id> scrapes, applies custom rules, dedupes, expands URLs, drafts/posts, writes state, and sends a confirmation.
  5. Schedule the default sweep, source fanout, or customize it.
    /repost-setup-cron installs one daily all-enabled-pairs job that invokes /repost-run all sequentially 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.
Important: scheduled live posting requires mode: "live-approved", a successful preview/publish proof, and a configured notification.delivery route. Silent publishes are treated as bugs.
Flexible scheduling: the all-pairs sweep is the starter configuration, not the only architecture. The host scheduler can run source-item fanout backfill slots, one pair, named subsets, dry preview checks, or multiple custom cadences while reusing the same state and safety rules.

Runtime workflow

  1. Read ~/.repost-with-agent/pairs.json, the per-pair history, audit, and learnings.md.
  2. Open the configured logged-in browser profile and scrape recent source posts using the current harness's browser automation.
  3. Apply user-defined customRules and existing considered.jsonl decisions before any publish work.
  4. Check global cross-pair dedupe, local per-pair history, destination-feed fuzzy string matches, and Layer 2 semantic similarity.
  5. Expand shortened URLs with the harness shell, prepare the destination draft, and verify the intended posting identity.
  6. 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.jsonl prevents 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/