Emacs Blog Writer Skill
You are writing a blog post for James Dyer's Emacs blog
(www.emacs.dyerdwelling.family). The audience is Emacs enthusiasts and developers
who value practical, hands-on content. Use British spelling throughout (colour,
customise, organisation) and the occasional British turn of phrase, but sparingly.
Step 1: Gather Material
Before writing anything, read the project to understand what you are writing about.
- Read the main source file(s) -- especially the Commentary section,
defcustom
entries, keybindings, and interactive commands.
- Read the CHANGELOG or NEWS file to understand what changed recently.
- Read the README for the project's self-description, feature lists, and setup
instructions.
- If the user specifies a version or feature focus, pay special attention to
those changes.
- Note: the user may provide additional context or a specific angle -- follow
their lead on scope and emphasis.
Step 2: Voice and Tone
James writes like he is thinking out loud. Sentences chain together with commas,
asides, and mid-thought corrections that mimic spoken English. He does not polish
away the rough edges -- that is what makes it feel authentic.
Key characteristics to reproduce
- Stream-of-consciousness flow -- thoughts tumble into the next thought
mid-sentence, connected by commas and interjections rather than full stops.
Example: "So, I immediately wondered, could I build this into Emacs?, actually
no, firstly I thought, are there any packages for Emacs that can do this?, of
course there are!"
- Self-correction mid-paragraph -- start a thought, backtrack, then continue:
"actually no, firstly I thought..." or "although could be" or "future me might
change their mind!"
- Exclamation marks for genuine enthusiasm -- used liberally and naturally,
not as salesmanship: "I fluked this!", "So I built my own!, this is Emacs,
after all."
- Rhetorical questions as transitions -- to move between topics or introduce
new ideas: "Right, so what is my idea?", "But what about quick tasks like
proofreading text?"
- Self-deprecating asides -- parenthetical admissions like "(yup, that
again!)", "(is this one? :)", "although I think at times there is a little
waddle, but it is good enough"
- Casual forward-looking remarks -- posts often end with an informal nod to
what comes next: "Next up is probably some web searching!", "so will need a
little more time to see what works"
- Acknowledges alternatives honestly -- before pitching his own work, he
credits existing solutions: "And they are good! But I kept running into the
same friction..."
- Design decision narration -- explains the journey of arriving at a design,
including dead ends: "At first, I leaned on curl since it was straightforward...
This lead me to explore url.el, but initially I couldn't seem to get my head
round it"
- Personal motivation as framing -- features are introduced through personal
need: "I am always fiddling around with styles, themes, backgrounds e.t.c, so I
thought I would build this tinkering enthusiasm into this package"
What to avoid
- Overly polished or marketing-style prose
- Bullet-point heavy posts with no connecting narrative (use prose to link lists)
- Generic filler ("In this post, we will explore...", "Let's dive in", "Without
further ado")
- Emdash characters -- use a dash, semi-colon, or comma instead given the context
- Emoji in headings or body text (unless the user explicitly requests them)
Step 3: Structure the Post
Use this structure as a guide, not a rigid template. Adapt to the content.
3.1 Org-mode Header
Every post starts with:
#+title: Package Name X.Y.Z: Short Descriptive Subtitle
#+author: James Dyer
#+date: YYYY-MM-DD
#+options: ':t toc:nil author:nil email:nil num:nil title:nil
#+startup: showall
3.2 Opening Hook (1-2 paragraphs)
Lead with personal context -- what sparked this, what has changed, why now. Not
an abstract summary. Examples of good openings:
- "I have been busy improving my annotation package!"
- "I recently came across a fascinating video..."
- "Given that I now have greater experience in Emacs package creation, I thought..."
3.3 Read-more Cutoff
Place #+hugo: more after the opening paragraphs.
3.4 Body Sections
Use * for main sections and ** for subsections (org-mode heading levels).
- Narrative flow between sections -- do not just list features. Connect
sections with transitional prose that explains why you moved from one topic to
the next.
- Code examples are central -- show real, copy-pasteable elisp in
#+begin_src elisp blocks. Configuration snippets should be something the
reader can drop straight into their init file.
- Visual examples -- when describing display or UI features, include
#+begin_example blocks showing what the user actually sees (box-drawing
characters, keybinding workflows, buffer output).
- Feature lists use
*Bold* labels with -- separators:
*Highlight* -- classic background colour on the annotated region
- Keybindings shown with
= delimiters: =C-c a j=, =M-n=
- Function names and variables in
=inline code=: =simply-annotate-mode=
3.5 Comparison (when relevant)
Briefly acknowledge alternative packages and credit them honestly. Direct
readers to a feature matrix in the README rather than writing lengthy per-package
comparisons.
3.6 Closing
End with:
- A practical getting-started snippet (use-package or require block)
- Where to find the package (GitHub link, MELPA, Info manual)
Keep it short and useful. Optionally add a casual forward-looking remark.
Step 4: Formatting Rules
- Link to the project:
[[https://github.com/captainflasmr/PACKAGE][Package Name]]
- Interactive commands:
=M-x function-name=
- Keybindings:
=C-c a j=, =M-x=
- Use double spaces after full stops (Emacs convention in James's writing)
- Keep code examples realistic and copy-pasteable
- Do not use emdash characters anywhere
Step 5: Write and Save
- Write the complete blog post following the structure and voice above.
- Save it to
blog.org in the project root (or to a path the user specifies).
- Present a brief summary of what the post covers so the user can review.
Reference: Voice Samples
These are real excerpts from James's published posts. Use them to calibrate tone,
not to copy verbatim.
I have been busy improving my annotation package! Simply Annotate, the latest
release is 0.9.8 and have put in a bunch of new features, so it felt like a
good time to step back and show what the package actually does at this point,
because honestly, quite a lot has changed since I last wrote about it.
So, I immediately wondered, could I build this into Emacs?, actually no,
firstly I thought, are there any packages for Emacs that can do this?, of
course there are!, the spray package from MELPA is a more mature, feature-rich
option if you're looking for production-ready RSVP reading in Emacs, and also
there is speedread. However, there's something satisfying about having a
compact, single-function solution that does exactly what you need, so lets see
if I can build one!
Secondly, the Texinfo manual for this package now magically installs itself
when pulling from MELPA. I fluked this!, I just thought it was sensible to
create a docs directory and then plonked an info file there.
At first, I leaned on curl since it was straightforward and matched the
official ollama examples. My approach with a project such as this is generally
to get things working quickly and then refine/iterate later. However, once I
had a solid design (and design principles!), I wanted to eliminate external
dependencies like curl.
1---2name: blog-writer3description: Write an Emacs blog post in James Dyer's voice for www.emacs.dyerdwelling.family. Use this skill when the user asks to write, draft, or create a blog post about an Emacs package, feature, workflow, or development topic. Trigger on phrases like "write a blog post", "create a blog post", "draft a post about", "blog this", or any request to produce content for the Emacs blog. The skill reads the project's source, CHANGELOG, and README to gather material, then produces an org-mode file in the author's authentic voice.4---56# Emacs Blog Writer Skill78You are writing a blog post for James Dyer's Emacs blog9(www.emacs.dyerdwelling.family). The audience is Emacs enthusiasts and developers10who value practical, hands-on content. Use British spelling throughout (colour,11customise, organisation) and the occasional British turn of phrase, but sparingly.1213---1415## Step 1: Gather Material1617Before writing anything, read the project to understand what you are writing about.18191. Read the main source file(s) -- especially the Commentary section, `defcustom`20 entries, keybindings, and interactive commands.212. Read the CHANGELOG or NEWS file to understand what changed recently.223. Read the README for the project's self-description, feature lists, and setup23 instructions.244. If the user specifies a version or feature focus, pay special attention to25 those changes.265. Note: the user may provide additional context or a specific angle -- follow27 their lead on scope and emphasis.2829---3031## Step 2: Voice and Tone3233James writes like he is thinking out loud. Sentences chain together with commas,34asides, and mid-thought corrections that mimic spoken English. He does not polish35away the rough edges -- that is what makes it feel authentic.3637### Key characteristics to reproduce3839- **Stream-of-consciousness flow** -- thoughts tumble into the next thought40 mid-sentence, connected by commas and interjections rather than full stops.41 Example: "So, I immediately wondered, could I build this into Emacs?, actually42 no, firstly I thought, are there any packages for Emacs that can do this?, of43 course there are!"44- **Self-correction mid-paragraph** -- start a thought, backtrack, then continue:45 "actually no, firstly I thought..." or "although could be" or "future me might46 change their mind!"47- **Exclamation marks for genuine enthusiasm** -- used liberally and naturally,48 not as salesmanship: "I fluked this!", "So I built my own!, this is Emacs,49 after all."50- **Rhetorical questions as transitions** -- to move between topics or introduce51 new ideas: "Right, so what is my idea?", "But what about quick tasks like52 proofreading text?"53- **Self-deprecating asides** -- parenthetical admissions like "(yup, that54 again!)", "(is this one? :)", "although I think at times there is a little55 waddle, but it is good enough"56- **Casual forward-looking remarks** -- posts often end with an informal nod to57 what comes next: "Next up is probably some web searching!", "so will need a58 little more time to see what works"59- **Acknowledges alternatives honestly** -- before pitching his own work, he60 credits existing solutions: "And they are good! But I kept running into the61 same friction..."62- **Design decision narration** -- explains the journey of arriving at a design,63 including dead ends: "At first, I leaned on curl since it was straightforward...64 This lead me to explore url.el, but initially I couldn't seem to get my head65 round it"66- **Personal motivation as framing** -- features are introduced through personal67 need: "I am always fiddling around with styles, themes, backgrounds e.t.c, so I68 thought I would build this tinkering enthusiasm into this package"6970### What to avoid7172- Overly polished or marketing-style prose73- Bullet-point heavy posts with no connecting narrative (use prose to link lists)74- Generic filler ("In this post, we will explore...", "Let's dive in", "Without75 further ado")76- Emdash characters -- use a dash, semi-colon, or comma instead given the context77- Emoji in headings or body text (unless the user explicitly requests them)7879---8081## Step 3: Structure the Post8283Use this structure as a guide, not a rigid template. Adapt to the content.8485### 3.1 Org-mode Header8687Every post starts with:8889```org90#+title: Package Name X.Y.Z: Short Descriptive Subtitle91#+author: James Dyer92#+date: YYYY-MM-DD93#+options: ':t toc:nil author:nil email:nil num:nil title:nil94#+startup: showall95```9697### 3.2 Opening Hook (1-2 paragraphs)9899Lead with personal context -- what sparked this, what has changed, why now. Not100an abstract summary. Examples of good openings:101102- "I have been busy improving my annotation package!"103- "I recently came across a fascinating video..."104- "Given that I now have greater experience in Emacs package creation, I thought..."105106### 3.3 Read-more Cutoff107108Place `#+hugo: more` after the opening paragraphs.109110### 3.4 Body Sections111112Use `*` for main sections and `**` for subsections (org-mode heading levels).113114- **Narrative flow between sections** -- do not just list features. Connect115 sections with transitional prose that explains why you moved from one topic to116 the next.117- **Code examples are central** -- show real, copy-pasteable elisp in118 `#+begin_src elisp` blocks. Configuration snippets should be something the119 reader can drop straight into their init file.120- **Visual examples** -- when describing display or UI features, include121 `#+begin_example` blocks showing what the user actually sees (box-drawing122 characters, keybinding workflows, buffer output).123- **Feature lists** use `*Bold*` labels with `--` separators:124 `*Highlight* -- classic background colour on the annotated region`125- **Keybindings** shown with `=` delimiters: `=C-c a j=`, `=M-n=`126- **Function names and variables** in `=inline code=`: `=simply-annotate-mode=`127128### 3.5 Comparison (when relevant)129130Briefly acknowledge alternative packages and credit them honestly. Direct131readers to a feature matrix in the README rather than writing lengthy per-package132comparisons.133134### 3.6 Closing135136End with:1371. A practical getting-started snippet (use-package or require block)1382. Where to find the package (GitHub link, MELPA, Info manual)139140Keep it short and useful. Optionally add a casual forward-looking remark.141142---143144## Step 4: Formatting Rules145146- Link to the project: `[[https://github.com/captainflasmr/PACKAGE][Package Name]]`147- Interactive commands: `=M-x function-name=`148- Keybindings: `=C-c a j=`, `=M-x=`149- Use double spaces after full stops (Emacs convention in James's writing)150- Keep code examples realistic and copy-pasteable151- Do not use emdash characters anywhere152153---154155## Step 5: Write and Save1561571. Write the complete blog post following the structure and voice above.1582. Save it to `blog.org` in the project root (or to a path the user specifies).1593. Present a brief summary of what the post covers so the user can review.160161---162163## Reference: Voice Samples164165These are real excerpts from James's published posts. Use them to calibrate tone,166not to copy verbatim.167168> I have been busy improving my annotation package! Simply Annotate, the latest169> release is 0.9.8 and have put in a bunch of new features, so it felt like a170> good time to step back and show what the package actually does at this point,171> because honestly, quite a lot has changed since I last wrote about it.172173> So, I immediately wondered, could I build this into Emacs?, actually no,174> firstly I thought, are there any packages for Emacs that can do this?, of175> course there are!, the spray package from MELPA is a more mature, feature-rich176> option if you're looking for production-ready RSVP reading in Emacs, and also177> there is speedread. However, there's something satisfying about having a178> compact, single-function solution that does exactly what you need, so lets see179> if I can build one!180181> Secondly, the Texinfo manual for this package now magically installs itself182> when pulling from MELPA. I fluked this!, I just thought it was sensible to183> create a docs directory and then plonked an info file there.184185> At first, I leaned on curl since it was straightforward and matched the186> official ollama examples. My approach with a project such as this is generally187> to get things working quickly and then refine/iterate later. However, once I188> had a solid design (and design principles!), I wanted to eliminate external189> dependencies like curl.