Highlights
TTT 1.4 is a code-review release. The Changes panel grows into a full review surface: a commit history detail view with per-commit diffs and paginated history, a live "Current Changes" review that tracks the working tree as you edit, hierarchical file trees for changed and historical files, and unified presentation controls (split/unified layout, context amount, wrapping, high-contrast) that now apply everywhere: local diffs, commit details, and GitHub PR review alike. Collapsed-context rows can be emphasized on demand, full-file context expands in place, and a unified diff view opens from any repository root or section header.
Editor and UI polish: drag to reorder tabs, a command-palette orientation help mode (?), tab context menus with close actions first, a stabilized palette width, and persisted Changes/History split sizes. Plugins gain checked menu entries, a node actions API, and access to the host platform, architecture, and TTT version.
New Collaborator
@arimxyer has joined the project as a collaborator. Much of what makes this release is his work, and TTT is meaningfully better for it.
Thank you 🙏
Contributors & Acknowledgments
TTT is better because of the people who take the time to try it, report bugs, request features, and contribute code. Thank you! This project grows because of you.
Code contributions
- @arimxyer re-envisioned and built the diff & code review experience end to end (commit history detail, live Current Changes review, hierarchical file trees, unified presentation controls, live detail-menu controls), plus tab drag reordering, the command-palette orientation help mode, checked plugin menu entries, git repository-identity correctness and performance work, an LSP protocol test fixture, the highlighting-as-presentation refactor, scrollbar canonicalization, the CI fast-feedback contract, and the architecture convergence plan. An enormous release for TTT.
Bug reports & feedback
- @lozzo followed through on the fullwidth CJK rendering report (#443), testing successive builds until it was resolved.
- @vikas-0 reported confusing Quick Open behavior (#467).
- @anderlli0053 requested UI translations / i18n (#483).
What's Changed (59 pull requests)
- test(integration): pin tui-use locally by @arimxyer in #478
- feat(debug): make exec automation deterministic and failure-safe by @arimxyer in #479
- feat(plugin): support checked menu entries by @arimxyer in #480
- feat(palette): add orientation help mode by @arimxyer in #481
- feat(ui): reorder tabs by dragging by @arimxyer in #482
- test(functional): fix sidebar action menu clicks by @arimxyer in #484
- feat(diff): unify review presentation controls by @arimxyer in #485
- fix(diff): preserve context and reuse hover theme by @arimxyer in #491
- feat(git): add commit history detail review by @arimxyer in #486
- feat(git): add hierarchical file tree controls by @arimxyer in #487
- feat(git): react to repository state changes by @arimxyer in #488
- feat(git): add live Current Changes review by @arimxyer in #489
- docs: add arimxyer to contributors & acknowledgments secton by @eugenioenko in #500
- ci: align setup-go version with go.mod by @eugenioenko in #494
- feat(git): paginate history and expand diff context by @arimxyer in #490
- fix(menu): add Color Theme option to View menu by @eugenioenko in #499
- fix(menu): separate Git presentation options by @arimxyer in #501
- fix(palette): keep width stable across modes by @arimxyer in #504
- ci: add go vet, golangci-lint, and race detector by @eugenioenko in #477
- ci: add pre-release test workflow by @eugenioenko in #510
- ci: add pre-release chaos monkey workflow by @eugenioenko in #511
- fix: nil pointer dereference in ChangesPanel.handleCommitLogKey by @eugenioenko in #513
- ci: rename Pre-Release Chaos Monkey to Chaos Monkey by @eugenioenko in #515
- fix(palette): reduce max width from 90 to 60 columns by @eugenioenko in #520
- feat(diff): add live controls to detail menus by @arimxyer in #509
- test(lsp): add deterministic protocol fixture by @arimxyer in #516
- feat(diff): emphasize collapsed rows on demand by @arimxyer in #517
- fix(git): canonicalize active repository identity by @arimxyer in #519
- test: broaden chaos monkey event coverage and add progress logging by @eugenioenko in #521
- ci: enable unused linter, remove dead code by @eugenioenko in #523
- fix(git): canonicalize external symlink blame by @arimxyer in #526
- fix(git): bound repository identity retries by @arimxyer in #527
- perf(git): coalesce repository identity refreshes by @arimxyer in #530
- perf(render): avoid full-grid copy on every frame by @eugenioenko in #529
- style(git): make commit message header a padded box by @eugenioenko in #531
- fix(ui): reorder tab context menu to put close actions first by @eugenioenko in #537
- fix(ui): prevent tab drag from press that began outside widget by @eugenioenko in #535
- docs: define architecture convergence plan by @arimxyer in #539
- ci: add a fast feedback contract by @arimxyer in #540
- ci: split pinned LSP checks from latest canary by @arimxyer in #541
- test: make functional readiness explicit by @arimxyer in #542
- refactor(widgets): canonicalize scrollbar range and interactions by @arimxyer in #543
- test: characterize highlighting boundary by @arimxyer in #544
- refactor: reclassify highlighting as presentation by @arimxyer in #545
- fix: clarify Changes panel menu item naming by @eugenioenko in #548
- docs: rename CLAUDE.md to AGENTS.md by @eugenioenko in #549
- fix: stop selection bleeding past text on last line by @eugenioenko in #550
- ci: fix ineffassign lint violations by @eugenioenko in #551
- ci: fix staticcheck lint violations by @eugenioenko in #552
- fix(ui): add spacing between collapsed-gap chevron and label by @eugenioenko in #554
- fix: clamp negative column in SplitLineCommand to prevent panic by @eugenioenko in #555
- fix(lsp): order signature-help requests after their triggering didChange by @eugenioenko in #557
- style(changes): rebalance changes/history split and persist panel sizes by @eugenioenko in #560
- feat(plugin): expose host platform, arch, and ttt version to plugins by @eugenioenko in #561
- chore: register port-finder in community plugins by @eugenioenko in #563
- fix(plugin): preserve input chevron on reconcile; add node actions API by @eugenioenko in #562
- feat(changes): open unified diff view from root/section and PR root by @eugenioenko in #564
- fix(ci): bypass test cache in pre-release repeat runs by @eugenioenko in #565
- chore: simplify readme and link to other sections by @eugenioenko in #566
Full Changelog: v1.3.0...v1.4.0