new
improved
fixed

In this release, we have made major improvements to the discovery process for new linters. When you now run
trunk check upgrade
we will do a full repo scan to discover and enable additional tools that match your repository. This could include tools we've added since you first initialized trunk or tools that are now applicable as you've added new technologies into your repo.If we suggest a linter you are not interested in running you can block us from suggesting a tool by calling
trunk check disable <linter>
. The enabled/disabled lists are maintained in your trunk.yaml
file so you can always tweak these entries by hand. 🎁 New Tools
✨ Improvements
- trunk check enable <linter>will now enable a supported linter at the most up-to-date version
- trunk check disable <linter>will mark a linter as disabled and block it from being suggested
- trunk initandtrunk check upgradenow have progress reporting so you can get more detailed information as the tool is running
🔧 Bug Fixes
- Fixed a rare bug in hold-the-line
- Fixed several bugs in our parsing of clippyissues
- Trunk now recognizes more Dockerfilefilenames
- trunk ignore-allnow works correctly for pass_fail style linters
- We now compute the merge base when using the git branch upstream as your trunk upstream instead of using it directly
- trunk check upgradewill correctly version sub-packages for linters (eg. flake8)
- trunk will no longer ignore files in a conflicted git state
new
improved
fixed

🎁 New
- Native macOS arm64 support. A launcher upgrade is required to take advantage of this: See https://docs.trunk.io/get-started
- New command: trunk check enable <linter>ortrunk check enable <linter>@<version>enables a linter to an autodetected or explicit version respectively.
⚜️ Improvements
- Linters can now propagate environment variables to execution.
🔧 Bug Fixes
- trunk init --lockworks again (requires a launcher upgrade)
fixed
improved
⚜️ Improvements
Added support for optional environment variables. An environment key can now be specified as optional. An optional key will essentially be ignored if it cannot be resolved. So for example, if the system environment does not have FOO defined, that key will be ignored.
environment:
- name: FOO
value: "${env.FOO}"
optional: true
🔧 Bug Fixes
- Fixed bug in how $PATH was injected for tooling that requires passing full system path through. We now have special casing to ensure that the full host $PATH is always post-pended to the constructed hermetic path.
fixed
Thanks to the community for reporting these holes to us. Happy to get them quickly patched (pun intended).
🔧 Bug Fixes
- Fix internal error when a linter failed to run from a sub dir
- More robust detekt-gradle support
- Ability to use git branch upstream as the base for changes
- The trunk daemonwill be now be terminated if it fails a health check
- Path construction for linters running on system installed runtimes are now constructed in the correct order
- zshscripts are now managed as a separate class of file frombashandsh
new
fixed
improved

We've been doing a lot of behind the scenes work in this release. We tracked down some really fun edge case bugs that we just will not tolerate in our product.
🎁 New Tools
- stylelint - css linter
⚜️ Improvements
- Expanded documentation of configuration options
🔧 Bug Fixes
- Fixed rare segfault that occurs when modifying trunk.yaml
- Fixed deleted files sometimes showing up as discards
- dotenv renamed to dotenv-linter
- Sanitize execution variables when executing sub-processes. (Hides secrets and increases hermeticity)
- vscode formatting now respects the run mode.
- ${workspace} template is now parsable in download phase
new
improved
fixed

🔥 Batched Lint Actions
One of the biggest wins of this release is a massive improvement in our ability to parallelize and batch linter executions. Previously, the linting of every file ran in an isolated process, this meant that linters with high startup costs would drag when executing on a large number of files. We solved that by coalescing work into batches and the results are amazing. For example, previously running rubocop on the rubocop repo took over 10 minutes. We shaved that down to 38s - a nearly 20x speed improvement.
📦 System Runtime Support
We’ve always aimed to deliver a completely hermetic toolchain because it leads to highly reproducible results, but some repos already manage some of their runtimes (Ruby is a popular one) and want to leverage/reuse their existing runtime deployments. Now you can! In the root of your trunk.yaml file you can now specify the runtimes you want to explicitly enable and the versions to deploy. When you use a range expression >=3.1.0 we will first check if your machine has a matching instance of ruby available. If the system already has it - we won’t bother installing a hermetic version of ruby. If you don’t have ruby - don’t worry - we’ll take care of installing a version that matches that requirement. Lot’s of other knobs to tinker with here (see docs for full story)

📣 Feature Requests
We love hearing from our users about all the ways we can make trunk better. In order to allow us to better prioritize asks and let people know when the new feature they asked for landed we've started gathering feedback here - features.trunk.io
🎁 New Tools
- dotenv-linter for all your .env files
- scalafmt
- goimports formatter
- haml-lint
🔧 Improvements
- Support for running detekt under gradle
- check now uses a DAG to more efficiently execute your actions - no more waiting for one tool to download before others can execute
- Linters can now be configured to run only in certain workflows using the 'run_when' field. This allows you to take greater control of your check runs - if you want to run some tools only in CI - now you have the power to do tha
- Caching of linter output is now enabled by default
- trunk print-config now pretty prints enums and uses intelligent field ordering so your trunk configuration is more legible and makes more logical sense to read
- Trunk launcher is now available for install via npm as as @trunkio/launcher
- Golang managed linters now use 'install' instead of 'get' for installation
improved

⚜️
Improvements
- Introduced --ci-progresswhich will print progress every 30 seconds instead of a realtime update.
- Introduced --github-annotate-details-urlwhich allows you to point to a custom url for check annotation details
- Internal work to support the trunk check web portal
improved
Making hold-the-line shine…

🔧 Improvements
- Autofixes are only presented to the user for new issues by default.
- Github annotations only post new issues by default.
- Duplicate auto-fixes are no longer shown.
- Hold-the-line results are now shown when checking individual files.
new
improved
fixed
Lot’s of great new features and bug fixes; let’s get to it…

🎁
New Tools
- Support for tflint (terraform linter)
- Support for terraform-validate
- Support for better Toml validation and formatting
⚜️
Improvements
- trunk-ignore now supports block level and file level ignores
- The maximum number of parallel actions can now be controlled with the jobs flag: –jobs
- Clippy linting now uses its own build cache and does not interfere with user builds
🔧
Bug Fixes
- Fixes for detekt, eslint, flake8, ktlint and pylint integrations.
⌨️
Visual Studio Code
- Added ability to pause trunk background checking with a new pause button
- Added visualization of check jobs
- Updated file status icons
new
improved
fixed
Happy New Year! This week’s release packages together a slew of bug fixes and performance improvements we made over the winter break. The engineering team is back to full steam now and cranking on reported issues and feature requests.

🎁
New Tools
Support for Detekt kotlin static analysis tool
⚜️
Improvements
- Support for GitLeaks 8.x.x (previous versions 7.x.x and older are still supported but as always we recommended running the latest versions of tools)
- Improved zip download support
🔧
CI Improvements
Load More
→