Skip to main content
ClaudeWave
Skill289 estrellas del repoactualizado 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.

Instalar en Claude Code
Copiar
git clone https://github.com/gitroomhq/postiz-agent ~/.claude/skills/postiz
Después abre una sesión nueva de Claude Code; el skill carga automáticamente.

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