Blog Generation logo

Blog Generation

Organization
hyperfx-ai
blog-generation

Generate one excellent, on-brand blog post per run for any business, built to rank on Google and get cited by AI search (ChatGPT, Claude, Perplexity, AI Overviews). A stateful engine: reads a brand strategy doc, picks a fresh topic (never repeats), researches, writes in the brand's voice, and logs the post back. Use when the user wants to write a blog post, run a daily or recurring blog task, or generate SEO / AEO / blog content. For keyword data and audits, defer to seo-research.

Overview

Publisherhyperfx-ai
Repositorymarketing-skills
Skill nameblog-generation
Stars
107
Forks
21
Bundled files
5
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 5 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by hyperfx-ai on GitHub. Read the source before you install it.

Installation

Install the Blog Generation AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/hyperfx-ai/marketing-skills/tree/main/skills/blog-generation
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/hyperfx-ai/marketing-skills.git /tmp/marketing-skills
mkdir -p .claude/skills
cp -r /tmp/marketing-skills/skills/blog-generation .claude/skills/blog-generation
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Blog Generation in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Blog Generation on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Blog Generation is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Blog Generation

One job, done well: produce a single excellent, on-brand blog post per run, optimized to rank on Google and get cited by AI search, and never repeat what you have already written. Built to run as a recurring task (for example, one post a day) or on demand for any business in any vertical: a dentist, a jeweler, a B2B SaaS, a DTC brand.

The whole game is captured in two ideas. First, AI search visibility is SEO done well: unique, genuinely useful, people-first content with a clear point of view, structured so a machine can extract a clean answer. There is no secret AEO hack. Second, the engine has memory: a single blog-strategy.md file, saved in persistent storage, holds the brand's context plus a running log of every post. That log is what stops it from ever repeating itself.

The memory contract (the most important rule in this skill). The log lives in a real file that survives between runs. On the FIRST run it does not exist, so you create it. On EVERY run after that it already exists, so you read it into context before doing anything, then append the new post to it before you finish. Same brand, same file path, every time. If you ever write a post without first reading the log, or finish a run without appending to it, the engine is broken: it will loop and repeat topics. Read-the-log-first and append-the-log-last are non-skippable.

Requirements

  • Hyper MCP connected. https://app.hyperfx.ai/mcp
  • A brand strategy doc (blog-strategy.md) in persistent files. If it does not exist yet, the engine builds one on the first run (Step 0). This is what lets it write in the brand's real voice and avoid repeats.
  • Recommended toolkits, enabled at https://app.hyperfx.ai/apps: Firecrawl (read the brand's site), HyperSEO (validate topics, see what ranks and what AI cites), Google Search Console (mine real signals and measure). Without them you can still draft, but flag that topic and ranking calls are unvalidated.

How to run the tools in this skill

Every tool in this skill is named by its canonical tool name. Run it with the call your surface gives you:

SurfaceFind a toolRun it
Hyper chatCall the tool by its name; search_tools(queries=["<provider> <action>"]) shows its parameters<name>(...)
MCP client (Claude, Cursor, Codex, ChatGPT)search("<what you want to do>"), then describe("<name>")call_read("<name>", {...}), call_write or call_destructive: the one that describe names in call_with
Hyper CLIhyperai search "<what you want to do>", then hyperai describe <name>hyperai call <name> --json '{...}'

If a tool is not found: in Hyper chat, find its toolkit id with discover_toolkits and pass it to enable_toolkit. On an MCP client or the CLI, tell the user which integration to connect in Hyper.

Tool surface

JobTools
Read and write blog-strategy.md and the post draftfiles_read, files_create, files_edit (add a log row with files_edit(path=..., mode="append", new_str="<the new log row>\n"))
Learn the brand from their site (Step 0)firecrawl_urls_scrape, web_pages_scrape
Validate a topic and study the SERP / AI answerhyperseo_search_volume_get, hyperseo_keyword_difficulty_get, hyperseo_intents_search, hyperseo_ai_search_volume_get, hyperseo_serp_results_get, hyperseo_ai_overviews_get
Mine real-world signal and measure impactgoogle_search_console_performance_get(site_url=..., start_date="YYYY-MM-DD", end_date="YYYY-MM-DD", dimensions=["query","page"], row_limit=1000). Take site_url from connections_info(toolkit_id="google_search_console_toolkit"). End the range 3 or more days ago: newer days are not complete.
Check whether AI recommends the brandhyperseo_mentions_track

Out of scope: defer to other skills

