Create custom animated GIFs for Slack reactions and celebrations. Use for team milestones, custom emoji reactions, inside jokes, and workplace fun.
Create custom animated GIFs for Slack workspaces, including celebration GIFs, reaction GIFs, and custom emoji animations. These add personality and fun to team communications.
from PIL import Image, ImageDraw, ImageFont
def create_shipped_gif(output_path):
frames = []
size = (128, 128)
for i in range(10):
img = Image.new('RGBA', size, (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
# Pulsing effect
scale = 0.8 + 0.2 * abs(i - 5) / 5
font_size = int(20 * scale)
draw.text((20, 50), "SHIPPED!", fill=(255, 100, 100))
frames.append(img)
frames[0].save(output_path, save_all=True, append_images=frames[1:],
duration=100, loop=0, transparency=0, disposal=2)
create_shipped_gif("shipped.gif")
from PIL import Image, ImageDraw, ImageFont
import os
def create_text_gif(text, output_path, frames=10, size=(128, 128)):
"""
Create simple animated text GIF.
Args:
text: Text to animate
*See sub-skills for full details.*
### Method 2: Python with moviepy (Video-to-GIF)
```python
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
import moviepy.video.fx.all as vfx
def video_to_slack_gif(video_path, output_path, start=0, duration=3, text=None):
"""
Convert video clip to Slack-optimized GIF.
Args:
video_path: Source video file
*See sub-skills for full details.*
### Method 3: Frame-by-Frame Animation
```python
from PIL import Image, ImageDraw
import math
def create_spinner_gif(output_path, size=64, frames=12):
"""Create loading spinner GIF."""
images = []
for frame in range(frames):
img = Image.new('RGBA', (size, size), (255, 255, 255, 0))
*See sub-skills for full details.*
## Slack-Specific Optimization
### Size Requirements
| Use Case | Max Size | Recommended |
|----------|----------|-------------|
| Custom emoji | 128x128 px | 64x64 px |
| Message GIF | 500 KB | Under 200 KB |
| Profile image | 512x512 px | 256x256 px |
### Optimization Script
```python
from PIL import Image
import subprocess
def optimize_for_slack(input_path, output_path, max_size_kb=200):
"""
Optimize GIF for Slack file size limits.
Args:
input_path: Source GIF
*See sub-skills for full details.*
## Related Skills
- [internal-comms](../internal-comms/SKILL.md) - Team communications
- [canvas-design](../../content-design/canvas-design/SKILL.md) - Static visual art
- [algorithmic-art](../../content-design/algorithmic-art/SKILL.md) - Generative animations
---
## Version History
- **2.0.0** (2026-01-02): Upgraded to v2 template - added Quick Start, When to Use, Execution Checklist, Error Handling, Metrics sections
- **1.0.0** (2024-10-15): Initial release with PIL/Pillow, moviepy methods, Slack optimization, celebration GIF templates
## Sub-Skills
- [Design Guidelines (+2)](design-guidelines/SKILL.md)
## Sub-Skills
- [Execution Checklist](execution-checklist/SKILL.md)
- [Error Handling](error-handling/SKILL.md)
- [Metrics](metrics/SKILL.md)
- [Dependencies](dependencies/SKILL.md)