x-posting

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

X Posting Workflow

X/Twitter 内容发布工作流

End-to-end workflow for creating, approving, and scheduling X/Twitter posts from OpenEd content.
从OpenEd内容创建、审核并排期X/Twitter帖子的端到端工作流。

When to Use

适用场景

  • Batch processing X posts from recent content
  • Promoting podcast episodes or blog posts
  • Scheduling a week of social content
  • Any X posting that involves guest tagging
  • 批量处理基于近期内容的X/Twitter帖子
  • 推广播客剧集或博客文章
  • 排期一周的社交内容
  • 任何涉及嘉宾标记的X/Twitter帖子发布

Prerequisites

前置条件

  • GETLATE_API_KEY
    in
    .env
  • Connected Twitter account in getlate.dev (@OpenEdHQ)

  • .env
    文件中配置
    GETLATE_API_KEY
  • 在getlate.dev中关联Twitter账号(@OpenEdHQ)

The Workflow

工作流步骤

Step 1: Find Content

步骤1:筛选内容

Search the Master Content Database for recent/relevant content:
bash
undefined
在主内容数据库中搜索近期/相关内容:
bash
undefined

Find recent podcasts

Find recent podcasts

ls "Content/Master Content Database/Podcasts/" | head -20
ls "Content/Master Content Database/Podcasts/" | head -20

Find recent blog posts

Find recent blog posts

ls "Content/Master Content Database/Blog Posts/" | head -20

Read source files to extract:
- Key insights and quotes
- Guest names
- Actual URLs (from frontmatter `url:` field)

**CRITICAL:** Never hallucinate URLs. Always pull from the source file's frontmatter.

---
ls "Content/Master Content Database/Blog Posts/" | head -20

读取源文件以提取以下信息:
- 核心观点与引用
- 嘉宾姓名
- 真实URL(来自文件头的`url:`字段)

**重要提示:** 切勿虚构URL,务必从源文件的文件头中提取。

---

Step 2: Find Guest X Handles

步骤2:查找嘉宾的X/Twitter账号

Before writing any post featuring a guest:
  1. Web search:
    "[Guest Name] [Company] Twitter X account"
  2. Verify it's the correct person (check bio)
  3. Note both personal handle AND company handle if applicable
Common OpenEd guest handles:
  • See
    Studio/Social_Scheduling.md
    for previously found handles
  • Add new handles to the reference table when found

在撰写任何包含嘉宾的帖子之前:
  1. 网页搜索:
    "[嘉宾姓名] [公司名称] Twitter X account"
  2. 验证账号是否为对应人员(查看简介)
  3. 记录个人账号及公司账号(如适用)
OpenEd常见嘉宾账号:
  • 可查看
    Studio/Social_Scheduling.md
    中已收录的账号
  • 找到新账号后添加至参考表

Step 3: Framework Fitting via Sub-Agents

步骤3:通过子代理匹配框架

CRITICAL: Spawn a sub-agent for EACH piece of content.
This is token-heavy but ensures quality. Each sub-agent does deep framework fitting rather than surface-level template matching.
Sub-Agent Prompt Template:
You are writing X/Twitter posts for OpenEd. Your job is DEEP FRAMEWORK FITTING - matching this concept to proven templates that amplify it.
重要提示:为每一条内容启动一个子代理。
这会消耗较多token,但能确保内容质量。每个子代理会深度匹配框架,而非表面化的模板套用。
子代理提示模板:
You are writing X/Twitter posts for OpenEd. Your job is DEEP FRAMEWORK FITTING - matching this concept to proven templates that amplify it.

Source Content

Source Content

[Paste the full content or key excerpts]
[Paste the full content or key excerpts]

Guest Info

Guest Info

  • Name: [Guest Name]
  • X Handle: @[handle]
  • Company: [Company] (@[company_handle] if applicable)
  • Name: [Guest Name]
  • X Handle: @[handle]
  • Company: [Company] (@[company_handle] if applicable)

URL (use exactly)

