codewithkyle / jitter
A just in time image transformation service.
Installs: 445
Dependents: 0
Suggesters: 0
Security: 0
Stars: 8
Watchers: 2
Forks: 1
Open Issues: 0
Type:craft-plugin
Requires
- php: ^8.0
- aws/aws-sdk-php: ^3.0.0
- codewithkyle/jitter-core: ^2.0.0
- craftcms/cms: ^4.0|^5.0
README
Jitter is a just in time image transformation plugin for Craft CMS. The API is based on Imgix. This plugin was created to be a simple and free alternative to an Imgix style service. It does not and will not have all the bells and whistles that other paid services/plugins offer. If you need something a bit more advanced besides basic image transformations I suggest you pay for Imgix or select a different Craft Plugin.
Requirements
This plugin requires ImageMagick and the following versions of PHP and Craft CMS:
- Craft CMS 5 with PHP 8 (Jitter v2.0, active)
- Craft CMS 4 with PHP 8 (Jitter v2.0, maintenance)
- Craft CMS 3 with PHP 7.2+ (Jitter v1.x, unsupported)
Installation
To install the plugin, follow these instructions.
-
Open your terminal and go to your Craft project:
cd /path/to/project
-
Then tell Composer to load the plugin:
composer require codewithkyle/jitter
-
In the Control Panel, go to Settings → Plugins and click the “Install” button for Jitter.
Configuring Jitter
Jitter can be configured to use S3-compatible object storage solutions by adding a jitter.php
file to your projects config/
directory. Transformed images will be stored in the storage solution but will still be served from your web server. If you would like to serve images from a CDN read the section below.
<?php return [ "accessKey" => getenv("PUBLIC_KEY"), "secretAccessKey" => getenv("PRIVATE_KEY"), "region" => "region-name", "bucket" => "bucket-name", "folder" => "transformed-images", "endpoint" => getenv("ENDPOINT_URL"), "acl" => "private", // supports "private" or "public-read" ];
Note: the
endpoint
andacl
config values are optional. You will only need to useendpoint
when using an S3-compatible alternative S3 cloud object storage solution (like Digital Ocean Spaces).
Using a Content Delivery Network (CDN)
Jitter can be configured to use CDN URLs. The cdn
config value should be the CDN's origin URL. Jitter's url()
and srcset()
functions will automatically switch from using the /jitter/
URL to the CDN URL over time as the image transformations are performed.
<?php return [ "accessKey" => getenv("PUBLIC_KEY"), "secretAccessKey" => getenv("PRIVATE_KEY"), "region" => "region-name", "bucket" => "bucket-name", "folder" => "transformed-images", "endpoint" => getenv("ENDPOINT_URL"), "acl" => "public-read", "cdn" => "https://demo.cdn.example.com/" ];
Note: if you use Craft's template caching or a 3rd party HTML caching service (like Cloudflare's Edge Cache)
/jitter/
image URLs may be cached when a CDN URL is available. We do not recommend disabling your caching systems, however, you may want to consider using a lower TTL to ensure the CDN URLs propagate sooner rather than later.
Using Jitter
Image transformations via the API:
/jitter/v1/transform?id=1&w=768&ar=16:9
Image transformations via Twig:
{# This will transform the image when the template renders. #} {# This can cause site-wide performance issues depending on how many times this method is used (per template) and how much RAM is available. #} {% set transformedImageUrl = craft.jitter.transformImage(entry.image[0], { w: 150, ar: "1:1", m: "fit", fm: "gif", q: 10 }) %} {# For a faster template render build the API URL instead #} {# If you have configured Jitter to use CDN URLs this value will swap to the CDN URL after the image has been transformed #} {% set transformedImageUrl = craft.jitter.url(entry.image[0], { w: 150, ar: "1:1", m: "fit", fm: "gif", q: 10 }) %} <img src="{{ transformedImageUrl }}" srcset="{{ craft.jitter.srcset(entry.image[0], [ { w: 300, h: 250, }, { w: 768, ar: "16:9", }, { w: 1024, ar: "16:9", }, ]) }}" loading="lazy" width="1024" />
Image transformations via PHP:
$jitter = new \codewithkyle\jitter\services\Transform(); $src = $jitter->generateURL([ "id" => $image->id, "w" => 300, "ar" => "1:1", ]); $srcset = $jitter->generateSourceSet($image, [ [ "w" => 300, "h" => 250, ], [ "w" => 768, "ar" => "16:9", ], [ "w" => 1024, "ar" => "16:9", ], ]);
Transformation parameters
The auto
format type will return a webp
image when the server can generate the format and the client's browser supports the format.