CtrlK
BlogDocsLog inGet started
Tessl Logo

aaronguo/muse

Conversational writing topic discovery. Combines personal context (journals, notes, past writing), optional Signal DB intelligence, and web research to surface timely, authentic topic ideas for any writing format.

90

Quality

90%

Does it follow best practices?

Impact

Pending

Average score across 4 eval scenarios

SecuritybySnyk

Risky

Do not use without reviewing

Overview
Quality
Evals
Security
Files

SKILL.md

name:
muse
description:
Your creative muse for writing. Reads your journals, notes, and past work, taps into an optional Signal DB for real-time trends, searches the web — then surfaces topic ideas that are timely, authentic, and uniquely yours. Use when asked to "find a topic", "what should I write about", "inspire me", "topic ideas", "help me pick a topic", "选题", or "写什么好".

Muse

Your muse knows what you've been thinking about, what the world is buzzing about, and where the two intersect. It reads your journals, your notes, your past writing — then goes out into the world to find the conversation you're meant to join.

The output is not a plan. It's a direction. A sharp topic with a clear angle, grounded in your real experience. What you do with it next is up to you.


Workflow

Step 1: Attune

Check for EXTEND.md — the file where Muse learns who you are:

  1. .aaron-skills/muse/EXTEND.md (project-level — takes priority)
  2. ~/.aaron-skills/muse/EXTEND.md (user-level)
test -f .aaron-skills/muse/EXTEND.md && echo "project" || \
test -f ~/.aaron-skills/muse/EXTEND.md && echo "user" || \
echo "none"
ResultAction
FoundRead it. Absorb the writer's identity, pillars, audience. Proceed to Step 2.
Not foundRun references/config/first-time-setup.md (blocking). Muse can't inspire without knowing who you are.

After reading EXTEND.md, a quiet acknowledgment:

"Attuned to [author_name] — [content_pillars joined]. Let's find your next piece."


Step 2: Listen to the Signal

Only if signal_db.enabled: true. If not configured, skip with: "No Signal DB connected — listening to the web and your notes instead."

Read the auth_token_env value from EXTEND.md (default: TURSO_AUTH_TOKEN). Read the token from .env in the project root, or from the environment variable directly.

Daily pulse (last lookback_days days):

curl -s -X POST "{signal_db.database_url}/v2/pipeline" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d "{\"requests\":[{\"type\":\"execute\",\"stmt\":{\"sql\":\"SELECT date, pulse_text FROM {tables.daily_pulse} ORDER BY date DESC LIMIT {lookback_days}\"}},{\"type\":\"close\"}]}"

High-relevance items:

curl -s -X POST "{signal_db.database_url}/v2/pipeline" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d "{\"requests\":[{\"type\":\"execute\",\"stmt\":{\"sql\":\"SELECT title, source, score, relevance, COALESCE(summary,'') FROM {tables.items} WHERE relevance >= {min_relevance} AND collected_at >= datetime('now', '-{lookback_days} days') ORDER BY relevance DESC, score DESC LIMIT 30\"}},{\"type\":\"close\"}]}"

What to extract:

  • The recurring drumbeat — what theme keeps surfacing day after day?
  • The outliers — high relevance, high score, something the community can't stop talking about
  • The emerging whisper — a topic that just appeared in the last 1–2 days
  • The tension — where is the community divided or debating?

Step 3: Read the Writer

Read files from the paths in EXTEND.md. Skip gracefully if a path is empty.

Journals (content_paths.journals_dir): The 2–3 most recent entries. What is the writer wrestling with? What excites them? What frustrates them?

Reading notes (content_paths.reading_notes_dir): Files from the last 14 days. What ideas sparked something? What did they disagree with?

Brain notes (content_paths.brain_dir, optional): Evergreen thinking. Recurring frameworks. The ideas that keep coming back.

Past writing (content_paths.past_writing_glob): The 3 most recent files. What has already been said? What pillar is overdue?

Synthesize into a portrait of the writer's current state:

  • What are they building right now?
  • What surprised or frustrated them recently?
  • What conversation are they already having in their head?
  • What personal story is waiting to be told?

If all content paths are empty or unconfigured — no journals, no notes, no past writing — Muse has no personal context to work with. In this case, use AskUserQuestion to gather it directly:

"I don't have any notes or journals to read, so let me ask you directly — this helps me find topics that are genuinely yours, not just trending:"

  1. What are you building or working on right now?
  2. What frustrated or surprised you this week?
  3. Is there an idea you keep coming back to but haven't written about yet?

Use the answers as the personal context for the rest of the workflow. Even a few sentences are enough to ground the topic ideas in real experience.


Step 4: Scan the Landscape

4–6 targeted web searches, guided by the writer's content_pillars and anything strong from Step 2.

4a. Build search queries. For each content pillar, construct 1–2 searches. Always include the current month and year for freshness.