URL (use exactly)

[URL from frontmatter]
[URL from frontmatter]

Your Task

Your Task

Phase 1: Concept Extraction

Phase 1: Concept Extraction

Extract from this content:
  1. Core insight (one sentence)
  2. Emotional hook (what feeling does this evoke?)
  3. Most quotable moment
  4. Surprising fact or statistic
  5. Contrarian angle (what does this challenge?)
Extract from this content:
  1. Core insight (one sentence)
  2. Emotional hook (what feeling does this evoke?)
  3. Most quotable moment
  4. Surprising fact or statistic
  5. Contrarian angle (what does this challenge?)

Phase 2: Template Review

Phase 2: Template Review

Read the FULL post-structures.md file. Do not skim.
For this concept, evaluate AT LEAST these template categories:
  • Commentary (quote + translation + explanation)
  • Contrast Evaluation (X overrated, Y underrated)
  • Paradox Hook (present contradiction)
  • Comparison with percentages (numbers + question)
  • Personal Story (setup → conflict → resolution)
  • One Sentence Comparison
  • Behavior Dichotomy
  • Binary Framing Hook
  • Counterintuitive Statement Hook
For each potentially fitting template:
  1. Name the template
  2. Explain WHY it might work for this concept
  3. Rate fit: Strong / Moderate / Weak
  4. Draft a quick test version
Read the FULL post-structures.md file. Do not skim.
For this concept, evaluate AT LEAST these template categories:
  • Commentary (quote + translation + explanation)
  • Contrast Evaluation (X overrated, Y underrated)
  • Paradox Hook (present contradiction)
  • Comparison with percentages (numbers + question)
  • Personal Story (setup → conflict → resolution)
  • One Sentence Comparison
  • Behavior Dichotomy
  • Binary Framing Hook
  • Counterintuitive Statement Hook
For each potentially fitting template:
  1. Name the template
  2. Explain WHY it might work for this concept
  3. Rate fit: Strong / Moderate / Weak
  4. Draft a quick test version

Phase 3: Select and Write

Phase 3: Select and Write

Choose 2-3 BEST fitting templates. Write full post variations using the EXACT template structure.
Choose 2-3 BEST fitting templates. Write full post variations using the EXACT template structure.

Phase 4: Voice Validation

Phase 4: Voice Validation

For each draft, check against AI-tells:
HARD BLOCKS (reject and rewrite if present):
  • Correlative constructions ("X isn't just Y - it's Z")
  • Split correlatives ("It wasn't about X. It was about Y.")
  • Staccato fragments ("No X. No Y. Just Z.")
  • Setup phrases ("Here's the thing:", "The best part?")
  • Triple adjective patterns
  • Thesaurus words (utilize, leverage, comprehensive, crucial)
VOICE CHECK:
  • Does this sound like a person talking or performing "good writing"?
  • Is this something you'd actually text to a friend?
  • Does it follow the template structure or drift into generic copy?
For each draft, check against AI-tells:
HARD BLOCKS (reject and rewrite if present):
  • Correlative constructions ("X isn't just Y - it's Z")
  • Split correlatives ("It wasn't about X. It was about Y.")
  • Staccato fragments ("No X. No Y. Just Z.")
  • Setup phrases ("Here's the thing:", "The best part?")
  • Triple adjective patterns
  • Thesaurus words (utilize, leverage, comprehensive, crucial)
VOICE CHECK:
  • Does this sound like a person talking or performing "good writing"?
  • Is this something you'd actually text to a friend?
  • Does it follow the template structure or drift into generic copy?

Output Format

Output Format

For each post option:
  1. Template used: [Name]
  2. Why this template: [1-2 sentences]
  3. Post:
[The actual post text]
[link]
  1. Voice validation: [Pass/Fail with notes]

**Launch sub-agents in parallel** - one per content piece. They will return structured options ready for the scheduling file.

---
For each post option:
  1. Template used: [Name]
  2. Why this template: [1-2 sentences]
  3. Post:
