{"id":"77c260b3-662c-489f-844d-cb385490d3c5","shortId":"DfB27m","kind":"skill","title":"slack-gif-creator","tagline":"A toolkit providing utilities and knowledge for creating animated GIFs optimized for Slack.","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```\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["slack","gif","creator","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-slack-gif-creator","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/slack-gif-creator","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34515 github stars · SKILL.md body (7,949 chars)","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-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T12:51:47.938Z","embedding":null,"createdAt":"2026-04-18T21:45:08.291Z","updatedAt":"2026-04-22T12:51:47.938Z","lastSeenAt":"2026-04-22T12:51:47.938Z","tsv":"'-128':55 '-30':47 '0':576,769,778 '0.0':563 '0.1':823 '0.8':693 '1':81,334,570,771,776,893 '1.0':565,834 '1.2':695 '10':46,91,484,898 '12':99 '128':87,89,103,104,480,482,913 '128x128':39,917 '2':92,324,676,905 '2.0':825,832 '20':901 '240':105 '248':106 '255':107 '3':63,124,233,256,284,914 '4':921 '400':578 '48':54,132,502,910,948 '480x480':43,920 '5':268,636,929 'acceler':718 'across':291,996 'action':1086 'add':339,373,404,437,488,494,654,836,863 'adjust':688,756 'alpha':757,764,767,774,874 'alway':321 'amateurish':338 'and/or':664 'angl':734,743,853 'anim':13,29,113,160,639,965,975,985 'appear':750 'appli':571,661,719 'applic':1080 'around':730 'ask':879,1124 'assembl':470 'assum':294 'attent':397 'auto':937 'auto-optim':936 'avail':465,584 'b':227,231,250,254,266,278,282 'back':597,810 'background':345,348,618,621 'base':697,1038 'bash':1068 'basic':314 'behind':388 'blank':614 'blur':838 'bounc':593,699,703,708,1056 'bound':792 'boundari':1132 'branch':449 'builder':73,83,84,469,477 'builder.add':121,485,491 'builder.save':128,498,944 'built':1005,1020 'burst':844 'calcul':432 'capabl':1066 'care':434 'center':731,827 'channel':758 'check':512,540 'choppi':336 'circl':117,372,394,625,628 'circles/ovals':218 'clarif':1126 'clear':1099 'color':53,131,399,403,501,617,907,909,947 'colors/style':197 'combin':389,427,1054 'common':606 'complementari':402 'complex':353,421 'compos':602,611 'composit':419 'concept':640,966,1055 'consid':151,416 'constant':867 'contrast':405 'conveni':603 'core':68 'core.easing':550,558 'core.frame':601,610 'core.gif':72,468 'core.validators':511,520 'creat':12,28,82,346,613,619,753,845,973 'creativ':312,451,1053 'creator':4,20 'criteria':1135 'crop':826 'curv':445 'dark':406,414 'depend':1067 'depth':341 'describ':1087,1103 'detail':438,453,527 'dimens':36,916 'direct':158,191,1047 'disappear':752 'doesn':1015 'drama':840 'draw':108,111,137,198,202,215,369,382,624,629,634 'draw.ellipse':219 'draw.line':258 'draw.polygon':245 'draw.rectangle':270 'duplic':508,923,925,954 'durat':60,904 'e.g':159,170,354 'eas':548,572,581,582,586,588,590,707,713,714,800,801,809,970 'effect':818 'elast':595 'ellips':431 'emoji':37,66,135,288,505,535,930,934,943,951,992 'emoji.gif':945 'end':577,793 'environ':1115 'environment-specif':1114 'etc':120,425,1060 'execut':1082 'exist':299 'expert':1120 'explode/particle':843 'fade':747,765,772,868 'fall':701,717 'feel':660 'fewer':56,894,906 'file':51,58,883 'file.png':189 'fill':224,247,263,275 'filter':842 'flexibl':972 'follow':891 'font':289,993 'fps':45,90,483,897 'frame':94,100,110,122,123,165,217,471,486,487,492,493,497,569,599,615,652,726,791,895 'frequenc':675 'full':1065 'function':549,604,971,991 'g':226,230,249,253,265,277,281 'generat':93,849 'gif':3,14,19,30,38,42,67,457,514,523,532 'gifbuild':75,85,467,478,968 'glow':381 'good':306,455 'gradient':343,347,620,623 'gradual':749 'graphic':138,203,298,304,307,464,1004,1021 'graviti':720,864,866 'heart':423,440 'heartbeat':682 'height':88,481 'helper':600,626 'higher':326 'highlight':374,444 'imag':79,144,150,179,186,490,755,1028 'image.bicubic':736 'image.blend':761 'image.new':101 'image.open':188 'image.rotate':733 'image1':762 'image2':763 'imagedraw':80,208,214 'imagedraw.draw':109,216 'imageio':1072 'implement':886 'import':74,78,185,213,521,559,612 'in/out':748 'includ':1017 'increas':722 'index':653 'info':530 'input':1129 'insid':361 'inspir':169,1051 'instal':1070 'instead':553,744,899,911,918 'interest':365 'interpol':560,574,705,798 'interpret':1037 'intric':448 'keep':61 'knowledg':10,26,960 'land':711 'larger':383 'layer':349 'librari':999 'light':409,411 'like':173,462 'limit':1091 'line':119,257,320,330,332 'linear':555,585,746 'list':495 'load':175,1032 'locat':796 'logic':976 'look':305,309,335,459 'lower':48,896 'made':990 'make':171,303,362,881 'match':1100 'math.cos':650 'math.pi':677 'math.sin':648,673 'maximum':940 'meet':515 'messag':41 'method':892 'miss':1137 'mode':931 'motion':552,837 'move':780 'multipl':350,390 'my.gif':533,545 'natur':659 'need':607 'note':1009 'num':130,500,568,908,946 'numpi':1073 'object':643,669,700,729,781 'off-screen':783 'offset':642 'optim':15,31,127,133,473,503,875,932,938,941,949 'oscil':646 'out.gif':499 'outlin':228,251,279,328,407,412 'output':1109 'output.gif':129 'outsid':790 'outward':848 'overal':418 'overshoot':807 'overview':1090 'packag':297,1003 'paramet':44 'particl':846,850,858,870 'pass':529 'pattern':377 'paus':687 'pay':396 'permiss':1130 'philosophi':956 'pil':77,115,181,184,207,212,489,732,841,978,1030,1063 'pillow':1071 'pip':1069 'placehold':463 'plain':371 'platform':292,997 'point':238,246,433,637 'polish':310,460 'polygon':118,237,429 'posit':644,666,787,789,794,815 'pre':296,989,1002,1019 'pre-built':1018 'pre-mad':988 'pre-packag':295,1001 'primit':116,209,979 'print':546 'progress':561 'provid':7,23,959,983 'puls':680,685,1058 'pulse/heartbeat':667 'python':70,182,210,476,518,556,608,939 'quick':539,684 'r':225,229,248,252,264,276,280 'radiat':847 'random':656,852 'rang':98 'readi':526,544,547 'recommend':40 'rectangl':269 'reduc':873 'refer':195 'remov':507,922,924,953 'render':633,994 'request':1041 'requir':35,517,963,1128 'resampl':735 'review':1121 'rgb':102 'rgba':754 'rhythmic':671 'rigid':984 'ring':375,395 'rotat':728,1057 'safeti':1131 'save':125,928 'scale':668,691,813,821,830 'scope':1102 'scratch':200,205 'screen':785 'second':64 'semi':385 'semi-transpar':384 'set':322 'shake/vibrate':641 'shape':351,363,391,410,415,422 'shorter':903 'simpl':631 'sine':689,740 'size':52,59,670,698,884 'skill':302,958,1008,1014,1078,1094 'skill-slack-gif-creator' 'slack':2,17,18,33,34,456,475,516,525,543,961 'slack-gif-cr':1 'slide':779,1059 'small':655 'smaller':50,57,359,885,915 'smooth':551,679,804 'snowflak':424,446 'solid':616 'someth':172 'source-sickn33' 'sparkl':393 'specif':1116 'spin/rotate':727 'split':162 'star':234,356,360,378,392,635,638 'start':575,788 'stop':805,1122 'strategi':876 'substitut':1112 'success':1134 'symmetri':436 'target':795 'task':1098 'templat':986 'test':1118 'text':630,632 'thicker':319 'thin':331 'time':872 'toolkit':6,22 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'transpar':386 'treat':1107 'triangl':235 'true':136,506,509,536,538,926,935,952,955 'two':683 'unreli':290,995 'updat':856 'upload':143,148,187,1012,1026 'use':114,156,166,180,190,206,287,318,342,400,426,647,672,704,712,739,760,797,808,977,1029,1046,1062,1076,1092 'user':142,147,1011,1025 'user-upload':141 'util':8,24,466,967 'valid':510,522,528,531,969,1117 'variat':657 'veloc':724,855 'verbos':537 'version':387 'vertic':622 'vibrant':401 'visual':340 'vx':860 'vy':862,865 'want':154,1044 'wave':690,741 'whether':152,1042 'width':86,232,255,267,283,323,333,479 'wobbl':738 'work':139,177,1034 'workflow':69,1084 'x':663,859 'x1':220,239,259,271 'x2':222,241,261,273 'x3':243 'y':573,665,723,861 'y1':221,240,260,272 'y2':223,242,262,274 'y3':244 'zoom':812,817,819,828","prices":[{"id":"c6de9555-aa14-467d-a21c-e8a002ee6437","listingId":"77c260b3-662c-489f-844d-cb385490d3c5","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:45:08.291Z"}],"sources":[{"listingId":"77c260b3-662c-489f-844d-cb385490d3c5","source":"github","sourceId":"sickn33/antigravity-awesome-skills/slack-gif-creator","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/slack-gif-creator","isPrimary":false,"firstSeenAt":"2026-04-18T21:45:08.291Z","lastSeenAt":"2026-04-22T12:51:47.938Z"}],"details":{"listingId":"77c260b3-662c-489f-844d-cb385490d3c5","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"slack-gif-creator","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34515,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-22T06:40:00Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"2990cfe1009c231993b7bb1f2e17647e436df92b","skill_md_path":"skills/slack-gif-creator/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/slack-gif-creator"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"slack-gif-creator","description":"A toolkit providing utilities and knowledge for creating animated GIFs optimized for Slack."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/slack-gif-creator"},"updatedAt":"2026-04-22T12:51:47.938Z"}}