RequestSend them to
Keyword research, SERP / AI-Overview analysis, competitor benchmarks, site audits, AI-visibility trackingseo-research
Turn a YouTube video into a postyoutube
What real customers say (Reddit, reviews) to ground a postcustomer-research
Publish to a social channellinkedin, instagram, tiktok

The run (do this every time the task fires)

To run it daily, read the task-management skill, then create a Task: tasks_create(name="Daily blog post: <brand>", action={"type": "agent", "instructions": "Run the blog-generation skill for <brand>. The strategy doc is /files/<brand-slug>/blog-strategy.md."}, trigger={"type": "schedule", "schedule": {"kind": "cron", "expression": "0 9 * * *", "timezone": "<the user's time zone>"}}, thread_policy="new_each_run").

Step 0 (first run only): build the strategy doc. If blog-strategy.md does not exist, create it before writing anything. First read /files/<brand-slug>/brand-context.md with files_read; if it exists, copy its positioning, audience, voice and proof into the Brand brief. Only if it does not exist, read the brand's site (firecrawl_urls_scrape on homepage, about, best existing posts, product/pricing) and fill the Brand brief using the method in references/brand-voice-and-quality.md. Seed the Topic backlog with 8 to 15 candidate topics (validate with HyperSEO where available). Then continue to Step 1. If anything critical is unknown (real proof assets, the brand's actual positioning): in a chat, ask the user. In a scheduled run, do not ask: skip the claim, write the open question into the strategy doc, and send it with notify_user at the end of the run.

Step 1: load your memory (read the log). Open the brand's blog-strategy.md from its saved file path and read ALL of it into context: the Brand brief (the contract every draft honors) and the entire Published log (everything already written). This happens on every run after the first, with no exceptions. You cannot pick a fresh topic without it.