[The actual post text]
[link]
  1. Voice validation: [Pass/Fail with notes]

**并行启动子代理** - 每条内容对应一个子代理。它们会返回结构化的选项,可直接用于排期文件。

---

Step 4: Compile Scheduling File

步骤4:整理排期文件

Collect sub-agent outputs into
Studio/Social_Scheduling.md
:
markdown
undefined
将子代理的输出收集至
Studio/Social_Scheduling.md
markdown
undefined

X Post Scheduling Queue

X Post Scheduling Queue

Created: [date] Status: Awaiting approval

Created: [date] Status: Awaiting approval

1. [Content Title] - @[guest_handle]

1. [Content Title] - @[guest_handle]

URL: [actual URL from source]
Option A - [Template Name]:
[Post content]
[link]
Template reasoning: [Why this template fits]
  • Approve Option A
Option B - [Template Name]:
[Post content]
[link]
Template reasoning: [Why this template fits]
  • Approve Option B

User marks approvals with `[X]` and adds notes in `{NOTES: ...}`.

---
URL: [actual URL from source]
Option A - [Template Name]:
[Post content]
[link]
Template reasoning: [Why this template fits]
  • Approve Option A
Option B - [Template Name]:
[Post content]
[link]
Template reasoning: [Why this template fits]
  • Approve Option B

用户通过`[X]`标记已审核通过的选项,并在`{NOTES: ...}`中添加备注。

---

Step 5: Voice Validation (Final Check)

步骤5:语气验证(最终检查)

Before posting/scheduling, run final validation:
Hard Blocks:
  • No correlative constructions ("X isn't just Y - it's Z")
  • No split correlatives ("X wasn't about Y. It was about Z.")
  • No staccato fragments ("No X. No Y. Just Z.")
  • No setup phrases ("Here's the thing:", "The best part?")
Soft Checks:
  • Sounds like a person, not a copywriter
  • Uses actual template structure (can identify which one)
  • Guest tagged correctly
  • URL is real (from source file)

在发布/排期前,进行最终验证:
硬性检查项:
  • 无关联结构(如"X不只是Y - 它是Z")
  • 无拆分关联句(如"这与Y无关,而是与Z有关")
  • 无断句碎片(如"没有X,没有Y,只有Z")
  • 无引导语(如"重点是:"、"最棒的部分是?")
软性检查项:
  • 语气像真人对话,而非文案撰写
  • 严格遵循模板结构(可识别具体模板类型)
  • 嘉宾标记正确
  • URL真实(来自源文件)

Step 6: Post and Schedule via getlate.dev

步骤6:通过getlate.dev发布并排期

Post immediately:
bash
python3 agents/post_tweet.py '[tweet content]'
Schedule for future:
python
import os
import requests
from pathlib import Path
from dotenv import load_dotenv

load_dotenv(Path(__file__).parent.parent / ".env")

api_key = os.getenv("GETLATE_API_KEY")
base_url = "https://getlate.dev/api/v1"
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
立即发布:
bash
python3 agents/post_tweet.py '[tweet content]'
排期至未来发布:
python
import os
import requests
from pathlib import Path
from dotenv import load_dotenv

load_dotenv(Path(__file__).parent.parent / ".env")

api_key = os.getenv("GETLATE_API_KEY")
base_url = "https://getlate.dev/api/v1"
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}

Get account ID

Get account ID

response = requests.get(f"{base_url}/accounts", headers=headers) accounts = response.json().get("accounts", []) twitter_account = next((a for a in accounts if a.get("platform") == "twitter"), None) account_id = twitter_account.get("_id")
response = requests.get(f"{base_url}/accounts", headers=headers) accounts = response.json().get("accounts", []) twitter_account = next((a for a in accounts if a.get("platform") == "twitter"), None) account_id = twitter_account.get("_id")

Schedule post (9am ET = 14:00 UTC in winter)

Schedule post (9am ET = 14:00 UTC in winter)

