Fish function for WebP

A Fish function to convert images to WebP

(Last update: 21 August 2023)
Time 2 minute read
Logo of the WebP image format
Logo of the WebP image format

When creating this blog I like to convert my images to WebP, as they save a lot of space at little to no quality loss. For example, the cover image of this post is 87 KB in PNG format, but only 27 KB in WebP format. That’s a 69% reduction. Nice.

I use the cwebp command line tool to convert my images, but there’s something I really don’t like about it. It always requires you to explicitly specify the output file name. This makes it so you can’t just do something like cwebp *.png, as it will just dump the output to stdout. Not very helpful.

As I’m using the fish shell I decided to write a function to make this a little easier:

function convert-to-webp --description='Convert given files to webp format'
  for filename in $argv
    set -l output_filename (path change-extension .webp $filename)
    cwebp -m 6 -q 70 -mt -af -progress $filename -o $output_filename
  end
end

Just chuck it into ~/.config/fish/functions/convert-to-webp.fish1 and you can immediately use convert-to-webp *.png because of fish ’s function autoloading.

I’m especially fond of path change-extension .webp $filename. It’s a very readable way to change the extension of a filename. The surrounding parentheses (used for command substitution in fish) are not required, but do improve readability.

I’ll leave implementing this in bash/zsh as an exercise to the reader.

Note: It turns out this is not needed for this project, as my current Hugo setup automatically converts images to WebP.


  1. The file name doesn’t matter here, as the function name determines how you call it, but it’s good practice to give them the same name. ↩︎


Pricetags Tags: FishShell ScriptingWebP
Folder Open Categories: ShowCase