{"id":"1611224b-818f-4b89-9030-cf1faaa4cd32","entityType":"agent","slug":"clawhub-nickludlam-mailchimp-to-ghost-skill","name":"Mailchimp To Ghost","canonicalUrl":"https://www.xpersona.co/agent/clawhub-nickludlam-mailchimp-to-ghost-skill","canonicalPath":"/agent/clawhub-nickludlam-mailchimp-to-ghost-skill","generatedAt":"2026-10-09T17:14:09.113Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T10:24:45.481Z","emptyReason":null},"description":"Sync Mailchimp newsletter posts to a Ghost blog. Fetches newsletter content from RSS, converts HTML to clean markdown with horizontal rules, uploads images t... Skill: Mailchimp To Ghost Owner: nickludlam Summary: Sync Mailchimp newsletter posts to a Ghost blog. Fetches newsletter content from RSS, converts HTML to clean markdown with horizontal rules, uploads images t... Tags: latest:0.1.0 Version history: v0.1.0 | 2026-07-23T12:31:24.704Z | auto mailchimp-to-ghost v0.1.0 - Initial release: sync Mailchimp newsletters to Ghost blog via RSS. - Converts Mailchimp HTML to clean","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 3K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17axevwnzhw0vg8qs8f2kvxdn83q1mx:mailchimp-to-ghost-skill","sourceUrl":"https://clawhub.ai/nickludlam/mailchimp-to-ghost-skill","homepage":"https://clawhub.ai/nickludlam/skills/mailchimp-to-ghost-skill","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/nickludlam/mailchimp-to-ghost-skill","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/nickludlam/skills/mailchimp-to-ghost-skill","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":69,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Sync Mailchimp newsletter posts to a Ghost blog. Fetches newsletter content from RSS, converts HTML to clean markdown with horizontal rules, uploads images t..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T10:24:45.481Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T10:24:45.481Z","emptyReason":null},"stars":null,"forks":null,"downloads":2979,"packageName":null,"latestVersion":"0.1.0","tractionLabel":"3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T10:24:45.481Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T10:24:45.481Z","lastCrawledAt":"2026-10-09T10:24:45.481Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T10:24:45.481Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.0","createdAt":"2026-07-23T12:31:24.704Z","changelog":"mailchimp-to-ghost v0.1.0 - Initial release: sync Mailchimp newsletters to Ghost blog via RSS. - Converts Mailchimp HTML to clean markdown, preserving formatting, horizontal rules, buttons, and images. - Downloads images from Mailchimp and uploads them to Ghost, updating references. - Publishes newsletters as Ghost Lexical-format draft posts with deduplication to prevent duplicates. - Provides cache management and guides on installation, configuration, and workflow.","fileCount":8,"zipByteSize":15833}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17axevwnzhw0vg8qs8f2kvxdn83q1mx:mailchimp-to-ghost-skill","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nickludlam-mailchimp-to-ghost-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nickludlam-mailchimp-to-ghost-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nickludlam-mailchimp-to-ghost-skill/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-nickludlam-mailchimp-to-ghost-skill/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-nickludlam-mailchimp-to-ghost-skill/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-nickludlam-mailchimp-to-ghost-skill/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T17:14:09.112Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nickludlam-mailchimp-to-ghost-skill/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nickludlam-mailchimp-to-ghost-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nickludlam-mailchimp-to-ghost-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nickludlam-mailchimp-to-ghost-skill/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-09T10:24:45.481Z","emptyReason":null},"readme":"Skill: Mailchimp To Ghost\n\nOwner: nickludlam\n\nSummary: Sync Mailchimp newsletter posts to a Ghost blog. Fetches newsletter content from RSS, converts HTML to clean markdown with horizontal rules, uploads images t...\n\nTags: latest:0.1.0\n\nVersion history:\n\nv0.1.0 | 2026-07-23T12:31:24.704Z | auto\n\nmailchimp-to-ghost v0.1.0\n\n- Initial release: sync Mailchimp newsletters to Ghost blog via RSS.\n- Converts Mailchimp HTML to clean markdown, preserving formatting, horizontal rules, buttons, and images.\n- Downloads images from Mailchimp and uploads them to Ghost, updating references.\n- Publishes newsletters as Ghost Lexical-format draft posts with deduplication to prevent duplicates.\n- Provides cache management and guides on installation, configuration, and workflow.\n\nArchive index:\n\nArchive v0.1.0: 8 files, 15833 bytes\n\nFiles: LICENSE (906b), README.md (678b), scripts (0b), scripts/fetch_markdown.py (12024b), scripts/sync_to_ghost.py (21727b), skill-card.md (2462b), SKILL.md (7871b), _meta.json (143b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: mailchimp-to-ghost\ndescription: Sync Mailchimp newsletter posts to a Ghost blog. Fetches newsletter content from RSS, converts HTML to clean markdown with horizontal rules, uploads images to Ghost, and publishes as Lexical-format posts with proper formatting.\nhomepage: https://github.com/nickludlam/mailchimp-to-ghost-skill\ncaption: Sync Mailchimp newsletter posts to Ghost blog\nmetadata:\n  openclaw:\n    emoji: \"📰\"\n    homepage: \"https://github.com/nickludlam/mailchimp-to-ghost-skill\"\n    requires:\n      bins: [\"python3\", \"ghst\"]\n      env: [\"GHOST_URL\", \"GHOST_STAFF_ACCESS_TOKEN\"]\n    primaryEnv: \"GHOST_URL\"\n---\n\n# Sync Newsletter Skill\n\nFetch newsletter posts from a Mailchimp RSS feed and sync them to a Ghost blog as properly formatted posts with uploaded images and horizontal rules.\n\n## Overview\n\nThis skill automates the complete workflow of:\n1. **Fetching** newsletter content from Mailchimp's RSS feed\n2. **Converting** HTML email content to clean markdown (preserving horizontal rules, links, formatting)\n3. **Downloading** images from Mailchimp CDN\n4. **Uploading** images to Ghost\n5. **Publishing** to Ghost as Lexical-format posts with local images\n\n## Requirements\n\n- **Python 3** with packages: `beautifulsoup4`, `requests`, `feedparser`, `markdownify`, `lxml`\n- **ghst CLI** for Ghost publishing (see [ghst skill](../ghst/SKILL.md))\n- **Environment variables:**\n  - `GHOST_URL` - Your Ghost instance URL\n  - `GHOST_STAFF_ACCESS_TOKEN` - Ghost Admin API token\n\n## Installation\n\n### Python Dependencies\n\n```bash\ncd skills/sync-newsletter\npip install beautifulsoup4 requests feedparser markdownify lxml\n```\n\n### Ghost CLI (ghst)\n\nInstall globally via npm:\n```bash\nnpm install -g @tryghost/ghst\n```\n\n## Configuration\n\nSet up your Ghost credentials in `~/.openclaw/.env`:\n\n```env\nGHOST_URL=\"https://myghostblog.com\"\nGHOST_STAFF_ACCESS_TOKEN=\"your-token-id:secret\"\n```\n\n## Usage\n\n### ⚠️ CRITICAL: Always Re-fetch First\n\n**You MUST re-fetch the RSS feed every time before syncing** to ensure you're working with the latest newsletter data. The cache may contain stale or previously-processed entries.\n\n```bash\n# 1. Clear any stale cache and fetch fresh from RSS (ALWAYS DO THIS FIRST)\nrm -rf cache/ && python3 scripts/fetch_markdown.py\n\n# 2. Sync to Ghost (downloads images, uploads them, creates draft post)\npython3 scripts/sync_to_ghost.py\n```\n\n**Why this matters:** The RSS feed only shows the most recent newsletter(s). If you sync without re-fetching, you may:\n- Create duplicate posts (Ghost will add `-2`, `-3` suffixes to slugs)\n- Miss new newsletters entirely\n- Process outdated content\n\n### Cache Management\n\nAll cached data is stored in the `cache/` folder:\n- `cache/feed_cache.xml` — RSS feed cache\n- `cache/newsletter_markdown_1.md` — Generated markdown\n\nTo force a fresh fetch, delete the cache:\n```bash\nrm -rf cache/\n```\n\n### Deduplication\n\nThe sync script checks Ghost for existing posts with similar titles before creating. If a match is found, it warns you and exits. Use `--force` to create anyway:\n\n```bash\npython3 scripts/sync_to_ghost.py --force\n```\n\n## What Gets Converted\n\n### From Mailchimp HTML\n\nThe fetch script extracts and converts:\n- **Text content** — Paragraphs, headings, lists\n- **Formatting** — Bold, italic, links\n- **Images** — With filtering for social icons and spacers\n- **Horizontal rules** — `mceDividerBlockContainer` → `---`\n- **Boilerplate removal** — Unsubscribe links, preview text, social icons\n\n### To Ghost Lexical Format\n\nThe sync script creates Lexical JSON with:\n- **Paragraphs** with inline formatting (bold, italic, links)\n- **Line breaks** preserved within paragraphs\n- **Headings** (H2, H3)\n- **Images** uploaded to Ghost (not hotlinked)\n- **Horizontal rules** — `---` → `horizontalrule` nodes\n- **Blockquotes**\n- **Buttons** — Call-to-action links → Lexical `button` nodes (center-aligned by default)\n\n### Button Handling\n\nMailchimp button blocks are converted to Ghost's native Lexical button nodes:\n\n**Markdown pattern:** `[button: text](url)`\n\n**Lexical output:**\n```json\n{\n  \"type\": \"button\",\n  \"version\": 1,\n  \"buttonText\": \"Read More\",\n  \"alignment\": \"center\",\n  \"buttonUrl\": \"https://example.com\"\n}\n```\n\n**Configuration:**\n- Buttons are **center-aligned** by default (can be changed in `sync_to_ghost.py`)\n- Button text is extracted from the Mailchimp button link\n- URL is cleaned of Mailchimp tracking parameters\n\n## Script Reference\n\n### `scripts/fetch_markdown.py`\n\nFetches Mailchimp RSS and converts to clean markdown.\n\n**Features:**\n- Strips Mailchimp boilerplate (social icons, unsubscribe links, preview text)\n- Detects `mceDividerBlockContainer` elements and converts to `---` horizontal rules\n- Removes tiny spacer images and layout tables\n- Deduplicates repeated content blocks\n- Preserves actual newsletter content, images, and formatting\n\n**Configuration:**\n- `RSS_URL` — The Mailchimp feed URL (hardcoded in script)\n- `limit` — Number of entries to process (default: 1)\n- Output: `cache/newsletter_markdown_N.md`\n\n### `scripts/sync_to_ghost.py`\n\nComplete sync workflow: downloads images, uploads to Ghost, creates Lexical-format draft post.\n\n**Features:**\n- **Deduplication** — Checks for existing posts by title\n- **Image handling** — Downloads from Mailchimp CDN, uploads to Ghost via `ghst image upload`\n- **URL mapping** — Replaces external image URLs with Ghost-hosted URLs\n- **Lexical conversion** — Full markdown → Lexical JSON with:\n  - Paragraphs with inline bold/italic/link formatting\n  - Line breaks within paragraphs (preserves `<br>`-style breaks)\n  - Headings (H2, H3; skips H1 as it's the post title)\n  - Images with alt text\n  - Horizontal rules (`---` → `horizontalrule` nodes)\n  - Blockquotes\n  - **Buttons** — `[button: text](url)` pattern → center-aligned Lexical `button` nodes\n- **Draft creation** — Creates post with `newsletter` tag as draft\n\n**Command-line options:**\n- `--force` — Bypass deduplication check\n\n## Example: Manual Workflow\n\n```bash\n# Navigate to skill directory\ncd ~/.openclaw/workspace/skills/sync-newsletter\n\n# Fetch latest newsletter\npython3 scripts/fetch_markdown.py\n\n# Review the markdown\ncat cache/newsletter_markdown_1.md\n\n# Sync to Ghost (creates draft)\npython3 scripts/sync_to_ghost.py\n\n# Publish via Ghost admin when ready\n```\n\n## Troubleshooting\n\n### Duplicate posts created (slug has `-2`, `-3` suffix)\n\n**Cause:** You synced without re-fetching the RSS feed first. The cache contained an already-published newsletter.\n\n**Fix:** Always clear cache and re-fetch before syncing:\n```bash\nrm -rf cache/\npython3 scripts/fetch_markdown.py\npython3 scripts/sync_to_ghost.py\n```\n\n### No horizontal rules in output\n\nDelete cache and re-fetch:\n```bash\nrm -rf cache/\npython3 scripts/fetch_markdown.py\n```\n\n### Images not uploading\n\nCheck Ghost API is accessible:\n```bash\nghst site info --json\n```\n\n### Duplicate posts created\n\nThe deduplication should prevent this. If it fails, check the existing post title matches exactly.\n\n### Buttons not rendering as styled buttons\n\n**Cause:** The markdown may contain plain links instead of the button pattern.\n\n**Fix:** Check the generated markdown has `[button: text](url)` pattern (not just `[text](url)`). If buttons aren't detected, the Mailchimp HTML structure may have changed.\n\n## Notes\n\n- The conversion is tuned for Mailchimp's HTML structure; other newsletter platforms may need adjustments\n- Images are uploaded to Ghost and replaced in the content (no hotlinking)\n- Horizontal rules from Mailchimp dividers are preserved as `---` in markdown and converted to Ghost's `horizontalrule` nodes\n- The script preserves the conversational formatting with line breaks within paragraphs\n- **Buttons** — Mailchimp button blocks are converted to center-aligned Ghost Lexical button nodes using the `[button: text](url)` pattern\n\nFile v0.1.0:README.md\n\n# Mailchimp to Ghost SKILL\n\n**Version: 1.0.0**\n\nThis repository contains the `mailchimp-to-ghost` skill for Agents, allowing your AI agent to mirror posts made to a Mailchimp mailing list over to a Ghost blog. It's useful when migrating your content from the former to the latter.\n\nIt's available from:\n- [https://github.com/nickludlam/mailchimp-to-ghost-skill](https://github.com/nickludlam/mailchimp-to-ghost-skill)\n- [https://clawhub.ai/nickludlam/mailchimp-to-ghost](https://clawhub.ai/nickludlam/mailchimp-to-ghost)\n\n## Usage\n\nFor full details on agent capabilities, command references, and specific workflows, please see the primary [SKILL.md](SKILL.md) instruction file.\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn75m16ma7dcvhhpdvd5t9q9gs83qnpn\",\n  \"slug\": \"mailchimp-to-ghost-skill\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1784809884704\n}\n\nFile v0.1.0:skill-card.md\n\n## Description:\n\nSync Mailchimp newsletter posts to a Ghost blog by fetching newsletter content from RSS, converting HTML to clean markdown, uploading images to Ghost, and publishing Lexical-format draft posts.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[nickludlam](https://clawhub.ai/user/nickludlam)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and site operators use this skill to migrate or mirror Mailchimp newsletter posts into Ghost as reviewable draft posts with converted formatting, uploaded images, and duplicate-post checks.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill requires a Ghost Admin API token, which can grant publishing and content-management access to the target Ghost site.\n\nMitigation: Use only reviewed Ghost credentials for the intended site, store them in the expected environment variables, and review generated draft posts before publishing.\n\nRisk: The sync workflow downloads image URLs supplied by newsletter content.\n\nMitigation: Run the skill only from an environment where those network requests are acceptable, and review newsletter content and generated drafts before using force or update behavior.\n\nRisk: Cache-clearing commands can remove local cache contents when copied or run in the wrong directory.\n\nMitigation: Run commands from the intended skill directory and confirm the target path before clearing cache files.\n\n## Reference(s):\n\n- [Server-resolved source repository](https://github.com/nickludlam/mailchimp-to-ghost-skill)\n- [ClawHub skill page](https://clawhub.ai/nickludlam/skills/mailchimp-to-ghost-skill)\n- [ClawHub publisher profile](https://clawhub.ai/user/nickludlam)\n\n## Skill Output:\n\n**Output Type(s):** [markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell commands and generated markdown or Ghost Lexical post content]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates local cache files and Ghost draft posts when its scripts are run with configured Ghost credentials.]\n\n## Skill Version(s):\n\n0.1.0 (source: server-resolved release metadata and changelog)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.1.0:LICENSE\n\nMIT No Attribution\n\nCopyright 2026 Nick Ludlam\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this\nsoftware and associated documentation files (the \"Software\"), to deal in the Software\nwithout restriction, including without limitation the rights to use, copy, modify,\nmerge, publish, distribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\nPARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","readmeExcerpt":"Skill: Mailchimp To Ghost Owner: nickludlam Summary: Sync Mailchimp newsletter posts to a Ghost blog. Fetches newsletter content from RSS, converts HTML to clean markdown with horizontal rules, uploads images t... Tags: latest:0.1.0 Version history: v0.1.0 | 2026-07-23T12:31:24.704Z | auto mailchimp-to-ghost v0.1.0 - Initial release: sync Mailchimp newsletters to Ghost blog via RSS. - Converts Mailchimp HTML to clean","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"cd skills/sync-newsletter\npip install beautifulsoup4 requests feedparser markdownify lxml"},{"language":"bash","snippet":"npm install -g @tryghost/ghst"},{"language":"env","snippet":"GHOST_URL=\"https://myghostblog.com\"\nGHOST_STAFF_ACCESS_TOKEN=\"your-token-id:secret\""},{"language":"bash","snippet":"# 1. Clear any stale cache and fetch fresh from RSS (ALWAYS DO THIS FIRST)\nrm -rf cache/ && python3 scripts/fetch_markdown.py\n\n# 2. Sync to Ghost (downloads images, uploads them, creates draft post)\npython3 scripts/sync_to_ghost.py"},{"language":"bash","snippet":"rm -rf cache/"},{"language":"bash","snippet":"python3 scripts/sync_to_ghost.py --force"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: mailchimp-to-ghost\ndescription: Sync Mailchimp newsletter posts to a Ghost blog. Fetches newsletter content from RSS, converts HTML to clean markdown with horizontal rules, uploads images to Ghost, and publishes as Lexical-format posts with proper formatting.\nhomepage: https://github.com/nickludlam/mailchimp-to-ghost-skill\ncaption: Sync Mailchimp newsletter posts to Ghost blog\nmetadata:\n  openclaw:\n    emoji: \"📰\"\n    homepage: \"https://github.com/nickludlam/mailchimp-to-ghost-skill\"\n    requires:\n      bins: [\"python3\", \"ghst\"]\n      env: [\"GHOST_URL\", \"GHOST_STAFF_ACCESS_TOKEN\"]\n    primaryEnv: \"GHOST_URL\"\n---\n\n# Sync Newsletter Skill\n\nFetch newsletter posts from a Mailchimp RSS feed and sync them to a Ghost blog as properly formatted posts with uploaded images and horizontal rules.\n\n## Overview\n\nThis skill automates the complete workflow of:\n1. **Fetching** newsletter content from Mailchimp's RSS feed\n2. **Converting** HTML email content to clean markdown (preserving horizontal rules, links, formatting)\n3. **Downloading** images from Mailchimp CDN\n4. **Uploading** images to Ghost\n5. **Publishing** to Ghost as Lexical-format posts with local images\n\n## Requirements\n\n- **Python 3** with packages: `beautifulsoup4`, `requests`, `feedparser`, `markdownify`, `lxml`\n- **ghst CLI** for Ghost publishing (see [ghst skill](../ghst/SKILL.md))\n- **Environment variables:**\n  - `GHOST_URL` - Your Ghost instance URL\n  - `GHOST_STAFF_ACCESS_TOKEN` - Ghost Admin API token\n\n## Installation\n\n### Python Dependencies\n\n```bash\ncd skills/sync-newsletter\npip install beautifulsoup4 requests feedparser markdownify lxml\n```\n\n### Ghost CLI (ghst)\n\nInstall globally via npm:\n```bash\nnpm install -g @tryghost/ghst\n```\n\n## Configuration\n\nSet up your Ghost credentials in `~/.openclaw/.env`:\n\n```env\nGHOST_URL=\"https://myghostblog.com\"\nGHOST_STAFF_ACCESS_TOKEN=\"your-token-id:secret\"\n```\n\n## Usage\n\n### ⚠️ CRITICAL: Always Re-fetch First\n\n**You MUST re-fetch the RSS feed every time before syncing** to ensure you're working with the latest newsletter data. The cache may contain stale or previously-processed entries.\n\n```bash\n# 1. Clear any stale cache and fetch fresh from RSS (ALWAYS DO THIS FIRST)\nrm -rf cache/ && python3 scripts/fetch_markdown.py\n\n# 2. Sync to Ghost (downloads images, uploads them, creates draft post)\npython3 scripts/sync_to_ghost.py\n```\n\n**Why this matters:** The RSS feed only shows the most recent newsletter(s). If you sync without re-fetching, you may:\n- Create duplicate posts (Ghost will add `-2`, `-3` suffixes to slugs)\n- Miss new newsletters entirely\n- Process outdated content\n\n### Cache Management\n\nAll cached data is stored in the `cache/` folder:\n- `cache/feed_cache.xml` — RSS feed cache\n- `cache/newsletter_markdown_1.md` — Generated markdown\n\nTo force a fresh fetch, delete the cache:\n```bash\nrm -rf cache/\n```\n\n### Deduplication\n\nThe sync script checks Ghost for existing posts with similar titles before creating. If a match is found, it warns you"},{"path":"README.md","content":"# Mailchimp to Ghost SKILL\n\n**Version: 1.0.0**\n\nThis repository contains the `mailchimp-to-ghost` skill for Agents, allowing your AI agent to mirror posts made to a Mailchimp mailing list over to a Ghost blog. It's useful when migrating your content from the former to the latter.\n\nIt's available from:\n- [https://github.com/nickludlam/mailchimp-to-ghost-skill](https://github.com/nickludlam/mailchimp-to-ghost-skill)\n- [https://clawhub.ai/nickludlam/mailchimp-to-ghost](https://clawhub.ai/nickludlam/mailchimp-to-ghost)\n\n## Usage\n\nFor full details on agent capabilities, command references, and specific workflows, please see the primary [SKILL.md](SKILL.md) instruction file."},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn75m16ma7dcvhhpdvd5t9q9gs83qnpn\",\n  \"slug\": \"mailchimp-to-ghost-skill\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1784809884704\n}"},{"path":"skill-card.md","content":"## Description:\n\nSync Mailchimp newsletter posts to a Ghost blog by fetching newsletter content from RSS, converting HTML to clean markdown, uploading images to Ghost, and publishing Lexical-format draft posts.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[nickludlam](https://clawhub.ai/user/nickludlam)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and site operators use this skill to migrate or mirror Mailchimp newsletter posts into Ghost as reviewable draft posts with converted formatting, uploaded images, and duplicate-post checks.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill requires a Ghost Admin API token, which can grant publishing and content-management access to the target Ghost site.\n\nMitigation: Use only reviewed Ghost credentials for the intended site, store them in the expected environment variables, and review generated draft posts before publishing.\n\nRisk: The sync workflow downloads image URLs supplied by newsletter content.\n\nMitigation: Run the skill only from an environment where those network requests are acceptable, and review newsletter content and generated drafts before using force or update behavior.\n\nRisk: Cache-clearing commands can remove local cache contents when copied or run in the wrong directory.\n\nMitigation: Run commands from the intended skill directory and confirm the target path before clearing cache files.\n\n## Reference(s):\n\n- [Server-resolved source repository](https://github.com/nickludlam/mailchimp-to-ghost-skill)\n- [ClawHub skill page](https://clawhub.ai/nickludlam/skills/mailchimp-to-ghost-skill)\n- [ClawHub publisher profile](https://clawhub.ai/user/nickludlam)\n\n## Skill Output:\n\n**Output Type(s):** [markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell commands and generated markdown or Ghost Lexical post content]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates local cache files and Ghost draft posts when its scripts are run with configured Ghost credentials.]\n\n## Skill Version(s):\n\n0.1.0 (source: server-resolved release metadata and changelog)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."},{"path":"LICENSE","content":"MIT No Attribution\n\nCopyright 2026 Nick Ludlam\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this\nsoftware and associated documentation files (the \"Software\"), to deal in the Software\nwithout restriction, including without limitation the rights to use, copy, modify,\nmerge, publish, distribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\nPARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Sync Mailchimp newsletter posts to a Ghost blog. Fetches newsletter content from RSS, converts HTML to clean markdown with horizontal rules, uploads images t... Skill: Mailchimp To Ghost Owner: nickludlam Summary: Sync Mailchimp newsletter posts to a Ghost blog. Fetches newsletter content from RSS, converts HTML to clean markdown with horizontal rules, uploads images t... Tags: latest:0.1.0 Version history: v0.1.0 | 2026-07-23T12:31:24.704Z | auto mailchimp-to-ghost v0.1.0 - Initial release: sync Mailchimp newsletters to Ghost blog via RSS. - Converts Mailchimp HTML to clean","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1327,"uniquenessScore":45,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T10:24:45.481Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T10:24:45.481Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:14:09.113Z","emptyReason":null},"items":[{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-10T18:48:31.762Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}