post_data = { "platforms": [{"platform": "twitter", "accountId": account_id}], "content": "Your tweet content here", "scheduledFor": "2026-01-15T14:00:00Z" # ISO 8601 format }
response = requests.post(f"{base_url}/posts", headers=headers, json=post_data)

**Time conversion:**
- 9am ET (winter) = 14:00 UTC
- 9am ET (summer/DST) = 13:00 UTC

---
post_data = { "platforms": [{"platform": "twitter", "accountId": account_id}], "content": "Your tweet content here", "scheduledFor": "2026-01-15T14:00:00Z" # ISO 8601 format }
response = requests.post(f"{base_url}/posts", headers=headers, json=post_data)

**时间转换:**
- 东部时间上午9点(冬季)= UTC时间14:00
- 东部时间上午9点(夏季/夏令时)= UTC时间13:00

---

Quick Reference

快速参考

getlate.dev API

getlate.dev API

EndpointMethodPurpose
/accounts
GETList connected accounts
/posts
POSTCreate/schedule post
Post payload:
json
{
  "platforms": [{"platform": "twitter", "accountId": "..."}],
  "content": "Tweet text",
  "publishNow": true,           // OR
  "scheduledFor": "ISO-8601"    // for scheduling
}
端点请求方法用途
/accounts
GET列出关联账号
/posts
POST创建/排期帖子
帖子请求体:
json
{
  "platforms": [{"platform": "twitter", "accountId": "..."}],
  "content": "Tweet text",
  "publishNow": true,           // 或
  "scheduledFor": "ISO-8601"    // 用于排期
}

Best Posting Times (ET)

最佳发布时间(东部时间)

  • 8-9am - Morning commute
  • 12-1pm - Lunch break
  • 7-8pm - Evening wind-down
  • 8-9点 - 早高峰通勤时段
  • 12-13点 - 午餐时段
  • 19-20点 - 晚间休闲时段

Character Limits

字符限制

  • Optimal: 70-100 characters
  • Max: 280 characters
  • With link: ~250 characters of text

  • 最佳范围:70-100字符
  • 最大值:280字符
  • 包含链接时:约250字符的文本空间

Sub-Agent Required Reading

子代理必读文件

Each sub-agent MUST read these files before writing posts:
FilePurposeTokens
.claude/skills/text-content/references/templates/post-structures.md
100+ template structures~4000
.claude/skills/ai-tells/SKILL.md
Voice constraints~200
.claude/skills/ai-tells/references/pirate-wires-examples.md
Voice examples~1500
Source content fileThe actual content to promotevaries
Why this matters: The quality difference between skimming templates and deeply reading them is the difference between generic AI copy and posts that actually follow proven structures.

每个子代理在撰写帖子前必须阅读以下文件:
文件用途Token数量
.claude/skills/text-content/references/templates/post-structures.md
100+种模板结构~4000
.claude/skills/ai-tells/SKILL.md
语气约束~200
.claude/skills/ai-tells/references/pirate-wires-examples.md
语气示例~1500
源内容文件需推广的实际内容视情况而定
重要性说明: 浅读模板与深度理解模板的区别,就是生成通用AI文案与遵循成熟结构的优质帖子的区别。

Related Skills

相关技能

  • text-content
    - Template library and framework fitting
  • ai-tells
    - Voice validation
  • ghostwriter
    - Deeper voice guidance

  • text-content
    - 模板库与框架匹配
  • ai-tells
    - 语气验证
  • ghostwriter
    - 深度语气指导

Files

相关文件

  • agents/post_tweet.py
    - Single tweet posting
  • agents/test_tweet.py
    - API testing
  • Studio/Social_Scheduling.md
    - Current queue

Last updated: 2026-01-14 (v2 - added sub-agent framework fitting)
  • agents/post_tweet.py
    - 单条帖子发布工具
  • agents/test_tweet.py
    - API测试工具
  • Studio/Social_Scheduling.md
    - 当前排期队列

最后更新:2026-01-14(v2版本 - 新增子代理框架匹配功能)