# Changelog

<!-- Entries are one line per item and section headings repeat for every release,
     so the line-length and duplicate-heading rules don't fit this file. -->
<!-- markdownlint-disable MD013 MD024 -->

## 3.3.0 (2026-07-27)

### New features

- [#1867](https://github.com/bbatsov/projectile/issues/1867): Add `projectile-per-command-compilation-buffer`, so compiling, testing and running a project no longer overwrite each other's output (`*compilation*<test>`).
- [#2121](https://github.com/bbatsov/projectile/pull/2121): Recognize the subprojects of a monorepo: `projectile-find-file-in-subproject` (`s-p c m f`) scopes file completion to one part of the repository, `projectile-project-subprojects` lists them, and the subproject lifecycle commands now work in any project rather than only where the module's manifest matches the project's own type (`projectile-subproject-markers`).
- [#2120](https://github.com/bbatsov/projectile/pull/2120): `projectile-run-task` now also offers the tasks a project's own tooling defines - npm scripts, Deno tasks, Composer scripts, just recipes, go-task tasks and Make targets - named after the tool that defines them (`npm:build`) and switched off with `projectile-discover-tasks`.
- [#2119](https://github.com/bbatsov/projectile/pull/2119): Add 34 project types that used to come out as generic projects: `node` (a `package.json` with no lock file), `bun`, `deno`, `nx`, `turborepo`, `python-uv`, `python-pdm`, `php-composer`, `php-laravel`, `xcode`, `flutter`, `terraform`, `pulumi`, `helm`, `ansible`, `docker-compose`, `just`, `mise`, `buck2`, `pants`, `gleam`, `babashka`, `scala-cli`, `dub`, `fpm`, `alire`, `foundry`, `godot`, `platformio`, `hugo`, `jekyll`, `zola`, `mkdocs` and `quarto`.
- [#2119](https://github.com/bbatsov/projectile/pull/2119): A project type marker can now be an `(:any "file1" "file2")` clause, so a build file with several spellings no longer needs a predicate function.
- [#2115](https://github.com/bbatsov/projectile/pull/2115): Add `projectile-replace-undo` (`s-p u`), which reverts the last replace applied from the reviewable replace buffer, leaving alone any file whose replaced text has changed since.
- [#2114](https://github.com/bbatsov/projectile/pull/2114): Add project-scoped bookmarks - `projectile-bookmark-set` (`s-p B s`), `projectile-bookmark-jump` (`s-p B j`) and `projectile-bookmark-delete` (`s-p B d`) - which are plain Emacs bookmarks with the completion scoped to the current project (see `projectile-bookmark-scope`).
- [#2113](https://github.com/bbatsov/projectile/pull/2113): Add `projectile-todos` (`s-p s t`), which collects the project's `TODO`/`FIXME`-style annotations (`projectile-todo-keywords`) into the reviewable search buffer.
- [#2112](https://github.com/bbatsov/projectile/pull/2112): Add `projectile-dashboard` (`s-p P`), a buffer summarising the current project - name, root, type, file count, branch and working tree status, most-visited files, tasks and lifecycle commands, each of them a button - which also works as a `projectile-switch-project-action`.
- [#2111](https://github.com/bbatsov/projectile/pull/2111): Add `projectile-doctor` (`s-p H`), which reports how Projectile sees the current project - root, type, indexing method and command, available tools, cache state and effective ignore rules - and ends with a list of concrete suggestions.
- [#2104](https://github.com/bbatsov/projectile/pull/2104): Alien indexing now honors Projectile's ignore rules, which it previously skipped entirely, by pushing them into the external tool.
  - Alien projects will list fewer files than before; set `projectile-alien-honors-ignores` to nil for the old behavior.
  - Tools that can't express exclusions (svn, fossil, bzr, darcs, pijul, plain `find`) are filtered in Emacs Lisp instead, and dirconfig `+` keep entries stay `hybrid`/`native` only.
- [#2096](https://github.com/bbatsov/projectile/pull/2096): Add an optional Embark/Marginalia integration, wired via `with-eval-after-load` so neither package becomes a dependency.
...
...
