{"id":"e64884d2-f210-466d-aefe-486023f4c942","shortId":"QVFqGE","kind":"skill","title":"Slack Gif Creator","tagline":"Skills skill by Anthropics","description":"# Slack GIF Creator\n\nA toolkit providing utilities and knowledge for creating animated GIFs optimized for Slack.\n\n## Slack Requirements\n\n**Dimensions:**\n- Emoji GIFs: 128x128 (recommended)\n- Message GIFs: 480x480\n\n**Parameters:**\n- FPS: 10-30 (lower is smaller file size)\n- Colors: 48-128 (fewer = smaller file size)\n- Duration: Keep under 3 seconds for emoji GIFs\n\n## Core Workflow\n\n```python\nfrom core.gif_builder import GIFBuilder\nfrom PIL import Image, ImageDraw\n\n# 1. Create builder\nbuilder = GIFBuilder(width=128, height=128, fps=10)\n\n# 2. Generate frames\nfor i in range(12):\n    frame = Image.new('RGB', (128, 128), (240, 248, 255))\n    draw = ImageDraw.Draw(frame)\n\n    # Draw your animation using PIL primitives\n    # (circles, polygons, lines, etc.)\n\n    builder.add_frame(frame)\n\n# 3. Save with optimization\nbuilder.save('output.gif', num_colors=48, optimize_for_emoji=True)\n```\n\n## Drawing Graphics\n\n### Working with User-Uploaded Images\nIf a user uploads an image, consider whether they want to:\n- **Use it directly** (e.g., \"animate this\", \"split this into frames\")\n- **Use it as inspiration** (e.g., \"make something like this\")\n\nLoad and work with images using PIL:\n```python\nfrom PIL import Image\n\nuploaded = Image.open('file.png')\n# Use directly, or just as reference for colors/style\n```\n\n### Drawing from Scratch\nWhen drawing graphics from scratch, use PIL ImageDraw primitives:\n\n```python\nfrom PIL import ImageDraw\n\ndraw = ImageDraw.Draw(frame)\n\n# Circles/ovals\ndraw.ellipse([x1, y1, x2, y2], fill=(r, g, b), outline=(r, g, b), width=3)\n\n# Stars, triangles, any polygon\npoints = [(x1, y1), (x2, y2), (x3, y3), ...]\ndraw.polygon(points, fill=(r, g, b), outline=(r, g, b), width=3)\n\n# Lines\ndraw.line([(x1, y1), (x2, y2)], fill=(r, g, b), width=5)\n\n# Rectangles\ndraw.rectangle([x1, y1, x2, y2], fill=(r, g, b), outline=(r, g, b), width=3)\n```\n\n**Don't use:** Emoji fonts (unreliable across platforms) or assume pre-packaged graphics exist in this skill.\n\n### Making Graphics Look Good\n\nGraphics should look polished and creative, not basic. Here's how:\n\n**Use thicker lines** - Always set `width=2` or higher for outlines and lines. Thin lines (width=1) look choppy and amateurish.\n\n**Add visual depth**:\n- Use gradients for backgrounds (`create_gradient_background`)\n- Layer multiple shapes for complexity (e.g., a star with a smaller star inside)\n\n**Make shapes more interesting**:\n- Don't just draw a plain circle - add highlights, rings, or patterns\n- Stars can have glows (draw larger, semi-transparent versions behind)\n- Combine multiple shapes (stars + sparkles, circles + rings)\n\n**Pay attention to colors**:\n- Use vibrant, complementary colors\n- Add contrast (dark outlines on light shapes, light outlines on dark shapes)\n- Consider the overall composition\n\n**For complex shapes** (hearts, snowflakes, etc.):\n- Use combinations of polygons and ellipses\n- Calculate points carefully for symmetry\n- Add details (a heart can have a highlight curve, snowflakes have intricate branches)\n\nBe creative and detailed! A good Slack GIF should look polished, not like placeholder graphics.\n\n## Available Utilities\n\n### GIFBuilder (`core.gif_builder`)\nAssembles frames and optimizes for Slack:\n```python\nbuilder = GIFBuilder(width=128, height=128, fps=10)\nbuilder.add_frame(frame)  # Add PIL Image\nbuilder.add_frames(frames)  # Add list of frames\nbuilder.save('out.gif', num_colors=48, optimize_for_emoji=True, remove_duplicates=True)\n```\n\n### Validators (`core.validators`)\nCheck if GIF meets Slack requirements:\n```python\nfrom core.validators import validate_gif, is_slack_ready\n\n# Detailed validation\npasses, info = validate_gif('my.gif', is_emoji=True, verbose=True)\n\n# Quick check\nif is_slack_ready('my.gif'):\n    print(\"Ready!\")\n```\n\n### Easing Functions (`core.easing`)\nSmooth motion instead of linear:\n```python\nfrom core.easing import interpolate\n\n# Progress from 0.0 to 1.0\nt = i / (num_frames - 1)\n\n# Apply easing\ny = interpolate(start=0, end=400, t=t, easing='ease_out')\n\n# Available: linear, ease_in, ease_out, ease_in_out,\n#           bounce_out, elastic_out, back_out\n```\n\n### Frame Helpers (`core.frame_composer`)\nConvenience functions for common needs:\n```python\nfrom core.frame_composer import (\n    create_blank_frame,         # Solid color background\n    create_gradient_background,  # Vertical gradient\n    draw_circle,                # Helper for circles\n    draw_text,                  # Simple text rendering\n    draw_star                   # 5-pointed star\n)\n```\n\n## Animation Concepts\n\n### Shake/Vibrate\nOffset object position with oscillation:\n- Use `math.sin()` or `math.cos()` with frame index\n- Add small random variations for natural feel\n- Apply to x and/or y position\n\n### Pulse/Heartbeat\nScale object size rhythmically:\n- Use `math.sin(t * frequency * 2 * math.pi)` for smooth pulse\n- For heartbeat: two quick pulses then pause (adjust sine wave)\n- Scale between 0.8 and 1.2 of base size\n\n### Bounce\nObject falls and bounces:\n- Use `interpolate()` with `easing='bounce_out'` for landing\n- Use `easing='ease_in'` for falling (accelerating)\n- Apply gravity by increasing y velocity each frame\n\n### Spin/Rotate\nRotate object around center:\n- PIL: `image.rotate(angle, resample=Image.BICUBIC)`\n- For wobble: use sine wave for angle instead of linear\n\n### Fade In/Out\nGradually appear or disappear:\n- Create RGBA image, adjust alpha channel\n- Or use `Image.blend(image1, image2, alpha)`\n- Fade in: alpha from 0 to 1\n- Fade out: alpha from 1 to 0\n\n### Slide\nMove object from off-screen to position:\n- Start position: outside frame bounds\n- End position: target location\n- Use `interpolate()` with `easing='ease_out'` for smooth stop\n- For overshoot: use `easing='back_out'`\n\n### Zoom\nScale and position for zoom effect:\n- Zoom in: scale from 0.1 to 2.0, crop center\n- Zoom out: scale from 2.0 to 1.0\n- Can add motion blur for drama (PIL filter)\n\n### Explode/Particle Burst\nCreate particles radiating outward:\n- Generate particles with random angles and velocities\n- Update each particle: `x += vx`, `y += vy`\n- Add gravity: `vy += gravity_constant`\n- Fade out particles over time (reduce alpha)\n\n## Optimization Strategies\n\nOnly when asked to make the file size smaller, implement a few of the following methods:\n\n1. **Fewer frames** - Lower FPS (10 instead of 20) or shorter duration\n2. **Fewer colors** - `num_colors=48` instead of 128\n3. **Smaller dimensions** - 128x128 instead of 480x480\n4. **Remove duplicates** - `remove_duplicates=True` in save()\n5. **Emoji mode** - `optimize_for_emoji=True` auto-optimizes\n\n```python\n# Maximum optimization for emoji\nbuilder.save(\n    'emoji.gif',\n    num_colors=48,\n    optimize_for_emoji=True,\n    remove_duplicates=True\n)\n```\n\n## Philosophy\n\nThis skill provides:\n- **Knowledge**: Slack's requirements and animation concepts\n- **Utilities**: GIFBuilder, validators, easing functions\n- **Flexibility**: Create the animation logic using PIL primitives\n\nIt does NOT provide:\n- Rigid animation templates or pre-made functions\n- Emoji font rendering (unreliable across platforms)\n- A library of pre-packaged graphics built into the skill\n\n**Note on user uploads**: This skill doesn't include pre-built graphics, but if a user uploads an image, use PIL to load and work with it - interpret based on their request whether they want it used directly or just as inspiration.\n\nBe creative! Combine concepts (bouncing + rotating, pulsing + sliding, etc.) and use PIL's full capabilities.\n\n## Dependencies\n\n```bash\npip install pillow imageio numpy\n```","tags":["slack","gif","creator","skills","anthropics"],"capabilities":["skill","source-anthropics","category-skills"],"categories":["skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/anthropics/skills/slack-gif-creator","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.500","qualityRationale":"deterministic score 0.50 from registry signals: · indexed on skills.sh · published under anthropics/skills","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T13:40:06.857Z","embedding":null,"createdAt":"2026-04-18T20:24:09.556Z","updatedAt":"2026-04-24T13:40:06.857Z","lastSeenAt":"2026-04-24T13:40:06.857Z","tsv":"'-128':45 '-30':37 '0':566,759,768 '0.0':553 '0.1':813 '0.8':683 '1':71,324,560,761,766,883 '1.0':555,824 '1.2':685 '10':36,81,474,888 '12':89 '128':77,79,93,94,470,472,903 '128x128':29,907 '2':82,314,666,895 '2.0':815,822 '20':891 '240':95 '248':96 '255':97 '3':53,114,223,246,274,904 '4':911 '400':568 '48':44,122,492,900,938 '480x480':33,910 '5':258,626,919 'acceler':708 'across':281,986 'add':329,363,394,427,478,484,644,826,853 'adjust':678,746 'alpha':747,754,757,764,864 'alway':311 'amateurish':328 'and/or':654 'angl':724,733,843 'anim':19,103,150,629,955,965,975 'anthrop':7 'appear':740 'appli':561,651,709 'around':720 'ask':869 'assembl':460 'assum':284 'attent':387 'auto':927 'auto-optim':926 'avail':455,574 'b':217,221,240,244,256,268,272 'back':587,800 'background':335,338,608,611 'base':687,1028 'bash':1058 'basic':304 'behind':378 'blank':604 'blur':828 'bounc':583,689,693,698,1046 'bound':782 'branch':439 'builder':63,73,74,459,467 'builder.add':111,475,481 'builder.save':118,488,934 'built':995,1010 'burst':834 'calcul':422 'capabl':1056 'care':424 'category-skills' 'center':721,817 'channel':748 'check':502,530 'choppi':326 'circl':107,362,384,615,618 'circles/ovals':208 'color':43,121,389,393,491,607,897,899,937 'colors/style':187 'combin':379,417,1044 'common':596 'complementari':392 'complex':343,411 'compos':592,601 'composit':409 'concept':630,956,1045 'consid':141,406 'constant':857 'contrast':395 'conveni':593 'core':58 'core.easing':540,548 'core.frame':591,600 'core.gif':62,458 'core.validators':501,510 'creat':18,72,336,603,609,743,835,963 'creativ':302,441,1043 'creator':3,10 'crop':816 'curv':435 'dark':396,404 'depend':1057 'depth':331 'detail':428,443,517 'dimens':26,906 'direct':148,181,1037 'disappear':742 'doesn':1005 'drama':830 'draw':98,101,127,188,192,205,359,372,614,619,624 'draw.ellipse':209 'draw.line':248 'draw.polygon':235 'draw.rectangle':260 'duplic':498,913,915,944 'durat':50,894 'e.g':149,160,344 'eas':538,562,571,572,576,578,580,697,703,704,790,791,799,960 'effect':808 'elast':585 'ellips':421 'emoji':27,56,125,278,495,525,920,924,933,941,982 'emoji.gif':935 'end':567,783 'etc':110,415,1050 'exist':289 'explode/particle':833 'fade':737,755,762,858 'fall':691,707 'feel':650 'fewer':46,884,896 'file':41,48,873 'file.png':179 'fill':214,237,253,265 'filter':832 'flexibl':962 'follow':881 'font':279,983 'fps':35,80,473,887 'frame':84,90,100,112,113,155,207,461,476,477,482,483,487,559,589,605,642,716,781,885 'frequenc':665 'full':1055 'function':539,594,961,981 'g':216,220,239,243,255,267,271 'generat':83,839 'gif':2,9,20,28,32,57,447,504,513,522 'gifbuild':65,75,457,468,958 'glow':371 'good':296,445 'gradient':333,337,610,613 'gradual':739 'graphic':128,193,288,294,297,454,994,1011 'graviti':710,854,856 'heart':413,430 'heartbeat':672 'height':78,471 'helper':590,616 'higher':316 'highlight':364,434 'imag':69,134,140,169,176,480,745,1018 'image.bicubic':726 'image.blend':751 'image.new':91 'image.open':178 'image.rotate':723 'image1':752 'image2':753 'imagedraw':70,198,204 'imagedraw.draw':99,206 'imageio':1062 'implement':876 'import':64,68,175,203,511,549,602 'in/out':738 'includ':1007 'increas':712 'index':643 'info':520 'insid':351 'inspir':159,1041 'instal':1060 'instead':543,734,889,901,908 'interest':355 'interpol':550,564,695,788 'interpret':1027 'intric':438 'keep':51 'knowledg':16,950 'land':701 'larger':373 'layer':339 'librari':989 'light':399,401 'like':163,452 'line':109,247,310,320,322 'linear':545,575,736 'list':485 'load':165,1022 'locat':786 'logic':966 'look':295,299,325,449 'lower':38,886 'made':980 'make':161,293,352,871 'math.cos':640 'math.pi':667 'math.sin':638,663 'maximum':930 'meet':505 'messag':31 'method':882 'mode':921 'motion':542,827 'move':770 'multipl':340,380 'my.gif':523,535 'natur':649 'need':597 'note':999 'num':120,490,558,898,936 'numpi':1063 'object':633,659,690,719,771 'off-screen':773 'offset':632 'optim':21,117,123,463,493,865,922,928,931,939 'oscil':636 'out.gif':489 'outlin':218,241,269,318,397,402 'output.gif':119 'outsid':780 'outward':838 'overal':408 'overshoot':797 'packag':287,993 'paramet':34 'particl':836,840,848,860 'pass':519 'pattern':367 'paus':677 'pay':386 'philosophi':946 'pil':67,105,171,174,197,202,479,722,831,968,1020,1053 'pillow':1061 'pip':1059 'placehold':453 'plain':361 'platform':282,987 'point':228,236,423,627 'polish':300,450 'polygon':108,227,419 'posit':634,656,777,779,784,805 'pre':286,979,992,1009 'pre-built':1008 'pre-mad':978 'pre-packag':285,991 'primit':106,199,969 'print':536 'progress':551 'provid':13,949,973 'puls':670,675,1048 'pulse/heartbeat':657 'python':60,172,200,466,508,546,598,929 'quick':529,674 'r':215,219,238,242,254,266,270 'radiat':837 'random':646,842 'rang':88 'readi':516,534,537 'recommend':30 'rectangl':259 'reduc':863 'refer':185 'remov':497,912,914,943 'render':623,984 'request':1031 'requir':25,507,953 'resampl':725 'rgb':92 'rgba':744 'rhythmic':661 'rigid':974 'ring':365,385 'rotat':718,1047 'save':115,918 'scale':658,681,803,811,820 'scratch':190,195 'screen':775 'second':54 'semi':375 'semi-transpar':374 'set':312 'shake/vibrate':631 'shape':341,353,381,400,405,412 'shorter':893 'simpl':621 'sine':679,730 'size':42,49,660,688,874 'skill':4,5,292,948,998,1004 'slack':1,8,23,24,446,465,506,515,533,951 'slide':769,1049 'small':645 'smaller':40,47,349,875,905 'smooth':541,669,794 'snowflak':414,436 'solid':606 'someth':162 'source-anthropics' 'sparkl':383 'spin/rotate':717 'split':152 'star':224,346,350,368,382,625,628 'start':565,778 'stop':795 'strategi':866 'symmetri':426 'target':785 'templat':976 'text':620,622 'thicker':309 'thin':321 'time':862 'toolkit':12 'transpar':376 'triangl':225 'true':126,496,499,526,528,916,925,942,945 'two':673 'unreli':280,985 'updat':846 'upload':133,138,177,1002,1016 'use':104,146,156,170,180,196,277,308,332,390,416,637,662,694,702,729,750,787,798,967,1019,1036,1052 'user':132,137,1001,1015 'user-upload':131 'util':14,456,957 'valid':500,512,518,521,959 'variat':647 'veloc':714,845 'verbos':527 'version':377 'vertic':612 'vibrant':391 'visual':330 'vx':850 'vy':852,855 'want':144,1034 'wave':680,731 'whether':142,1032 'width':76,222,245,257,273,313,323,469 'wobbl':728 'work':129,167,1024 'workflow':59 'x':653,849 'x1':210,229,249,261 'x2':212,231,251,263 'x3':233 'y':563,655,713,851 'y1':211,230,250,262 'y2':213,232,252,264 'y3':234 'zoom':802,807,809,818","prices":[{"id":"c32f5983-841d-4510-835c-e1c8a38bf0ec","listingId":"e64884d2-f210-466d-aefe-486023f4c942","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"anthropics","category":"skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:24:09.556Z"}],"sources":[{"listingId":"e64884d2-f210-466d-aefe-486023f4c942","source":"github","sourceId":"anthropics/skills/slack-gif-creator","sourceUrl":"https://github.com/anthropics/skills/tree/main/skills/slack-gif-creator","isPrimary":false,"firstSeenAt":"2026-04-18T21:24:29.531Z","lastSeenAt":"2026-04-24T12:50:17.725Z"},{"listingId":"e64884d2-f210-466d-aefe-486023f4c942","source":"skills_sh","sourceId":"anthropics/skills/slack-gif-creator","sourceUrl":"https://skills.sh/anthropics/skills/slack-gif-creator","isPrimary":true,"firstSeenAt":"2026-04-18T20:24:09.556Z","lastSeenAt":"2026-04-24T13:40:06.857Z"}],"details":{"listingId":"e64884d2-f210-466d-aefe-486023f4c942","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"anthropics","slug":"slack-gif-creator","source":"skills_sh","category":"skills","skills_sh_url":"https://skills.sh/anthropics/skills/slack-gif-creator"},"updatedAt":"2026-04-24T13:40:06.857Z"}}