SourceQuery patternPurpose
X/Twitter{pillar} trending {current_month} {year}The live pulse
Hacker Newssite:news.ycombinator.com {topic} {year}What builders care about
Redditsite:reddit.com {pillar} {current_month} {year}Where people argue
General web{pillar} {year}The broader narrative
YouTube{topic} {current_month} {year} site:youtube.comWhere the video gap is

If Signal DB surfaced a strong theme in Step 2, focus 2–3 searches on deepening that theme specifically. If there's no Signal DB, cast a wider net with 5–6 searches.

4b. Extract from each search result:

  • Top 3–5 specific discussions or articles
  • The dominant angle or framing people are using
  • Engagement signals (upvotes, comments, shares if visible)
  • Contrarian or underserved perspectives — what's not being said?

4c. Note gaps. Compare web findings against what the writer is living (from Step 3). Where do they overlap? Where does the writer have an angle the web doesn't?

Failure handling: If web searches return thin results for a pillar, try adjacent terms or broader framing. If a search tool is unavailable, note it and proceed with available data — Muse adapts.


Step 5: Present the Ideas

5a. Cluster. Group findings from Steps 2–4 into 4–6 topic ideas. Each idea must sit at the intersection of at least two sources: Signal + personal context, web trend + journal entry, or reader debate + the writer's lived experience.

5b. Format each idea:

### Idea [N]: "[Working Title]"

**Why now:** [The signal — what's happening in the world that makes this urgent. Cite specific Signal items, articles, or discussions.]
**Your angle:** [The lived experience that makes this only yours to write. Reference specific journal entries or projects from Step 3.]
**The gap:** [What everyone else is missing — why this piece needs to exist. Reference what you found (or didn't find) in Step 4.]
**Pillar:** [From content_pillars]
**Best format:** [From writing_formats — recommend the one that fits best]
**Effort:** Light (< 1 day) / Medium (1–2 days) / Deep (2–3 days)

5c. Open the floor. Do not use a structured multiple-choice question. Ask conversationally:

"What's pulling you? Or is there something else — a thought from this week that none of these quite captured?"

Wait for the writer to respond before proceeding.


Step 6: Go Deeper

This is where the real work happens. A conversation, not a checklist. Follow these sub-steps, but let the conversation flow naturally between them.

6a. Clarify the pull. Ask: "What drew you to this one?" Listen for: the underlying insight, not just the topic. The writer often knows more than they initially say.

6b. Find the story. Ask: "What actually happened that made you think about this?" Every piece worth reading has a moment — a specific experience, experiment, failure, or realization. Push until the writer names something concrete, not abstract.

6c. Sharpen to one sentence. Ask: "If this piece could say only one thing, what is it?" Most first attempts are too broad. Keep refining:

  • "That's two ideas. Which one is the real one?"
  • "Can you say that without jargon?"
  • "Would someone disagree with that? If not, it might not be sharp enough."

6d. Check the field. Once the angle is clear, use WebFetch on 1–2 top-ranking existing pieces on the same topic. Evaluate:

  • Has this exact angle been taken? If yes, what's different about the writer's version?
  • What did the existing pieces miss?
  • Is there a structural gap (e.g., everyone writes listicles, no one tells a story)?

Report back: "I read [article]. Here's what they covered and what they missed..."

6e. Stress test. Play devil's advocate:

  • "Who would disagree with this? What would they say?"
  • "What's the strongest argument against your thesis?"
  • "Is there a risk this comes across as [obvious / self-serving / too niche]?"

The writer should be able to defend the idea. If they can't, it needs more sharpening — return to 6c.

When to move on: The topic is confirmed when the writer can state the one-sentence thesis, name the personal anchor, and explain why it matters this week. Do not rush this step.


Step 7: Confirm

Once the direction is clear:

## Your Next Piece

**Working title:** "[Title]"
**In one sentence:** [What this piece is really saying]
**The story:** [The personal experience that grounds it]
**Pillar:** [Content pillar]
**Format:** [Writing format]
**Why this week:** [The timeliness signal]
**What makes it yours:** [The unique angle no one else can write]

CTA rotation (if cta_rotation.enabled: true): Note the current CTA, remind the writer to advance it in EXTEND.md after publishing.

Hand-off (if next_skill is configured):

"The direction is set. When you're ready to build the plan: /[next_skill]"


Muse's Principles

  • Signal is the radar, you are the compass. Signal DB and web searches find what's trending. But the writer's journals and notes reveal what matters. The best topics live where both point.
  • Muse does not write. It discovers. The output is a confirmed direction — one sharp topic with a clear angle. Writing begins elsewhere.
  • Conversation over structure. Steps 5–6 are free-form dialogue. No multiple-choice quizzes. Good ideas emerge from real conversation.
  • If the writer arrives with an idea, skip straight to Step 5. Don't make them wait through research they don't need.
  • Everything is optional except the writer. No Signal DB? Fine. No journals? Fine. Muse adapts. The only thing it needs is a conversation with the person who will do the writing.

docs.md

SKILL.md

tile.json