Technical Blog Writing Write developer-focused technical blog posts via inference.sh CLI. Quick Start Requires inference.sh CLI ( infsh ). Get installation instructions: npx skills add inference-sh/skills@agent-tools infsh login
Research topic depth
infsh app run exa/search --input '{ "query": "building REST API Node.js best practices 2024 tutorial" }'
Generate header image
infsh app run infsh/html-to-image --input '{ "html": "
// engineering blog
How We Reduced API Latency by 90% with Edge Caching
A deep dive into our CDN architecture
What this code does (one line)
def calculate_retry_delay(attempt: int, base_delay: float = 1.0) -> float: """Exponential backoff with jitter.""" delay = base_delay * (2 ** attempt) jitter = random.uniform(0, delay * 0.1) return delay + jitter
Usage
delay = calculate_retry_delay(attempt=3) # ~8.0-8.8 seconds
Explanation Depth
| Audience Signal | Depth |
|---|---|
| "Getting started with X" | Explain everything, assume no prior knowledge |
| "Advanced X patterns" | Skip basics, go deep on nuances |
| "X vs Y" | Assume familiarity with both, focus on differences |
| "How we built X" | Technical audience, can skip fundamentals |
| State your assumed audience level explicitly at the start: | |
| "This post assumes familiarity with Docker and basic Kubernetes concepts. | |
| If you're new to containers, start with [our intro post]." | |
| ## Blog Post Structure | |
| ### The Ideal Structure | |
| ```markdown | |
| # Title (contains primary keyword, states outcome) | |
| [Hero image or diagram] | |
| TL;DR: [2-3 sentence summary with key takeaway] | |
| ## The Problem / Why This Matters | |
| [Set up why the reader should care — specific, not generic] | |
| ## The Solution / How We Did It | |
| [Core content — code, architecture, explanation] | |
| ### Step 1: [First thing] | |
| [Explanation + code + output] | |
| ### Step 2: [Second thing] | |
| [Explanation + code + output] | |
| ## Results | |
| [Numbers, benchmarks, outcomes — be specific] | |
| ## Trade-offs and Limitations | |
| [Honest about downsides — builds trust] | |
| ## Conclusion | |
| [Key takeaway + what to do next] | |
| ## Further Reading | |
| [3-5 relevant links] | |
| Word Count by Type | |
| Type | |
| Word Count | |
| Why | |
| Quick tip | |
| 500-800 | |
| One concept, one example | |
| Tutorial | |
| 1,500-3,000 | |
| Step-by-step needs detail | |
| Deep dive | |
| 2,000-4,000 | |
| Thorough exploration | |
| Architecture post | |
| 2,000-3,500 | |
| Diagrams carry some load | |
| Benchmark | |
| 1,500-2,500 | |
| Data and charts do heavy lifting | |
| Diagrams and Visuals | |
| When to Use Diagrams | |
| Scenario | |
| Diagram Type | |
| Request flow | |
| Sequence diagram | |
| System architecture | |
| Box-and-arrow diagram | |
| Decision logic | |
| Flowchart | |
| Data model | |
| ER diagram | |
| Performance comparison | |
| Bar/line chart | |
| Before/after | |
| Side-by-side | |
| # Generate architecture diagram | |
| infsh app run infsh/html-to-image | |
| --input | |
| '{ | |
| "html": " Client React App → Edge CDN Cache → API Node.js → Database PostgreSQL |
|
| }' | |
| # Generate benchmark chart | |
| infsh app run infsh/python-executor | |
| --input | |
| '{ | |
| "code": "import matplotlib.pyplot as plt\nimport matplotlib\nmatplotlib.use(\"Agg\")\n\nfig, ax = plt.subplots(figsize=(12, 6))\nfig.patch.set_facecolor(\"#0f172a\")\nax.set_facecolor(\"#0f172a\")\n\ntools = [\"Express\", \"Fastify\", \"Hono\", \"Elysia\"]\nrps = [15000, 45000, 62000, 78000]\ncolors = [\"#64748b\", \"#64748b\", \"#3b82f6\", \"#64748b\"]\n\nax.barh(tools, rps, color=colors, height=0.5)\nfor i, v in enumerate(rps):\n ax.text(v + 1000, i, f\"{v:,} req/s\", va=\"center\", color=\"white\", fontsize=14)\n\nax.set_xlabel(\"Requests per second\", color=\"white\", fontsize=14)\nax.set_title(\"HTTP Framework Benchmark (Hello World)\", color=\"white\", fontsize=18, fontweight=\"bold\")\nax.tick_params(colors=\"white\", labelsize=12)\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nax.spines[\"bottom\"].set_color(\"#334155\")\nax.spines[\"left\"].set_color(\"#334155\")\nplt.tight_layout()\nplt.savefig(\"benchmark.png\", dpi=150, facecolor=\"#0f172a\")\nprint(\"Saved\")" | |
| }' | |
| Distribution | |
| Where Developers Read | |
| Platform | |
| Format | |
| How to Post | |
| Your blog | |
| Full article | |
| Primary — own your content | |
| Dev.to | |
| Cross-post (canonical URL back to yours) | |
| Markdown import | |
| Hashnode | |
| Cross-post (canonical URL) | |
| Markdown import | |
| Hacker News | |
| Link submission | |
| Show HN for projects, tell HN for stories | |
| Reddit (r/programming, r/webdev, etc.) | |
| Link or discussion | |
| Follow subreddit rules | |
| Twitter/X | |
| Thread summary + link | |
| See twitter-thread-creation skill | |
| Adapted version + link | |
| See linkedin-content skill | |
| # Cross-post thread to X | |
| infsh app run x/post-create | |
| --input | |
| '{ | |
| "text": "New blog post: How We Reduced API Latency by 90%\n\nThe short version:\n→ Moved computation to edge\n→ Aggressive cache-control headers\n→ Eliminated N+1 queries\n\np99 went from 800ms to 90ms.\n\nFull deep dive with code: [link]" | |
| }' | |
| Common Mistakes | |
| Mistake | |
| Problem | |
| Fix | |
| No TL;DR | |
| Busy devs leave before getting the point | |
| 2-3 sentence summary at the top | |
| Broken code examples | |
| Destroys all credibility | |
| Test every code block before publishing | |
| No version pinning | |
| Code breaks in 6 months | |
| "Works with Node 20, React 18.2" | |
| "Simply do X" | |
| Dismissive, condescending | |
| Remove "simply", "just", "easily" | |
| No diagrams for architecture | |
| Walls of text describing systems | |
| One diagram > 500 words of description | |
| Marketing tone | |
| Developers instantly disengage | |
| Direct, technical, honest | |
| No trade-offs section | |
| Reads as biased marketing | |
| Always discuss downsides | |
| Giant introduction before content | |
| Readers bounce | |
| Get to the point in 2-3 paragraphs | |
| Unpinned dependencies | |
| Tutorial breaks for future readers | |
| Pin versions, note date written | |
| No "Further Reading" | |
| Dead end, no context | |
| 3-5 links to deepen understanding |