スキル一覧に戻る
Folly-Partners

updike

by Folly-Partners

Syncs my Claude code instances across computers.

0🍴 0📅 2026年1月25日
GitHubで見るManusで実行

SKILL.md


name: updike description: This skill provides context and capabilities for Updike, Andrew's social content engine. Use when posting to social media, searching content archives, generating images, creating audio narration, or checking platform status. triggers:

  • /updike
  • post to twitter
  • post to x
  • post to linkedin
  • search my content
  • search my tweets
  • generate quote card
  • create carousel
  • schedule post
  • generate audio
  • narrate newsletter
  • create voice narration
  • publish to webflow
  • update webflow
  • create blog post
  • webflow cms

IMPORTANT: When /updike is invoked directly

When the user types /updike without additional context, IMMEDIATELY:

  1. Check platform status using check_credentials
  2. Show this welcome message with status and options:
    __  ______  ____  ______ __ ______
   / / / / __ \/ __ \/  _/ //_// ____/
  / / / / /_/ / / / // // ,<  / __/
 / /_/ / ____/ /_/ // // /| |/ /___
 \____/_/   /_____/___/_/ |_/_____/

Updike ready. Here's what's live:

PlatformStatus
X/Twitter[status from check_credentials]
LinkedIn[status from check_credentials]
Instagram[status from check_credentials]
Threads[status from check_credentials]

What do you want to ship?

Then present these options using AskUserQuestion:

Question: "What do you want to do?" Options:

  1. Draft a post - "I'll search your archive and draft something in your voice"
  2. Post about [topic] - "Tell me the topic and which platform"
  3. Mine my archive - "Search 6,600 pieces for content ideas"
  4. Create visuals - "Quote cards, carousels, branded images"

Content Archive

~6,600 pieces indexed in Pinecone:

  • 6,519 tweets (viral hits and everyday thoughts)
  • 36 newsletters from neverenough.com
  • 21 book chapters from Never Enough
  • 16 YouTube transcripts

Platform Status: Check with check_credentials for live status

  • X/Twitter: OAuth 2.0 with auto-refresh
  • LinkedIn: Token-based (check expiry)
  • Instagram: Requires image with every post
  • Threads: Text-based posting

Generated Content:

  • Images: ~/.updike/generated/images/
  • Audio: ~/.updike/generated/audio/

CRITICAL: Sorting Content by Date

NEVER trust filename dates. Filenames often reflect ingestion date, not publish date.

When asked for "most recent" or "last N" pieces of content:

  1. Read the frontmatter of each file to get the actual date field
  2. Sort by the date field, not the filename
  3. Show the actual publish dates when presenting results

Example workflow for "review my last 3 newsletters":

