Awesome-omni-skill genviral
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.
git clone https://github.com/diegosouzapw/awesome-omni-skill
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/cli-automation/genviral-openclaw" ~/.claude/skills/diegosouzapw-awesome-omni-skill-genviral && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/cli-automation/genviral-openclaw" ~/.openclaw/skills/diegosouzapw-awesome-omni-skill-genviral && rm -rf "$T"
skills/cli-automation/genviral-openclaw/SKILL.mdgenviral Partner API Skill
TL;DR for agents: This skill wraps genviral's Partner API into 42+ bash commands covering all documented endpoints. Core workflow:
(create slideshow from prompt) >generate(produce images) >render(check quality) >review(publish). Auth viacreate-postenv var. Config inGENVIRAL_API_KEY. New: full analytics support (summary, posts, targets, refresh). Product context inconfig.md. Hook library incontext/. Track results inhooks/. The skill self-improves: post > track > analyze > adapt strategy > post better content.performance/
Complete 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.).
This 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.
What This Skill Does
- Multi-Platform Posting: Create posts for TikTok, Instagram, or any connected account (video OR slideshow, multiple accounts per post)
- File Management: Upload videos/images to genviral's CDN with presigned URL flow
- AI Slideshow Generation: Generate photo carousels from prompts, render them to images
- Template System: Create reusable slideshow templates, convert winning slideshows to templates
- Pack Management: Manage image packs (backgrounds for slideshows)
- Analytics: Get summary KPIs, post-level metrics, manage tracked accounts, trigger refreshes
- Content Pipeline: Full automation from prompt to posted draft
- Performance Tracking: Log posts, track metrics, learn from results
- Hook Library: Maintain and evolve a library of proven content hooks
How It Works
The core workflow is:
- Generate or upload media (slideshow from prompt, or upload your own video/images)
- Create a post targeting one or more accounts
- Schedule or publish (immediately or at a specific time)
- Track performance via analytics endpoints
- Learn and optimize (promote winning hooks, retire underperformers)
The 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).
First-Time Setup
If this is a fresh install, read
setup.md and walk your human through onboarding conversationally:
- Set API key and verify it works
- List accounts and pick which ones to post to
- Discuss image strategy (existing packs, create new ones, generate per post, or mix)
- Optionally set up product context and brand voice together
No 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.
All configuration lives in
config.md. Secrets are loaded from environment variables.
File Structure
genviral/ SKILL.md # This file (comprehensive API reference + strategy) setup.md # Quick setup guide (3 steps) config.md # API config, defaults, schedule settings context/ product.md # Product description, value props, target audience brand-voice.md # Tone, style, do's and don'ts niche-research.md # Platform research for the niche hooks/ library.json # Hook instances (grows over time, tracks performance) formulas.md # Hook formula patterns and psychology content/ scratchpad.md # Working content plan, ideas, drafts in progress calendar.json # Content calendar (upcoming planned posts) performance/ log.json # Post performance tracking (views, likes, shares) insights.md # Agent's learnings from performance data weekly-review.md # Weekly review template and process scripts/ genviral.sh # Main API wrapper script (all commands) prompts/ slideshow.md # Prompt templates for slideshow generation hooks.md # Prompt templates for hook brainstorming
Script Reference
All commands use the wrapper script:
/path/to/genviral/scripts/genviral.sh <command> [options]
The script requires
GENVIRAL_API_KEY as an environment variable. It loads defaults from config.md.
Account & File Commands
accounts
List connected BYO and hosted accounts in your scope. Use this to discover account IDs for posting.
genviral.sh accounts genviral.sh accounts --json
Returns:
- Account ID (use in --accounts for create-post)
- Platform (tiktok, instagram, etc.)
- Type (byo or hosted)
- Username, display name, status
upload
Upload a file to genviral's CDN using the presigned URL flow. Returns a CDN URL you can use in posts.
genviral.sh upload --file video.mp4 --content-type video/mp4 genviral.sh upload --file slide1.jpg --content-type image/jpeg --filename "slide1.jpg"
Supported content types:
- Videos:
,video/mp4
,video/quicktime
,video/x-msvideo
,video/webmvideo/x-m4v - Images:
,image/jpeg
,image/png
,image/gif
,image/webp
,image/heicimage/heif
Returns the CDN URL (use in create-post).
list-files
List files uploaded via the Partner API.
genviral.sh list-files genviral.sh list-files --type video --limit 20 --offset 0 genviral.sh list-files --type image --context ai-studio,media-upload genviral.sh list-files --context all # include all contexts genviral.sh list-files --json
--type accepts: image or video.
Post Commands
create-post
Create a post (video OR slideshow) targeting one or more accounts. This is the core posting command.
Video post:
genviral.sh create-post \ --caption "Your caption with #hashtags" \ --media-type video \ --media-url "https://cdn.genviral.com/your-video.mp4" \ --accounts "account_id_1,account_id_2" \ --scheduled-at "2025-03-01T15:00:00Z"
Slideshow post:
genviral.sh create-post \ --caption "Your caption" \ --media-type slideshow \ --media-urls "url1,url2,url3,url4,url5,url6" \ --accounts "account_id_1" \ --music-url "https://www.tiktok.com/@user/video/1234567890"
TikTok-specific settings (only when ALL accounts are TikTok BYO):
genviral.sh create-post \ --caption "Caption" \ --media-type slideshow \ --media-urls "url1,url2,url3,url4,url5,url6" \ --accounts "tiktok_account_id" \ --tiktok-title "Optional title" \ --tiktok-description "Optional description" \ --tiktok-post-mode "MEDIA_UPLOAD" \ --tiktok-privacy "SELF_ONLY" \ --tiktok-disable-comment \ --tiktok-disable-duet \ --tiktok-disable-stitch \ --auto-add-music true \ --is-commercial false \ --is-branded-content false \ --user-consent true \ --is-your-brand false
Boolean TikTok toggles support both forms:
(sets--tiktok-disable-comment
)true
(explicit false)--tiktok-disable-comment false
Same behavior applies to:
--tiktok-disable-duet, --tiktok-disable-stitch, --auto-add-music, --is-commercial, --is-branded-content, --user-consent, --is-your-brand.
TikTok
post_mode options:
- publish immediately (default)DIRECT_POST
- save to TikTok drafts inbox (only supported for slideshow media)MEDIA_UPLOAD
TikTok
privacy_level options:
(default)PUBLIC_TO_EVERYONEMUTUAL_FOLLOW_FRIENDSFOLLOWER_OF_CREATOR
(draft mode)SELF_ONLY
Scheduling:
- Omit
or set it within 30 seconds of now: post is queued for immediate publish (status:--scheduled-at
)pending - Provide future ISO timestamp: post is scheduled (status:
)scheduled
must be ISO 8601 with timezone offset (example:--scheduled-at
)2026-02-14T19:47:00Z
--music-url must point to a TikTok URL.
Multi-account posting:
You 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.
update-post
Update an existing post (only editable if status is draft, pending, scheduled, retry, or failed).
genviral.sh update-post \ --id POST_ID \ --caption "Updated caption" \ --media-type video \ --media-url "https://new-video.mp4" \ --accounts "new_account_id_1,new_account_id_2" \ --scheduled-at "2025-03-15T18:00:00Z"
Clear operations:
- Remove music:
--music-url null - Clear scheduled time:
--clear-scheduled-at - Clear all TikTok settings:
--clear-tiktok
Validation notes:
must be ISO 8601 with timezone offset (example:--scheduled-at
)2026-02-14T19:47:00Z
must be a TikTok URL (unless using--music-url
to clear)null- TikTok boolean toggles support both flag form (
) and explicit values (--auto-add-music
)--auto-add-music false
retry-posts
Retry failed or partial posts.
genviral.sh retry-posts --post-ids "post_id_1,post_id_2" genviral.sh retry-posts --post-ids "post_id_1" --account-ids "account_id_1"
Limits:
: 1-20 IDspost_ids
: 1-10 IDsaccount_ids
list-posts
List posts with optional filters.
genviral.sh list-posts genviral.sh list-posts --status scheduled --limit 20 genviral.sh list-posts --since "2025-02-01T00:00:00Z" --until "2025-02-28T23:59:59Z" genviral.sh list-posts --json
--since and --until must be ISO 8601 datetimes with timezone offset.
Status filters:
draft, pending, scheduled, posted, failed, partial, retry
get-post
Get details for a specific post.
genviral.sh get-post --id POST_ID
delete-posts (alias: delete-post
)
delete-postBulk delete posts by IDs.
genviral.sh delete-posts --ids "post_id_1,post_id_2,post_id_3" # equivalent option name genviral.sh delete-posts --post-ids "post_id_1,post_id_2,post_id_3" # command alias genviral.sh delete-post --ids "post_id_1,post_id_2"
Limit: up to 50 IDs per request.
Returns structured delete results including:
deletedIds
(posts that can't be deleted due to status)blockedStatusesskippederrors
Slideshow Commands
generate | generate-slideshow
Generate a slideshow from a prompt using AI, or create one manually with
--skip-ai.
# AI mode (default) genviral.sh generate \ --prompt "Your hook and content prompt" \ --pack-id PACK_ID \ --slides 5 \ --type educational \ --aspect-ratio 4:5 \ --style tiktok \ --language en \ --font-size small \ --text-width narrow \ --product-id PRODUCT_ID # Manual/mixed mode with slide_config genviral.sh generate \ --skip-ai \ --slide-config-file slide-config.json # Pass slide_config inline genviral.sh generate \ --skip-ai \ --slide-config-json '{"total_slides":2,"slide_types":["image_pack","custom_image"],...}'
Options:
- AI prompt (required unless--prompt
or--skip-ai
)--product-id
- Image pack UUID for backgrounds--pack-id
- number of slides (1-10, default: 5)--slides
---type
oreducationalpersonal
---aspect-ratio
(vertical),9:16
(default),4:5
(square)1:1
/--style
- text style preset (e.g.,--text-preset
)tiktok
- language code (e.g.,--language
,en
,es
)fr
---font-size
ordefaultsmall
---text-width
ordefaultnarrow
- optional product context identifier--product-id
- skip AI text generation (use with--skip-ai
)--slide-config-*
/--slide-config-json
- inline JSON slide config--slide-config
- path to JSON file with slide config--slide-config-file
render | render-slideshow
Render a slideshow to images via Remotion.
genviral.sh render --id SLIDESHOW_ID
Returns:
- Updated slideshow with rendered image URLs
- Status:
rendered
review | get-slideshow
Get full slideshow details for review. Shows slide text, status, rendered URLs.
genviral.sh review --id SLIDESHOW_ID genviral.sh review --id SLIDESHOW_ID --json genviral.sh get-slideshow --id SLIDESHOW_ID # alias
update | update-slideshow
Update slideshow fields, settings, or slides. Re-render after updating slides.
# Update title genviral.sh update --id SLIDESHOW_ID --title "New Title" # Update status genviral.sh update --id SLIDESHOW_ID --status draft # Update settings genviral.sh update --id SLIDESHOW_ID --settings-json '{"aspect_ratio":"9:16","advanced_settings":{"text_width":"narrow"}}' # Update slides (full replacement) genviral.sh update --id SLIDESHOW_ID --slides '[{"image_url":"...","text_elements":[{"content":"..."}]}]' # Load slides from file genviral.sh update --id SLIDESHOW_ID --slides-file slides.json # Update product_id or clear it genviral.sh update --id SLIDESHOW_ID --product-id NEW_PRODUCT_ID genviral.sh update --id SLIDESHOW_ID --clear-product-id
Options:
- Update title--title
---status
ordraftrendered
---slideshow-type
oreducationalpersonal
- Link to product--product-id
- Detach product--clear-product-id
/--settings-json
- Partial settings patch--settings-file
/--slides
- Full slides array replacement--slides-file
regenerate-slide
Regenerate AI text for a single slide (0-indexed).
genviral.sh regenerate-slide --id SLIDESHOW_ID --index 2 genviral.sh regenerate-slide --id SLIDESHOW_ID --index 2 --instruction "Make this shorter and more punchy"
Constraints:
must be a non-negative integer--index
max length: 500 characters--instruction
duplicate | duplicate-slideshow
Clone an existing slideshow as a new draft.
genviral.sh duplicate --id SLIDESHOW_ID
delete | delete-slideshow
Delete a slideshow.
genviral.sh delete --id SLIDESHOW_ID
list-slideshows
List slideshows with filtering and pagination.
genviral.sh list-slideshows genviral.sh list-slideshows --status rendered --search "hook" --limit 20 --offset 0 genviral.sh list-slideshows --json
Pack Commands
Packs are collections of background images used in slideshows.
list-packs
List available image packs.
genviral.sh list-packs genviral.sh list-packs --search motivation --include-public false genviral.sh list-packs --limit 20 --offset 0 --json
get-pack
Get a single pack with all image URLs.
genviral.sh get-pack --id PACK_ID
create-pack
Create a new pack.
genviral.sh create-pack --name "My Pack" genviral.sh create-pack --name "Public Pack" --is-public # explicit boolean also supported genviral.sh create-pack --name "Private Pack" --is-public false
update-pack
Update pack name or visibility.
genviral.sh update-pack --id PACK_ID --name "New Name" genviral.sh update-pack --id PACK_ID --is-public true
delete-pack
Delete a pack.
genviral.sh delete-pack --id PACK_ID
add-pack-image
Add an image to a pack.
genviral.sh add-pack-image --pack-id PACK_ID --image-url "https://cdn.example.com/image.jpg" genviral.sh add-pack-image --pack-id PACK_ID --image-url "https://cdn.example.com/image.jpg" --file-name "hero-1.jpg"
delete-pack-image
Remove an image from a pack.
genviral.sh delete-pack-image --pack-id PACK_ID --image-id IMAGE_ID
Template Commands
Templates are reusable slideshow structures. Convert winning slideshows into templates for faster iteration.
list-templates
List templates visible in your scope.
genviral.sh list-templates genviral.sh list-templates --search hooks --limit 20 --offset 0 genviral.sh list-templates --json
get-template
Get a single template.
genviral.sh get-template --id TEMPLATE_ID
create-template
Create a template from a validated template config object.
# File input genviral.sh create-template \ --name "My Template" \ --description "Description" \ --visibility private \ --config-file template-config.json # Inline JSON input genviral.sh create-template \ --name "My Template" \ --visibility workspace \ --config-json '{"version":1,"structure":{"slides":[]},"content":{},"visuals":{}}'
Config must be valid JSON matching the template config v1 schema. Use exactly one of:
--config-file <path>--config-json '<json>'
update-template
Update template fields.
genviral.sh update-template --id TEMPLATE_ID --name "New Name" genviral.sh update-template --id TEMPLATE_ID --visibility workspace genviral.sh update-template --id TEMPLATE_ID --config-file new-config.json genviral.sh update-template --id TEMPLATE_ID --config-json '{"version":1,"structure":{"slides":[]},"content":{},"visuals":{}}' genviral.sh update-template --id TEMPLATE_ID --clear-description
Config input: use one of
--config-file or --config-json.
delete-template
Delete a template.
genviral.sh delete-template --id TEMPLATE_ID
create-template-from-slideshow
Convert an existing slideshow into a reusable template.
genviral.sh create-template-from-slideshow \ --slideshow-id SLIDESHOW_ID \ --name "Winning Format" \ --description "Built from high-performing slideshow" \ --visibility workspace \ --preserve-text
--preserve-text supports both forms:
(sets true)--preserve-text--preserve-text true|false
Analytics Commands
Analytics endpoints provide KPIs, post metrics, and tracked account management.
analytics-summary (alias: get-analytics-summary
)
get-analytics-summaryGet analytics summary with KPIs, trends, and content mix.
genviral.sh analytics-summary genviral.sh analytics-summary --range 30d genviral.sh analytics-summary --start 2026-01-01 --end 2026-01-31 genviral.sh analytics-summary --platforms tiktok,instagram genviral.sh analytics-summary --accounts TARGET_ID_1,TARGET_ID_2 genviral.sh analytics-summary --json
Options:
- Date preset:--range
,14d
,30d
,90d
,1yall
/--start
- Custom date range (YYYY-MM-DD), must use both together--end
- Comma-separated platform filter--platforms
- Comma-separated analytics target IDs--accounts
Returns:
- publishedVideos, activeAccounts, views, likes, comments, shares, saves, engagementRate (with deltas)kpis
- Daily interactionsinteractionSeries
- Daily engagement rateengagementSeries
- Daily post countspostingHeatmap
- Consecutive posting dayspostingStreak
- Posts by platformcontentMix
analytics-posts (alias: list-analytics-posts
)
list-analytics-postsList post-level analytics with sorting and pagination.
genviral.sh analytics-posts genviral.sh analytics-posts --range 90d --sort-by views --sort-order desc --limit 25 genviral.sh analytics-posts --start 2026-01-01 --end 2026-01-31 --platforms tiktok genviral.sh analytics-posts --json
Options:
- Date preset:--range
,14d
,30d
,90d
,1yall
/--start
- Custom date range--end
- Platform filter--platforms
- Target ID filter--accounts
---sort-by
,published_at
,views
,likes
,commentsshares
---sort-order
orascdesc
- Page size (max 100)--limit
- Pagination offset--offset
analytics-targets
List tracked analytics accounts.
genviral.sh analytics-targets genviral.sh analytics-targets --json
analytics-target-create
Add a new tracked account.
genviral.sh analytics-target-create --platform tiktok --identifier @brand genviral.sh analytics-target-create --platform instagram --identifier @brand --alias "Brand HQ"
Options:
---platform
,tiktok
, orinstagram
(required)youtube
- Account handle (required)--identifier
- Display name override--alias
analytics-target
Get details for a single analytics target.
genviral.sh analytics-target --id TARGET_ID
analytics-target-update
Update an analytics target.
genviral.sh analytics-target-update --id TARGET_ID --display-name "New Name" genviral.sh analytics-target-update --id TARGET_ID --favorite true genviral.sh analytics-target-update --id TARGET_ID --clear-display-name genviral.sh analytics-target-update --id TARGET_ID --refresh-policy-json '{"freeDailyRefresh":true}' genviral.sh analytics-target-update --id TARGET_ID --clear-refresh-policy
analytics-target-delete
Delete an analytics target.
genviral.sh analytics-target-delete --id TARGET_ID
analytics-target-refresh
Trigger a refresh for an analytics target.
genviral.sh analytics-target-refresh --id TARGET_ID
Returns:
- Refresh ID and status
- Whether free refresh window was usedwasFree
analytics-refresh | get-analytics-refresh
Check refresh status.
genviral.sh analytics-refresh --id REFRESH_ID
Returns:
-status
,pending
,processing
, orcompletedfailed
,credits_usedfree_refresh_used
,started_atcompleted_at
(if failed)error
analytics-workspace-suggestions (alias: get-analytics-workspace-suggestions
)
get-analytics-workspace-suggestionsList other workspace/personal scopes with tracked accounts.
genviral.sh analytics-workspace-suggestions genviral.sh get-analytics-workspace-suggestions genviral.sh analytics-workspace-suggestions --json
Legacy Pipeline Commands
These are TikTok-focused convenience commands from the original skill.
post-draft
Post a rendered slideshow as a draft (TikTok-focused).
genviral.sh post-draft \ --id SLIDESHOW_ID \ --caption "Your caption with #hashtags" \ --account-ids "account_id_1"
Always forces TikTok draft-safe settings:
privacy_level=SELF_ONLY and post_mode=MEDIA_UPLOAD.
full-pipeline
End-to-end: generate -> render -> review -> post draft.
genviral.sh full-pipeline \ --prompt "Your hook and content prompt" \ --caption "Caption with #hashtags" \ --pack-id PACK_ID \ --slides 5 \ --type educational \ --style tiktok \ --account-ids ACC_ID
Use
--skip-post to stop after rendering (useful for review before posting).
Content Creation Pipeline
This is the recommended workflow for producing posts.
For Slideshow Posts
-
Hook Selection: Read
and pick a hook. Rotate through categories.hooks/library.json -
Prompt Assembly: Use the selected hook to build a full slideshow prompt. Reference
.prompts/slideshow.md -
Generate Slideshow: Run
with the assembled prompt.generate -
Review Slide Text: Check each slide for clarity, readability, flow. Update or regenerate weak slides.
-
Render: Run
to generate final images.render -
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.
-
Post: Use
with media-type slideshow, or use legacycreate-post
for TikTok drafts.post-draft -
Log the Post (MANDATORY): Immediately after posting, append an entry to
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.content/post-log.md -
Track Performance: Use analytics endpoints to monitor metrics. During performance checks (evening cron), update
with view/like/comment counts for recent posts.content/post-log.md
For Video Posts
-
Source Video: Upload via
command or reference existing CDN URL.upload -
Write Caption: Follow brand voice, include relevant hashtags.
-
Create Post: Run
with media-type video.create-post -
Track Performance: Check analytics.
Platform Best Practices
TikTok
Slide Count: 5-6 slides is the sweet spot.
Aspect Ratio:
9:16 for fullscreen, 4:5 for feed.
Text Readability: One idea per slide. 8-16 words max. Avoid text in bottom 20% (UI overlap).
Narrative Structure (5-slide arc):
- Hook (stop the scroll)
- Problem detail
- Shift (introduce the solution)
- Feature/proof
- CTA
Slide Count: 5-10 slides for carousel posts.
Aspect Ratio:
- Reels: 9:16
- Feed posts: 4:5 or 1:1
API Error Codes
Common Partner API error patterns:
- API key missing, malformed, or invalid401 unauthorized
- workspace/account needs an active subscription402 subscription_required
- current plan tier does not include the attempted capability403 tier_not_allowed
- request shape or enum values are invalid422 invalid_payload
- too many requests in a short window429 rate_limited
Troubleshooting
"GENVIRAL_API_KEY is required" Export the environment variable:
export GENVIRAL_API_KEY="your_public_id.your_secret"
"No rendered image URLs found" The slideshow has not been rendered yet. Run
render first.
API returns 401, 402, or 403
: verify API key format (401
) and token validitypublic_id.secret
: activate or upgrade subscription402 subscription_required
: your tier does not permit that feature403 tier_not_allowed
Render takes too long Each slide takes 2-5 seconds. For 5 slides, expect up to 25 seconds.
Notes
- Multi-platform support: Works with any platform genviral supports (TikTok, Instagram, etc.)
- Content types: Supports both video posts and slideshow (photo carousel) posts
- Hosted vs BYO accounts: Works with both hosted and BYO accounts
- Scheduling: Posts can be scheduled for future publish or queued for immediate posting
- Draft mode: For TikTok slideshow posts, use
to save to drafts inboxpost_mode: MEDIA_UPLOAD - Template system: Convert winning slideshows to templates for faster iteration
- Analytics: Full analytics support for tracking performance across accounts
- Never use em-dashes in any generated content