Releases: nette/tracy
Released version 2.12.0
Tracy learns to speak AI. This release turns every error screen, debug bar, and dump() call into a first-class citizen of agentic workflows – when an AI coding assistant hits your app, it gets a structured, token-efficient view of exactly what went wrong instead of a blob of HTML. Plus the usual spit-and-polish: a unified "transparent frames" model across BlueScreen and Dumper, a new breadcrumb in logged exceptions showing where Debugger::log() was called from, and a few quality-of-life API additions.
✨ New Features
- AI agent support – Tracy now detects AI agents (via Helpers::isAgent()) and serves them tailored output instead of HTML:
- BlueScreen renders a dedicated agent template for exceptions, making stack traces and context machine-readable
- Debug Bar ships an agent-friendly render path with bespoke templates for the Warnings and Dumps panels
- Debugger::dump() writes to the console when an agent is on the other end, so your dumps land where the agent actually looks
- Production error page now includes a hint for agents so they don't have to guess what happened behind the generic 500
- Markdown companion files – every HTML error log now gets a
.mdsibling, giving agents a clean, readable version of the same crash - Debugger::$transparentPaths – a public, autodetected list of "framework" paths (Tracy, Nette, Latte) whose frames are skipped when locating the real call site. Path-based, so it catches anonymous functions and closures that class-based detection missed
- Helpers::findCallerLocation() – walks the backtrace and returns the first frame outside
$transparentPaths, respecting@tracySkipLocationand internal functions. Reusable across Tracy instead of buried in Dumper - Helpers::countTransparentFrames() – companion helper returning the number of leading transparent frames in a trace
- Logger records caller location – exception reports now show a "Logged from ..." footer pointing to the exact line where
Debugger::log()was called, alongside the existing "Report generated at" entry - Dumper::toText() – gained an optional
$keyparameter so you can label the dumped value in text output
♻️ Code Refactoring
- BlueScreen stack-trace collapse unified with
Debugger::$transparentPaths– one source of truth for which frames to hide, replacing the inline logic insection-stack-exception.php.BlueScreen::$collapsePathsandisCollapsed()remain as@deprecatedshims so existing configuration keeps working - BlueScreen internals cleaned up, including a new
prepareStack(\Throwable)method that strips Tracy's own handler frames and returns the frame index to expand by default
Released version 2.11.4
A maintenance release focused on CSP-friendly assets, mobile-friendly error pages, and a couple of handy API additions. Expect cleaner nonce handling, better behavior on phones, and a bar.js that no longer trips strict Content Security Policies.
- script-src-elem support in Helpers::getNonce() – nonces are now also picked up from the
script-src-elemCSP directive, not justscript-src(#612). - CSP-friendly Tracy Bar – replaced the inline
onloadattribute in bar.js with a nativeaddEventListener, eliminating a common CSP violation (#614). - FileSession::clean() – emits a warning when the session directory is not readable, making misconfigured storage easier to diagnose (#538).
- Mobile-friendly error pages – BlueScreen and the 500 error template now include a proper viewport meta tag, so exceptions no longer render microscopically on phones (#604).
- Improved PHPDoc descriptions and fixed PHPStan errors across the codebase.
- open-in-editor on Windows – installer now registers the protocol via
AutoLaunchProtocolsFromOrigins, suppressing the browser's "Open external app?" confirmation prompt (#573).
Released version 2.11.3
- Templates converted to Latte-like syntax, paving the way for a cleaner templating pipeline
- Environment guards relocated from
Debuggerto the individual strategy classes, improving separation of concerns - Upgraded to PHPStan level 8 — the strictest static analysis level is now passing
Released version 2.11.1
✨ New Features
- Dumper – added support for uninitialized lazy objects (PHP 8.4), displaying them with a
(lazy)label and showing only pre-initialized properties - Source mapper – added column support, so BlueScreen can now pinpoint the exact character position in mapped source files
🐛 Bug Fixes
Released version 2.11.0
- requires PHP 8.2 & supports PHP 8.5
- added support for backtraces for fatal errors in PHP 8.5
- bar: errors panel => warnings
- Bridge: removed support for Latte (is part of Latte)
Released version 2.10.10
- bluescreen.js: fixed scrolling to top
- bluescreen.css: fixed displaying with body { display: relative }
- bar.js: removes the data-tracy-content HTML attributes from DOM
- bar.css: .tracy-label removes leading and trailing spaces
- css: used fit-content
- Bridge: Nette\MemberAccessException may not throw only ObjectHelpers
- Dumper: added support for Dom classes in PHP 8.4
Released version 2.10.9
- Released version 2.10.9
- dumper: added cmd-click to open in editor
- dumper:
exposeDOMNode()does not throw deprecation notices in PHP 8.4 - added workaround for Opera "feature" – 'Close tabs created for opening external apps'
- error 500: improved CSS style reset #581
- drop obsolete E_STRICT error level (#587)
- FileSession: greater $gcProbability value #585
- Logger: uses CRLF for mail headers #584
Released version 2.10.8
- bar.js: initializes Tabs (#580)
- refactoring
- support for PHP 8.4
Released version 2.10.7
- bluescreen: added php://input preview
- bluescreen: allows to create classes with two-letter namespace
- bluescreen: stack trace is reduced before analysis
- bar: label 'Errors' => 'Warnings'
Released version 2.10.6
- info panel: added TS indicator & xdebug modes
Helpers::improveException()improved- js: unload replaced with pagehide #576