soul-builder
${var} — a source brief. Two accepted shapes:
- Structured (from the dashboard):
|-separatedkey=valuetokens — any ofx=<handle>,name=<full name>,links=<url1>,<url2>. Example:x=karpathy | name=Andrej Karpathy | links=https://karpathy.ai,https://github.com/karpathy.- Bare handle (back-compat / scheduled runs): just an X handle like
aeonfun(optionally@/URL).If
${var}is empty, reuse the handle already referenced insoul/SOUL.md. If no source at all can be resolved, logSOUL_BUILDER_SKIP: no source — set var (x=, name=, or links=)and stop with no notification.
Today is ${today}. This skill turns someone's public footprint — their X account, their name on the open web, their own writing and profiles — into a SOUL: the identity-and-voice files every content-generating skill reads (see the "Voice" section of CLAUDE.md). The goal, borrowed from the soul.md project: produce files where someone reading them could predict the person's take on a new topic. Favour specific opinions with reasoning over safe, nuanced mush. Keep real contradictions — they make an identity recognisable.
This is the agent behind the dashboard's Soul → Build my soul button.
Why this skill exists
A blank soul/SOUL.md means every article, tweet, and digest comes out in generic-AI voice. Hand-writing a good soul is real work most operators never do. But the raw material already exists in public: how someone tweets is their worldview, opinions, interests, and style, compressed. This skill reads that signal and drafts the files, so the operator edits a strong first draft instead of staring at a scaffold.
Steps
0. Parse the source brief
Parse ${var} into up to three sources: