NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #3553 most downloaded on crates.io
Extra utilities for MiniJinja
Last release today
08 Oct 2026
Ships fairly regularly
a new release about every 3 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
70 releases · first in 2023
One column per quarter.
Fixed a bug that caused {% raw %} blocks to accidentally not skip the surrounding tags, causing {% raw %} and {% endraw %} to show up in output.
{% raw %} blocks to accidentally not skip the
surrounding tags, causing {% raw %} and {% endraw %} to show up in
output. (#307)Support unicode sorting for filters when the unicode feature is enabled. This also fixes confusing behavior when mixed types were sorted.
Support unicode sorting for filters when the unicode feature is enabled.
This also fixes confusing behavior when mixed types were sorted. (#299)
Added json5 as file extension for JSON formatter.
The autoreload crate now supports fast reloading by just clearing the
already templates. This is enabled via set_fast_reload on the
Notifier.
Note: This also includes all the changes in the different 1.0.0 alphas.
1.0 includes a lot of changes that are breaking. However they should with some minor exceptions be rather trivial changes.
Environment::source, Environment::set_source and the Source type
together with the source feature were removed. The replacement is the
new loader feature which adds the add_template_owned and set_loader
APIs. The functionality previously provided by Source::from_path is
now available via path_loader.
Old:
let mut source = Source::with_loader(|name| ...);
source.add_template("foo", "...").unwrap();
let mut env = Environment::new();
env.set_source(source);
New:
let mut env = Environment::new();
env.set_loader(|name| ...);
env.add_template_owned("foo", "...").unwrap();
Old:
let mut env = Environment::new();
env.set_source(Source::from_path("templates"));
New:
let mut env = Environment::new();
env.set_loader(path_loader("templates"));
Template::render_block and Template::render_block_to_write were
replaced with APIs of the same name on the State returned by
Template::eval_to_state or Template::render_and_return_state:
Old:
let rv = tmpl.render_block("name", ctx)?;
New:
let rv = tmpl.eval_to_state(ctx)?.render_block("name")?;
Kwargs::from_args was removed as API as it's no longer necessary since
the from_args function now provides the same functionality:
Before:
// just split
let (args, kwargs) = Kwargs::from_args(values);
// split and parse
let (args, kwargs) = Kwargs::from_args(values);
let (a, b): (i32, i32) = from_args(args)?;
After:
// just split
let (args, kwargs): (&[Value], Kwargs) = from_args(values)?;
// split and parse
let (a, b, kwargs): (i32, i32, Kwargs) = from_args(values)?;
The testutils feature and testutils module were removed. Instead you
can now directly create an empty State and use the methods provided
to invoke filters.
Before:
let env = Environment::new();
let rv = apply_filter(&env, "upper", &["hello world".into()]).unwrap();
After:
let env = Environment::new();
let rv = env.empty_state().apply_filter("upper", &["hello world".into()]).unwrap();
Before:
let env = Environment::new();
let rv = perform_test(&env, "even", &[42.into()]).unwrap();
After:
let env = Environment::new();
let rv = env.empty_state().perform_test("even", &[42.into()]).unwrap();
Before:
let env = Environment::new();
let rv = format(&env, 42.into()).unwrap();
After:
let env = Environment::new();
let rv = env.empty_state().format(42.into()).unwrap();
intern and some APIs that use Arc<String> now use Arc<str>. This
means that for instance StructObject::fields returns Arc<str> instead
of Arc<String>. All the type conversions that previously accepted
Arc<String> now only support Arc<str>.
State::current_call was removed without replacement. This information
was unreliably maintained in the engine and caused issues with recursive
calls. If you have a need for this API please reach out on the issue
tracker.
Output::is_discarding was removed without replacement. This is
an implementation detail and was unintentionally exposed. You should not
write code that depends on the internal state of the Output.
Value now implements Ord. This also improves the ability of the engine to sort more complex values in filters.
Value now implements Ord. This also improves the ability of the engine
to sort more complex values in filters. (#295)
Arc<String> was replaced with Arc<str> in some of the public APIs where
this shined through. Support for more complex key types in maps was added.
You can now have tuple keys for instance. (#297)
Removed char as a value type. Characters are now represented as strings instead. This solves a bunch of Jinja2 incompatibilities that resulted by inde
Removed char as a value type. Characters are now represented as strings
instead. This solves a bunch of Jinja2 incompatibilities that resulted by
indexing into strings. (#292)
Marked ErrorKind as #[non_exhaustive].
Correctly handle coercing of characters and strings. "w" == "w"[0] is
now evaluating to true as one would expect.
The include block now supports with context and without context modifiers but they are ignored. This is mostly helpful to render some Jinja2 templates
The include block now supports with context and without context
modifiers but they are ignored. This is mostly helpful to render some
Jinja2 templates that depend on this functionality. (#288)
Added tests true, false, filter, test and filters
pprint and unique. (#287)
Added support for indexing into strings. (#149)
Added Error::detail which returns the detail help string. (#289)
Added Error::template_source and Error::range to better support
rendering of errors outside of the built-in debug printing. (#286)
Removed testutils feature. New replacement APIs are directly available on the State.
Removed testutils feature. New replacement APIs are directly available
on the State.
Added Template::render_and_return_state to render a template and return the
resulting State to permit introspection. Template::render_to_write now
also returns the State.
Added State::fuel_levels to introspect fuel consumption when the fuel feature
is in use.
Removed Source and the source feature. The replacement is the new loader
feature and the functionality of the source is moved directly into the
Environment. This also adds Environment::clear_templates to unload
all already loaded templates. (#275)
Added Environment::template_from_str and Environment::template_from_named_str
to compile templates for temporary use. (#274)
Removed Kwargs::from_args as this can now be expressed with just
from_args. (#273)
Output no longer reveals if it's discarding in the public API.
Added Value::call, Value::call_method and Template::new_state. The
combination of these APIs makes it possible to call values which was
previously not possible. (#272)
Added Template::eval_to_state. This replaces the functionality of the
previous Template::render_block which is now available via State.
It also adds support for accessing globals and macros from a template
via the State. (#271)
Removed support for State::current_call. This property wasn't too useful
and unreliable. Supporting it properly for nested invocations would require
calls to take a mutable state or use interior mutability which did not seem
reasonable for this. (#269)
Updated self_cell and percent-encoding dependencies.
Updated self_cell and percent-encoding dependencies. (#264)
Added Template::render_block and Template::render_block_to_write which
allows rendering a single block in isolation. (#262)
Hide accidentally exposed Syntax::compile method.
Syntax::compile method.undeclared_variables methods to Template and Expression. (#250)Fixed an issue with autoreload not working properly on windows.
TryFrom for Value now converts integers to f32 and f64.
Value::is_number. (#240)TryFrom for Value now converts integers to f32 and f64.custom_syntax feature which allows custom delimiters
to be configured. (#245)Kwargs abstraction to easier handle keyword arguments.Option<T> was incorrectly picking up none
for undefined values.sort filter now accepts reverse, attribute and case_sensitive
by keyword argument and sorts case insensitive by default.dictsort filter now supports reversing, by value sorting,
and is sorting case insensitive by default.Your coding agent can read these notes before it upgrades. Set up the MCP server →