post-writer is the skill that does the most ordinary job in the Charlie Hills system, which is also the job everyone gets wrong without it. It loads the voice files, accepts a topic or a context dump, and drafts the post inside the constraints already on disk. The trick is the angle review in the middle, where the model offers three framings and lets the writer pick before writing a word of body copy.
Most LinkedIn drafting prompts go wrong in the same place. The model is given a topic and asked to write a post, which produces a post that reads like the topic plus the model's most-statistically-common idea of what good LinkedIn content sounds like. post-writer fixes this by routing every draft through three constraints in order: the writer's positioning, the writer's voice, and an angle the writer has actually approved.
§01What it does
The skill refuses to run without about-me.md and voice.md, which is the same prerequisite check newsletter-voice and post-scorer enforce. Without those files there is no voice to write in, and the skill says so rather than producing a generic post in some averaged-out version of the writer's intent.
With the files loaded, the skill takes one of three input shapes. A typed topic. A pasted context dump (notes, a transcript, a research excerpt). Or a suggest topics for me option that reads the topic pillars from about-me.md and proposes five specific angles the writer can pick from.
Then it does the move that distinguishes it from a one-shot drafter. Before writing the post, it researches the topic for data points, contrarian takes, real examples, and common misconceptions. From that research it proposes three framings of the post and lets the writer pick one. Only then does it draft. This is the angle review step, and skipping it is what produces drafts that need three or four rewrites to land.
§02The angle review is the actual feature
A topic is not a post. A topic plus an angle is a post. The framings post-writer offers are usually some variation of: a contrarian take that names what the writer thinks the field gets wrong, a personal-story angle that opens with a specific scene before zooming out, and a how-to angle that distils a method into numbered moves. The framework picker (PAS, how-to list, story to lesson, observation to advice) compounds with the angle to give the draft a clear shape before the first sentence is written.
The cost of letting the model pick the angle by itself is that it will pick the most-likely angle, which means whatever angle is most common in the training data for that topic. For most professional topics that means a vaguely encouraging how-to with a generic close. The angle review forces a more specific commitment up front and turns the post into a position rather than a survey.
§03Setup
# Trigger phrases:
# "write a post"
# "draft a post"
# "post about [topic]"
# "content idea"
The skill is configured to auto-start on load. Its first action after the voice files load is the topic input form, not a summary of what the skill does. That is by design and consistent with the rest of the Charlie Hills bundle.
◆ pull quote
“A topic is not a post. A topic plus an angle is a post.”
§04Caveats
The output is a draft, not a final. The natural next step is to pipe it through post-scorer, which compares it against the writer's own top-decile post history and surfaces what is likely to underperform.
The skill will also reference past training posts on request. If you used a borrowed sample set in voice-builder rather than your own writing, the use my training posts option will pull from the borrowed set and the resulting draft will sound like the original author rather than you. Same warning that applies to voice-builder applies here.
- 01Load voice
- ▸read about-me.md
- ▸read voice.md
- ▸stop if either is missing
- 02Gather inputs
- ▸topic, dump, or "suggest"
- ▸optional reference posts
- ▸context for the angle
- 03Angle review
- ▸propose three framings
- ▸pick a framework
- ▸confirm before drafting
- 04Draft
- ▸voice-matched body copy
- ▸output in a code block
- ▸ready for post-scorer