feat(hands): improve linkedin, reddit, and twitter hands

- linkedin: API fallback strategy, queue JSON schema, 3 new settings, algorithm deep dive, crisis management
- reddit: concrete rule parsing, anti-spam/shadowban detection, engagement scoring, new settings
- twitter: structured trend analysis, queue schema, engagement criteria, algorithm awareness, new settings
This commit is contained in:
Evan Hu committed 2026-03-23 00:51:26 +09:00
1 parent de939b80d0
commit 3da827e6da
6 files changed
+3446 -89

No files matched your search

+569 -26
View File
@@ -285,6 +285,59 @@ description = "Write tweets to a queue file for your review instead of posting d
setting_type = "toggle"
default = "true"
[[settings]]
key = "hashtag_strategy"
label = "Hashtag Strategy"
description = "How aggressively to use hashtags in tweets"
setting_type = "select"
default = "minimal"
[[settings.options]]
value = "none"
label = "No hashtags"
[[settings.options]]
value = "minimal"
label = "Minimal (0-1 per tweet)"
[[settings.options]]
value = "moderate"
label = "Moderate (1-2 per tweet)"
[[settings.options]]
value = "discovery"
label = "Discovery (2-3, for new accounts)"
[[settings]]
key = "engagement_threshold"
label = "Engagement Threshold"
description = "Minimum follower count for auto-reply and auto-like targets (filters out bots and spam)"
setting_type = "select"
default = "50"
[[settings.options]]
value = "0"
label = "No minimum"
[[settings.options]]
value = "50"
label = "50+ followers"
[[settings.options]]
value = "100"
label = "100+ followers"
[[settings.options]]
value = "500"
label = "500+ followers"
[[settings]]
key = "growth_mode"
label = "Growth Mode"
description = "Optimize strategy for growing from zero — prioritizes replies on larger accounts and community participation over original content"
setting_type = "toggle"
default = "false"
# ─── Agent configuration ─────────────────────────────────────────────────────
[agent]
@@ -337,19 +390,43 @@ Store strategy in knowledge graph for consistency across sessions.
## Phase 2 — Content Research & Trend Analysis
Before creating content:
1. Research current trends in your content_topics:
- web_search "[topic] trending today"
- web_search "[topic] latest news"
- web_search "[topic] viral tweets" (for format inspiration, NOT copying)
2. Check what's performing well on Twitter (via API if available):
```
curl -s -H "Authorization: Bearer $TWITTER_BEARER_TOKEN" \
"https://api.twitter.com/2/tweets/search/recent?query=[topic]&max_results=10&tweet.fields=public_metrics" \
-o trending_tweets.json
```
3. Identify content gaps — what's NOT being said about the topic
4. Store trending topics and insights in knowledge graph
Before creating content, run a structured trend analysis for each topic in `content_topics`:
**Step 1 — Gather raw signals** (do all three for each topic):
- web_search "[topic] trending today" — capture headline themes
- web_search "[topic] latest news [current month year]" — recent developments
- web_search "site:twitter.com [topic] viral" — format inspiration (NOT copying)
**Step 2 — Pull live Twitter data**:
```
curl -s -H "Authorization: Bearer $TWITTER_BEARER_TOKEN" \
"https://api.twitter.com/2/tweets/search/recent?query=[topic]&max_results=25&tweet.fields=public_metrics,created_at&sort_order=relevancy" \
-o trending_tweets.json
```
**Step 3 — Extract actionable trends** by analyzing the gathered data:
For each topic, produce a trend brief (store in knowledge graph):
```json
{
"topic": "AI",
"date": "2025-01-15",
"hot_narratives": ["narrative 1", "narrative 2"],
"content_gaps": ["angle nobody is covering"],
"high_engagement_formats": ["thread", "hot_take"],
"top_performing_hooks": ["example hook from trending tweet"],
"sentiment": "positive|negative|mixed",
"timeliness": "rising|peaking|declining"
}
```
- **hot_narratives**: 2-3 themes dominating the conversation right now
- **content_gaps**: angles, counterpoints, or data nobody is surfacing yet — this is where your content wins
- **high_engagement_formats**: which tweet formats (thread, question, data) are getting the most replies in the current conversation
- **timeliness**: if "declining," skip the trend — you are too late
**Step 4 — Prioritize**:
- Prefer trends where timeliness = "rising" and a clear content_gap exists
- Cross-reference with `hashtag_strategy` setting to decide hashtag usage
- If no strong trends exist, fall back to evergreen content from your pillars
---
@@ -378,9 +455,28 @@ Tweet rules:
- Stay under 280 characters (hard limit)
- Front-load the hook — first line must grab attention
- Use line breaks for readability
- Hashtags: 0-2 max (overuse looks spammy)
- Hashtags: follow `hashtag_strategy` setting (default: 0-2 per tweet, more looks spammy)
- For threads: first tweet must stand alone as a compelling hook
Algorithm-awareness rules (maximize distribution):
- Tweets with images/video get 2-3x more impressions — include media when it adds value
- The algorithm rewards early engagement: post when your audience is online
- Tweets that earn replies within the first 30 minutes get boosted significantly
- Threads keep users on-platform (dwell time) — the algorithm favors this
- Avoid external links in the main tweet; put links in a reply instead
Media handling:
- If the tweet references data/stats, generate a simple text summary as an image description for accessibility
- For threads with code, format code in a plain text file and reference it
- Note: Twitter API v2 media upload requires the v1.1 media/upload endpoint — use:
```
curl -X POST "https://upload.twitter.com/1.1/media/upload.json" \
-H "Authorization: OAuth ..." \
-F "media=@image.png"
```
Then attach the returned media_id to the tweet payload: `{"text": "...", "media": {"media_ids": ["MEDIA_ID"]}}`
- If OAuth 1.0a credentials are not configured, skip media uploads and post text-only with a note in the queue
Generate enough tweets to fill the `content_queue_size`.
---
@@ -388,13 +484,49 @@ Generate enough tweets to fill the `content_queue_size`.
## Phase 4 — Content Queue & Posting
If `approval_mode` is ENABLED:
1. Write generated tweets to `twitter_queue.json`:
1. Write generated tweets to `twitter_queue.json` using this schema:
```json
[{"id": "q_001", "content": "tweet text", "type": "hot_take", "created": "timestamp", "status": "pending"}]
[
{
"id": "q_001",
"content": "tweet text here",
"thread": null,
"type": "hot_take",
"pillar": "AI",
"hashtags": ["#AI"],
"media": null,
"scheduled_for": "2025-01-15T10:00:00Z",
"created": "2025-01-14T20:00:00Z",
"status": "pending",
"trend_source": "rising narrative about LLM pricing",
"notes": "Contrarian take on open-source vs proprietary costs"
},
{
"id": "q_002",
"content": "1/5 First tweet of thread (hook)",
"thread": ["2/5 Second tweet", "3/5 Third tweet", "4/5 Fourth", "5/5 CTA"],
"type": "thread",
"pillar": "Engineering",
"hashtags": [],
"media": null,
"scheduled_for": "2025-01-16T10:00:00Z",
"created": "2025-01-14T20:05:00Z",
"status": "pending",
"trend_source": null,
"notes": "Evergreen content on deployment patterns"
}
]
```
Field reference:
- `thread`: null for single tweets; array of follow-up tweet texts for threads
- `pillar`: which content pillar this serves
- `hashtags`: planned hashtags (separate from content for easy editing)
- `media`: null or `{"type": "image|video", "path": "local_path", "alt_text": "description"}`
- `trend_source`: which trend brief inspired this, or null for evergreen
- `status`: "pending" | "approved" | "rejected" | "posted" | "failed"
2. Write a human-readable `twitter_queue_preview.md` for easy review
3. event_publish "twitter_queue_updated" with queue size
4. Do NOT post — wait for user to approve via the queue file
4. Do NOT post — wait for user to approve via the queue file (user sets status to "approved")
If `approval_mode` is DISABLED:
1. Post each tweet at its scheduled time via the API:
@@ -425,26 +557,39 @@ During `engagement_hours`, if `auto_reply` or `auto_like` is enabled:
Check mentions:
```
curl -s -H "Authorization: Bearer $TWITTER_BEARER_TOKEN" \
"https://api.twitter.com/2/users/USER_ID/mentions?max_results=10&tweet.fields=public_metrics,created_at" \
"https://api.twitter.com/2/users/USER_ID/mentions?max_results=20&tweet.fields=public_metrics,created_at,author_id&expansions=author_id&user.fields=public_metrics" \
-o mentions.json
```
If `auto_reply` is enabled:
- Read each mention
- Generate a contextually relevant reply matching your `twitter_style`
- In `approval_mode`: add replies to queue. Otherwise post directly.
- NEVER argue, insult, or engage with trolls — ignore negative engagement
**Engagement decision criteria** — score each mention before acting:
- **Author follower count**: >1000 = high priority, 100-1000 = medium, <100 = low
- **Mention sentiment**: positive/neutral = engage, negative = evaluate, hostile = skip
- **Relevance to pillars**: on-topic = engage, off-topic = lower priority
- **Author engagement history**: repeat engager = always respond (loyalty signal)
- Minimum threshold from `engagement_threshold` setting: only auto-engage with mentions whose author has >= threshold followers (prevents bot noise)
If `auto_like` is enabled:
If `auto_reply` is enabled:
- Read each mention that passes the decision criteria above
- Generate a contextually relevant reply matching your `twitter_style`
- Reply priority: questions > compliments > disagreements > generic mentions
- In `approval_mode`: add replies to queue with `"type": "reply"` and `"reply_to_tweet_id"` field. Otherwise post directly.
- NEVER argue, insult, or engage with trolls — ignore negative engagement
- If a mention is hostile or toxic: do not reply, do not like. If `auto_reply` is on, log the skip reason.
- For negative but constructive feedback: reply with acknowledgment, not defensiveness
- Max replies per cycle: 15 (to stay within rate limits and avoid appearing bot-like)
If `auto_like` is enabled (requires OAuth 1.0a credentials):
```
curl -s -X POST "https://api.twitter.com/2/users/USER_ID/likes" \
-H "Authorization: Bearer $TWITTER_BEARER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tweet_id": "TWEET_ID"}'
```
- Like tweets from people who engage with you
- Like tweets from people who engage with you (reciprocity builds community)
- Like relevant content from people in your network
- Max 50 likes per cycle to avoid rate limits
- Like replies to your own tweets (encourages more replies — strong algorithm signal)
- Max 40 likes per cycle (stay well under the 50/15min rate limit)
- Skip: controversial content, political takes outside your pillars, anything you have not read
---
@@ -483,6 +628,25 @@ Store insights in knowledge graph for future content optimization.
---
## Phase 8 — Growth Mode (when `growth_mode` is enabled)
When `growth_mode` is enabled, shift strategy from broadcasting to community participation:
1. **Reply-first approach**: Spend 70% of effort on replies to larger accounts in your niche, 30% on original content
2. **Target accounts**: Find 10-15 accounts with 5K-50K followers who post about your `content_topics`
```
curl -s -H "Authorization: Bearer $TWITTER_BEARER_TOKEN" \
"https://api.twitter.com/2/tweets/search/recent?query=[topic]&max_results=25&tweet.fields=public_metrics,author_id&expansions=author_id&user.fields=public_metrics" \
-o niche_tweets.json
```
Filter for authors with 5K-50K followers who get consistent replies.
3. **Reply quality**: Every reply must add value — data, counterpoint, or personal experience. Never "Great post!" or emoji-only.
4. **Original content cadence**: 1-2 tweets/day max (observations, not promotions). Save threads for week 3+.
5. **Track growth signals**: profile visits, follower growth rate, reply-to-impression ratio. If profile visits are low, your replies are not compelling enough.
6. **Disable** heavy auto-posting schedules — the algorithm penalizes low-engagement tweets, and new accounts will have low engagement.
---
## Guidelines
- NEVER post content that could be defamatory, discriminatory, or harmful
@@ -496,6 +660,9 @@ Store insights in knowledge graph for future content optimization.
- If the user messages you, pause posting and respond to their question
- Monitor your API rate limit headers and back off when approaching limits
- When in doubt about a tweet, DON'T post it — add it to the queue with a note
- The Twitter/X algorithm is opaque and changes without notice — track what works for YOUR account rather than relying on generic advice
- External links in tweets reduce distribution — put links in a reply to the main tweet instead
- Early engagement (first 30 min) determines reach — post when your audience is most active
"""
[dashboard]
@@ -536,6 +703,7 @@ default_active = false
[i18n.zh]
name = "Twitter Hand"
description = "自主 Twitter/X 管理——内容创作、定时发布、互动管理和效果追踪"
<<<<<<< HEAD
category = "通信"
[i18n.zh.settings.twitter_bearer_token]
@@ -836,3 +1004,378 @@ description = "멘션 확인 및 소통 활동을 수행하는 시간대"
[i18n.ko.settings.approval_mode]
label = "승인 모드"
description = "트윗을 직접 게시하지 않고 대기열 파일에 기록하여 검토"
||||||| parent of e65ad25 (feat(hands): improve linkedin, reddit, and twitter hands)
=======
category = "通信"
[i18n.zh.settings.twitter_bearer_token]
label = "Twitter Bearer Token"
description = "Twitter/X 开发者平台的 Bearer Token,所有 Twitter API 操作均需此凭证。"
[i18n.zh.settings.twitter_style]
label = "内容风格"
description = "推文的语气和风格"
[i18n.zh.settings.post_frequency]
label = "发布频率"
description = "创建和发布内容的频率"
[i18n.zh.settings.auto_reply]
label = "自动回复"
description = "自动回复提及和相关对话"
[i18n.zh.settings.auto_like]
label = "自动点赞"
description = "自动为人脉网络中的推文和相关内容点赞"
[i18n.zh.settings.content_topics]
label = "内容主题"
description = "要创作内容的主题(逗号分隔,例如 AI、创业、效率提升)"
[i18n.zh.settings.brand_voice]
label = "品牌调性"
description = "描述你的独特风格(例如"用幽默简化复杂技术的创业者")"
[i18n.zh.settings.thread_mode]
label = "推文串模式"
description = "在内容组合中加入推文串(多条推文组成的故事)"
[i18n.zh.settings.content_queue_size]
label = "内容队列大小"
description = "待发队列中保持的推文数量"
[i18n.zh.settings.engagement_hours]
label = "互动时段"
description = "检查提及和互动的时间段"
[i18n.zh.settings.approval_mode]
label = "审批模式"
description = "将推文写入队列等待审核,而非直接发布"
[i18n.zh.settings.hashtag_strategy]
label = "话题标签策略"
description = "推文中使用话题标签的力度"
[i18n.zh.settings.engagement_threshold]
label = "互动门槛"
description = "自动回复和点赞的最低粉丝数门槛(过滤机器人和垃圾账号)"
[i18n.zh.settings.growth_mode]
label = "增长模式"
description = "优化从零开始的增长策略——优先在大号下评论互动,而非发布原创内容"
# ─── Spanish (Español) ────────────────────────────────────────────────────
[i18n.es]
name = "Hand de Twitter"
description = "Gestor autónomo de Twitter/X — creación de contenido, publicación programada, interacciones y seguimiento de rendimiento"
category = "Comunicación"
[i18n.es.settings.twitter_bearer_token]
label = "Token Bearer de Twitter"
description = "Token Bearer del Portal de Desarrolladores de Twitter/X. Requerido para todas las operaciones de la API de Twitter."
[i18n.es.settings.twitter_style]
label = "Estilo de contenido"
description = "Voz y tono para tus tweets"
[i18n.es.settings.post_frequency]
label = "Frecuencia de publicación"
description = "Con qué frecuencia crear y publicar contenido"
[i18n.es.settings.auto_reply]
label = "Respuesta automática"
description = "Responder automáticamente a menciones y conversaciones relevantes"
[i18n.es.settings.auto_like]
label = "Me gusta automático"
description = "Dar me gusta automáticamente a tweets de tu red y contenido relevante"
[i18n.es.settings.content_topics]
label = "Temas de contenido"
description = "Temas sobre los que crear contenido (separados por comas, ej. IA, startups, productividad)"
[i18n.es.settings.brand_voice]
label = "Voz de marca"
description = "Describe tu voz única (ej. 'fundador sarcástico que simplifica la tecnología compleja')"
[i18n.es.settings.thread_mode]
label = "Modo de hilos"
description = "Incluir hilos de tweets (historias de múltiples tweets) en la mezcla de contenido"
[i18n.es.settings.content_queue_size]
label = "Tamaño de la cola de contenido"
description = "Número de tweets a mantener en la cola preparada"
[i18n.es.settings.engagement_hours]
label = "Horario de interacción"
description = "Cuándo verificar menciones e interactuar"
[i18n.es.settings.approval_mode]
label = "Modo de aprobación"
description = "Escribir los tweets en un archivo de cola para revisión en lugar de publicarlos directamente"
[i18n.es.settings.hashtag_strategy]
label = "Estrategia de hashtags"
description = "Nivel de uso de hashtags en los tweets"
[i18n.es.settings.engagement_threshold]
label = "Umbral de interacción"
description = "Número mínimo de seguidores para respuestas y likes automáticos (filtra bots y spam)"
[i18n.es.settings.growth_mode]
label = "Modo de crecimiento"
description = "Optimizar la estrategia para crecer desde cero — prioriza respuestas en cuentas grandes y participación comunitaria"
# ─── Japanese (日本語) ────────────────────────────────────────────────────
[i18n.ja]
name = "Twitter Hand"
description = "自律型Twitter/Xマネージャー——コンテンツ作成、スケジュール投稿、エンゲージメント管理、パフォーマンス追跡"
category = "コミュニケーション"
[i18n.ja.settings.twitter_bearer_token]
label = "Twitter Bearerトークン"
description = "Twitter/X開発者ポータルのBearerトークン。すべてのTwitter API操作に必要です。"
[i18n.ja.settings.twitter_style]
label = "コンテンツスタイル"
description = "ツイートの語調とスタイル"
[i18n.ja.settings.post_frequency]
label = "投稿頻度"
description = "コンテンツの作成・投稿の頻度"
[i18n.ja.settings.auto_reply]
label = "自動返信"
description = "メンションや関連する会話に自動で返信する"
[i18n.ja.settings.auto_like]
label = "自動いいね"
description = "ネットワーク内のツイートや関連コンテンツに自動でいいねする"
[i18n.ja.settings.content_topics]
label = "コンテンツトピック"
description = "作成するコンテンツのトピック(カンマ区切り、例: AI、スタートアップ、生産性)"
[i18n.ja.settings.brand_voice]
label = "ブランドボイス"
description = "あなた独自の語り口を記述(例:「複雑なテクノロジーをわかりやすく伝える皮肉屋の起業家」)"
[i18n.ja.settings.thread_mode]
label = "スレッドモード"
description = "コンテンツミックスにツイートスレッド(複数ツイートで構成するストーリー)を含める"
[i18n.ja.settings.content_queue_size]
label = "コンテンツキューサイズ"
description = "準備キューに保持するツイートの数"
[i18n.ja.settings.engagement_hours]
label = "エンゲージメント時間帯"
description = "メンションの確認とエンゲージメントを行う時間帯"
[i18n.ja.settings.approval_mode]
label = "承認モード"
description = "ツイートを直接投稿せず、レビュー用のキューファイルに書き出す"
[i18n.ja.settings.hashtag_strategy]
label = "ハッシュタグ戦略"
description = "ツイートでのハッシュタグの使用頻度"
[i18n.ja.settings.engagement_threshold]
label = "エンゲージメント閾値"
description = "自動返信・自動いいねの対象となる最低フォロワー数(ボットやスパムをフィルタリング)"
[i18n.ja.settings.growth_mode]
label = "成長モード"
description = "ゼロからの成長に最適化——大きなアカウントへのリプライとコミュニティ参加を優先し、オリジナル投稿は控えめに"
# ─── French (Français) ────────────────────────────────────────────────────
[i18n.fr]
name = "Hand Twitter"
description = "Gestionnaire Twitter/X autonome — création de contenu, publication programmée, interactions et suivi des performances"
category = "Communication"
[i18n.fr.settings.twitter_bearer_token]
label = "Jeton Bearer Twitter"
description = "Jeton Bearer du Portail Développeurs Twitter/X. Requis pour toutes les opérations de l'API Twitter."
[i18n.fr.settings.twitter_style]
label = "Style de contenu"
description = "Ton et style pour vos tweets"
[i18n.fr.settings.post_frequency]
label = "Fréquence de publication"
description = "Fréquence de création et de publication de contenu"
[i18n.fr.settings.auto_reply]
label = "Réponse automatique"
description = "Répondre automatiquement aux mentions et conversations pertinentes"
[i18n.fr.settings.auto_like]
label = "Like automatique"
description = "Aimer automatiquement les tweets de votre réseau et le contenu pertinent"
[i18n.fr.settings.content_topics]
label = "Sujets de contenu"
description = "Sujets sur lesquels créer du contenu (séparés par des virgules, ex. IA, startups, productivité)"
[i18n.fr.settings.brand_voice]
label = "Voix de marque"
description = "Décrivez votre voix unique (ex. 'fondateur sarcastique qui simplifie la technologie complexe')"
[i18n.fr.settings.thread_mode]
label = "Mode fil de discussion"
description = "Inclure des fils de tweets (histoires à plusieurs tweets) dans le mix de contenu"
[i18n.fr.settings.content_queue_size]
label = "Taille de la file de contenu"
description = "Nombre de tweets à maintenir dans la file d'attente préparée"
[i18n.fr.settings.engagement_hours]
label = "Heures d'engagement"
description = "Quand vérifier les mentions et interagir"
[i18n.fr.settings.approval_mode]
label = "Mode d'approbation"
description = "Écrire les tweets dans un fichier d'attente pour révision au lieu de les publier directement"
[i18n.fr.settings.hashtag_strategy]
label = "Stratégie de hashtags"
description = "Niveau d'utilisation des hashtags dans les tweets"
[i18n.fr.settings.engagement_threshold]
label = "Seuil d'engagement"
description = "Nombre minimum d'abonnés pour les réponses et likes automatiques (filtre les bots et le spam)"
[i18n.fr.settings.growth_mode]
label = "Mode croissance"
description = "Optimiser la stratégie pour une croissance depuis zéro — privilégie les réponses aux grands comptes et la participation communautaire"
# ─── German (Deutsch) ────────────────────────────────────────────────────
[i18n.de]
name = "Twitter-Hand"
description = "Autonomer Twitter/X-Manager — Content-Erstellung, geplante Veröffentlichung, Engagement-Management und Performance-Tracking"
category = "Kommunikation"
[i18n.de.settings.twitter_bearer_token]
label = "Twitter Bearer-Token"
description = "Bearer-Token vom Twitter/X-Entwicklerportal. Erforderlich für alle Twitter-API-Operationen."
[i18n.de.settings.twitter_style]
label = "Inhaltsstil"
description = "Ton und Stil für Ihre Tweets"
[i18n.de.settings.post_frequency]
label = "Veröffentlichungshäufigkeit"
description = "Wie oft Inhalte erstellt und veröffentlicht werden"
[i18n.de.settings.auto_reply]
label = "Automatische Antwort"
description = "Automatisch auf Erwähnungen und relevante Gespräche antworten"
[i18n.de.settings.auto_like]
label = "Automatisches Like"
description = "Tweets im Netzwerk und relevante Inhalte automatisch liken"
[i18n.de.settings.content_topics]
label = "Inhaltsthemen"
description = "Themen für die Content-Erstellung (kommagetrennt, z.B. KI, Startups, Produktivität)"
[i18n.de.settings.brand_voice]
label = "Markenstimme"
description = "Beschreiben Sie Ihre einzigartige Stimme (z.B. 'sarkastischer Gründer, der komplexe Technologie vereinfacht')"
[i18n.de.settings.thread_mode]
label = "Thread-Modus"
description = "Tweet-Threads (mehrteilige Tweet-Geschichten) in den Content-Mix aufnehmen"
[i18n.de.settings.content_queue_size]
label = "Größe der Content-Warteschlange"
description = "Anzahl der Tweets in der vorbereiteten Warteschlange"
[i18n.de.settings.engagement_hours]
label = "Engagement-Zeiten"
description = "Wann Erwähnungen geprüft und interagiert werden soll"
[i18n.de.settings.approval_mode]
label = "Genehmigungsmodus"
description = "Tweets in eine Warteschlangendatei zur Überprüfung schreiben, anstatt sie direkt zu veröffentlichen"
[i18n.de.settings.hashtag_strategy]
label = "Hashtag-Strategie"
description = "Intensität der Hashtag-Nutzung in Tweets"
[i18n.de.settings.engagement_threshold]
label = "Engagement-Schwelle"
description = "Mindestanzahl an Followern für automatische Antworten und Likes (filtert Bots und Spam)"
[i18n.de.settings.growth_mode]
label = "Wachstumsmodus"
description = "Strategie für Wachstum von null optimieren — priorisiert Antworten bei größeren Accounts und Community-Beteiligung"
# ─── Korean (한국어) ────────────────────────────────────────────────────
[i18n.ko]
name = "Twitter Hand"
description = "자율 Twitter/X 관리 — 콘텐츠 제작, 예약 게시, 소통 관리 및 성과 추적"
category = "커뮤니케이션"
[i18n.ko.settings.twitter_bearer_token]
label = "Twitter Bearer 토큰"
description = "Twitter/X 개발자 포털의 Bearer 토큰. 모든 Twitter API 작업에 필수."
[i18n.ko.settings.twitter_style]
label = "콘텐츠 스타일"
description = "트윗의 어조와 스타일"
[i18n.ko.settings.post_frequency]
label = "게시 빈도"
description = "콘텐츠를 작성하고 게시하는 주기"
[i18n.ko.settings.auto_reply]
label = "자동 답글"
description = "멘션 및 관련 대화에 자동으로 답글 작성"
[i18n.ko.settings.auto_like]
label = "자동 좋아요"
description = "네트워크 내 트윗 및 관련 콘텐츠에 자동으로 좋아요"
[i18n.ko.settings.content_topics]
label = "콘텐츠 주제"
description = "콘텐츠를 작성할 주제 (쉼표로 구분, 예: AI, 스타트업, 생산성)"
[i18n.ko.settings.brand_voice]
label = "브랜드 보이스"
description = "고유한 스타일을 설명 (예: '복잡한 기술을 쉽게 풀어내는 유머러스한 창업자')"
[i18n.ko.settings.thread_mode]
label = "스레드 모드"
description = "콘텐츠 구성에 트윗 스레드 (다중 트윗 스토리) 포함"
[i18n.ko.settings.content_queue_size]
label = "콘텐츠 대기열 크기"
description = "준비 대기열에 유지할 트윗 수"
[i18n.ko.settings.engagement_hours]
label = "소통 시간대"
description = "멘션 확인 및 소통 활동을 수행하는 시간대"
[i18n.ko.settings.approval_mode]
label = "승인 모드"
description = "트윗을 직접 게시하지 않고 대기열 파일에 기록하여 검토"
[i18n.ko.settings.hashtag_strategy]
label = "해시태그 전략"
description = "트윗에서 해시태그를 사용하는 정도"
[i18n.ko.settings.engagement_threshold]
label = "소통 기준"
description = "자동 답글 및 좋아요 대상의 최소 팔로워 수 (봇과 스팸 필터링)"
[i18n.ko.settings.growth_mode]
label = "성장 모드"
description = "제로에서 시작하는 성장 전략 최적화 — 대형 계정에 답글과 커뮤니티 참여를 우선시"
>>>>>>> e65ad25 (feat(hands): improve linkedin, reddit, and twitter hands)
+171
View File
@@ -105,6 +105,78 @@ Always check response headers:
---
## Algorithm Optimization
The following signals are known to affect distribution as of 2024-2025. Treat as heuristics -- validate against your own account's data.
### Signals That Boost Distribution
| Signal | Why It Matters | How to Leverage |
|--------|---------------|-----------------|
| Early engagement (first 30 min) | Algorithm tests tweets on a small audience first; high early engagement triggers wider distribution | Post when your audience is most active; craft strong hooks |
| Dwell time | Time spent reading your tweet/thread counts as engagement | Write threads (keeps users scrolling), use line breaks for readability |
| Replies (especially conversations) | Reply chains signal valuable content | End tweets with questions; reply to your own replies to keep threads going |
| Bookmarks/saves | Strong quality signal (user wants to return) | Post actionable content (how-tos, frameworks, checklists) worth saving |
| Profile visits after viewing | Indicates your content made someone curious about you | Ensure your bio clearly states your expertise and value prop |
### Signals That Suppress Distribution
| Signal | Impact | Avoidance |
|--------|--------|-----------|
| External links in tweet body | Reduced impressions (Twitter wants users on-platform) | Post the content natively; put links in a reply |
| Hashtag spam (3+) | Triggers spam filters | Use 0-2 relevant hashtags maximum |
| Rapid-fire posting | Floods follower timelines, reduces per-tweet engagement | Space posts 2-3 hours apart minimum |
| Low engagement ratio | Tweets with many impressions but no interaction signal low quality | Delete or don't repeat content formats that consistently underperform |
| Engagement bait without substance | "Like if you agree" without actual content | Pair CTAs with genuine value |
### Algorithm-Aware Posting Strategy
1. **Test before committing**: Post a single tweet on a topic. If engagement is above-average in 1 hour, follow up with a thread within 24 hours.
2. **Reply to yourself**: Add a reply with a link or context. This creates a conversation thread that boosts the original.
3. **Engagement window**: Reply to comments on your tweets within the first hour. Reply chains are rewarded.
4. **Content recycling**: A tweet that performed well 3+ months ago can be reposted with fresh wording.
---
## Media Upload Handling
### Twitter API v2 Media Upload
Twitter API v2 has no media upload endpoint. Use the v1.1 endpoint, which requires OAuth 1.0a.
**Simple upload (images < 5MB, GIFs < 15MB)**:
```bash
curl -X POST "https://upload.twitter.com/1.1/media/upload.json" \
-H "Authorization: OAuth oauth_consumer_key=...,oauth_token=...,oauth_signature=..." \
-F "media=@/path/to/image.png"
```
Response: `{"media_id": 123456789, "media_id_string": "123456789"}`
**Attach media to a tweet**:
```bash
curl -s -X POST "https://api.twitter.com/2/tweets" \
-H "Authorization: Bearer $TWITTER_BEARER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"text": "Check this out", "media": {"media_ids": ["123456789"]}}'
```
**Alt text for accessibility** (set after upload, before tweeting):
```bash
curl -X POST "https://upload.twitter.com/1.1/media/metadata/create.json" \
-H "Authorization: OAuth ..." \
-H "Content-Type: application/json" \
-d '{"media_id": "123456789", "alt_text": {"text": "Description of the image"}}'
```
### When to Use Media
- **Data/stats tweets**: Chart or highlighted number as image -- 2-3x more impressions
- **Thread hooks**: Image in tweet 1 increases click-through
- **Code snippets**: Screenshot with syntax highlighting beats plain text
- **Before/after**: Visual comparisons are highly shareable
### When to Skip Media
- OAuth 1.0a credentials not configured (Bearer Token alone cannot upload)
- Image does not add information beyond the text
- Attaching media would delay posting past the optimal window
---
## Content Strategy Framework
### Content Pillars
@@ -226,6 +298,7 @@ Do NOT auto-like:
---
<<<<<<< HEAD
## Advanced Engagement Patterns
### Quote Tweet vs Reply vs Retweet
@@ -292,6 +365,104 @@ A thread that performed well contains 5-7 standalone content pieces. Extract the
---
||||||| parent of e65ad25 (feat(hands): improve linkedin, reddit, and twitter hands)
=======
## Advanced Engagement Patterns
### Quote Tweet vs Reply vs Retweet
Choosing the right interaction type determines whether you gain visibility or waste it.
**Use a Quote Tweet when**:
- You have a distinct take or added context (not just "this!")
- The original tweet has high impressions and you want to draft off its reach
- You are crediting someone while adding your own insight for your audience
- The original author has a similar or larger following (exposes you to their audience)
**Use a Reply when**:
- You want to build a direct relationship with the author
- Your comment only makes sense in context of the original
- The original author has a much larger following (replies show on their thread, giving you visibility without looking self-promotional)
- You are answering a question or adding a correction
**Use a plain Retweet when**:
- The original says everything perfectly and you have nothing to add
- You want to signal-boost a community member, customer, or partner
- The content is time-sensitive (breaking news, event announcements)
**Avoid**:
- Quote tweeting with only emojis or "this" -- adds no value, looks lazy
- Quote tweeting someone with fewer followers just to dunk -- punching down
- Retweeting more than 3-4 times per day -- dilutes your original content ratio
### Thread Repurposing
A thread that performed well contains 5-7 standalone content pieces. Extract them over the following week to maximize ROI.
**Process**:
1. Day 0 (original): Post the full thread
2. Day 2: Pull the single most quotable tweet from the thread. Post it standalone with slightly different wording. No link back to the thread
3. Day 4: Turn a data point or example from the thread into a graphic or screenshot tweet
4. Day 6: Post the thread's core thesis as a hot take (one tweet, punchy)
5. Day 8+: If engagement stayed strong, post a "Part 2" thread that goes deeper on whichever tweet in the original got the most replies
**Rules**:
- Change the wording each time -- copy-pasting feels like spam to followers who saw the original
- Space extractions at least 48 hours apart
- Stop if any extraction underperforms significantly -- the topic is tapped out
- Never repurpose a thread that got low engagement; the content did not resonate
### Trending Topic Participation
**When to participate**:
- The trend directly intersects one of your content pillars
- You have a genuine, informed perspective (not a generic reaction)
- The trend is still rising (check the "Trending" tab; if it has been trending for >12 hours, you are late)
- The tone of the trend matches your brand voice
**When to avoid**:
- Tragedy, disaster, or crisis events -- opportunistic posting destroys trust
- Highly polarized political or social debates outside your expertise
- Trends driven by outrage mobs -- associating your brand is high-risk, low-reward
- You would need to force-fit your product or message into the trend
**Execution**:
- Lead with your actual insight, not the hashtag. The hashtag goes at the end or is omitted entirely if the topic keyword is in your text
- Be early or be different. If 50 people have already made the same joke, skip it
- Tie back to your pillar: "Trend X is exactly why [your pillar topic] matters more than ever"
---
## Crisis & Negative Comment Management
### Classifying Negative Interactions
Not all negative replies require the same response. Classify before acting:
| Type | Example | Action |
|------|---------|--------|
| **Constructive criticism** | "Your benchmark methodology is flawed because X" | Reply with acknowledgment, address the specific point, thank them |
| **Frustrated user** | "I tried your tool and it broke on my setup" | Reply publicly with empathy, ask for details, move to DMs if needed |
| **Trolling** | Personal insults, bad-faith arguments, bait | Do not reply. Block if repeated. Never quote-tweet to "expose" them |
| **Misinformation about you** | Factually wrong claims about your product/work | Reply once with facts and evidence. Do not engage further if they persist |
| **Pile-on / ratio** | Many negative replies at once, often from outside your audience | Pause all posting. Do not delete the original tweet (looks like hiding). Wait 24 hours before responding |
### Response Templates
- **Constructive criticism**: "Fair point — [acknowledgment]. We actually [explanation]. Appreciate you raising this."
- **Frustrated user**: "Sorry you hit that. Can you share [detail]? Happy to help sort it out."
- **Factual correction**: "To clarify — [correct info with source]. Happy to discuss further."
### Rules During a Crisis
1. **Stop all scheduled posts immediately** — auto-posting during a crisis looks tone-deaf
2. **Do not delete** the original tweet unless it contains genuinely harmful misinformation
3. **Acknowledge** the situation in a single, clear tweet if it involves your product/brand
4. **Do not be defensive** — own mistakes directly
5. **Wait before responding** — draft a response and review it after 1 hour
6. **Resume normal posting** only after the situation has cooled down (24-48 hours minimum)
---
>>>>>>> e65ad25 (feat(hands): improve linkedin, reddit, and twitter hands)
## Content Calendar Template
```