Step 2: plan today's post. Pick ONE topic that is not in the Published log and is genuinely distinct from it (see "Picking a fresh topic" below). Write a one-line plan capturing exactly these four things, and record it in the strategy doc:

  • Title / topic: the working title and the primary query it targets.
  • Where it is coming from: the source or trigger (a backlog item, a GSC gap, a customer question, a keyword gap, a news hook, a piece of the brand's own expertise or data).
  • What it is going to do: the archetype (listicle, comparison, how-to, what-is, alternatives, pillar, pain/diagnostic, original research, case study, glossary) from references/blog-archetypes.md.
  • The research it is going to do: the specific checks for this post (SERP read, AI Mode check (hyperseo_ai_overviews_get), sources to pull, the brand proof to feature).

Step 3: research. Run the plan. Validate the target with hyperseo_search_volume_get, hyperseo_keyword_difficulty_get, hyperseo_intents_search and hyperseo_ai_search_volume_get (each takes keywords=[...]). Study what wins (hyperseo_serp_results_get(keyword=...)) and the sources that Google AI Mode cites (hyperseo_ai_overviews_get(keyword=...)). Read the top pages and find the angle they all miss. Pull the real facts, stats, and named sources you will cite. Never fabricate.

Step 4: write the post. Build to the archetype spec in references/blog-archetypes.md, in the brand's voice from the Brand brief. That one file holds what the post needs: the type's structure, schema and AI-citation lever, the AI tells to strip, and the gate of Step 5.

Step 5: run the quality gate. Pass every item in the pre-publish gate at the end of references/blog-archetypes.md before the post is done: on-brand voice, no AI tells, no fabrication, answer-first structure, on-page and schema, baseline captured. If anything fails, fix it.

Step 6: update your memory (append to the log). Append the finished post as a new row in the Published log in blog-strategy.md (date, title, slug, archetype, target query, source, link), and save the file back to the same path. Remove the topic from the backlog and add any new ideas the research surfaced. This append is exactly what the next run reads to avoid repeating you. Never finish a run without it.

Step 7: deliver. Save the post to /files/<brand-slug>/posts/<slug>.md with files_create, and show it with sandbox_files_display(path="/files/<brand-slug>/posts/<slug>.md"). To publish, call connections_info(toolkit_id=<the brand's CMS toolkit>) for the site, then: WordPress.com wordpress_posts_create(site=..., title=..., content=..., status="publish"); self-hosted WordPress wordpress_org_posts_create(title=..., content=..., status="publish"); Ghost ghost_posts_create(title=..., html=..., status="published"); Wix wix_posts_create_and_publish(title=..., html=...); Webflow webflow_collection_items_create(collection_id=..., field_data={...}), then webflow_publish_site(site_id=...). Put the live URL in the log's Link column. Set the expectation that ranking moves in days to weeks and AI citations in weeks.

Picking a fresh topic (so it never loops)

Each run must produce something new. To choose:

  1. Exclude everything in the Published log and anything that merely rewords it (same intent under a different title is a repeat).
  2. Prefer the highest-priority unblocked backlog item that fits the brand and has real demand.
  3. Vary the shape. If the last few posts were listicles, write a how-to, a pain/diagnostic, or an original-data piece. A healthy blog mixes archetypes.
  4. Pull from live signal where available: GSC queries the brand ranks for on page two (google_search_console_performance_get), keyword gaps (defer to seo-research), recurring customer questions, or a timely news hook in the brand's space.
  5. Lean on the brand's own substance. The most citable, least repeatable posts use the brand's proprietary data, real customer outcomes, or first-hand expertise. Reach for these often.

The strategy doc (blog-strategy.md) — the engine's memory

One Markdown file per brand, saved at a stable path in persistent storage (for example /files/<brand-slug>/blog-strategy.md) and reused at that SAME path on every run. Create it in Step 0, read it in Step 1, append to it in Step 6. The Published log section is the part that prevents repeats; it only ever grows. Template:

markdown
# Blog Strategy: [Business name]

## Brand brief
- Business: [what they do, one sentence]
- Sells: [products / services]
- Audience / ICP: [the specific customer]
- Category + one-liner: "[Brand] is a [category] for [audience] that [core value]."
- Voice: [tone, reading level, point of view]
- Words we use / words we avoid: [...]
- Proof assets: [real numbers, customers, credentials, data, stories]
- Primary site: [url]
- Target topics / seed keywords: [themes]
- Publishing: [CMS toolkit id, site, cadence]

## Topic backlog (planned, prioritized)
| Priority | Working title | Archetype | Target query | Source / angle | Status |
| --- | --- | --- | --- | --- | --- |
| 1 | ... | ... | ... | ... | planned |

## Published log (do NOT repeat anything here)
| Date | Title | Slug | Archetype | Target query | Source | Link |
| --- | --- | --- | --- | --- | --- | --- |

Non-negotiables (true on every run)

  • Unique and people-first beats every hack. If a model could already write the post from common knowledge, or ten pages already say it, do not publish it. Lead with the brand's real angle.
  • Answer first, then explain. Open the post and every section with the direct answer. AI extracts it; Google rewards it.
  • On-brand and human, or it backfires. Off-brand, AI-tell-ridden, salesy content erodes trust and AI engines deprioritize it. The brand's real voice is the asset.
  • Specific and verifiable, never vague or invented. Numbers, names, dates, real sources. Never fabricate a stat, quote, customer, or credential.
  • One new post per run, always logged. The log is what makes the engine an engine instead of a loop.

Also handles: optimizing an existing post

The same references cover improving a page that already exists (rewrite a weak title and lead for a high-impression, low-CTR page, add structure and schema, sharpen the brand's recommendation context). Use references/on-page-and-technical.md, and log the change in the strategy doc.

References

  • references/blog-archetypes.md: authoritative per-type specs for 10 blog types, each with structure, length, schema, AI-citation lever, and pitfalls. Listicles get the fullest treatment; then the AI tells to strip and the pre-publish quality gate.
  • references/blog-playbook.md: answer-first structure; copy-paste content-block templates; the proven GEO writing rules; topic clusters; improving an existing post.
  • references/brand-voice-and-quality.md: extract a voice profile from the brand's site; positioning clarity; the substance rules.
  • references/ai-citation-playbook.md: the Princeton GEO factor order; E-E-A-T and author/entity signals; off-page mentions; per-engine notes; the honest Google stance.
  • references/on-page-and-technical.md: on-page checklist; JSON-LD schema and deprecations; crawlability / AI-bot / server-rendering gates; how to measure impact.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Blog Generation AI skill do?

Generate one excellent, on-brand blog post per run for any business, built to rank on Google and get cited by AI search (ChatGPT, Claude, Perplexity, AI Overviews). A stateful engine: reads a brand strategy doc, picks a fresh topic (never repeats), researches, writes in the brand's voice, and logs the post back. Use when the user wants to write a blog post, run a daily or recurring blog task, or generate SEO / AEO / blog content. For keyword data and audits, defer to seo-research.

Why use Blog Generation on TypingMind?

Because you install it once and use it with any model. Blog Generation is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Blog Generation in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/hyperfx-ai/marketing-skills/tree/main/skills/blog-generation. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Blog Generation?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Blog Generation?

As many as you like. As long as a model supports skills, you can use Blog Generation with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Blog Generation AI skill free?

Yes. It is published on GitHub by hyperfx-ai under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