# Writing Blogs

Writes, structures, and formats SEO-optimized blog posts for the Appwrite blog...

- Repository: https://github.com/appwrite/appwrite (57838 stars)
- Category: Marketing
- License: BSD-3-Clause
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add appwrite/appwrite --skill writing-blogs -g -a claude-code -y`
Codex: `npx skills add appwrite/appwrite --skill writing-blogs -g -a codex -y`
Cursor: `npx skills add appwrite/appwrite --skill writing-blogs -g -a cursor -y`
Gemini CLI: `npx skills add appwrite/appwrite --skill writing-blogs -g -a gemini-cli -y`

## Description

Writes, structures, and formats SEO-optimized blog posts for the Appwrite blog following established conventions for voice, tone, frontmatter, and post structure. Use when the user asks to write, draft, create, or outline a blog post, or when working with files in src/content/blog/posts/.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

## Repository layout (apps/console)

This skill targets the Console app at `apps/console` in `appwrite/appwrite`; paths are relative to it. Path mapping from the upstream `appwrite/website` skills:

| Artifact | Path |
| --- | --- |
| Blog post | `src/content/blog/posts/<slug>.markdoc` |
| Docs page | `src/content/docs/{path}/index.markdoc` |
| Changelog entry | `src/content/changelog/entries/<YYYY-MM-DD>.markdoc` |
| Cover image | `public/images/blog/<slug>/cover.avif` (min 1200px wide; run `bun run generate:cover-manifest` after adding) |

Also apply the `unslop` skill to all user-facing prose.



# Blog Writing

## Blog structure

Each blog post is a single file at `src/content/blog/posts/<slug>.markdoc` (e.g. `src/content/blog/posts/my-post-slug.markdoc`). Every file must start with this frontmatter:

```yaml
---
layout: post
title: "Full title as a string"
description: One sentence summary of what the post covers.
date: YYYY-MM-DD
cover: /images/blog/<slug>/cover.avif
timeToRead: <number>
author: aditya-oberai
category: product
featured: false
unlisted: true
faqs:
  - question: "A question a reader would actually ask."
    answer: "A direct answer. Markdown links to docs and inline code blocks are allowed."
  - question: "Another question."
    answer: "Another answer."
---
```

The filename (slug) must match the `cover` image path: e.g. `avoid-backend-overengineering.md` maps to `/images/blog/avoid-backend-overengineering/cover/cover.avif`.

## Voice and tone

- **Direct and opinionated.** State positions clearly. Avoid hedging language like "it depends" without then explaining what it depends on.
- **Developer-first.** Write for engineers making real decisions. No fluff, no marketing speak.
- **Practical over theoretical.** Lead with the concrete problem, then the reasoning, then the solution.
- **No unnecessary superlatives.** Don't call things "amazing" or "powerful", show why they matter.

## Post structure pattern

The rest: https://github.com/appwrite/appwrite/blob/HEAD/apps/console/.cursor/skills/writing-blogs/SKILL.md
