Cross-post articles to Dev.to for wider developer reach
Cross-post Aeon articles to Dev.to for organic developer discovery. Articles are published with a canonical URL pointing back to the GitHub Pages gallery, preserving SEO attribution.
DEVTO_API_KEY — Dev.to API key. Generate at https://dev.to/settings/extensions (scroll to "DEV Community API Keys"). If not set, the skill logs a skip and exits silently — no error, no notification.Check for API key — verify DEVTO_API_KEY is available:
if [ -z "$DEVTO_API_KEY" ]; then
echo "SYNDICATE_SKIP: DEVTO_API_KEY not configured"
exit 0
fi
If missing, log "SYNDICATE_SKIP: DEVTO_API_KEY not configured" to memory/logs/${today}.md and stop. Do NOT send any notification.
Select the article to syndicate:
${var} is set, use articles/${var} directly..md file in articles/ (excluding feed.xml and .gitkeep):
ls -t articles/*.md 2>/dev/null | head -1
Check for duplicates — before posting, check if this article was already syndicated:
memory/logs/ for SYNDICATED: entries containing this filename.Parse the article:
# Heading line. If the article has Jekyll frontmatter with a title: field, use that instead.YYYY-MM-DD from the filename using regex ([0-9]{4}-[0-9]{2}-[0-9]{2}).Determine tags from the filename slug (max 4 tags for Dev.to):
repo-article, article → ai, github, automation, agentstoken-report, token-alert, defi-overview, defi-monitor → crypto, defi, blockchain, tradingchangelog, push-recap, weekly-shiplog → opensource, devops, changelog, githubdigest, rss-digest, hacker-news → news, tech, ai, digestdeep-research, research-brief, paper-pick → research, ai, machinelearning, paperstechnical-explainer → tutorial, ai, explainer, programmingai, automation, agents, programmingBuild the canonical URL pointing to the GitHub Pages post:
https://aaronjmars.github.io/aeon/articles/YYYY/MM/DD/<slug>/
Where <slug> is derived the same way update-gallery builds Jekyll post filenames: title lowercased, spaces replaced with hyphens, special characters removed, truncated to 50 chars.
Post to Dev.to using WebFetch (not curl, due to sandbox auth limitations):
https://dev.to/api/articles with headers:
Content-Type: application/jsonapi-key: <DEVTO_API_KEY>{
"article": {
"title": "<extracted title>",
"body_markdown": "<article body>",
"published": true,
"tags": ["tag1", "tag2", "tag3", "tag4"],
"canonical_url": "<github pages URL>",
"series": "Aeon"
}
}
url field (the Dev.to article URL) and id.Handle errors:
Log the result to memory/logs/${today}.md:
SYNDICATED: {filename} → {devto_url}
Send notification via ./notify:
Article syndicated to Dev.to
"{article title}" is now live on Dev.to, reaching 1M+ developers beyond our GitHub Pages audience.
Dev.to: {devto_url}
Original: {canonical_url}
The Dev.to API requires DEVTO_API_KEY in request headers. Since the sandbox blocks env var expansion in curl headers, use WebFetch for the API call — WebFetch can make authenticated HTTP requests. If WebFetch cannot pass custom headers, fall back to the post-process pattern: write the request payload to .pending-devto/post.json and let scripts/postprocess-devto.sh execute the actual API call after Claude finishes.