Juha-Matti Santala
Community Builder. Dreamer. Adventurer.

File organisation in Eleventy: Filters

Filters are a handy feature in Eleventy that allows you to run functions on input from templates.

A filter is a function which can be used within templating syntax to transform data into a more presentable format. Filters are typically designed to be chained, so that the value returned from one filter is piped into the next filter.

They are used with a pipe character (|) from templates like in the documentation example:

 <h1>{{ name | makeUppercase }}</h1>

Here, name is a variable that contains some value and makeUppercase is a filter it is passed to.

To create a filter, you call addFilter method in your configuration:

export default function(eleventyConfig) {
	eleventyConfig.addFilter("makeUppercase", function(value) {
		return value.toUpperCase()
	}); 
});

When you have one or two filters, they live comfortably in the main function but due to their usefulness, I tend to accumulate a large collection over time. They are handy small utility functions so it’s easy to create one for any use case.

Here’s how I organise my filters:

I have a _11ty/ folder for all sorts of scripts that I use to run my Eleventy project. There, I create a filters.js file that contains all my filters and export them.

Here’s an example of a small project I started recently

function ongoing(isOngoing) {
  return isOngoing ? "ongoing" : "finished";
}

function finishedSeries(series) {
  return series.filter((serie) => !serie.ongoing).length || 0;
}

export default { ongoing, finishedSeries };

The function name matches the filter name exactly here so that I can in my config file then do this

import filters from './11ty/filters.js'

export default function(eleventyConfig) {
	Object.entries(filters).forEach(([name, callback]) => {
    eleventyConfig.addFilter(name, callback);
  });
});

This will go through all the filters and register them with the function name as filter name and the function callback as the function.

I don’t have to remember the syntax of addFilter anymore and I can keep all of my filters in one place. That’s handy when I need to debug a misbehaving filter or add a new filter. Everything is tidily in one place.


If something above resonated with you, let's start a discussion about it! Email me at juhamattisantala at gmail dot com and share your thoughts. In 2025, I want to have more deeper discussions with people from around the world and I'd love if you'd be part of that.