{"skill":{"slug":"genvirall-skill","displayName":"Genviral - Social Media Automation","summary":"Complete genviral Partner API automation. Create and schedule posts (video + slideshow) across TikTok, Instagram, and any supported platform. Includes slides...","description":"---\nname: genviral\ndescription: Complete genviral Partner API automation. Create and schedule posts (video + slideshow) across TikTok, Instagram, and any supported platform. Includes slideshow generation, file uploads, template/pack management, analytics, and full content pipeline automation.\nhomepage: https://github.com/fdarkaou/genviral-skill\nmetadata:\n  openclaw:\n    emoji: \"🎬\"\n    requires:\n      bins: [\"curl\", \"jq\", \"bash\"]\n---\n\n# genviral Partner API Skill\n\n> **TL;DR for agents:** This skill wraps genviral's Partner API into 42+ bash commands covering all documented endpoints. Core workflow: `generate` (create slideshow from prompt) > `render` (produce images) > `review` (check quality) > `create-post` (publish). Auth via `GENVIRAL_API_KEY` env var. Config in `config.md`. New: full analytics support (summary, posts, targets, refresh). Product context in `context/`. Hook library in `hooks/`. Track results in `performance/`. The skill self-improves: post > track > analyze > adapt strategy > post better content.\n\nComplete automation for genviral's Partner API. Create video posts, AI-generated slideshows, manage templates and image packs, track analytics, and schedule content across any platform genviral supports (TikTok, Instagram, etc.).\n\nThis skill provides a full CLI wrapper around the Partner API with commands for every endpoint, plus higher-level workflows for content creation, performance tracking, and strategy optimization.\n\n## What This Skill Does\n\n- **Multi-Platform Posting:** Create posts for TikTok, Instagram, or any connected account (video OR slideshow, multiple accounts per post)\n- **File Management:** Upload videos/images to genviral's CDN with presigned URL flow\n- **AI Slideshow Generation:** Generate photo carousels from prompts, render them to images\n- **Template System:** Create reusable slideshow templates, convert winning slideshows to templates\n- **Pack Management:** Manage image packs (backgrounds for slideshows)\n- **Analytics:** Get summary KPIs, post-level metrics, manage tracked accounts, trigger refreshes\n- **Content Pipeline:** Full automation from prompt to posted draft\n- **Performance Tracking:** Log posts, track metrics, learn from results\n- **Hook Library:** Maintain and evolve a library of proven content hooks\n\n## How It Works\n\nThe core workflow is:\n\n1. **Generate or upload media** (slideshow from prompt, or upload your own video/images)\n2. **Create a post** targeting one or more accounts\n3. **Schedule or publish** (immediately or at a specific time)\n4. **Track performance** via analytics endpoints\n5. **Learn and optimize** (promote winning hooks, retire underperformers)\n\nThe skill handles the full automation. For TikTok slideshow posts, it can optionally save as drafts so you add trending audio before publishing (music selection requires human judgment for best results).\n\n## First-Time Setup\n\nIf this is a fresh install, read `setup.md` and walk your human through onboarding conversationally:\n\n1. Set API key and verify it works\n2. List accounts and pick which ones to post to\n3. Discuss image strategy (existing packs, create new ones, generate per post, or mix)\n4. Optionally set up product context and brand voice together\n\nNo hardcoded defaults needed. The agent should ask the user what they prefer and adapt. Everything done through this skill shows up in the Genviral dashboard, so the user always has full visibility and control.\n\nAll configuration lives in `config.md`. Secrets are loaded from environment variables.\n\n## File Structure\n\n```\ngenviral/\n  SKILL.md                  # This file (comprehensive API reference + strategy)\n  setup.md                  # Quick setup guide (3 steps)\n  config.md               # API config, defaults, schedule settings\n\n  context/\n    product.md              # Product description, value props, target audience\n    brand-voice.md          # Tone, style, do's and don'ts\n    niche-research.md       # Platform research for the niche\n\n  hooks/\n    library.json            # Hook instances (grows over time, tracks performance)\n    formulas.md             # Hook formula patterns and psychology\n\n  content/\n    scratchpad.md           # Working content plan, ideas, drafts in progress\n    calendar.json           # Content calendar (upcoming planned posts)\n\n  performance/\n    log.json                # Post performance tracking (views, likes, shares)\n    insights.md             # Agent's learnings from performance data\n    weekly-review.md        # Weekly review template and process\n\n  scripts/\n    genviral.sh             # Main API wrapper script (all commands)\n\n  prompts/\n    slideshow.md            # Prompt templates for slideshow generation\n    hooks.md                # Prompt templates for hook brainstorming\n```\n\n## Script Reference\n\nAll commands use the wrapper script:\n\n```bash\n/path/to/genviral/scripts/genviral.sh <command> [options]\n```\n\nThe script requires `GENVIRAL_API_KEY` as an environment variable. It loads defaults from `config.md`.\n\n---\n\n## Account & File Commands\n\n### accounts\nList connected BYO and hosted accounts in your scope. Use this to discover account IDs for posting.\n\n```bash\ngenviral.sh accounts\ngenviral.sh accounts --json\n```\n\nReturns:\n- Account ID (use in --accounts for create-post)\n- Platform (tiktok, instagram, etc.)\n- Type (byo or hosted)\n- Username, display name, status\n\n### upload\nUpload a file to genviral's CDN using the presigned URL flow. Returns a CDN URL you can use in posts.\n\n```bash\ngenviral.sh upload --file video.mp4 --content-type video/mp4\ngenviral.sh upload --file slide1.jpg --content-type image/jpeg --filename \"slide1.jpg\"\n```\n\nSupported content types:\n- Videos: `video/mp4`, `video/quicktime`, `video/x-msvideo`, `video/webm`, `video/x-m4v`\n- Images: `image/jpeg`, `image/png`, `image/gif`, `image/webp`, `image/heic`, `image/heif`\n\nReturns the CDN URL (use in create-post).\n\n### list-files\nList files uploaded via the Partner API.\n\n```bash\ngenviral.sh list-files\ngenviral.sh list-files --type video --limit 20 --offset 0\ngenviral.sh list-files --type image --context ai-studio,media-upload\ngenviral.sh list-files --context all  # include all contexts\ngenviral.sh list-files --json\n```\n\n`--type` accepts: `image` or `video`.\n\n---\n\n## Post Commands\n\n### create-post\nCreate a post (video OR slideshow) targeting one or more accounts. This is the core posting command.\n\n**Video post:**\n\n```bash\ngenviral.sh create-post \\\n  --caption \"Your caption with #hashtags\" \\\n  --media-type video \\\n  --media-url \"https://cdn.genviral.com/your-video.mp4\" \\\n  --accounts \"account_id_1,account_id_2\" \\\n  --scheduled-at \"2025-03-01T15:00:00Z\"\n```\n\n**Slideshow post:**\n\n```bash\ngenviral.sh create-post \\\n  --caption \"Your caption\" \\\n  --media-type slideshow \\\n  --media-urls \"url1,url2,url3,url4,url5,url6\" \\\n  --accounts \"account_id_1\" \\\n  --music-url \"https://www.tiktok.com/@user/video/1234567890\"\n```\n\n**TikTok-specific settings** (only when ALL accounts are TikTok BYO):\n\n```bash\ngenviral.sh create-post \\\n  --caption \"Caption\" \\\n  --media-type slideshow \\\n  --media-urls \"url1,url2,url3,url4,url5,url6\" \\\n  --accounts \"tiktok_account_id\" \\\n  --tiktok-title \"Optional title\" \\\n  --tiktok-description \"Optional description\" \\\n  --tiktok-post-mode \"MEDIA_UPLOAD\" \\\n  --tiktok-privacy \"SELF_ONLY\" \\\n  --tiktok-disable-comment \\\n  --tiktok-disable-duet \\\n  --tiktok-disable-stitch \\\n  --auto-add-music true \\\n  --is-commercial false \\\n  --is-branded-content false \\\n  --user-consent true \\\n  --is-your-brand false\n```\n\nBoolean TikTok toggles support both forms:\n- `--tiktok-disable-comment` (sets `true`)\n- `--tiktok-disable-comment false` (explicit false)\n\nSame behavior applies to: `--tiktok-disable-duet`, `--tiktok-disable-stitch`, `--auto-add-music`, `--is-commercial`, `--is-branded-content`, `--user-consent`, `--is-your-brand`.\n\nTikTok `post_mode` options:\n- `DIRECT_POST` - publish immediately (default)\n- `MEDIA_UPLOAD` - save to TikTok drafts inbox (only supported for slideshow media)\n\nTikTok `privacy_level` options:\n- `PUBLIC_TO_EVERYONE` (default)\n- `MUTUAL_FOLLOW_FRIENDS`\n- `FOLLOWER_OF_CREATOR`\n- `SELF_ONLY` (draft mode)\n\n**Scheduling:**\n\n- Omit `--scheduled-at` or set it within 30 seconds of now: post is queued for immediate publish (status: `pending`)\n- Provide future ISO timestamp: post is scheduled (status: `scheduled`)\n- `--scheduled-at` must be ISO 8601 with timezone offset (example: `2026-02-14T19:47:00Z`)\n\n`--music-url` must point to a TikTok URL.\n\n**Multi-account posting:**\n\nYou can target up to 10 accounts per post. Mix TikTok, Instagram, etc. Music is only supported when ALL accounts support it (currently TikTok only). TikTok-specific settings only work when ALL accounts are TikTok BYO.\n\n### update-post\nUpdate an existing post (only editable if status is draft, pending, scheduled, retry, or failed).\n\n```bash\ngenviral.sh update-post \\\n  --id POST_ID \\\n  --caption \"Updated caption\" \\\n  --media-type video \\\n  --media-url \"https://new-video.mp4\" \\\n  --accounts \"new_account_id_1,new_account_id_2\" \\\n  --scheduled-at \"2025-03-15T18:00:00Z\"\n```\n\nClear operations:\n- Remove music: `--music-url null`\n- Clear scheduled time: `--clear-scheduled-at`\n- Clear all TikTok settings: `--clear-tiktok`\n\nValidation notes:\n- `--scheduled-at` must be ISO 8601 with timezone offset (example: `2026-02-14T19:47:00Z`)\n- `--music-url` must be a TikTok URL (unless using `null` to clear)\n- TikTok boolean toggles support both flag form (`--auto-add-music`) and explicit values (`--auto-add-music false`)\n\n### retry-posts\nRetry failed or partial posts.\n\n```bash\ngenviral.sh retry-posts --post-ids \"post_id_1,post_id_2\"\ngenviral.sh retry-posts --post-ids \"post_id_1\" --account-ids \"account_id_1\"\n```\n\nLimits:\n- `post_ids`: 1-20 IDs\n- `account_ids`: 1-10 IDs\n\n### list-posts\nList posts with optional filters.\n\n```bash\ngenviral.sh list-posts\ngenviral.sh list-posts --status scheduled --limit 20\ngenviral.sh list-posts --since \"2025-02-01T00:00:00Z\" --until \"2025-02-28T23:59:59Z\"\ngenviral.sh list-posts --json\n```\n\n`--since` and `--until` must be ISO 8601 datetimes with timezone offset.\n\nStatus filters: `draft`, `pending`, `scheduled`, `posted`, `failed`, `partial`, `retry`\n\n### get-post\nGet details for a specific post.\n\n```bash\ngenviral.sh get-post --id POST_ID\n```\n\n### delete-posts (alias: `delete-post`)\nBulk delete posts by IDs.\n\n```bash\ngenviral.sh delete-posts --ids \"post_id_1,post_id_2,post_id_3\"\n# equivalent option name\ngenviral.sh delete-posts --post-ids \"post_id_1,post_id_2,post_id_3\"\n# command alias\ngenviral.sh delete-post --ids \"post_id_1,post_id_2\"\n```\n\nLimit: up to 50 IDs per request.\n\nReturns structured delete results including:\n- `deletedIds`\n- `blockedStatuses` (posts that can't be deleted due to status)\n- `skipped`\n- `errors`\n\n---\n\n## Slideshow Commands\n\n### generate | generate-slideshow\nGenerate a slideshow from a prompt using AI, or create one manually with `--skip-ai`.\n\n```bash\n# AI mode (default)\ngenviral.sh generate \\\n  --prompt \"Your hook and content prompt\" \\\n  --pack-id PACK_ID \\\n  --slides 5 \\\n  --type educational \\\n  --aspect-ratio 4:5 \\\n  --style tiktok \\\n  --language en \\\n  --font-size small \\\n  --text-width narrow \\\n  --product-id PRODUCT_ID\n\n# Manual/mixed mode with slide_config\ngenviral.sh generate \\\n  --skip-ai \\\n  --slide-config-file slide-config.json\n\n# Pass slide_config inline\ngenviral.sh generate \\\n  --skip-ai \\\n  --slide-config-json '{\"total_slides\":2,\"slide_types\":[\"image_pack\",\"custom_image\"],...}'\n```\n\nOptions:\n- `--prompt` - AI prompt (required unless `--skip-ai` or `--product-id`)\n- `--pack-id` - Image pack UUID for backgrounds\n- `--slides` - number of slides (1-10, default: 5)\n- `--type` - `educational` or `personal`\n- `--aspect-ratio` - `9:16` (vertical), `4:5` (default), `1:1` (square)\n- `--style` / `--text-preset` - text style preset (e.g., `tiktok`)\n- `--language` - language code (e.g., `en`, `es`, `fr`)\n- `--font-size` - `default` or `small`\n- `--text-width` - `default` or `narrow`\n- `--product-id` - optional product context identifier\n- `--skip-ai` - skip AI text generation (use with `--slide-config-*`)\n- `--slide-config-json` / `--slide-config` - inline JSON slide config\n- `--slide-config-file` - path to JSON file with slide config\n\n### render | render-slideshow\nRender a slideshow to images via Remotion.\n\n```bash\ngenviral.sh render --id SLIDESHOW_ID\n```\n\nReturns:\n- Updated slideshow with rendered image URLs\n- Status: `rendered`\n\n### review | get-slideshow\nGet full slideshow details for review. Shows slide text, status, rendered URLs.\n\n```bash\ngenviral.sh review --id SLIDESHOW_ID\ngenviral.sh review --id SLIDESHOW_ID --json\ngenviral.sh get-slideshow --id SLIDESHOW_ID  # alias\n```\n\n### update | update-slideshow\nUpdate slideshow fields, settings, or slides. Re-render after updating slides.\n\n```bash\n# Update title\ngenviral.sh update --id SLIDESHOW_ID --title \"New Title\"\n\n# Update status\ngenviral.sh update --id SLIDESHOW_ID --status draft\n\n# Update settings\ngenviral.sh update --id SLIDESHOW_ID --settings-json '{\"aspect_ratio\":\"9:16\",\"advanced_settings\":{\"text_width\":\"narrow\"}}'\n\n# Update slides (full replacement)\ngenviral.sh update --id SLIDESHOW_ID --slides '[{\"image_url\":\"...\",\"text_elements\":[{\"content\":\"...\"}]}]'\n\n# Load slides from file\ngenviral.sh update --id SLIDESHOW_ID --slides-file slides.json\n\n# Update product_id or clear it\ngenviral.sh update --id SLIDESHOW_ID --product-id NEW_PRODUCT_ID\ngenviral.sh update --id SLIDESHOW_ID --clear-product-id\n```\n\nOptions:\n- `--title` - Update title\n- `--status` - `draft` or `rendered`\n- `--slideshow-type` - `educational` or `personal`\n- `--product-id` - Link to product\n- `--clear-product-id` - Detach product\n- `--settings-json` / `--settings-file` - Partial settings patch\n- `--slides` / `--slides-file` - Full slides array replacement\n\n### regenerate-slide\nRegenerate AI text for a single slide (0-indexed).\n\n```bash\ngenviral.sh regenerate-slide --id SLIDESHOW_ID --index 2\ngenviral.sh regenerate-slide --id SLIDESHOW_ID --index 2 --instruction \"Make this shorter and more punchy\"\n```\n\nConstraints:\n- `--index` must be a non-negative integer\n- `--instruction` max length: 500 characters\n\n### duplicate | duplicate-slideshow\nClone an existing slideshow as a new draft.\n\n```bash\ngenviral.sh duplicate --id SLIDESHOW_ID\n```\n\n### delete | delete-slideshow\nDelete a slideshow.\n\n```bash\ngenviral.sh delete --id SLIDESHOW_ID\n```\n\n### list-slideshows\nList slideshows with filtering and pagination.\n\n```bash\ngenviral.sh list-slideshows\ngenviral.sh list-slideshows --status rendered --search \"hook\" --limit 20 --offset 0\ngenviral.sh list-slideshows --json\n```\n\n---\n\n## Pack Commands\n\nPacks are collections of background images used in slideshows.\n\n### list-packs\nList available image packs.\n\n```bash\ngenviral.sh list-packs\ngenviral.sh list-packs --search motivation --include-public false\ngenviral.sh list-packs --limit 20 --offset 0 --json\n```\n\n### get-pack\nGet a single pack with all image URLs.\n\n```bash\ngenviral.sh get-pack --id PACK_ID\n```\n\n### create-pack\nCreate a new pack.\n\n```bash\ngenviral.sh create-pack --name \"My Pack\"\ngenviral.sh create-pack --name \"Public Pack\" --is-public\n# explicit boolean also supported\ngenviral.sh create-pack --name \"Private Pack\" --is-public false\n```\n\n### update-pack\nUpdate pack name or visibility.\n\n```bash\ngenviral.sh update-pack --id PACK_ID --name \"New Name\"\ngenviral.sh update-pack --id PACK_ID --is-public true\n```\n\n### delete-pack\nDelete a pack.\n\n```bash\ngenviral.sh delete-pack --id PACK_ID\n```\n\n### add-pack-image\nAdd an image to a pack.\n\n```bash\ngenviral.sh add-pack-image --pack-id PACK_ID --image-url \"https://cdn.example.com/image.jpg\"\ngenviral.sh add-pack-image --pack-id PACK_ID --image-url \"https://cdn.example.com/image.jpg\" --file-name \"hero-1.jpg\"\n```\n\n### delete-pack-image\nRemove an image from a pack.\n\n```bash\ngenviral.sh delete-pack-image --pack-id PACK_ID --image-id IMAGE_ID\n```\n\n---\n\n## Template Commands\n\nTemplates are reusable slideshow structures. Convert winning slideshows into templates for faster iteration.\n\n### list-templates\nList templates visible in your scope.\n\n```bash\ngenviral.sh list-templates\ngenviral.sh list-templates --search hooks --limit 20 --offset 0\ngenviral.sh list-templates --json\n```\n\n### get-template\nGet a single template.\n\n```bash\ngenviral.sh get-template --id TEMPLATE_ID\n```\n\n### create-template\nCreate a template from a validated template config object.\n\n```bash\n# File input\ngenviral.sh create-template \\\n  --name \"My Template\" \\\n  --description \"Description\" \\\n  --visibility private \\\n  --config-file template-config.json\n\n# Inline JSON input\ngenviral.sh create-template \\\n  --name \"My Template\" \\\n  --visibility workspace \\\n  --config-json '{\"version\":1,\"structure\":{\"slides\":[]},\"content\":{},\"visuals\":{}}'\n```\n\nConfig must be valid JSON matching the template config v1 schema.\nUse exactly one of:\n- `--config-file <path>`\n- `--config-json '<json>'`\n\n### update-template\nUpdate template fields.\n\n```bash\ngenviral.sh update-template --id TEMPLATE_ID --name \"New Name\"\ngenviral.sh update-template --id TEMPLATE_ID --visibility workspace\ngenviral.sh update-template --id TEMPLATE_ID --config-file new-config.json\ngenviral.sh update-template --id TEMPLATE_ID --config-json '{\"version\":1,\"structure\":{\"slides\":[]},\"content\":{},\"visuals\":{}}'\ngenviral.sh update-template --id TEMPLATE_ID --clear-description\n```\n\nConfig input: use one of `--config-file` or `--config-json`.\n\n### delete-template\nDelete a template.\n\n```bash\ngenviral.sh delete-template --id TEMPLATE_ID\n```\n\n### create-template-from-slideshow\nConvert an existing slideshow into a reusable template.\n\n```bash\ngenviral.sh create-template-from-slideshow \\\n  --slideshow-id SLIDESHOW_ID \\\n  --name \"Winning Format\" \\\n  --description \"Built from high-performing slideshow\" \\\n  --visibility workspace \\\n  --preserve-text\n```\n\n`--preserve-text` supports both forms:\n- `--preserve-text` (sets true)\n- `--preserve-text true|false`\n\n---\n\n## Analytics Commands\n\nAnalytics endpoints provide KPIs, post metrics, and tracked account management.\n\n### analytics-summary (alias: `get-analytics-summary`)\nGet analytics summary with KPIs, trends, and content mix.\n\n```bash\ngenviral.sh analytics-summary\ngenviral.sh analytics-summary --range 30d\ngenviral.sh analytics-summary --start 2026-01-01 --end 2026-01-31\ngenviral.sh analytics-summary --platforms tiktok,instagram\ngenviral.sh analytics-summary --accounts TARGET_ID_1,TARGET_ID_2\ngenviral.sh analytics-summary --json\n```\n\nOptions:\n- `--range` - Date preset: `14d`, `30d`, `90d`, `1y`, `all`\n- `--start` / `--end` - Custom date range (YYYY-MM-DD), must use both together\n- `--platforms` - Comma-separated platform filter\n- `--accounts` - Comma-separated analytics target IDs\n\nReturns:\n- `kpis` - publishedVideos, activeAccounts, views, likes, comments, shares, saves, engagementRate (with deltas)\n- `interactionSeries` - Daily interactions\n- `engagementSeries` - Daily engagement rate\n- `postingHeatmap` - Daily post counts\n- `postingStreak` - Consecutive posting days\n- `contentMix` - Posts by platform\n\n### analytics-posts (alias: `list-analytics-posts`)\nList post-level analytics with sorting and pagination.\n\n```bash\ngenviral.sh analytics-posts\ngenviral.sh analytics-posts --range 90d --sort-by views --sort-order desc --limit 25\ngenviral.sh analytics-posts --start 2026-01-01 --end 2026-01-31 --platforms tiktok\ngenviral.sh analytics-posts --json\n```\n\nOptions:\n- `--range` - Date preset: `14d`, `30d`, `90d`, `1y`, `all`\n- `--start` / `--end` - Custom date range\n- `--platforms` - Platform filter\n- `--accounts` - Target ID filter\n- `--sort-by` - `published_at`, `views`, `likes`, `comments`, `shares`\n- `--sort-order` - `asc` or `desc`\n- `--limit` - Page size (max 100)\n- `--offset` - Pagination offset\n\n### analytics-targets\nList tracked analytics accounts.\n\n```bash\ngenviral.sh analytics-targets\ngenviral.sh analytics-targets --json\n```\n\n### analytics-target-create\nAdd a new tracked account.\n\n```bash\ngenviral.sh analytics-target-create --platform tiktok --identifier @brand\ngenviral.sh analytics-target-create --platform instagram --identifier @brand --alias \"Brand HQ\"\n```\n\nOptions:\n- `--platform` - `tiktok`, `instagram`, or `youtube` (required)\n- `--identifier` - Account handle (required)\n- `--alias` - Display name override\n\n### analytics-target\nGet details for a single analytics target.\n\n```bash\ngenviral.sh analytics-target --id TARGET_ID\n```\n\n### analytics-target-update\nUpdate an analytics target.\n\n```bash\ngenviral.sh analytics-target-update --id TARGET_ID --display-name \"New Name\"\ngenviral.sh analytics-target-update --id TARGET_ID --favorite true\ngenviral.sh analytics-target-update --id TARGET_ID --clear-display-name\ngenviral.sh analytics-target-update --id TARGET_ID --refresh-policy-json '{\"freeDailyRefresh\":true}'\ngenviral.sh analytics-target-update --id TARGET_ID --clear-refresh-policy\n```\n\n### analytics-target-delete\nDelete an analytics target.\n\n```bash\ngenviral.sh analytics-target-delete --id TARGET_ID\n```\n\n### analytics-target-refresh\nTrigger a refresh for an analytics target.\n\n```bash\ngenviral.sh analytics-target-refresh --id TARGET_ID\n```\n\nReturns:\n- Refresh ID and status\n- `wasFree` - Whether free refresh window was used\n\n### analytics-refresh | get-analytics-refresh\nCheck refresh status.\n\n```bash\ngenviral.sh analytics-refresh --id REFRESH_ID\n```\n\nReturns:\n- `status` - `pending`, `processing`, `completed`, or `failed`\n- `credits_used`, `free_refresh_used`\n- `started_at`, `completed_at`\n- `error` (if failed)\n\n### analytics-workspace-suggestions (alias: `get-analytics-workspace-suggestions`)\nList other workspace/personal scopes with tracked accounts.\n\n```bash\ngenviral.sh analytics-workspace-suggestions\ngenviral.sh get-analytics-workspace-suggestions\ngenviral.sh analytics-workspace-suggestions --json\n```\n\n---\n\n## Legacy Pipeline Commands\n\nThese are TikTok-focused convenience commands from the original skill.\n\n### post-draft\nPost a rendered slideshow as a draft (TikTok-focused).\n\n```bash\ngenviral.sh post-draft \\\n  --id SLIDESHOW_ID \\\n  --caption \"Your caption with #hashtags\" \\\n  --account-ids \"account_id_1\"\n```\n\nAlways forces TikTok draft-safe settings: `privacy_level=SELF_ONLY` and `post_mode=MEDIA_UPLOAD`.\n\n### full-pipeline\nEnd-to-end: generate -> render -> review -> post draft.\n\n```bash\ngenviral.sh full-pipeline \\\n  --prompt \"Your hook and content prompt\" \\\n  --caption \"Caption with #hashtags\" \\\n  --pack-id PACK_ID \\\n  --slides 5 \\\n  --type educational \\\n  --style tiktok \\\n  --account-ids ACC_ID\n```\n\nUse `--skip-post` to stop after rendering (useful for review before posting).\n\n---\n\n## Content Creation Pipeline\n\nThis is the recommended workflow for producing posts.\n\n### For Slideshow Posts\n\n1. **Hook Selection:** Read `hooks/library.json` and pick a hook. Rotate through categories.\n\n2. **Prompt Assembly:** Use the selected hook to build a full slideshow prompt. Reference `prompts/slideshow.md`.\n\n3. **Generate Slideshow:** Run `generate` with the assembled prompt.\n\n4. **Review Slide Text:** Check each slide for clarity, readability, flow. Update or regenerate weak slides.\n\n5. **Render:** Run `render` to generate final images.\n\n6. **Visual Review (MANDATORY):** Before posting, visually inspect EVERY rendered slide using an image analysis tool. Check: (a) background images are relevant to the topic and product, (b) text is readable and not obscured by busy backgrounds, (c) no text overflow or clipping, (d) overall quality is something you'd actually want posted. If any slide fails, regenerate it or swap the image. Never post without reviewing.\n\n7. **Post:** Use `create-post` with media-type slideshow, or use legacy `post-draft` for TikTok drafts.\n\n8. **Log the Post (MANDATORY):** Immediately after posting, append an entry to `content/post-log.md` with: date, time (UTC), post ID, type (slideshow/video), hook/caption snippet, status (posted/scheduled/draft), and which pack was used. This is the single source of truth for all content output. If the file doesn't exist, create it with the header format. Never skip this step.\n\n9. **Track Performance:** Use analytics endpoints to monitor metrics. During performance checks (evening cron), update `content/post-log.md` with view/like/comment counts for recent posts.\n\n### For Video Posts\n\n1. **Source Video:** Upload via `upload` command or reference existing CDN URL.\n\n2. **Write Caption:** Follow brand voice, include relevant hashtags.\n\n3. **Create Post:** Run `create-post` with media-type video.\n\n4. **Track Performance:** Check analytics.\n\n---\n\n## Platform Best Practices\n\n### TikTok\n\n**Slide Count:** 5-6 slides is the sweet spot.\n\n**Aspect Ratio:** `9:16` for fullscreen, `4:5` for feed.\n\n**Text Readability:** One idea per slide. 8-16 words max. Avoid text in bottom 20% (UI overlap).\n\n**Narrative Structure (5-slide arc):**\n1. Hook (stop the scroll)\n2. Problem detail\n3. Shift (introduce the solution)\n4. Feature/proof\n5. CTA\n\n### Instagram\n\n**Slide Count:** 5-10 slides for carousel posts.\n\n**Aspect Ratio:**\n- Reels: 9:16\n- Feed posts: 4:5 or 1:1\n\n---\n\n## API Error Codes\n\nCommon Partner API error patterns:\n\n- `401 unauthorized` - API key missing, malformed, or invalid\n- `402 subscription_required` - workspace/account needs an active subscription\n- `403 tier_not_allowed` - current plan tier does not include the attempted capability\n- `422 invalid_payload` - request shape or enum values are invalid\n- `429 rate_limited` - too many requests in a short window\n\n---\n\n## Troubleshooting\n\n**\"GENVIRAL_API_KEY is required\"**\nExport the environment variable: `export GENVIRAL_API_KEY=\"your_public_id.your_secret\"`\n\n**\"No rendered image URLs found\"**\nThe slideshow has not been rendered yet. Run `render` first.\n\n**API returns 401, 402, or 403**\n- `401`: verify API key format (`public_id.secret`) and token validity\n- `402 subscription_required`: activate or upgrade subscription\n- `403 tier_not_allowed`: your tier does not permit that feature\n\n**Render takes too long**\nEach slide takes 2-5 seconds. For 5 slides, expect up to 25 seconds.\n\n---\n\n## Notes\n\n- **Multi-platform support:** Works with any platform genviral supports (TikTok, Instagram, etc.)\n- **Content types:** Supports both video posts and slideshow (photo carousel) posts\n- **Hosted vs BYO accounts:** Works with both hosted and BYO accounts\n- **Scheduling:** Posts can be scheduled for future publish or queued for immediate posting\n- **Draft mode:** For TikTok slideshow posts, use `post_mode: MEDIA_UPLOAD` to save to drafts inbox\n- **Template system:** Convert winning slideshows to templates for faster iteration\n- **Analytics:** Full analytics support for tracking performance across accounts\n- **Never use em-dashes** in any generated content\n","topics":["Pipeline","Schedule"],"tags":{"latest":"1.0.0"},"stats":{"comments":0,"downloads":262,"installsAllTime":9,"installsCurrent":1,"stars":1,"versions":1},"createdAt":1771188301455,"updatedAt":1778491549296},"latestVersion":{"version":"1.0.0","createdAt":1771188301455,"changelog":"genviral-skill 1.0.0\n\n- Initial release providing a complete CLI wrapper for genviral's Partner API.\n- Automates the creation and scheduling of video and slideshow posts across platforms like TikTok and Instagram.\n- Includes support for slideshow generation, file uploads, template and image pack management.\n- Adds analytics tracking and performance logging to inform content strategy.\n- Offers a library of content hooks and guides agents through onboarding and configuration.\n- All actions are accessible via bash commands, with flexible workflows for full content pipeline automation.","license":null},"metadata":{"setup":[],"os":null,"systems":null},"owner":{"handle":"fdarkaou","userId":"s1745t897v5skke0papw7qgjdx885k3c","displayName":"fdarkaou","image":"https://avatars.githubusercontent.com/u/62242714?v=4"},"moderation":{"isSuspicious":false,"isMalwareBlocked":false,"verdict":"clean","reasonCodes":["review.llm_review"],"summary":"Review: review.llm_review","engineVersion":"v2.4.24","updatedAt":1780089729312}}