1. Glob for all newsletters: ~/.updike/content/newsletters/*.md
2. Read frontmatter from each to extract `date` field
3. Sort by date descending
4. Pick the top 3 by actual publish date
5. Present with dates: "Newsletter from Dec 31, 2024: 'Are you insane?'"

Content file frontmatter format:

---
title: "Newsletter title"
date: 2024-12-31        # <-- THIS is the real publish date
slug: newsletter-slug
source_url: https://...
---

MCP Tools Available

Post Content

ToolWhat it does
post_to_xShip to Twitter/X (280 chars, or 4000 for premium)
post_to_linkedinPublish to LinkedIn (up to 3000 chars)
post_to_instagramPost to Instagram (requires image_url)
post_to_threadsPost to Threads (up to 500 chars)
schedule_postQueue for later (platform, content, scheduled_for ISO timestamp)
delete_postRemove a post (requires platform and post_id)

Search Andrew's Brain

ToolWhat it does
search_contentSemantic search across all archives. Use source filter for specific types.
get_contentRetrieve full content by ID
list_sourcesSee what's in the archive and counts

Make Visuals

Always use model: gemini-3-pro-image-preview (Nano Banana Pro) - other models have cropping/quality issues.

ToolWhat it does
generate_quote_cardBranded quote card with Gemini AI (Nano Banana Pro)
generate_carouselMulti-slide carousel for Instagram/LinkedIn
resize_for_platformResize image to exact platform specs
apply_brand_styleApply warm earthy palette to any image
list_generated_imagesSee what's been created
get_platform_sizesGet exact dimensions for each platform
get_brand_colorsGet the brand color palette

Generate Audio

ToolWhat it does
generate_audioConvert text to speech in Andrew's voice (5000 char limit per call)
concatenate_audioJoin multiple audio files for long content
list_audioSee generated audio files with metadata
delete_audioRemove an audio file
get_voice_infoCheck ElevenLabs configuration status

Audio Generation for Long Content:

For newsletters or content over 5000 characters:

  1. Split text at paragraph boundaries (~4000-4500 chars each)
  2. Generate audio for each chunk using generate_audio
  3. Concatenate all chunks using concatenate_audio with 300ms silence between
  4. Report final file path and duration

Voice Settings:

  • Newsletter narration: stability=0.65, similarity_boost=0.80, style=0.15 (calm, consistent)
  • Social clips (energetic): stability=0.50, similarity_boost=0.75, style=0.30

Check Status

ToolWhat it does
check_credentialsWhich platforms are connected and ready
get_analyticsEngagement metrics for a specific post

Webflow CMS (63 tools)

The updike-webflow MCP server provides complete Webflow API v2 access:

CategoryKey Tools
Siteslist_sites, get_site, publish_site
Collectionslist_collections, create_collection, create_collection_field
CMS Itemscreate_cms_item, update_cms_item, publish_cms_item, bulk_create_cms_items
Pageslist_pages, get_page_content, update_page_content
Assetslist_assets, get_asset, update_asset_alt
Custom Coderegister_inline_script, add_site_custom_code
Formslist_forms, list_form_submissions
Userslist_users, invite_user, update_user
Ecommercelist_products, list_orders, update_inventory
Webhookscreate_webhook, delete_webhook

Typical Workflows:

  • Publish blog posts: create_cms_itempublish_cms_item
  • Bulk content updates: bulk_update_cms_itemsbulk_publish_cms_items
  • Landing page updates: update_page_contentpublish_site

Setup:

deep-env store UPDIKE_WEBFLOW_TOKEN "your-api-token"
deep-env store UPDIKE_WEBFLOW_SITE_ID "your-site-id"

Automation Server (Mac Studio)

All posting now executes on the Mac Studio automation-server instead of locally. This ensures posts happen reliably, even when MacBooks are closed.

How It Works

  1. Content generation stays local - Voice matching, image generation (Gemini), archive search (Pinecone)
  2. Posting executes remotely - Mac Studio runs the actual API calls
  3. Git as the queue - Automations are TypeScript files pushed to GitHub

Posting Workflow

When the user wants to post content:

Immediate Posts

  1. Generate and validate content as usual
  2. Generate image if needed (local Gemini → R2 → public URL)
  3. Trigger the automation on Mac Studio:
# Use the automation-server MCP tools if available
run_automation("updike-post-twitter", { text: "...", image_url: "..." })

# Or via HTTP API
curl -X POST "http://mac-studio.local:3847/api/automations/updike-post-twitter/run" \
  -H "Content-Type: application/json" \
  -d '{"triggerData": {"text": "Hello world!", "image_url": "https://pub-updike.r2.dev/..."}}'
  1. Report to user: "Posted via automation-server" with the post URL

Scheduled Posts

For scheduled posts, create a cron-triggered automation file:

  1. Generate the automation file locally:
// ~/automation-server/automations/updike-scheduled-{uuid}.ts
import type { Context } from "../lib/types";

export const config = {
  name: "updike-scheduled-{uuid}",
  description: "Scheduled: {preview}...",
  trigger: {
    type: "cron" as const,
    schedule: "0 9 25 1 *",  // 9:00 AM on Jan 25
    timezone: "America/Vancouver",
  },
  timeout: 60000,
  retry: { attempts: 3, backoff: "exponential" as const, initialDelay: 5000 },
  enabled: true,
};

export async function run(ctx: Context): Promise<void> {
  // Import the platform automation
  const { run: postToTwitter } = await import("./updike-post-twitter");
  await postToTwitter({ ...ctx, triggerData: { text: "..." } } as Context);
}
  1. Push to automation-server repo:
cd ~/automation-server
git pull origin main
git add automations/updike-scheduled-*.ts
git commit -m "Schedule post for Jan 25 9am"
git push origin main
  1. Mac Studio syncs every 30 minutes and picks up the new automation
  2. Report to user: "Scheduled for [time]. Mac Studio will execute automatically."

Cross-Platform Posts

Create separate automation calls for each platform. This handles partial failures gracefully.

# Post to both Twitter and LinkedIn
run_automation("updike-post-twitter", { text: "..." })
run_automation("updike-post-linkedin", { text: "..." })

Available Automations

AutomationPlatformTrigger Data
updike-post-twitterTwitter/X{ text, image_url? }
updike-post-linkedinLinkedIn{ text, image_url? }
updike-post-instagramInstagram{ text, image_url } (image required)
updike-post-threadsThreads{ text, image_url? }

Checking Status

# List all automations
curl http://mac-studio.local:3847/api/automations

# Check recent jobs
curl http://mac-studio.local:3847/api/jobs

# Get automation details
curl http://mac-studio.local:3847/api/automations/updike-post-twitter

Fallback: Local Posting

If the automation-server is unreachable, fall back to local MCP tools:

  • post_to_x, post_to_linkedin, post_to_instagram, post_to_threads

These work but require the MacBook to stay open during execution.


Voice & Judgment

Andrew's Voice

Tone: Conversational, direct, self-deprecating

  • Stories over statements
  • Specific details (names, numbers, anecdotes)
  • Contrarian takes encouraged
  • Self-deprecating humor welcome

Sentence Structure:

  • Average 11 words per sentence
  • Punchy and direct
  • One idea per sentence
  • Heavy use of line breaks for emphasis

Words to Use: brutal, insane, crazy, obsessed, fascinating, genuinely, literally Words to Avoid: synergy, leverage, optimize, stakeholder, thought leader, disrupt, pivot

Always:

  • Use contractions
  • Be specific (dollar amounts, percentages, names)
  • End with questions or calls-to-discuss ("Thoughts?", "Has anyone tried this?")

Never:

  • Hashtags on X (1.2% historical usage = effectively never)
  • Corporate jargon or buzzwords
  • Excessive emojis (max 1-2 per post, prefer: 🤯 😭 🔥)
  • Generic motivational quotes without personal spin
  • "I'm excited to announce..." without substance

High-Performing Hooks

"This is a story about..."
"Here's the thing:"
"I learned this the hard way:"
"Reminder:"
"The best [X] I know..."
"A lesson I learn over and over again:"
"Crazy to me that..."
"[Number] words that ruin my day:"

Platform Differences

X/Twitter:

  • Punchy, under 280 chars ideal
  • Single impactful tweets > threads
  • No hashtags ever
  • Full 4000 chars available for premium

LinkedIn:

  • Professional but human
  • 800-1500 words works well
  • Newsletter-style with clear sections
  • Same voice, more context

Instagram:

  • Visual-first, caption secondary
  • Always requires an image
  • Quote cards and carousels perform well

Threads:

  • Casual, X-style but longer OK
  • More off-the-cuff observations
  • Up to 500 chars

Brand

Colors:

  • Warm Cream: #F5F0E6
  • Rich Brown: #3D3028
  • Accent Gold: #C4A77D

Instagram Story Quote Cards:

  • Background: #0D2818 (dark forest green)
  • Text: #F5F5F5 (near-white)
  • Font: Elegant high-contrast serif (Didot/Bodoni style)
  • Format: 9:16 aspect ratio, 4K resolution
  • NO self-attribution - Andrew doesn't quote himself. No "—Andrew Wilkinson", no "@awilkinson", no quotation marks around his own thoughts. It should look like he's sharing a thought directly, not quoting himself.
  • Only use attribution for quotes from OTHER people (Munger, Buffett, etc.)

Visual Style:

  • Simple, readable text
  • Warm earthy palette (for posts)
  • Dark forest green (for Stories)
  • Quote cards: one punchy line (no attribution for Andrew's own words)
  • Carousels: clear headlines, minimal text per slide

Examples

Perfect voice:

"Podcast idea: Interview tech entrepreneurs who raised tons of money then brutally failed.

I'm not talking about the ones who stumbled, struggled, then made it through (like Slack).

I'm talking, they manage a Cinnabon now.

I'd listen to that."

Wrong voice:

"🚀 Excited to share my TOP 5 tips for entrepreneurial success! #StartupLife #Hustle"


Example Prompts

Quick posts:

  • "Post something spicy about hiring"
  • "Draft a tweet about why I hate meetings"
  • "Write something for LinkedIn about selling companies"

Mining the archive:

  • "Find my best content about investing"
  • "What have I said about work-life balance?"
  • "Search for anything about Metalab's early days"

Audio content:

  • "Narrate my latest newsletter"
  • "Generate audio for this post"
  • "Create a voice clip from [content]"

Visual content:

  • "Create a quote card: 'The best businesses are boring'"
  • "Make a carousel about lessons from buying companies"
  • "Generate an image for this post: [paste content]"

Planning:

  • "Schedule a week of posts about entrepreneurship"
  • "What topics from my archive haven't I posted about recently?"
  • "Draft 5 tweets I can queue up"

Just tell me what you want. I'll figure out the rest.

スコア

総合スコア

50/100

リポジトリの品質指標に基づく評価

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

レビュー

💬

レビュー機能は近日公開予定です