nicepkg/astro-cta-injector
Inject Call-to-Action blocks into Astro site content with intelligent placement strategies. Use when the user wants to add CTAs, newsletter signups, product promotions, or any content blocks to blog posts. Supports multiple placement strategies (end, after 50%, after 60%), content scoring for relevance, and dry-run preview.
npx skills add https://github.com/nicepkg/ai-workflow --skill astro-cta-injector
This skill injects Call-to-Action (CTA) blocks into Astro site content. It supports:
.astro or .md filesCreate a config.json in the skill directory:
{
"content_path": "./src/content/blog",
"file_patterns": ["*.astro", "*.md"],
"cta_types": {
"newsletter": {
"template": "newsletter.html",
"default_placement": "after-paragraph-50%",
"keywords": ["tip", "guide", "learn", "strategy"]
},
"product": {
"template": "product.html",
"default_placement": "end",
"keywords": ["productivity", "task", "habit", "goal"]
}
},
"output": {
"state_file": "./state/cta_injection_progress.json",
"backup_dir": "./backups",
"report_file": "./reports/cta_injection_report.md"
},
"dry_run": true
}
| Strategy | Description | Best For |
|----------|-------------|----------|
| end | After all content | Non-intrusive CTAs |
| after-paragraph-50% | After 50% of paragraphs | Mid-content engagement |
| after-paragraph-60% | After 60% of paragraphs | Later engagement |
| after-heading | After first H2 | Early engagement |
| before-conclusion | Before last paragraph | Strong finish |
Templates are HTML files in the templates/ directory:
<!-- templates/newsletter.html -->
<aside class="cta-newsletter" data-cta-type="newsletter">
<h3>{{title}}</h3>
<p>{{description}}</p>
<form action="{{form_url}}" method="post">
<input type="email" placeholder="Your email" required />
<button type="submit">Subscribe</button>
</form>
</aside>
Variables:
{{title}} - CTA headline{{description}} - CTA body text{{form_url}} - Form submission URL{{product_url}} - Product link{{image_url}} - Image sourcepython scripts/score_posts.py --content-path ./src/content/blog --cta-type newsletter
python scripts/preview_injection.py --input scored_posts.json --cta-type newsletter
python scripts/inject_ctas.py --input scored_posts.json --cta-type newsletter
Scored posts JSON:
{
"posts": [
{
"file_path": "./src/content/blog/my-post.astro",
"title": "My Blog Post",
"relevance_score": 8.5,
"cta_type": "newsletter",
"placement": "after-paragraph-50%",
"cta_data": {
"title": "Get More Tips Like This",
"description": "Subscribe to my weekly newsletter"
}
}
]
}
Posts are scored for CTA relevance based on:
Scores range from 0-10. Default threshold: 5.0
User: "Add a newsletter signup CTA to all my productivity-related blog posts"
Claude will:
Take nicepkg/astro-cta-injector from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.