| name | postall |
| version | 1.0.0 |
| description | AI-powered multi-platform social media content generation and publishing automation. Generate, review, and publish content across Twitter, LinkedIn, Instagram, Pinterest, Threads, and Xiaohongshu. |
| homepage | https://postall.live |
| repository | https://github.com/qingxuantang/postall |
| metadata | {"emoji":"๐ฎ","category":"content-automation","platforms":["twitter","linkedin","instagram","pinterest","threads","xiaohongshu","wechat"],"ai_providers":["anthropic","openai","google"]} |
PostAll - AI Agent Integration
AI-powered multi-platform content automation. Generate, review, and publish across all social platforms from a single configuration.
Skill Files
| File | URL |
|---|
| SKILL.md (this file) | https://postall.live/skill.md |
| skill.json (metadata) | https://postall.live/skill.json |
Quick install for agents:
curl -s https://postall.live/skill.md > ~/.postall/SKILL.md
curl -s https://postall.live/skill.json > ~/.postall/skill.json
What PostAll Does
- Content Generation - AI creates platform-optimized posts from your brand guidelines
- Director Review - Second AI reviews for quality, brand alignment, factual accuracy
- Image Generation - Auto-generate matching visuals with correct dimensions per platform
- Multi-Platform Publishing - Publish to Twitter, LinkedIn, Instagram, Pinterest, Threads, Xiaohongshu
- RLHF Learning - System improves from feedback over time
- Scheduling - Optimal posting times per platform
Quick Start
Option 1: Docker (Recommended)
git clone https://github.com/qingxuantang/postall.git
cd postall
cp .env.example .env
docker-compose up -d
Option 2: Local Installation
git clone https://github.com/qingxuantang/postall.git
cd postall
pip install -e .
cp .env.example .env
Core CLI Commands
All commands use the format: python -m postall.cli <command> --project <path/to/project.yaml>
Generate Content
python -m postall.cli generate --project projects/example/project.yaml
python -m postall.cli generate --project projects/example/project.yaml --platform twitter
python -m postall.cli generate --project projects/example/project.yaml --model claude
Publish Content
python -m postall.cli publish --project projects/example/project.yaml
python -m postall.cli publish --project projects/example/project.yaml --platform linkedin
Run as Daemon
python -m postall.cli daemon --project projects/example/project.yaml
Check Status
python -m postall.cli status --project projects/example/project.yaml
python -m postall.cli review --project projects/example/project.yaml
Docker Commands
docker-compose up -d
docker-compose logs -f postall
docker-compose down
docker-compose restart
docker exec postall python -m postall.cli status --project /app/projects/example/project.yaml
Telegram Bot Integration
PostAll includes a Telegram bot for monitoring and control. Each project gets its own bot.
Bot Commands (in Telegram)
| Command | Description |
|---|
/start | Initialize the bot |
/status | View current system status |
/upcoming | Posts scheduled for next 24 hours |
/schedule | Today's posting schedule |
/stats | Recent publishing statistics |
/generate | Trigger content generation for next week |
/publish | Manually trigger publishing |
/help | Show all commands |
Bot Menu Buttons
- Upcoming - View posts in the next 24 hours
- Schedule - Today's scheduled posts
- Stats - Publishing statistics by platform
- Content Status - Next week's content status
- Generate - Start content generation
Setting Up Telegram Bot
- Create a bot via @BotFather
- Get your bot token
- Add to
.env:
TELEGRAM_BOT_ENABLED=true
TELEGRAM_BOT_TOKEN=your_bot_token
TELEGRAM_CHAT_ID=your_chat_id
Project Configuration
Create a project.yaml file to define your brand and content strategy:
project_name: "My Brand"
brand:
name: "My Brand"
tagline: "Your Tagline"
website: "mybrand.com"
colors:
primary: "#3498DB"
secondary: "#2ECC71"
accent: "#E74C3C"
voice:
tone: "professional yet friendly"
characteristics:
- "clear and concise"
- "helpful and educational"
- "trustworthy and authentic"
avoid:
- "aggressive sales language"
- "overpromising or hype"
- "technical jargon"
content_strategy:
pillars:
product_education: 35
industry_insights: 25
tips_productivity: 20
customer_stories: 10
behind_scenes: 5
lead_magnet: 5
themes:
- "Getting Started"
- "Best Practices"
- "Common Mistakes"
- "Success Stories"
platforms:
twitter:
enabled: true
language: "en"
linkedin:
enabled: true
language: "en"
instagram:
enabled: false
pinterest:
enabled: false
timezone: "America/Los_Angeles"
generation_schedule:
day: "saturday"
time: "09:00"
posting_times:
twitter: ["08:00", "12:00", "18:00"]
linkedin: ["07:30", "12:00"]
Environment Variables
ANTHROPIC_API_KEY=
OPENAI_API_KEY=
GEMINI_API_KEY=
TWITTER_ENABLED=true
TWITTER_API_KEY=
TWITTER_API_SECRET=
TWITTER_ACCESS_TOKEN=
TWITTER_ACCESS_SECRET=
LINKEDIN_ENABLED=true
LINKEDIN_ACCESS_TOKEN=
LINKEDIN_CLIENT_ID=
LINKEDIN_CLIENT_SECRET=
LINKEDIN_PERSON_URN=
INSTAGRAM_ENABLED=false
INSTAGRAM_ACCESS_TOKEN=
INSTAGRAM_BUSINESS_ACCOUNT_ID=
PINTEREST_ENABLED=false
PINTEREST_ACCESS_TOKEN=
TELEGRAM_BOT_ENABLED=false
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=
Content Generation Flow
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ Brand Config โโโโโโถโ AI Generation โโโโโโถโ Director Review โ
โ (project.yaml) โ โ (Claude/GPT/ โ โ (Quality Check) โ
โ โ โ Gemini) โ โ โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ Publishing โโโโโโโ Human Review โโโโโโโ Content Ready โ
โ (Platforms) โ โ (Optional) โ โ (Approved) โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโ
โ RLHF Learning โ
โ (Improvement) โ
โโโโโโโโโโโโโโโโโโโ
Director Review System
The Director is a second AI that reviews generated content for:
- Brand Alignment - Does it match your voice and tone?
- Quality Standards - Is it well-written and engaging?
- Platform Fit - Is it optimized for the target platform?
- Factual Accuracy - No fabricated statistics or claims
- Compliance - No problematic content
Posts receive a score. Low-scoring posts can be regenerated automatically.
Supported Platforms
| Platform | Publishing | Image Support | Notes |
|---|
| Twitter/X | โ
| โ
| Threads supported |
| LinkedIn | โ
| โ
| Personal & Company pages |
| Instagram | โ
| โ
| Requires Meta Business |
| Pinterest | โ
| โ
| Pin creation |
| Threads | โ
| โ
| Meta Threads API |
| Xiaohongshu | โ
| โ
| Card generation + publishing |
| WeChat | โ
| โ
| Article publishing |
Image Generation
PostAll automatically generates images optimized for each platform:
- Twitter: 1200x675 (16:9)
- LinkedIn: 1200x627 (1.91:1)
- Instagram: 1080x1080 (1:1)
- Pinterest: 1000x1500 (2:3)
Recommended: Use Gemini Pro for image generation (best quality).
RLHF Learning
The system learns from your feedback:
- Rate Content - Mark posts as good, bad, or needs improvement
- Custom Feedback - Provide specific notes on what to change
- Auto-Learning - System adjusts future generations based on patterns
Agent Integration Patterns
Pattern 1: Scheduled Generation
Set up weekly content generation with auto-publish:
import subprocess
def weekly_content_generation():
subprocess.run([
"python", "-m", "postall.cli", "generate",
"--project", "projects/mybrand/project.yaml"
])
subprocess.run([
"python", "-m", "postall.cli", "publish",
"--project", "projects/mybrand/project.yaml"
])
Pattern 2: On-Demand Generation
Generate content when triggered by your agent:
python -m postall.cli generate \
--project projects/mybrand/project.yaml \
--topic "New product feature announcement" \
--platform twitter
Pattern 3: Monitor via Telegram
Let your agent receive status updates via Telegram bot, then take action based on results.
File Structure
postall/
โโโ postall/ # Core library
โ โโโ cli.py # Command-line interface
โ โโโ config.py # Configuration management
โ โโโ cloud/ # Cloud services
โ โ โโโ daemon.py # Background daemon
โ โ โโโ generation_controller.py
โ โ โโโ telegram_bot.py
โ โโโ director/ # AI review system
โ โ โโโ director.py
โ โโโ executors/ # AI model executors
โ โ โโโ claude_api_executor.py
โ โ โโโ gemini_api_executor.py
โ โ โโโ gemini_image_executor.py
โ โโโ publishers/ # Platform publishers
โ โ โโโ twitter_publisher.py
โ โ โโโ linkedin_publisher.py
โ โ โโโ instagram_publisher.py
โ โ โโโ xhs_publisher.py
โ โโโ learning/ # RLHF system
โ โโโ feedback_collector.py
โ โโโ rlhf_manager.py
โโโ projects/
โ โโโ example/ # Example project
โ โโโ project.yaml
โ โโโ output/ # Generated content
โ โโโ database/ # Persistent data
โโโ docker-compose.yml
โโโ Dockerfile
โโโ .env.example
Critical Rules
When using PostAll, follow these rules to avoid common issues:
- NO parentheses in content - ๆฌๅทไผๅฏผ่ด LinkedIn ๅ
ๅฎน่ขซๆชๆญ
- NO AI clichรฉs - ้ฟๅ
ใไน
ไน
ไธ่ฝๅนณ้ใใ้ๆผไบๆใใ้ข ่ฆ่ฎค็ฅใ็ญ็ฉบๆด่กจ่พพ
- NO fabricated data - ๅชไฝฟ็จๅๅงๅ
ๅฎนไธญ็็ๅฎไฟกๆฏ๏ผไธ่ฆ็ผ้ ็ป่ฎกๆฐๆฎ
- Image prompts in English - AI ๅพๅ็ๆๅจๆ ๆณๆธฒๆไธญๆๅญ็ฌฆ
- Image prompts must reference a concrete object or scene, not the abstract thesis - ้
ๅพๅฟ
้กปๅบไบไธไธชๅ
ทไฝ็ฉไปถๆๅบๆฏ๏ผไธ่ฆ็จๆ็ซ ็ๆฝ่ฑก่ฎบ็นใ Models like Gemini produce generic geometric blocks or flowing color shapes when given abstract conceptual phrases like "components dissolving" or "intelligence augmentation." Read the post body, find one concrete thing it mentions โ a vintage radio with a TV camera pointed at it, a presentation slide with a score badge, a stack of old books, a key, a bridge โ and use that as the image hero element. The abstract thesis is conveyed through the literal scene, not through the prompt language. โ ๆจกๅๅฏนๆฝ่ฑกๆฆๅฟต่ฏ๏ผไพๅฆใ็ปไปถๆญฃๅจๆถ่งฃใใAI ้ๅกๅทฅ็จๅธ่ง่ฒใ๏ผๅบๅพ้ฝๆฏๅ ไฝ blocks ๆๆตๅจ่ฒๅ๏ผๆฒกๆ่ง่ง่ฎฐๅฟ็นใๅฟ
้กปไปๆ็ซ ้ๆพไธไธชๅ
ทไฝ็็ฉไปถๆๅบๆฏ๏ผ็จ้ฃไธชไฝไธบ image ไธปไฝใๆฝ่ฑก่ฎบ็น้่ฟๅ
ทไฝๅบๆฏ่ฎฉ่ฏป่
่ชๅทฑๆๅบๆฅใ
- Handle rate limits gracefully - ้ๅฐๅนณๅฐ้ๅถๆถ็ญๅพ
ๅ้่ฏ
- *WeChat: use _content.md files - Content parser ๅฏ่ฝ้่ฏฏๅๅฒๅ็ฏๆ็ซ ๏ผๅๅธๆถๆฐธ่ฟไฝฟ็จๅฎๆด็
*_content.md ๆไปถ๏ผๅฆ wechat_content.md๏ผ๏ผไธ่ฆไฝฟ็จๅๅฒๅ็ๅฐๆไปถ๏ผๅฆ 01_monday_morning_article.md๏ผ
Content File Structure
When content is generated, you'll see:
wechat-posts/
โโโ wechat_content.md # โ
ๅฎๆดๅ
ๅฎน - ๅๅธๆถ็จ่ฟไธช
โโโ 01_monday_morning_article.md # โ ๅฏ่ฝ่ขซๆชๆญ
โโโ 02_tuesday_morning_post.md # โ ๅฏ่ฝ่ขซๆชๆญ
โโโ ...
Always publish using the *_content.md file, not the numbered split files.
Prompt Design Tips
Lessons that surface only after running the pipeline against real platforms. Two patterns to bake into your run_topic_*.py from day one.
Tip 1: Set explicit per-platform character caps โ don't assume the model honors them
The LLM is bad at counting characters. Telling it "stay under N chars" reduces overrun frequency but does NOT guarantee compliance. Always verify with wc -c after generation and trim manually if over.
Per-account, per-platform caps to know:
| Platform / tier | Max characters per single post |
|---|
| Twitter Free | 280 |
| Twitter Premium Basic | 4,000 |
| Twitter Premium+ | 25,000 |
| LinkedIn personal feed | 3,000 (hard cap, no exceptions) |
| LinkedIn org page | 3,000 |
| WeChat article body | no hard cap (practical 5,000-10,000) |
Encode the cap explicitly in your prompt's CRITICAL RULES section. Example:
twitter_prompt_en = f"""...
CRITICAL RULES:
- HARD CAP: body text MUST stay under <N> characters. Count carefully.
If your draft is over, cut paragraphs until under.
- Single tweet, NO thread structure
...
"""
After each generation, verify:
python3 -c "import re; t=open('x.md').read(); body=re.sub(r'\*\*([^*]+)\*\*', r'\1', t.split('### Image Prompt')[0]); print(len(body.strip()))"
If your draft is over, paragraph-level trims are usually enough. Prioritize keeping: the hook, the concrete examples, the closing CTA.
Tip 2: Don't let prompt blocks contradict each other
If your prompt has multiple instruction blocks (e.g. TOPIC describes the content + CTA_INSTRUCTION describes the CTA + HITLIST_INSTRUCTION describes style constraints), check for direct contradictions BEFORE every run.
Failure mode observed in production: when one block says "include link X" and another block says "don't include link X", the model resolves the conflict probabilistically โ sometimes X appears, sometimes it doesn't. The result is unpredictable output across batch runs.
Cheap mitigation: after editing any prompt block, grep across all blocks for the same concept:
grep -nE "tarai\.dev|don't include" run_topic_my_post.py
If you see both directions present, fix the conflict before running. The LLM cannot reliably honor mutually exclusive instructions.
Tip 3: Ban bridge phrases the LLM defaults to
When generating posts that mention multiple numbers or categories (e.g. dual scores, before/after metrics), the LLM tends to produce filler bridge sentences like "those two numbers tell different stories" or "the gap between them is the point." These add nothing and feel generic.
Add an explicit ban in your HITLIST ็ฆๆญข list:
โ ๏ธ ็ฆๆญข๏ผ
- ไธ่ฆๅ"ไธคไธชๆฐๅญ่ฎฒไธๅ็ๆ
ไบ" / "telling different stories" /
"gap between them" / similar abstract bridge phrasing โ
go straight to the specific cause / specific finding / specific layer
This is in the same spirit as banning generic AI clichรฉ phrases โ the goal is to force the model into concrete, specific writing.
Troubleshooting
Common Issues
Content not publishing:
python -m postall.cli status --project project.yaml
docker-compose logs -f postall | grep ERROR
Rate limits:
- Twitter: 1 post per platform per posting slot
- LinkedIn: Respect 100 posts/day limit
- Instagram: 25 posts/day limit
Image generation failing:
- Ensure
GEMINI_API_KEY is set
- Check quota limits on Google AI Studio
Third-Party Integration Policy
PostAll's official docs do not recommend, endorse, or document third-party SaaS middlemen for any platform action โ content collection, posting, scheduling, scraping, authentication proxying, or anything that routes user credentials or content through an external service.
This includes but is not limited to: Twitter/X middleman APIs, "agent-friendly" social scrapers, hosted content-collection services, and any closed-source plugin that requires users to give a third party their platform credentials or session cookies.
Why this policy exists
- A doc that says "install package X" is read by users as a tacit endorsement from the maintainers, even when the README disclaims it.
- Third-party SaaS integrations introduce supply chain risk that PostAll cannot audit. Today's benign version is tomorrow's malicious release.
- "Optional integration" PRs are increasingly generated by AI coding agents at scale and submitted to many OSS repos as a free marketing channel. See the
codex/* PR pattern observed in 2026.
- PostAll's value is in clean, auditable, first-party publisher implementations. Routing through a middleman defeats that.
What we accept instead
- Users are free to integrate anything they want in their own project fork or downstream automation.
- Third-party tool authors are free to publish their own README documenting how to use their package alongside PostAll. That belongs in the third-party's repo, not in PostAll's.
- PRs that add a first-party publisher for a platform PostAll doesn't yet support are welcome โ code and config, not links to a hosted service.
- PRs that add defensive controls against credential leakage, prompt injection, or supply-chain risk are welcome.
PRs we will close on sight
- PRs that add
install <third-party-package> / pip install <middleman> / npm install @vendor/x instructions to any official doc.
- PRs that propose docs changes from a branch prefixed
codex/, chatgpt-*, copilot-*, or other AI-agent autogeneration patterns when the substance is third-party promotion.
- PRs whose validation checklist reads like a generic AI boilerplate (
markdown-link-check, git diff --check, python -m compileall) and whose substantive change is one ad block repeated across multiple files.
We close these without merging, regardless of how defensively-framed the proposed text is. Defensive framing is a known social-engineering pattern.
Resources
License
MIT License - Free to use and modify.
Last updated: 2026-03-04