NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #3428 most downloaded on PyPI
A library for rendering project templates.
Last release 27 days ago
07 Sep 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
8 years old
95 releases · first in 2019
allow overwriting destination symlinks when preserve_symlinks: false
preserve_symlinks: falseprevent trust bypass via ambiguous URL characters
To prevent URL confusion attacks, trusted prefix matching is now restricted to repository URL paths containing only RFC 3986 §2.3 "unreserved" characters (letters, digits, -, ., _, ~) and /. URL paths containing other characters now require an exact, verbatim match.
disambiguate Windows paths from SCP URLs in trust check
One column per quarter.
exclude : add support for multiple exclude patterns in a single entry
disallow Jinja {% include %} of symlinks resolving outside template root
{% include %} of symlinks resolving outside template root!include paths outside the template rootprevent code execution via Jinja finalizer by disallowing YAML tags
add --ask flag to force prompting of selected questions
--ask flag to force prompting of selected questions (#2705)cache remote git templates as local mirrors with worktrees
deprecate locating {{ _copier_conf.answers_file }}.jinja file in non-root directory
.rej files when converting to inline conflict
markers (#2668){{ _copier_conf.answers_file }}.jinja file in non-root directoryenrich invalid choice error message with variable name and valid choices
copier copy when git is not availableadd support for enabling StrictUndefined in Jinja environment
StrictUndefined in Jinja environment (#2587)git clone is interruptedvcs: fix Git tag lookup for template SSH URLs without ssh:// scheme
ssh:// schemevcs: fix Git tag lookup for relative local template paths
is_git_repo_root (#2586)make YieldExtension self-contained
YieldExtension self-contained--trust for _external_data paths outside subproject root_subdirectory path outside template rootcli: add --answers-file flag to check-update command
--answers-file flag to check-update commandHEADcheck-update command help outputvcs: make Git version parsing robust to vendor-suffixed patch versions
add CLI subcommand check-update to check for new template version
check-update to check for new template version (#2463)run_* functions instead of internal Worker.run_* methodsdeprecate public settings module and its symbols
Phase enum at package levelsettings module and its symbols**kwargs with explicit parameters in run_{copy,recopy,update} functionsavoid pattern deprecation warning for pathspec v1.0.0+
pathspec v1.0.0+updating: restore support for preserved symlinks pointing outside subproject
updating: avoid circular reference when rendering JSON-serialized _copier_conf variable
_copier_conf
variableupdating: allow updating a dirty Git repository when the subproject directory is clean
chmod is not allowedupdating: render templated skip-if-exists patterns before applying patch with excluded paths
_exclude list in new template version when
updatingdeps: remove prompt-toolkit version cap
deps: cap prompt-toolkit to <3.0.52
add support for nested multi-document includes in copier.yml
copier.yml (#2251)disallow render paths outside destination directory
pathlib.PurePathadd support for prompting filesystem paths
core.fsmonitor=true (#2151)add support for providing serialized answers to multiselect choice questions
:current: for referring to the current template
ref_copier_conf.answers_file via Jinja
context hookimport from module _tools instead of tools
_tools instead of toolsre-expose API with deprecation warnings on non-public API imports
TaskError exception on task errorsInteractiveSessionError when prompting in non-interactive environment<CONFIG_ROOT>/copier as settings directory on Windows (#2071)when: false questions_ prefixcontext: expose a _copier_phase context variable
_copier_operation variable (#1733)_copier_phase context variable--data-file$file if $file.tmpl exists when subdirectory is usedexternal_data: load data from other YAML files
defaults values (fix #235).gitignore file
(#1886)restore support for preserve_symlinks: false for directories
preserve_symlinks: false for directories (#1820)exclude: support negative exclude matching child of excluded parent
--skip-answered is usedkeep_trailing_newline more idiomaticallypass --skip-tasks flag to worker
--skip-tasks flag to worker (#1688)add simpler migrations configuration syntax
default list items for multi-select choice questionstasks: add support for skipping tasks
copier.ymlpyyaml-include dependency and reimplement relevant featuresPERF lint rules fixes (#1556)don't fail in systems with windows 1252 encoding (probably)
address deprecation warning in shutil.rmtree(onerror=...)
multiselect: true.shutil.rmtree(onerror=...) (#1401)don't produce output when imported with $FORCE_COLOR=1 env
$FORCE_COLOR=1 envadd -A as an alias for --skip-answered, and support it in recopy too
-A as an alias for --skip-answered, and support it in recopy too--skip-answered flag to avoid repeating recorded answersadd support for pre-update and post-update messages
add support for computed values via skipped questions
--trust as a less scary alternative to --UNSAFE (#1179)Deprecated copier.copy function is removed. Use copier.run_copy, copier.run_update or copier.run_recopy explicitly as needed.
git mergetool or git difftool after updating.--overwrite/-w disappeared from copier update. It is now implicit.overwrite=True is now required.inline instead of rej.copier must become now copier update; also copier ./tpl ./dst must become copier copy ./tpl ./dst.copier -r HEAD update ./dst must now become copier update -r HEAD ./dst or copier update ./dst -r HEAD.copier.copy function is removed. Use copier.run_copy, copier.run_update or copier.run_recopy explicitly as needed.--UNSAFE switch (#1171)recopy command and functionfix using a branch name as VCS ref
support preserving symlinks when copying templates
_answers_file setting (#1027)_copier_conf.sep to allow generating
dynamic directory structures!include constructor globally (#947)--conflict flag only in copier update subcommandMapping instead of ChainMap typeexperimental inline conflict markers when updating
remove deprecated code scheduled for removal in Copier v7
add validator field to Question
support getting template commit hash with {{ _copier_conf.vcs_ref_hash }}
{{ _copier_conf.vcs_ref_hash }}Deprecated now and make_secret functions. If your template used those, Copier will emit warnings leading you on how to upgrade it.
All changes here. Summary:
--defaults flag to use default answers to questions, which might be null if
not specified.--overwrite flag to overwrite files that already exist, without asking.$VERSION_PEP440_FROM,
$VERSION_PEP440_CURRENT and $VERSION_PEP440_TO, which will always get a valid
PEP440 version identifier, without the v prefix, allowing your migration scripts
to have a valid standard where to base their logic.user_defaults, which take precedence over template defaults._copier_python to provide python sys.executable.copier copy on a preexisting project now recopies the project instead of
updating it. That means that it respects old answers, but ignores history diff.{{ }} instead of [[ ]] and similar.type: yaml to make it behave mostly as before. Or just don't use that, it's
complicated anyway (warn added to docs).--force to be the same as --defaults --overwrite.git clone --filter=blob:none when cloning, to be faster.now and make_secret functions. If your template used those, Copier
will emit warnings leading you on how to upgrade it._min_copier_version below 6 will still default to use
bracket-based Jinja defaults, but that will disappear soon. If you want your
template to work on Copier 5 and 6, make sure to declare _envops explicitly in
your copier.yaml.copier.copy() is confusing, now that actually copying and updating are 2
completely different actions (before, you were actually always updating if
possible). Its direct equivalent is now copier.run_auto(), and copier.copy()
will disappear in the future.json method on _copier_conf. Where you would previously use
_copier_conf.json() in your templates, please now use _copier_conf|to_json
instead.--subdirectory flag, which was confusing... and probably useless.Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →