Noise2blog logo

Noise2blog

Organization
Varnan-Tech
noise2blog

Turns rough notes, bullet points, voice transcripts, or tweet dumps into a polished, publication-ready blog post. Optionally enriches with Tavily research to add supporting data and credibility to claims. Use when asked to write a blog post from notes, turn rough ideas into an article, expand bullet points into a full post, clean up a voice transcript into a blog, or repurpose a tweet thread as an article. Trigger when a user says "write a blog post from this", "turn these notes into a post", "expand this into an article", "make this publishable", "I have rough notes write a blog", or "clean up this transcript".

Overview

PublisherVarnan-Tech
Repositoryopendirectory
Skill namenoise2blog
Stars
674
Forks
74
Bundled files
3
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.

  • 3 bundled files

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

  • Open source

    Published by Varnan-Tech on GitHub. Read the source before you install it.

Installation

Install the Noise2blog 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/Varnan-Tech/opendirectory/tree/main/skills/noise2blog
  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/Varnan-Tech/opendirectory.git /tmp/opendirectory
mkdir -p .claude/skills
cp -r /tmp/opendirectory/skills/noise2blog .claude/skills/noise2blog
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Noise2blog 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 Noise2blog 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 Noise2blog 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.

Noise to Blog

Take any rough input (bullet points, voice transcripts, tweet dumps, or short drafts) and produce a polished, publication-ready blog post. Every claim traces to the source material or Tavily-verified research.


Critical rule: DO NOT INVENT SPECIFICS. Every claim, metric, and example in the blog post must come from the raw input or a Tavily search result. Never fabricate data, quotes, or outcomes.


Step 1: Setup Check

Confirm required env vars are set:

bash
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+set}"
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:-not set, Tavily enrichment will be skipped}"

If GEMINI_API_KEY is missing: Stop. Tell the user: "GEMINI_API_KEY is required. Get it at aistudio.google.com → Get API key. Add it to your .env file."

If TAVILY_API_KEY is missing: Continue. Note that Tavily enrichment will be skipped. The blog post will be based entirely on the provided content. This is fine for personal stories, tutorials from experience, or opinion pieces.

Confirm input is present. The user must provide one of:

  • Pasted text (bullet points, rough notes, transcript, tweet dump, short draft)
  • A URL to fetch

If no input, ask: "Share your rough notes, bullet points, or transcript. Paste them directly, or give me a URL to fetch the source."


Step 2: Read and Analyze Input

If input is a URL: Fetch the page content using WebFetch. Extract: title, author, publish date, all body text, key statistics, numbered lists, subheadings, quotes.

If input is pasted text: Read it directly. Identify the input type:

  • Bullet points or rough notes: fragmented ideas, incomplete sentences, stream of consciousness
  • Voice transcript: conversational, repetitive, filler words (um, uh, like, you know), meandering sentences
  • Tweet thread dump: short fragments, @mentions, hashtags, "1/8" numbering
  • Short draft: structured but thin, needs expansion and polish

QA checkpoint: State before continuing:

  1. Input type detected
  2. Core thesis or main argument in one sentence
  3. The 3-5 strongest insights, facts, or ideas from the raw content
  4. Any claims that need external verification (benchmarks, statistics, product comparisons, research findings)

If you cannot identify a core thesis, ask: "What's the single most important thing you want readers to take away from this?"


Step 3: Choose Blog Post Style

Four styles. Auto-detect from content signals. User override always respected.

StyleWhen to useSignals
Technical TutorialStep-by-step guide, how-to, code walkthroughNumbered steps, commands, code snippets, "how to" in content
Case StudyBefore/after story, build log, lessons learnedSpecific results, timelines, first-person journey
Thought LeadershipOpinion, argument, counterintuitive claim"I think", "the problem with X", contrarian position, debate framing
ExplainerWhat is X, why it matters, how it worksConcept-first, comparison-heavy, "most people don't know"

Detection logic:

  • Content has numbered steps or commands → Technical Tutorial
  • Content has before/after, specific metrics, or narrative arc → Case Study
  • Content argues against common wisdom or makes a strong opinion claim → Thought Leadership
  • Content explains a concept, tool, or trend for people unfamiliar with it → Explainer

State chosen style and reasoning. If ambiguous, pick one and note the choice.


Step 4: Enrich with Tavily Research

Skip this step silently if TAVILY_API_KEY is not set.

Search for supporting evidence for claims in the raw content that could benefit from verification or data. Good candidates:

  • Product benchmarks or performance numbers
  • Market statistics or industry trends
  • Technical comparisons ("X is faster than Y")
  • Any number the user mentioned from memory rather than a cited source

Run one Tavily search per claim that needs verification. Limit to 3 searches maximum to avoid over-sourcing:

bash
curl -s -X POST "https://api.tavily.com/search" \
  -H "Content-Type: application/json" \
  -d '{
    "api_key": "'"$TAVILY_API_KEY"'",
    "query": "SPECIFIC_CLAIM_OR_TOPIC",
    "search_depth": "advanced",
    "max_results": 5,
    "include_answer": true
  }'

