Install
openclaw skills install gifhorseSearch video dialogue and create reaction GIFs with timed subtitles. Perfect for creating meme-worthy clips from movies and TV shows.
openclaw skills install gifhorseCreate reaction GIFs from your video library by searching dialogue and adding timed subtitles.
cd ~/gifhorse && source venv/bin/activate
gifhorse transcribe ~/Movies
The gifhorse command must be run from within its virtual environment. You can activate it with:
cd ~/gifhorse && source venv/bin/activate
Or use the activation helper:
source ~/gifhorse/activate.sh
Extract dialogue from your videos (one-time per video):
# Default: downloads subtitles from online providers (fast, recommended)
gifhorse transcribe /path/to/videos
# Use only local .srt files (no downloading, no Whisper)
gifhorse transcribe /path/to/videos --use-subtitles
# Use Whisper AI (slow but works for any video)
gifhorse transcribe /path/to/video.mp4 --use-whisper
# Re-transcribe videos already in database
gifhorse transcribe /path/to/videos --force
Download .srt files without storing in the database:
gifhorse fetch-subtitles /path/to/videos
gifhorse fetch-subtitles /path/to/videos --skip-existing
Find quotes across your entire library:
# Basic search
gifhorse search "memorable quote"
# Search with surrounding context
gifhorse search "memorable quote" --context 2
# Show all results (no limit)
gifhorse search "memorable quote" --all
# Custom result limit (default: 100)
gifhorse search "memorable quote" --limit 50
See exactly what will be captured:
gifhorse preview "memorable quote" 1
gifhorse preview "quote" 1 --include-before 1 --include-after 1
Generate the GIF with subtitles:
# Basic GIF (auto-named from dialogue, saved to exports/)
gifhorse create "memorable quote" 1
# Explicit output path
gifhorse create "memorable quote" 1 -o reaction.gif
# High quality for social media
gifhorse create "quote" 1 --width 720 --fps 24 --quality high
# Include conversation context
gifhorse create "quote" 1 --include-before 2 --include-after 1
# Substitute words in subtitles (repeatable, target segments by number from preview)
gifhorse create "the age of men" 1 --include-after 1 \
-s 1 "men" "standardized software" \
-s 2 "orc" "custom applications"
# Clean replace (no strikethrough)
gifhorse create "quote" 1 -r 1 "old word" "new word"
# Create and send via iMessage
gifhorse create "quote" 1 --send
gifhorse create "quote" 1 --send-to "+15551234567"
# Remove videos by path pattern (SQL LIKE wildcards)
gifhorse remove "%Adventure Time%"
gifhorse remove "%S01%" --yes
# Check subtitle status for a directory
gifhorse subtitle-status ~/Videos
gifhorse subtitle-status ~/Videos --missing-only
# See transcription stats
gifhorse stats
# List all transcribed videos
gifhorse list
# Set phone number for iMessage sending
gifhorse config --set-phone "+15551234567"
# Show current configuration
gifhorse config --show
Control exactly what gets captured:
--include-before N - Include N dialogue segments before the match--include-after N - Include N dialogue segments after the match--padding-before SECS - Add buffer seconds before dialogue starts (default: 1.0)--padding-after SECS - Add buffer seconds after dialogue ends (default: 1.0)--start-offset SECS - Manual adjustment to start time (can be negative)--end-offset SECS - Manual adjustment to end time (can be negative)Important: For reactions after dialogue, use --padding-after instead of --include-after. The include-after option captures ALL time until the next dialogue segment (could be 30+ seconds!).
--quality low|medium|high - Color palette quality (affects file size)--fps N - Frames per second (default: 15, use 24 for smooth)--width N - Width in pixels (default: 480, use 720 for HD)-s, --sub NUM OLD NEW - Substitute words in a segment (repeatable). Replaced words render struck through in red, replacements in red. Segment numbers shown by preview.-r, --replace NUM OLD NEW - Replace words cleanly (no strikethrough). Repeatable.--no-subtitles - Create GIF without subtitle overlayi_dont_think_so.gif) and saved to exports/-o PATH to override. Collision handling appends _2, _3, etc.--send - Send created GIF to configured phone number via iMessage (macOS only)--send-to NUMBER - Send to a specific phone number (overrides config)Note: All GIFs automatically include a subtle "gifhorse" watermark in the bottom-right corner.
gifhorse search "perfect"
gifhorse create "perfect" 1 --padding-after 2.0
gifhorse search "key phrase"
gifhorse preview "key phrase" 1 --include-before 2 --include-after 1
gifhorse create "key phrase" 1 --include-before 2 --include-after 1
gifhorse preview "the age of men" 1 --include-after 1
gifhorse create "the age of men" 1 --include-after 1 \
-s 1 "men" "standardized software" \
-s 2 "orc" "custom applications"
gifhorse create "quote" 1 --width 720 --fps 24 --quality high -o tweet.gif
gifhorse create "memorable line" 1 --padding-after 3.0
gifhorse config --set-phone "+15551234567"
gifhorse create "quote" 1 --send
preview to verify timing before creatinggifhorse transcribe and subtitles are fetched automatically--padding-after not --include-after--context 2 to see surrounding dialogue--force to update transcriptions after getting better subtitlessubtitle-status to see which videos need subtitlesActivate the virtual environment:
cd ~/gifhorse && source venv/bin/activate
Make sure FFmpeg-full is installed:
brew install ffmpeg-full
The database stores absolute paths. If you moved videos after transcription, re-transcribe in the new location.
GifHorse works with network-mounted videos:
# Mount network share (macOS)
open "smb://server-ip/share-name"
# Transcribe from network
gifhorse transcribe "/Volumes/server-ip/Movies"
Invoke gifhorse when the user wants to:
MIT