Skip to content

Releases: textmatelives/textmate

TextMate 2.2.1-undead

Choose a tag to compare

@github-actions github-actions released this 27 Aug 22:09
Immutable release. Only release title and notes can be modified.
94f3655

2026-08-27 (v2.2.1-undead)

One stability fix. See all changes since v2.2.0-undead.

Stability

  • KeyCue and other accessibility clients no longer crash TextMate while inspecting menus on macOS 26.6.2. AppKit's NSMenu accessibility path raises and internally catches a compatibility exception for its removed accessibilityPerformAction: fallback. TextMate's fail-fast exception observer previously called abort() before AppKit could catch it. Reported, diagnosed and fixed by @BenjaminX. (#54, #55, 172a78fa)

What's Changed

New Contributors

Full Changelog: v2.2.0-undead...v2.2.1-undead

TextMate 2.2.0-undead

Choose a tag to compare

@github-actions github-actions released this 27 Aug 03:56
Immutable release. Only release title and notes can be modified.
bb8b704

2026-08-26 (v2.2.0-undead)

The rave build system is replaced by CMake, two crashes are fixed, and a fork-wide sweep gets bundle Ruby running on the system interpreter — 50 bundle pull requests across 40 repositories. See all changes since v2.1.5-undead.

Build

  • rave is gone; the tree builds with CMake and Ninja. bin/rave (1,686 lines of Ruby), configure and the 60 default.rave files are removed, along with two scripts only rave called — bin/gen_build and bin/notarize_await, the latter obsolete since notarytool replaced altool. The test suites run under CTest, and CI and the release workflow configure and build through CMake. ⌘B still builds and relaunches TextMate: bin/relaunch_app reproduces rave's TextMate/run target behind a run target. (#42, d4f6338f, 65d907b6, 94bd8270)
  • The CMake build came from @tectiv3. tectiv3/textmate migrated TextMate to CMake first, and this fork adopted their work rather than repeating it: the root CMakeLists.txt, cmake/TextMateHelpers.cmake, CMakePresets.json and 54 of the module CMakeLists.txt files are theirs. Three more — SoftwareUpdate, network and CrashReporter — were written here because tectiv3 had dropped those modules, and version derivation, Markdown rendering and a few include scopes were adapted to this tree. Thanks for doing it first.
  • boost, google-sparsehash and ragel are no longer build dependencies. google::dense_hash_map gives way to std::unordered_map, ascii.rl to a hand-written ASCII plist parser, boost::variant to std::variant, and boost::crc_32_type to zlib's crc32(). Ported from tectiv3/textmate 36acd469, 34e166b9 and 2c49eead. multimarkdown is deliberately retained — it drives the twelve in-app Help pages as well as the About window, and is build-time only. (#42, 0bbeb579)
  • Deployment target raised from 10.12 to 14.0, which the dependency removals require (std::variant needs a modern libc++). LSMinimumSystemVersion follows it, so the app now declares macOS 14 as its floor. (#42, d8867a71)
  • Globbed sources are re-scanned on every build. CMake's file(GLOB) runs once at configure time, so a newly added file was silently ignored until someone re-ran cmake by hand — and for tests that failure is invisible: the file is not compiled into the runner and the suite passes without it. CONFIGURE_DEPENDS makes ninja recheck each glob. (#43, 37bc59a9)
  • Contributions.md aggregates by person instead of by commit. One entry per commit rendered 739 rows and 1.1 MB of HTML that changed on every push; it is now one row per contributor — avatar, name, handle, commit count, years active — 107 contributors and 39 KB. Identity keys on the GitHub login, so someone who committed under several addresses appears once. (#42, 8e01ffc8)

Stability

  • Fixed a crash on launch while restoring a session. An uncaught std::bad_variant_access escaped NSApplicationMain and main()'s handler called abort(). Moving plist::any_t off boost::variant had renamed the lenient plist::get<T> to plist::convert<T> and given the old name to the strict accessor, so call sites that relied on coercion silently became strict — and grammars and themes in the wild do carry a numeric name or a string disabled. The lenient read is restored at the schema field handlers, the theme colour and font reads, and the disabled check in parse::convert_plist. (#43, bc899cb4)
  • Fixed a crash on ⌘G and ⇧⌘G in the HTML output window. -findNext: and -findPrevious: passed completionHandler:nil to -[WKWebView findString:withConfiguration:completionHandler:], whose handler parameter is implicitly nonnull; WebKit invokes it without a null check, faulting at 0x10 on the async IPC reply. The find dialog was never affected — only the two keyboard shortcuts. (#44, 8473c153)

Editor

  • Tab titles and close buttons are centred again. Both were pinned a few points above the bottom of the tab, which only centres them in a 22pt tab — the height OakTabBarView asks for. As a titlebar accessory it is fixed at 36pt whatever it requests, so tabs are 35pt and both subviews sat well below the middle. They are constrained to the tab's centre instead. (#46, a48d539e)

Commands

  • Commands run in a UTF-8 locale. Launched from Finder the app inherits no LANG or LC_*, and neither is in the environment whitelist, so everything it spawned landed in the C locale. For Ruby that means Encoding.default_external is US-ASCII and ENV strings come back tagged ASCII-8BIT, so interpolating a TM_FILEPATH containing an accent raised Encoding::CompatibilityError. bash_init.sh had exported LC_CTYPE since forever, but fix_shebang only prepends that preamble to commands with no shebang of their own — every #!/usr/bin/env ruby command went without. It is now set in setup_basic_environment(), covering all of them. (#48, 5cab4eef)
  • No more env: ruby18: No such file or directory. macOS has no ruby18, so every command carrying that shebang died at exec. Fixed in Avian.tmbundle, which ships inside the app and has no upstream repo of its own, and in the Bundle Editor command templates, which were minting a ruby18 shebang into every newly created command. The 1.8-era -KU flag — which Ruby 2.6 warns about on every run — is replaced by -Eutf-8. (#45, #47, f8803570, 525ac364)

Bundles

The embedded bundles are pinned by SHA and ship with the app; everything in the catalogue auto-updates from main and arrives on the next poll.

  • Word Count works again. Text.tmbundle required jcode, removed in Ruby 1.9, and called the String#jcount it added, so the command died at the require on a fresh install. Pin 34ab5891f3fd9fc9. (#51, text.tmbundle#1, thanks @capac)
  • Every command that used shelltokenize was broken. lib/shelltokenize.rb failed to parse at all under the system Ruby — invalid multibyte escape: /[^\w_\-\+=\/\x7F-\xFF]/ — whatever shebang the caller carried. Bundle Support and Source pins bumped to pick that up, along with File.exists?/ERB.new modernization (thanks @mattneub) and the Source shebang fix. (#49, 4a9664fb)
  • ruby18 shebangs replaced across 15 bundles — cvs, lua, bundle-development, cron, groovy, html, java, markdown, perl, php, python, ruby, source, xcode and yaml — and ruby20 in html and rust.
  • The 1.8-era -K flag replaced with -Eutf-8 in 18 bundles — ant, applescript, arduino, cmake, git, golang, haskell, Julia, nim, ninja, pdb, processing, r, rust, scala, swift, tads3 and vagrant. Dropping it outright is not enough: with no locale set Encoding.default_external falls back to US-ASCII, which is what -KU was there to prevent.
  • Hash#to_plist resolves again in 6 bundles — ant, apache, git, objective-c, ocaml and html — which used it without requiring private/plist.
  • Markdown list commands work under modern Ruby. List.parse called String#to_a, removed in Ruby 1.9. (markdown.tmbundle#2, thanks @tbates)
  • GitHub Markdown preview works under Ruby 4.0. Rouge 3.x calls CGI.parse in Lexer.lookup_fancy, and Ruby 4.0 ships only cgi/escape, so any code block with no language tag — including every indented one — raised NoMethodError when TM_RUBY pointed at a modern interpreter. The cgi gem is now a declared dependency. (GitHub-Markdown.tmbundle#3, reported by @capac)
  • Hyperlink Helper matches non-ASCII URLs. URL detection covered ASCII only, so an IRI stopped at the first accented character; matching also no longer runs through Unicode whitespace. (hyperlink-helper.tmbundle#1, #2, thanks @tectiv3)
  • AppleScript URL escaping uses URI::DEFAULT_PARSER.escape instead of URI.encode, removed in Ruby 3.0. (applescript.tmbundle#2)
  • iPhone dropped from the catalogue, 108 entries → 107. Its Completion: Inside Brackets command requires a symlink into the flat TextMate 1 bundle layout, which cannot resolve under one-repo-per-bundle; Objective-C grammar and completion come from objective-c.tmbundle. It was never a default bundle, so nothing installed it. (#50, bundle-support.tmbundle#9)

What's Changed

Read more

TextMate 2.1.5-undead

Choose a tag to compare

@github-actions github-actions released this 22 Aug 04:00
Immutable release. Only release title and notes can be modified.
6488af3

2026-08-21 (v2.1.5-undead)

Maintenance release: seven stalled community fixes adopted from the upstream PR queue, the Ruby build helpers brought up to Ruby 3, and the unused SyntaxMate XPC service removed. See all changes since v2.1.4-undead.

Editor

  • File browser and document view backgrounds render correctly again. (#39, b87d4641)
  • attr.filebrowser is now set while the file browser pane has focus, so scoped settings and key bindings can target it. (#39, 5e39c5ee)
  • Corrected a "toggleing" typo in Preferences. (#39, 6236dcb0)

Stability

  • Avoided a clang 15 crash in Find caused by an incorrect array size. (#39, d115b6f7)
  • Fixed an incorrect number of seconds in a day in format_string. (#39, 9a41ea5c)
  • Fixed a cast of a non-Objective-C pointer in shared_ptr in RMateServer. (#39, 62ad24f4)
  • Silenced the vfork deprecation warning on macOS Monterey, pending migration to posix_spawn. (#39, bb047ecb)

Build tooling

  • The Ruby helper scripts are Ruby 3 compatible. ERB usage was modernized to eliminate deprecation warnings. (#38, fc835f67)
  • gen_credits.rb uses a JSON cache instead of DBM, which is no longer bundled with Ruby 3. (#38, c187e5dc)

Housekeeping

  • Removed the unused SyntaxMate XPC service. (#40, 129c1b03)

Release infrastructure

  • The Apple signing identity is gated behind a required reviewer. The signing secrets moved from repository scope into a release environment, so a signed build cannot be produced without explicit approval. (#34, b00a4ee7)
  • actions/checkout is pinned to a full commit SHA in every workflow, with SHA pinning now enforced repository-wide. (#35, 4c8f75dc)
  • Added CODEOWNERS. (#36, 8b1c6b8b)

What's Changed

Full Changelog: v2.1.4-undead...v2.1.5-undead

TextMate 2.1.4-undead

Choose a tag to compare

@github-actions github-actions released this 11 Jun 18:32
Immutable release. Only release title and notes can be modified.
e26471b

2026-06-11 (v2.1.4-undead)

Bugfix release: the GitHub Markdown preview no longer dies with a LoadError on installs that predate 2026-06-08 (#29). See all changes since v2.1.3-undead.

Bundles

  • Stale Bundle Support installs heal themselves. The shared gem store (tm/gems) had landed only in the app's embedded copy of Bundle Support — the upstream bundle repository and its pin never changed, so existing installs kept a copy without it while the auto-updating Markdown (GitHub) bundle began requiring it. The library (and the Markdown (GitHub) default-bundle promotion from #23, which had drifted the same way) is now published upstream, and the bumped pin makes every stale install re-copy Bundle Support on next launch. (#30, f71b6df2)

What's Changed

Full Changelog: v2.1.3-undead...v2.1.4-undead

TextMate 2.1.3-undead

Choose a tag to compare

@github-actions github-actions released this 11 Jun 16:34
Immutable release. Only release title and notes can be modified.
db66f82

2026-06-11 (v2.1.3-undead)

Bugfix release: the app no longer talks to the metered GitHub API at all, fixing update checks that failed around the clock on networks whose unauthenticated quota (60 requests/hour per IP, shared by every tool on the network) was exhausted (#26). See all changes since v2.1.2-undead.

Software Update

  • Update checks can no longer be rate-limited. The update feed moved from the GitHub Releases API to git's smart-HTTP ref advertisement — the same unmetered endpoint git ls-remote reads. The newest refs/tags/v* tag is the latest version (the beta channel includes -beta tags, release skips them) and the download URL follows the release asset convention. (#27, c355ab70)
  • Errors now say what went wrong. A rate-limited network reports “GitHub API rate limit reached for this network. Try again after ⟨reset time⟩.” instead of “Incomplete server response.”; other server errors surface the server's own message, and an unexpected content type (e.g. a captive portal) names itself. (#27, c355ab70)

Bundles

  • Bundle updates no longer spend API quota. Ref-to-SHA resolution uses the same unmetered ref advertisement instead of one Releases-API call per bundle per poll, so a busy network can no longer starve bundle updates either. (#27, c355ab70)

What's Changed

Full Changelog: v2.1.2-undead...v2.1.3-undead

TextMate 2.1.2-undead

Choose a tag to compare

@github-actions github-actions released this 11 Jun 05:33
Immutable release. Only release title and notes can be modified.
5402f2b

2026-06-10 (v2.1.2-undead)

Feature release: a working prerelease (beta) update channel, a shared RubyGems store that lets bundles declare gem dependencies, GitHub-flavored Markdown by default, and a fork identity pass across the About window, preferences, and themes. See all changes since v2.1.1-undead.

Software Update

  • Prerelease (beta) channel implemented. The beta channel now reads the repository's release list and offers the highest-version non-draft release, prerelease or stable — so beta users get betas as they appear and converge back onto stable when it catches up. The "Prereleases" item returns to the Software Update preferences, and versions containing -beta publish as GitHub prereleases, keeping releases/latest (the stable feed) on the stable build. (#24, d2c9a504)

Bundles

  • Shared gem store for bundles. A bundle can declare a Support/Gemfile; TextMate::Gems installs it once into a shared, Ruby-ABI-keyed store under ~/Library/Application Support/TextMate/Gems. Failures alert natively and log full detail; nothing falls back to system gems. (#21, b93c76cf)
  • Gems warm at install time. Installing a Gemfile-bearing bundle starts its gem install in the background immediately, so the first command that needs them doesn't stall. (#22, 014e57a3)
  • Markdown (GitHub) is a default bundle. GFM syntax highlighting and preview (rendered by redcarpet + Rouge — no Python dependency) now installs out of the box instead of being opt-in. (#23, 15da2268)

App and UI

  • Undead theme ships, a Twilight-derived fork theme. (#19, 3d9da91c)
  • SF Symbols in the preferences toolbar replace the legacy raster icons. (#20, 2bb377b2)
  • About window fork pass: fork-branded background and feedback link (7655cfda), Contributions repointed at the fork with avatars and ref scope fixed (03c3d5f3), missing third-party attributions added to Legal (bdf30345), and the defunct Bundles tab removed (151149ab). (#17)
  • License/registration subsystem retired. The vestigial serial-number machinery is gone. (#15, bae9095e)

Fixed

  • SCM wait_for_status bounded, fixing an occasional CI hang. (#18, c8a8ce74)

CI and docs

  • Releases gate on an isolated build + test via a reusable workflow. (#14, c64a7e0e)
  • actions/checkout bumped to v5 (Node 24 runtime). (#16, 077a579d)
  • Stale api.textmate.org notes corrected in the contributor docs. (#13, 0aeda5b6)

What's Changed

Full Changelog: v2.1.1-undead...v2.1.2-undead

TextMate 2.1.1-undead

Choose a tag to compare

@github-actions github-actions released this 28 May 12:39
Immutable release. Only release title and notes can be modified.
390cc3d

2026-05-28 (v2.1.1-undead)

Maintenance release: the software-update mechanism is rebuilt on GitHub Releases, all remaining calls to the retired api.textmate.org are removed, and the app is classified as a macOS application again. See all changes since v2.1.0-undead.

Software Update

  • Update feed served from GitHub Releases instead of api.textmate.org. The check reads the repository's releases/latest, and a downloaded build is trusted only if it carries a valid Apple Developer ID signature whose Team Identifier matches the running app — an update signed by a different team, or unsigned, is refused. (#9, 96a7e0f7)
  • Prereleases channel removed until a beta stream exists, so the updater no longer offers builds that aren't published. (d69723f4)

Privacy

  • No more calls to api.textmate.org. Removed the silent launch-time crash-report upload and the "Submit to MacroMates" checkbox and contact field from the Software Update preferences; the app no longer transmits crash logs or contact details. Bundle-suggestion reachability probes now target github.com. (#9, e4ee811c)
  • Removed the bl command-line tool and the updater framework, whose only remaining dependency was the retired bundle catalogue on api.textmate.org. (e4ee811c)

Fixed

  • App no longer misreported as an iOS app. System Profiler classified TextMate.app as arch_ios on Apple Silicon because the bundle declared no supported platform; it now declares CFBundleSupportedPlatforms = [MacOSX] and is classified as a macOS (Apple Silicon) application. (#8, #10, 9e610a8d)

Build

  • configure works against Homebrew on Apple Silicon out of the box. It derives the dependency prefix from brew --prefix (covering /opt/homebrew and Intel /usr/local) instead of hardcoding /usr/local, so the documented ./configure && ninja build no longer fails to find boost and sparsehash. CI now exercises this path on a clean runner. (#11, bd3013da)

What's Changed

  • Software Update: feed from GitHub Releases, verify via Apple signature by @dayglojesus in #9
  • Info.plist: declare CFBundleSupportedPlatforms = [MacOSX] (fixes #8) by @dayglojesus in #10
  • configure: use Homebrew prefix so the README build works on Apple Silicon by @dayglojesus in #11
  • Release v2.1.1-undead by @dayglojesus in #12

Full Changelog: v2.1.0-undead...v2.1.1-undead

TextMate 2.1.0-undead

Choose a tag to compare

@github-actions github-actions released this 24 May 19:14
Immutable release. Only release title and notes can be modified.
ee1d41b

2026-05-23 (v2.1.0-undead)

First release of the textmatelives/textmate fork. TextMate builds and ships against macOS 26 on Apple Silicon, with refreshed bundle delivery, an in-process SCM gutter diff, and a signed-and-notarized release pipeline. Commit and PR references throughout. See all changes since v2.0.23.

App and UI

  • New Liquid Glass app icon, sourced from an Icon Composer .icon bundle and compiled at build time. The system handles light, dark, and tinted variants on its own. (0c6319f8)
  • HTML output backed by WKWebView (replaces the deprecated WebView). The git bundle's commit dialog and other bundle-driven HTML windows load on modern macOS again. (a20abe94, f045c65b, c9d831a6, 0c058b4f)
  • macOS 26 compatibility fixes: removed FSEventStreamFlushSync to prevent a main-thread hang (78529a60); resolved a deadlock between NSUserDefaults notification and FSEvents flush (2510f3dc); fixed OakBackgroundFillView drawing beyond its bounds on macOS 15+ (72a15176).
  • Apple Silicon only. Intel binaries removed; deployment target raised to macOS 26.
  • mate CLI now declares disable-library-validation so injected dylibs from launching processes don't get rejected. (fd48bae5)

Bundles

  • Catalogue hosted in Bundle Support.tmbundle. DefaultBundles.plist, AvailableBundles.plist, and BundleFileTypeIndex.plist move out of the app and into the bundle. Adding a bundle or fixing an extension association no longer requires cutting an app release. (#3, 2b828aa0)
  • First-launch sheet lets you batch-install (or skip) the 40 default-tier bundles. Return installs the checked rows, Esc skips, Space toggles a row. (0932d14a)
  • On-demand install: opening a file whose extension matches an uninstalled catalogue bundle now offers to install just that bundle. Bundles you decline are remembered and won't re-prompt. (47d03525, 94d24276, 7b0793c7, 9f59b9a1)
  • 110 opt-in bundles wired into the Bundles preference pane as an AvailableBundles tier alongside the defaults. (3d342b89, 7b8d7002)
  • Bundles pane refresh: gear-icon action menu (4ea36df6), hovered-row highlight (11a8b2db), restored category headers (e6277292).
  • SCM and Diff bundles ship by default; the now-redundant SCM Diff Gutter bundle was dropped. (49aa933e)
  • 12 additional bundles ship by default alongside the existing core set. (7e66f138)
  • Themes bundle embedded as a 4th mandatory bundle so a fresh install picks up themes without a network round-trip. (5fbb7f6c)
  • api.textmate.org bundle manager replaced with git-URL-driven subscriptions. The legacy DefaultBundles.tbz extraction on first launch is gone. (4994d2ec, c438a993)
  • Ruby bundles ported to Ruby 2.6.10 (the system Ruby on macOS 26). Bundled Ruby 1.8 removed entirely from bundle-support.tmbundle; TM_RUBY remains the override hook. Bundle-Support's plist gem submodule dropped (6243eef4); Java/Groovy/CVS bundles pinned at their remove-legacy-ruby branches (4b609eac).

SCM

  • In-process gutter diff. TextMate no longer relies on the SCM Diff Gutter bundle (or any external git invocation per gutter update). Vendored git's xdiff and built a self-contained gutter-diff component. (d7f71a64, fd48a081, 49fbfca0, 7e47d36f)
  • Per-repository serial queue for scm::shared_info_t, eliminating cross-repo lock contention on multi-repo workspaces. (7e5a2db1)
  • Half as many git subprocesses per SCM update: collect_all_paths was over-shelling and re-running probes inside untracked directories. (7d78a7ab, 62f86db9)
  • Duplicate driver invocation removed in SCMRepository. (ebe57b52)
  • Transient .git/ paths filtered from the SCM watcher so unrelated index updates don't trigger spurious status refreshes. (b1af6215)
  • wait_for_status race linearized in the per-repo queue test. (e56d4f77)

Build system

  • Cap'n Proto removed. Encoding classifier now uses ICU (4e45d3b6); bundle index cache uses NSKeyedArchiver (0062e083); configure/bin/rave/CI no longer require it (9ab4f001). No Homebrew runtime dependencies remain in the shipped .app.
  • CxxTest emission wired up in bin/rave so framework tests build alongside everything else. (04e6c4d8)
  • .mm test runners forced to --no-parallel on the main thread for fixtures that need NSThread.isMainThread. (602b3a24)
  • Ruby UTF-8 encoding fixed in build helpers under modern locales. (aef4231a)

CI, signing, and release

  • CI pipeline added: builds the app and runs framework test suites on every push. (#3 test infrastructure work spans 940a9157, 598f1da0, 0fde8c4e, e9fdde7c, fb734a9a, 8966eb60, 07a6d384, ef442001, d89fc688.)
  • Signed-and-notarized release pipeline. Tag a release by bumping Changes.md on main. The workflow extracts the version, builds, signs every embedded Mach-O with Developer ID, re-signs the outer .app with entitlements, notarizes via notarytool, retries stapler until the ticket propagates, runs Gatekeeper assessment, and gh release creates the asset. (940a9157, 00c49bb6, 75ca6517, b8f84419, 4f01e338, 20dcd938, c201fb6a)
  • Intel-only CocoaDialog.app scrubbed from the embedded bundle-support tree (blocked notarization). (297d39de)
  • Release flow consolidation: tag-pushing workflow folded into release.yml; RELEASE_PAT requirement dropped in favour of ${{ github.token }}. (#2, 9ab13123, 1a2872a7, ba397573)

Repository

  • Migrated from dayglojesus to textmatelives org; bundle catalogue and submodule URLs updated; default branch is now main (was master). (#1, d5f2ec39, e6677d1a)
  • README rewritten for the fork: requirements, fork-specific download/feedback, build instructions point at textmatelives. (2f7c510d)
  • CLAUDE.md added to capture fork-specific constraints for contributors. (8359a11a)

Versioning

  • Version bumped to 2.1.0 so the auto-update channel sorts the fork above upstream's v2.0.23 and can't downgrade fork installs.

What's Changed

  • Update fork references: textmatelives org + main branch by @dayglojesus in #1
  • Consolidate auto-tag.yml + release.yml; drop PAT requirement by @dayglojesus in #2
  • Catalogue resolver + first-launch bundle installer sheet by @dayglojesus in #3
  • Surface CHANGELOG content in GitHub release notes by @dayglojesus in #4
  • Bump CI/release runners to macos-26-arm64 by @dayglojesus in #6
  • Release v2.1.0-undead by @dayglojesus in #5
  • release.yml: re-seal nested bundles before signing outer .app by @dayglojesus in #7

New Contributors

Full Changelog: https://github.com/textmatelives/textmate/commits/v2.1.0-undead