Keep results with score >= 0.65. Extract: title, url, content snippet.

Rules for using Tavily results:

  • Use them to support or verify claims already present in the raw input. Never introduce entirely new claims from search results.
  • Attribute sources naturally in the text: "according to [Source]", "data from [X] shows"
  • If no Tavily result confirms a claim, leave the claim unverified rather than substituting an unrelated result

Step 5: Generate the Blog Post

Read references/blog-format.md in full. Select the matching template from references/output-template.md. Internalize all rules before generating.

Write the Gemini request to a temp file to handle special characters safely:

bash
cat > /tmp/noise2blog-request.json << 'ENDJSON'
{
  "system_instruction": {
    "parts": [{
      "text": "You are a tech writer who sounds like a real person. Rules: Active voice only. Short paragraphs, 1-3 lines max, then a blank line. Use contractions naturally (don't, won't, it's, can't, you're, they're). No em dashes — use a comma or period instead. No semicolons. Every sentence needs a concrete detail: a number, a tool name, a file name, a command, a result. No filler phrases: no 'In today's rapidly evolving', no 'Let's dive in', no 'It's worth noting', no 'In conclusion', no 'I hope this was helpful'. No banned words: incredible, amazing, leveraging, synergize, game-changing, groundbreaking, revolutionary, paradigm, cutting-edge, seamless, robust, unprecedented, delve, harness, utilize, transformative, disruptive, unlock, comprehensive, actionable, crucial, pivotal. Title must not start with I, My, or We. Open with a hook paragraph that does not announce the topic. Close with something actionable. Do not invent claims, metrics, or outcomes not present in the source material."
    }]
  },
  "contents": [{
    "parts": [{
      "text": "RAW_CONTENT_AND_INSTRUCTIONS_HERE"
    }]
  }],
  "generationConfig": {
    "temperature": 0.7,
    "maxOutputTokens": 4096
  }
}
ENDJSON

Replace RAW_CONTENT_AND_INSTRUCTIONS_HERE with:

  • The raw input content
  • The blog post style and structure instructions (from the selected template)
  • Any Tavily research results gathered in Step 4
  • Word target: 800-1,800 words

Post the request:

bash
curl -s -X POST \
  "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d @/tmp/noise2blog-request.json \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"

Also produce:

  • (B) A 1-2 sentence meta description for SEO preview text
  • (C) One alternative title using a different hook angle

Step 6: Self-QA

Run every check and fix violations before presenting:

  • Title does not start with "I", "My", or "We"
  • Title is specific and conversational (not "A Comprehensive Guide to X" or "The Ultimate Guide to Y")
  • Opening paragraph hooks without announcing the topic ("In this post I will...")
  • No em dashes in any line
  • No semicolons
  • No paragraph longer than 3 lines before a blank line
  • No banned words: incredible, amazing, leveraging, game-changing, delve, harness, unlock, groundbreaking, cutting-edge, remarkable, paradigm, revolutionize, seamless, robust, utilize, unprecedented, comprehensive, actionable, crucial, pivotal
  • No invented data: every claim traces to the raw input or a Tavily result
  • Post does not end with "In conclusion", "To summarize", or "I hope this helped"
  • 800-1,800 words (state the word count)
  • Logical flow: opening → problem/context → body sections → actionable close

Fix any violation before presenting. State the final word count.


Step 7: Output

Present the full blog post in a code block.

Present the meta description and alternative title below the main post.

Ask: "Ready to copy this to your editor? If you're publishing to a specific platform, let me know and I can format the frontmatter."

On platform-specific request:

Ghost:

yaml
---
title: "POST_TITLE"
date: YYYY-MM-DD
tags: [tag1, tag2]
status: draft
---

dev.to:

yaml
---
title: POST_TITLE
description: META_DESCRIPTION
tags: [tag1, tag2, tag3]
published: false
---

Substack: Present as plain Markdown. Substack's editor imports markdown directly.

Hashnode:

yaml
---
title: POST_TITLE
subtitle: META_DESCRIPTION
tags: [tag1, tag2]
---

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 Noise2blog AI skill do?

Turns rough notes, bullet points, voice transcripts, or tweet dumps into a polished, publication-ready blog post. Optionally enriches with Tavily research to add supporting data and credibility to claims. Use when asked to write a blog post from notes, turn rough ideas into an article, expand bullet points into a full post, clean up a voice transcript into a blog, or repurpose a tweet thread as an article. Trigger when a user says "write a blog post from this", "turn these notes into a post", "expand this into an article", "make this publishable", "I have rough notes write a blog", or "clea...

Why use Noise2blog on TypingMind?

Because you install it once and use it with any model. Noise2blog 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 Noise2blog in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/Varnan-Tech/opendirectory/tree/main/skills/noise2blog. 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 Noise2blog?

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 Noise2blog?

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

Is the Noise2blog AI skill free?

Yes. It is published on GitHub by Varnan-Tech 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 👇