Skill289 repo starsupdated 11d ago
postiz
Postiz is a command-line tool for scheduling and publishing posts to over 28 social media and messaging platforms including X, LinkedIn, Instagram, TikTok, Discord, Slack, and others. Use it to automate cross-platform content distribution by uploading media files through Postiz first, then creating posts with platform-specific settings across multiple channels simultaneously.
Install in Claude Code
Copygit clone https://github.com/gitroomhq/postiz-agent ~/.claude/skills/postizThen start a new Claude Code session; the skill loads automatically.
Definition
SKILL.md
## Install Postiz if it doesn't exist
```bash
npm install -g postiz
# or
pnpm install -g postiz
```
npm release: https://www.npmjs.com/package/postiz
postiz github: https://github.com/gitroomhq/postiz-app
postiz cli github: https://github.com/gitroomhq/postiz-app
official website: https://postiz.com
---
| Property | Value |
|----------|-------|
| **name** | postiz |
| **description** | Social media automation CLI for scheduling posts across 28+ platforms |
| **allowed-tools** | Bash(postiz:*) |
---
## ⚠️ Two Hard Rules (Read First)
**Rule 1 — Authenticate before anything.** All commands fail without valid credentials.
**Rule 2 — Every file passed to `-m` (or to `image`/media fields in JSON mode) MUST first go through `postiz upload`.** Raw filesystem paths (`image.jpg`, `video.mp4`) and external URLs (`https://example.com/...`) are **NOT** accepted by the publishing pipeline. TikTok, Instagram, YouTube, and most other providers reject anything that isn't a Postiz-verified URL. Always:
```bash
RESULT=$(postiz upload <file>)
URL=$(echo "$RESULT" | jq -r '.path')
postiz posts:create ... -m "$URL" ...
```
If you see `-m "something.jpg"` anywhere below, treat it as shorthand for "the `.path` you got back from `postiz upload something.jpg`" — never a raw local file.
---
## ⚠️ Authentication Required
**You MUST authenticate before running any Postiz CLI command.** All commands will fail without valid credentials.
Before doing anything else, check auth status:
```bash
postiz auth:status
```
If not authenticated, either:
1. **OAuth2:** `postiz auth:login`
2. **API Key:** `export POSTIZ_API_KEY=your_api_key`
**Do NOT proceed with any other commands until authentication is confirmed.**
---
## Core Workflow
The fundamental pattern for using Postiz CLI:
1. **Authenticate** - Verify or set up authentication (see above)
2. **Discover** - List integrations and get their settings
3. **Fetch** - Use integration tools to retrieve dynamic data (flairs, playlists, companies)
4. **Prepare** - Upload media files if needed
5. **Post** - Create posts with content, media, and platform-specific settings
6. **Analyze** - Track performance with platform and post-level analytics
7. **Resolve** - If analytics returns `{"missing": true}`, run `posts:missing` to list provider content, then `posts:connect` to link it
```bash
# 1. Authenticate
postiz auth:status
# If not authenticated: postiz auth:login --client-id <id> --client-secret <secret>
# 2. Discover
postiz integrations:list
postiz integrations:settings <integration-id>
# 3. Fetch (if needed)
postiz integrations:trigger <integration-id> <method> -d '{"key":"value"}'
# 4. Prepare
postiz upload image.jpg
# 5. Post
postiz posts:create -c "Content" -m "image.jpg" -i "<integration-id>"
# 6. Analyze
postiz analytics:platform <integration-id> -d 30
postiz analytics:post <post-id> -d 7
# 7. Resolve (if analytics returns {"missing": true})
postiz posts:missing <post-id>
postiz posts:connect <post-id> --release-id "<content-id>"
```
---
## Essential Commands
### Authentication
**Option 1: OAuth2 (Recommended)**
```bash
# Login via device flow (opens browser, no client ID/secret needed)
postiz auth:login
# Check auth status (verifies credentials are still valid)
postiz auth:status
# Logout (remove stored credentials)
postiz auth:logout
```
Credentials are stored in `~/.postiz/credentials.json`. OAuth2 credentials take priority over API key.
**Option 2: API Key**
```bash
export POSTIZ_API_KEY=your_api_key_here
```
**Optional custom API URL:**
```bash
export POSTIZ_API_URL=https://custom-api-url.com
```
### Integration Discovery
```bash
# List all connected integrations
postiz integrations:list
# List integrations belonging to a specific group (customer)
postiz integrations:list --group <group-id>
# List all groups (customers) as {id, name}
postiz integrations:groups
# Get settings schema for specific integration
postiz integrations:settings <integration-id>
# Trigger integration tool to fetch dynamic data
postiz integrations:trigger <integration-id> <method-name>
postiz integrations:trigger <integration-id> <method-name> -d '{"param":"value"}'
```
### Creating Posts
```bash
# Simple post (date is REQUIRED)
postiz posts:create -c "Content" -s "2024-12-31T12:00:00Z" -i "integration-id"
# Draft post
postiz posts:create -c "Content" -s "2024-12-31T12:00:00Z" -t draft -i "integration-id"
# Post with media (upload each file FIRST — see Rule 2)
IMG1=$(postiz upload img1.jpg | jq -r '.path')
IMG2=$(postiz upload img2.jpg | jq -r '.path')
postiz posts:create -c "Content" -m "$IMG1,$IMG2" -s "2024-12-31T12:00:00Z" -i "integration-id"
# Post with comments (each with own media — every file uploaded first)
MAIN=$(postiz upload main.jpg | jq -r '.path')
C1=$(postiz upload comment1.jpg | jq -r '.path')
C2A=$(postiz upload comment2.jpg | jq -r '.path')
C2B=$(postiz upload comment3.jpg | jq -r '.path')
postiz posts:create \
-c "Main post" -m "$MAIN" \
-c "First comment" -m "$C1" \
-c "Second comment" -m "$C2A,$C2B" \
-s "2024-12-31T12:00:00Z" \
-i "integration-id"
# Multi-platform post
postiz posts:create -c "Content" -s "2024-12-31T12:00:00Z" -i "twitter-id,linkedin-id,facebook-id"
# Platform-specific settings
postiz posts:create \
-c "Content" \
-s "2024-12-31T12:00:00Z" \
--settings '{"subreddit":[{"value":{"subreddit":"programming","title":"My Post","type":"text"}}]}' \
-i "reddit-id"
# Complex post from JSON file
postiz posts:create --json post.json
```
### Managing Posts
```bash
# List posts (defaults to last 30 days to next 30 days)
postiz posts:list
# List posts in date range
postiz posts:list --startDate "2024-01-01T00:00:00Z" --endDate "2024-12-31T23:59:59Z"
# Delete post
postiz posts:delete <post-id>
# Change post status (draft ↔ schedule)
postiz posts:status <post-id> --status draft # Move back to draft, terminates any running publish workflow
postiz posts:status <post-id> --status schedule # Promote a