{"id":13472443,"url":"https://github.com/lettier/gifcurry","last_synced_at":"2025-05-15T10:07:19.974Z","repository":{"id":41443371,"uuid":"49551977","full_name":"lettier/gifcurry","owner":"lettier","description":"😎 The open-source, Haskell-built video editor for GIF makers.","archived":false,"fork":false,"pushed_at":"2021-08-13T16:19:41.000Z","size":86715,"stargazers_count":1387,"open_issues_count":40,"forks_count":56,"subscribers_count":34,"default_branch":"master","last_synced_at":"2025-04-14T16:57:27.683Z","etag":null,"topics":["animated-gifs","appimage","arch-linux","fedora","functional-programming","gif","gif-library","gif-maker","gifmaker","gifs","gstreamer","gtk","gui","haskell","imagemagick","linux","ubuntu","video","video-editing"],"latest_commit_sha":null,"homepage":"https://lettier.github.io/gifcurry","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lettier.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-01-13T05:37:43.000Z","updated_at":"2025-04-13T22:20:17.000Z","dependencies_parsed_at":"2022-09-12T06:10:22.829Z","dependency_job_id":null,"html_url":"https://github.com/lettier/gifcurry","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lettier%2Fgifcurry","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lettier%2Fgifcurry/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lettier%2Fgifcurry/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lettier%2Fgifcurry/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lettier","download_url":"https://codeload.github.com/lettier/gifcurry/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254319720,"owners_count":22051073,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["animated-gifs","appimage","arch-linux","fedora","functional-programming","gif","gif-library","gif-maker","gifmaker","gifs","gstreamer","gtk","gui","haskell","imagemagick","linux","ubuntu","video","video-editing"],"created_at":"2024-07-31T16:00:54.673Z","updated_at":"2025-05-15T10:07:14.938Z","avatar_url":"https://github.com/lettier.png","language":"Haskell","funding_links":[],"categories":["Haskell","Utilities","Applications","Cross-Platform","video","GIF creation","Tools \u0026 Services"],"sub_categories":["Graphics","JavaScript","🎨 Graphics (15)","Individual Episodes"],"readme":"![Gifcurry](https://i.imgur.com/KFZyEqq.png)\n\n# Tell me about Gifcurry. :smiley:\n\nGifcurry is the open-source, Haskell-built video editor for GIF makers.\nLoad a video, make some edits, and save it as a GIF—Gifcurry makes your life easy! :sunglasses:\nMost video formats should work, so go wild.\nAnd since it's made with Haskell, you know it's good. :100:\n\nFor the command line averse, there is a GUI. :computer_mouse:\nDie-hard terminal aficionado? Gifcurry has you covered with its CLI. :desktop_computer:\nAnd for the Haskell programmers out there, there is also a library :books: API.\n\nGifcurry can save your creation as a GIF or as a video. :vhs:\nSo if you hate :angry: GIFs with a passion—no problem!\nJust select \"Save as a Video\" and do your part to rid :wastebasket: the world of GIFs.\n\nEnjoy memes? :trollface: Great! Gifcurry can add text all over your GIF.\nYou can change the font, size, color, position, outline, rotation, and the timing.\nCreate the next viral meme with Gifcurry.\n\nDid you know Gifcurry slices...and dices? :fork_and_knife:\nYou can crop :scissors: from the left, the right, the top, and/or the bottom.\nWith Gifcurry, you can slice up some tasty GIFs.\n\nIs Gifcurry another Electron app? No way! Gifcurry is 100% #ElectronFree.\nNo need to download more RAM :ram:, Gifcurry is light as a feather.\nRun :running: it all day, run it all year—you'll never notice.\n\n\"So...Gifcurry is just FFmpeg and ImageMagick?\"—nope.\nGifcurry hides all the goofy details so you can concentrate on what matters—the almighty :raised_hands: GIF.\n\nBecome a GIF master :muscle: with Gifcurry!\n\n## What do I need Gifcurry for? :thinking:\n\n:ballot_box_with_check: Want to show off that new UI feature in a pull request? Gifcurry.  \n:ballot_box_with_check: Your template doesn't allow video in the hero image? Gifcurry.  \n:ballot_box_with_check: No GIF of your favorite movie scene? Gifcurry.  \n:ballot_box_with_check: Need a custom animated emoji for Slack? Gifcurry.  \n:ballot_box_with_check: Can't find the perfect GIF for that reply-all email? Gifcurry.  \n:ballot_box_with_check: Your README needs a GIF? Gifcurry.  \n:ballot_box_with_check: That presentation slide could use some animation? Gifcurry.  \n:ballot_box_with_check: Video doesn't auto play on iOS? Gifcurry.  \n:ballot_box_with_check: Time to promote your indie game? Gifcurry.  \n:ballot_box_with_check: Need to add subtitles to a video? Gifcurry.  \n\nGifcurry comes in handy :wrench: for all sorts of scenarios.\n\n## What does the GUI look :eyes: like?\n\n![Gifcurry GUI](https://i.imgur.com/SJ8zovM.gif)\n\n## How do I use the command line interface (CLI)? :desktop_computer:\n\n```text\ngifcurry_cli [OPTIONS]\n\nFILE IO:\n  -i --input-file=FILE   The input video file path.\n  -o --output-file=FILE  The output GIF file path.\n  -m --save-as-video     If present, saves the GIF as a video.\nTIME:\n  -s --start-time=NUM    The start time (in seconds) for the first frame.\n  -e --end-time=NUM      The end time (in seconds) for the last frame.\nOUTPUT FILE SIZE:\n  -w --width=INT         How wide the output needs to be. Height will scale\n                         to match.\n  -f --fps=INT           How many frames per second the output should have.\n  -c --color-count=INT   How many colors are used in the output.\n  -d --dither            If present, uses dither.\nCROP:\n  -L --left-crop=NUM     The amount you wish to crop from the left.\n  -R --right-crop=NUM    The amount you wish to crop from the right.\n  -T --top-crop=NUM      The amount you wish to crop from the top.\n  -B --bottom-crop=NUM   The amount you wish to crop from the bottom.\nTEXT:\n  -t --text-file=FILE    Either a text overlays YAML or SRT subtitles file\n                         path.\n  -? --help              Display help message\n  -V --version           Print version information\n\nVisit https://github.com/lettier/gifcurry for more information.\n```\n\n## Got a CLI example?\n\n```text\ngifcurry_cli \\\n  -i ~/Videos/video.webm \\\n  -o ~/tmp/test \\\n  -s 150 \\\n  -e 151 \\\n  -t ~/tmp/text-overlays.yaml \\\n  -w 800 \\\n  -f 15 \\\n  -c 100 \\\n  -d\n  -L 0.1 \\\n  -R 0.1 \\\n  -T 0.1 \\\n  -B 0.1 \\\n  -m\n\n         ▄▄▄▄▄▄▄▄                                                                             \n     ▄▄████    ▀▀███▄                                                                         \n      ████▀   ▄    ▀███           ▄     ▐██▌   ▄███▄                                          \n  ▄   ▐███   ████   ▀███      ▄███▀▀██        ███                                             \n ▐█▌   ██   ▐███     ████    ███        ▐██  █████▌ ▄█████ ▐██▌  ██▌  ██▄██▌ ██▄██▌ ██▌   ███ \n ███   ▐▌   ███      ▐███▌   ███  ████▌ ▐██   ██▌  ███     ▐██▌  ██▌  ███▀   ███▀   ▐██  ███  \n ████      ███▀  ▐█   ███▌   ███    ██▌ ▐██   ██▌  ███     ▐██▌  ██▌  ██▌    ██▌     ██▌▐██   \n ▐███▄    ▐██▌   ██    ██     ███▄▄▄██▌ ▐██   ██▌   ███▄▄█  ███▄███▌  ██▌    ██▌      ████▌   \n  ▀███   ▀███   ▐███   ▀        ▀▀▀▀▀    ▀▀   ▀▀      ▀▀▀     ▀▀▀     ▀▀     ▀▀        ███    \n    ███▄   ▀    ████▌                                                                ███▀     \n      ▀███▄▄   █████▀                                                                         \n          ▀▀▀▀▀▀▀                                                                             \n\n\nGifcurry 6.0.1.0\n(C) 2016 David Lettier\nlettier.com\n\n[INFO] Here are your settings.\n\n  - FILE IO:\n    - Input File:    /home/Videos/video.webm\n    - Output File:   /home/tmp/test.webm\n    - Save As Video: Yes\n  - TIME:\n    - Start Second: 150.000\n    - End   Second: 151.000\n  - OUTPUT FILE SIZE:\n    - Width:       800px\n    - FPS:         15\n    - Color Count: 100\n    - Dither:      True\n  - TEXT:\n    - Text: This is a test.\n      - Font:\n        - Family:  Sans\n        - Size:    30\n        - Style:   Normal\n        - Stretch: Normal\n        - Weight:  800\n      - Time:\n        - Start Second: 150.000\n        - End   Second: 151.000\n      - Translation:\n        - Origin: NorthWest\n        - X:      0.0\n        - Y:      0.0\n      - Rotation:\n        - Degrees: 0\n      - Outline:\n        - Size: 10\n        - Color: rgb(1,100,10)\n      - Fill:\n        - Color: rgb(255,255,0)\n  - CROP:\n    - Left:   0.100\n    - Right:  0.100\n    - Top:    0.100\n    - Bottom: 0.100\n\n[INFO] Writing the temporary frames to: /home/.cache/gifcurry/gifcurry-frames30450\n[INFO] Adding text.\n[INFO] Converting the frames to the specified color count.\n[INFO] Saving your video to: /home/tmp/test.webm\n[INFO] All done.\n```\n\n## What is the format for the text overlays YAML file? :1234:\n\nHere's an example file:\n\n```yaml\n- text: This is an example.\n  fontFamily:   Sans\n  fontStyle:    Oblique\n  fontStretch:  Normal\n  fontWeight:   30\n  fontSize:     800\n  origin:       NorthWest\n  xTranslation: 0.0\n  yTranslation: 0.0\n  rotation:     20\n  startTime:    5.000\n  endTime:      8.000\n  outlineSize:  7\n  outlineColor: rgba(1,100,10,1.0)\n  fillColor:    rgba(255,255,0,0.0)\n- text: This is another example.\n  fontFamily:   Serif\n  fontStyle:    Italic\n  fontStretch:  Condensed\n  fontWeight:   30\n  fontSize:     800\n  origin:       Center\n  xTranslation: 10.0\n  yTranslation: 11.0\n  rotation:     20\n  startTime:    5.000\n  endTime:      8.000\n  outlineSize:  7\n  outlineColor: rgb(1,11,100)\n  fillColor:    rgba(255,0,0,0.0)\n```\n\n`fontStyle` can be:\n\n- `Any`\n- `Italic`\n- `Normal`\n- `Oblique`\n\n`fontStretch` can be:\n\n- `Any`\n- `Condensed`\n- `Expanded`\n- `ExtraCondensed`\n- `ExtraExpanded`\n- `Normal`\n- `SemiCondensed`\n- `SemiExpanded`\n- `UltraCondensed`\n- `UltraExpanded`\n\n`origin` can be:\n\n- `North`\n- `NorthEast`\n- `East`\n- `SouthEast`\n- `South`\n- `SouthWest`\n- `West`\n- `NorthWest`\n\n`outlineSize` ranges from `0` to `10`.\n\n`outlineColor` and `fillColor` can either be `rgba(red,green,blue,alpha)` or `rgb(red,green,blue)`\nwhere `red`, `green`, and `blue` range from `0` to `255` and `alpha` ranges from `0.0` to `1.0`.\n\n## How do I get a copy of Gifcurry? :floppy_disk:\n\nGifcurry works on Linux, Mac, and most likely Windows.\nMake sure you have FFmpeg, GStreamer, ImageMagick, and GTK+ installed on your machine.\nTo find the latest version of Gifcurry, head over to the\n[releases page](https://github.com/lettier/gifcurry/releases).\n\n### I use Linux. :penguin:\n\nIf you use Linux then the easiest way to grab a copy of Gifcurry is by downloading the\n[AppImage](https://github.com/lettier/gifcurry/releases/download/6.0.1.0/gifcurry-6.0.1.0-x86_64.AppImage).\nAfter you download the\n[AppImage](https://github.com/lettier/gifcurry/releases/download/6.0.1.0/gifcurry-6.0.1.0-x86_64.AppImage),\nright click on it, select permissions, and check the box near execute.\nWith that out of the way—you're all set—just double click on the AppImage\nand the GUI will fire right up.\n\nYou can also download and install the\n[AppImage](https://github.com/lettier/gifcurry/releases/download/6.0.1.0/gifcurry-6.0.1.0-x86_64.AppImage)\nusing the handy\n[AppImage install script](https://raw.githubusercontent.com/lettier/gifcurry/master/packaging/linux/app-image/gifcurry-app-image-install.sh)\n(right click and save link as).\nDownload the script, right click on it, select permissions, check the box near execute, and double click on it.\nYou should now see Gifcurry listed alongside your other installed programs.\n\nIf you want the CLI then download the\n[prebuilt version](https://github.com/lettier/gifcurry/releases/download/6.0.1.0/gifcurry-linux-6.0.1.0.tar.gz)\nfor Linux, extract it, open up your terminal,\n`cd` to the bin folder, and then run `gifcurry_cli -?`.\nAs an added bonus, inside the bin directory is the GUI version\ntoo so now you have both.\n\n#### I use Arch/Manjaro/Antergos/pacman. :ghost:\n\nIf you'd rather install Gifcurry via pacman then copy the following into your terminal.\n\n```bash\ncd\nsudo pacman -S git ffmpeg imagemagick gstreamer gst-plugins-base-libs gst-plugins-base gst-plugins-good gst-plugins-bad gst-libav\ncd \"$HOME/Downloads\"\ngit clone https://aur.archlinux.org/gifcurry.git\ncd gifcurry\nmakepkg -sic\ncd \"$HOME/Downloads\"\nrm -rf gifcurry\ncd\ngifcurry_cli -?\ngifcurry_gui\n```\n\n#### I use Ubuntu/Mint/Debian/Deepin/snap. :cyclone:\n\nGifcurry is available as a snap from [Snapcraft](https://snapcraft.io/).\nIf you don't already have `snap`, go ahead and install it using the command `sudo apt install snapd`.\n\nYou can install the\n[Gifcurry snap](https://snapcraft.io/gifcurry)\nright from your browser or via the command line.\nFor the command line route, paste the following into your terminal.\n\n```bash\nsnap install gifcurry\nsudo snap connect gifcurry:removable-media\ngifcurry\n```\n\nThe\n[Gifcurry snap](https://snapcraft.io/gifcurry)\nonly comes with the GUI.\nIf you want the CLI, download the\n[prebuilt version](https://github.com/lettier/gifcurry/releases/download/6.0.1.0/gifcurry-linux-6.0.1.0.tar.gz)\nfor Linux.\n\n### I use Mac. :apple:\n\nMac users can download the\n[Mac install script](https://raw.githubusercontent.com/lettier/gifcurry/master/packaging/mac/gifcurry-mac-install-script.command)\nby holding down control, clicking the link, selecting \"Save Link As...\", selecting where Downloads, and clicking save.\nTo run the script, hold down the command key and press the space bar.\nNow type terminal and hit enter. After the terminal comes up, copy and paste the following.\n\n```bash\ncd ~/Downloads\nchmod +x gifcurry-mac-install-script.command\n./gifcurry-mac-install-script.command\n```\n\nAfter running the install script, a shortcut to both the Gifcurry GUI and CLI will be on your desktop.\n\n### I'm a Haskell developer. :hammer:\n\nIf you develop Haskell programs then the easiest way to build Gifcurry is with\n[Haskell Stack](https://docs.haskellstack.org/en/stable/README/).\nCopy the following into your terminal.\n\n```bash\ngit clone https://github.com/lettier/gifcurry.git\ncd gifcurry\nstack setup\nstack install alex happy\nstack install gtk2hs-buildtools\nstack install hsc2hs\nstack install\n$HOME/.local/bin/gifcurry_cli -?\n$HOME/.local/bin/gifcurry_gui\n```\n\n## What dependencies does Gifcurry use? :thinking:\n\n### To run Gifcurry. :running:\n\n* [GTK+ \u003e= 3.10](http://www.gtk.org/download/index.php)\n* [FFmpeg \u003e= 2.8.15](https://www.ffmpeg.org/download.html)\n* [GStreamer \u003e= 1.0](https://gstreamer.freedesktop.org/download/)\n    * [GStreamer Plugins](https://gstreamer.freedesktop.org/modules/)\n* [ImageMagick \u003e= 6](http://www.imagemagick.org/script/download.php)\n\n### To build Gifcurry. :construction_worker:\n\n* [GObject Introspection](https://wiki.gnome.org/action/show/Projects/GObjectIntrospection)\n* [Haskell Stack](https://docs.haskellstack.org/en/stable/README/)\n\n## What is the license? :scroll:\n\nFor license information, see [LICENSE](LICENSE).\n\n## Who wrote Gifcurry? :copyright:\n\n(C) 2016 David Lettier  \n[lettier.com](http://www.lettier.com/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flettier%2Fgifcurry","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flettier%2Fgifcurry","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flettier%2Fgifcurry/lists"}