BBEdit 16.0 is a major upgrade, which includes significant new features; visible changes to existing features; and fixes for reported issues.
Because BBEdit 16 builds on features that were added during the BBEdit 15 cycle (as well as previous versions), please take a few moments to browse the release notes archive and review the release notes for any versions that you may not have seen.
To get a high-level overview of what’s new in BBEdit 16, with screen shots, see the What’s New in BBEdit 16 page.
For detailed information on using any of BBEdit’s features, please refer to the user manual (choose “User Manual” from BBEdit’s Help menu).
BBEdit 16 requires macOS 14.0 or later.
For whichever version of macOS you are using, please make sure that you have updated to the latest available OS version. This will resolve any functional issues caused by bugs and regressions in out-of-date versions of the OS.
If you have been using any previous version of BBEdit in Free Mode, starting BBEdit 16.0 will reset your 30-day evaluation period, so that you can have a full trial of the new features.
If you have previously purchased a license from us for BBEdit 15 or older, you will have a full 30-day evaluation period in which to try out BBEdit 16’s new features. License upgrades are available at a discount for existing customers, and some customers may be eligible for a free upgrade (based on date of purchase). Please see the BBEdit upgrades page for information and instructions.
This release of BBEdit introduces expanded support for macOS “Shortcuts”, via additional actions provided in the Shortcuts application. A “Transform Text” operation allows invocation of “one shot” operations of many kinds, and transforms are provided for extracting matching lines, deleting matching lines, sorting lines, and text replacement.
Although accessors are provided for getting and setting the contents of the active BBEdit document (or its selection range), the Shortcuts support is intended to make BBEdit’s powerful text transformations available to workflows outside the application – after all, BBEdit already supports (and will continue to support) text factories as well as text filters, any of which can be purpose-built for operating on text in the application.
Added support for using the W3C HTML checker service. This is on
by default, and improves the correctness and accuracy of syntax
checking in HTML5 documents. XML documents and non-HTML5 document
types (as determined by the DOCTYPE declaration) continue to
use the built-in syntax checker.
Settings to control this are available in the “Syntax Checker” section of a project document’s settings, as well as in the HTML language-specific settings (which you can customize via the “Custom Settings” tab in BBEdit’s “Languages” settings).
Use of the W3C service involves sending your HTML files securely via HTTPS to the W3C checker service. Bare Bones Software never sees your HTML code, and the W3C service does not retain any data submitted to the syntax checker.
If you prefer, you can run the checker locally. To do this, you will need to follow some steps:
Download and install the Docker application for macOS: https://www.docker.com/products/docker-desktop/ If you don’t already have a Docker account, you can set one up and the free tier will suffice.
Using Homebrew or a similar package manager, install the
docker command-line tool: brew install docker. Alternatively,
you can create a symlink named docker somewhere in $PATH to
/Applications/Docker.app/Contents/Resources/bin/docker.
In BBEdit, configure the checker URL (in project settings
or globally, as appropriate) to “http://localhost:8888/”.
Steps 1-3 need only be done once.
To start the server, run this command:
docker run -it --rm -p 8888:8888 ghcr.io/validator/validator:latest
This will also install and/or update the checker, as needed.
To learn more about the W3C syntax checker, visit the page: https://validator.nu/about.html
If you believe that the W3C syntax checker is inappropriately reporting an error or warning, we recommend that you file a bug report with the checker.
BBEdit can search for text in images, via OS-provided image text recognition. Use the Find or Multi-File Search windows to search for (and extract, if desired) matches for a given string or Grep pattern within image files.
Some behavior notes:
image search is on by default for multi-file searches, and may be controlled via the “Search for text in image files” option, behind the Options button in the Multi-File Search window. (This option operates independently of file type selection.)
image search is disabled when running a Text Factory or when doing a multi-file Replace All operation.
to preserve compatibility with existing AppleScripts, image
search is done for scripted find verbs only when an
explicit search image files parameter requests it.
throughput for multi-file search is limited by the performance of the OS image text recognition, but repeated searches of the same image files within the same run of the application will be much faster.
Notebooks get a text search field at the bottom of the sidebar. You can use this to search for string matches in note names as well as contents.
Added settings to projects, instaprojects, and notebooks for project- (and notebook-) specific color scheme settings. Settings here will override the global preferences (including, subject to setting, any language-specific overrides).
For project documents that have been saved to disk, the color scheme settings are in the project settings (visible when clicking on the first item in the sidebar, corresponding to the project itself). For notebooks and instaprojects (created by opening a folder), the settings are available via the small gear in the action bar at the bottom of the sidebar.
Added controls to allow use of an alternative color scheme when printing, if desired. The default is to use the document’s current color scheme, but if you routinely work in Dark Mode and print things out, selecting an alternative color scheme generally provides a better outcome.
The printing color scheme can be changed per-document via the print panel, per-project via the project document settings, and globally in the Printing preferences.
NB: BBEdit will not use the color scheme’s background color when printing, so as to avoid excessive resource consumption. Also, when printing on paper, a color scheme with a light background will generally give more legible results than one with a dark background.
Split the “Deployment” settings group in web site projects into three new sections:
“Deployment Settings”, which includes the pre-deployment processing options.
“Deployment Location (Testing)”, which are the previous deployment location settings, carried over from existing projects.
“Deployment Location (Production)”, which is an additional deployment location.
The previous “Deploy Site” and “Re-Deploy Entire Site” commands (on Markup => Update as well as in the “cloud” menu in the project’s action bar) are renamed: “Deploy Site to Testing” and “Re-Deploy Entire Site to Testing”. This pair of commands uses the “Deployment Location (Testing)” settings for upload.
A new pair of commands on Markup => Update (and the “cloud” menu in the project’s action bar) are named (respectively) “Deploy Site to Production” and “DeployRe-Deploy Entire Site to Production”. These function similarly, but will use the “Deployment Location (Production)” settings.
There is no functional difference between “Testing” and “Production” deployments, except for the configured locations. In this fashion, you could (for example) use a local folder and/or server on your LAN for Testing, and a remote file system and/or a public-facing server for Production.
Keyboard emulation for vi is available, via the corresponding
setting in BBEdit’s “Keyboard” settings. This enables a basic set
of vi navigation and editing commands and modes. :q will
close the active document rather than quitting BBEdit.
When vi emulation is enabled, mode and command status are
displayed in the status bar immediately below the text area (and
just to the right of the cursor position). If you want that space
back, you can hide it via BBEdit’s “Appearance” settings.
Added a button to the Languages preferences for installing a desired language module. This will handle copying of the language module to the appropriate location; so any obsolete instructions regarding where to copy the module can be ignored. Using this button will offer to relaunch the application after installing the module; untitled/unsaved documents are preserved and existing documents will reopen.
The file information panel (via “Get Info” or the document status icon in the navigation bar) adds an indicator when the file has been quarantined by macOS. The adjacent “Clear” button will attempt to remove quarantine.
Expanded syntax coloring support, via the Language Server Protocol “semantic token coloring” feature. When supported by the language server, this allows the server to provide information on specific ranges of the source code that supplements BBEdit’s built-in syntax coloring for the given language.
In cases where the server provides coloring information for a given range of text, BBEdit will always prefer that information over its own keyword lookups (including ctags data).
The presentation and availability of this feature varies by the language and server implementation; some servers do not support semantic token coloring at all, and some do not color the full range of possible symbols.
Due to the requirements of the protocol and variations in individual server behavior, there may be an observable delay before the coloring adjusts when changes are made in the document. This is not under the application’s control.
Added support for the macOS standard sharing mechanics, via the context menu in text selections, and on the File menu when text is selected.
Added a command to the View menu: “Gather Untitled Documents”. This will collect all untitled (never saved) documents into the active window, removing them from other windows (and possibly closing those windows in the process).
Added a command to the View menu and to the contextual menu in the sidebar: “Move to Window…”. This opens a dialog in which you can choose an extant window for the active document (or selected sidebar documents, as appropriate), and upon confirmation moves the document(s) to the designated window and makes it active. A search box is available to filter candidates. Note that moving all of a window’s documents to another window may result in the active window closing.
An expert preference is available for enabling the logging of
any output generated by certain Git operations, such as push
and pull. Use the following Terminal command if desired:
defaults write com.barebones.bbedit EnableGitCommandOutput -bool YES
BBEdit will roll log files every 10MB; the rolled copy is compressed to save space. The size limit can be controlled via expert preference:
defaults write com.barebones.bbedit MaximumLogFileSize -int N
where N is an integer representing the maximum size, expressed in
megabytes. Use a value of zero to disable rollover. Changes to this
setting take effect the next time the application starts.
Added a separate “Hidden Items” file filtering option for disk browsers and projects (via the magnifying glass at the bottom of the sidebar); this separates file type filtering from visibility filtering, so (for example) you can show only dotfiles (and dotfolders) that are text files.
Separated file type filtering from invisibles filtering in the Open panel, via a new “Type:” menu (behind the Options button) which allows specification of which file types to show. “Show hidden items” will modify this.
Added “Import” and “Export” buttons to the Patterns list in the Setup window. This can be used to export patterns for sharing with others, or import patterns provided by others. “Export” will export only the selected patterns; if none are selected then it will export all patterns.
Enhanced the Unicode display section in the Character Inspector palette to show the Unicode code point names for the respective characters.
The Minimap palette gets a cursor position display, and a popup menu button displaying the name of the function containing the start of the selection range. Clicking on the function display will open a function menu, from which you can choose another location in the displayed file.
The image inspector shows information about any text that is recognized from the image (using OS facilities provided for the purpose).
Git revision lists (as used in “Compare Revisions”, “Compare Arbitrary Revisions”, and the file version menu in the navigation bar) get indicators for revisions that have annotations (such as commit tags or special status as branch head revisions). Further details are available via hover tooltips.
BBEdit can (now) read (and search) and write files compressed by
xz, with the same considerations as files compressed by gzip
or bzip2; namely, this is really only useful if the compressed
file being opened is a text file.
Added script attachment points for applicationWillChangeWorkspace and applicationDidChangeWorkspace.
Added a script attachment point for
applicationDidChangeGitBranch. Parameters to this attachment
script include the path to the working copy root, the previous
branch name, and the current branch name.
Added an expert preference to disable iCloud Drive support, to be used on the advice of tech support in specific cases when a malfunction in the OS internals prevents the application from starting or running normally.
AI worksheets support streamed responses, which will shorten the time before responses from the service start to appear in the worksheet. If wrapping is turned on (as it is by default), streamed responses will appear in chunks (corresponding to an unwrapped response line) rather than a word or two at a time.
Added an “Other…” item to the popup menu for model selection in the AI Worksheet preferences, as well as in the worksheet popover. This makes an API request to the service (if supported) requesting a list of the available models, and then provides a searchable list.
If you have an appropriate file at ~/Library/KeyBindings/DefaultKeyBinding.dict,
BBEdit will load this and map the key bindings to appropriate operations in the
application. (This is an old NeXTSTEP thing, supported since the dawn of Mac OS X,
and apparently it still works and at least one person still uses it.)
Added an option to bbdiff(1): --compare-git-ignored-files,
also usable as -G. This parallels the “Compare Git ignored
files” option for folder comparison in the Find Differences
window.
Added an option to bbdiff(1): --ignore-case, also usable as
-i. This parallels the corresponding setting in diff(1), and
provides a solution for performing case-insensitive diffs. (The
old --case-sensitive option is supported for existing scripts,
but because the default behavior of the tool has always been to
perform case-sensitive diffs in the absence of the option,
specifying it had no effect and there was no way to request a
case-insensitive diff.)
Added syntax coloring support for Pandoc/R-Markdown style citations in Markdown documents. (There is a corresponding color scheme setting.)
If you really want to use the prevailing system accent color for
the text insertion point, this can be done via the
UseSystemAccentColorForInsertionPoint expert preference. To
turn it on:
defaults write com.barebones.bbedit UseSystemAccentColorForInsertionPoint -bool true
“Process Duplicate Lines” gets a new option to include duplicate counts in the duplicated-lines output. Each duplicate line will be prefixed by the number of duplicates that were removed.
The PHP function scanner will generate fold ranges for
#region...#endregion blocks, and entries on the function menu
for named #region starts.
The panels for “Check Folder Syntax”, “Check Folder Links”, and “Update Folder” (via the Markup menu) use the same interface for choosing directories as the source control “choose working copy” panel.
The “Custom Settings” tab in the Languages preferences lists all installed languages, and provides quick access for adding and removing customizations, without requiring a trip to a menu button. Double-clicking on a row in the list opens the language-specific settings panel to add or edit custom settings; use the “x” button to clear any custom settings. The “+” button can be used instead of double-clicking to add custom settings.
The codeless language module internals have been extensively reworked to improve performance, and to correct longstanding issues. With these changes, individual patterns (string, comment, keyword, etc) can be tested and developed using the Pattern Playground if desired, and used in a language module with some assurance that they’ll behave consistently (which was by no means guaranteed before).
Use an abbreviated date format in FTP browsers if the width of the Date column indicates.
Added annotations to the summary in the Multi-File Search window for cases when options (behind the Options button) are set to non-default values. (Such as: skipping compressed files, searching Git ignored files, searching invisible folders, etc.)
Include project documents in the results presented by the “Commands” command.
Cheat sheets can now specify a policy for handling of backslash
character escapes in their contents. This is done by adding an
Options dictionary, containing a single key:
backslashEscapePolicy. The value of backslashEscapePolicy is
an integer, with one of three supported values: 0 for default
processing (applies if absent) which will process only backslash
escapes corresponding to control characters or hex escapes; 1
to process all backslash escape sequences including \\ for a
literal backslash; or 2 to suppress all backslash escape
processing and treat the text literally.
An example usage to suppress processing:
"Options": { "backslashEscapePolicy": 2 }
The Options dictionary may be present at the top level of the
cheat sheet, or within an individual entry in the Hints array.
If both are present, any conflicting settings are resolved in favor
of the individual entry.
Mark the “Forget” button in the Open Recent alert for a missing item as “has destructive action” so that it gets appropriate treatment by the macOS UI mechanics.
Versions released in the Mac App Store use updated macOS facilities provided for App Store operations, for improved behavior on newer versions of macOS.
Changed “ctags symbols” in the color scheme preferences to
“Indexed symbols”, since ctags may not necessarily be involved
in the process if LSP semantic coloring is in effect.
Added a new core run kind for language modules, to specify that a range is a regular expression. This supersedes the language-specific run kinds used in the JavaScript and Ruby language modules.
Subversion support has been retired.
By default, BBEdit will avoid scanning Git ignored folders
during multi-file search. Generally this is fine (and
significantly improves search performance), but it also ignores
exceptions that may be specified in the .gitignore file. To
address this when needed, BBEdit provides a setting in the
Multi-File Search options panel to search in Git ignored folders.
(This is off by default, for consistency with previous versions.)
By default, BBEdit suppresses the presentation of system-generated icons on application menu items. (See https://daringfireball.net/2026/03/what_to_do_about_those_menu_item_icons_in_macos_26_tahoe.)
In the Commands window, allow the search string to match parent menu titles for commands on submenus. (Thus, typing “Insert” will return commands on the Insert submenu of the Edit menu.)
Editing views will now display a red exclamation point for surrogate pairs describing characters in the Unicode private use area. These have been used in malicious code attacks (see https://arstechnica.com/security/2026/03/supply-chain-attack-using-invisible-code-hits-github-and-other-repositories/) and previously were not displayed correctly.
Transfer progress and other interactions (SFTP password request, host connection verification, &c) are presented in-window for FTP/SFTP browsers and the “Save to FTP/SFTP Server” panel. This improves overall behavior and resolves some lurking issues with progress presentation.
When creating a new project, BBEdit will put a .gitignore file
in it so that ephemeral and user-specific files are ignored when
adding the project to the repository.
If site deployment completes in the background, BBEdit will post a system notification.
Made significant performance improvements to SFTP protocol operations, including file transfers. Most operations will be visibly faster, in some cases an order of magnitude or more can be expected (limited by network throughput to the server).
Made changes to improve nominal performance of uppercase character mapping for case-insensitive searches.
Made a change to significantly improve parsing and scanning performance in the built-in language modules, particularly on extremely large files.
Made a change to significantly improve performance when calculating the longest line length in very large documents (for scrollbar calibration).
Made changes to significantly improve performance when typing (inserting, deleting) with a columnar selection.
Made some changes to reduce the performance cost of checking to see whether certain commonly encountered file types are Zip or tar archives.
Made changes to improve performance when filtering Zip archives and tarballs in the Open panel.
Made some small changes to improve performance of the tag balancer in pathological cases.
Made a change to improve performance when choosing items using the Multi-File Search “Other…” button.
Changes to improve low-level performance in a number of the built-in language modules.
Made Hex Dump run a tiny bit faster.
Made a change to reduce the amount of work done building the SDK file cache for Open File by Name.
Made efficiency improvements in shell worksheet status display, so that open shell worksheets consume no additional CPU when idle.
Made some micro-optimizations to reduce the overhead involved in preparing text for sub-line differences calculation.
Additional low-level efficiency improvements to nominally improve performance in some large-scale operations.
Fixed misbehavior in which items dragged from the Finder into the Multi-File Search window’s source list would add those items, rather than replacing the current selection as intended. (Holding the Option key will add the items, if desired.)
Made a change to resolve unexpected state restoration in situations where the application was quit less than a minute after restarting from an application self-update.
Made a change so that the OS no longer offers insertion of verification codes in BBEdit editing windows.
Layout fixes to modal progress dialogs/sheets when running on macOS 26.
Made a change to reduce cruft accumulated in the outboard document state storage:
expiration of saved state entries is strictly date-based; entries older than 30 days will be aged off, unless they have saved marker data (which can’t be easily reconstructed);
old entries with marker data are expired if the file for which the state was saved no longer exists.
Worked around OS misbehavior when removing notes from a notebook located in iCloud Drive.
Adjust file info panel layout for macOS 26 appearance.
Made a change so that the application doesn’t try to change any properties of the macOS color panel unless the color panel is actually visible. This works around a bug in macOS 26.
Corrected button layout in the filter editor sheet.
Fixed bug in which errors or other unexpected behaviors would result when specifying a host name in the bookmark editor or FTP/SFTP connection panel, and the name ended with a line break or other unexpected whitespace.
When printing a live preview window, zero the print margins so that the rendering fills the entire page.
Corrected button layout glitches when running on macOS 26 and later.
Fixed bug in which some dock menu commands were inappropriately available when in Free Mode.
Update the document date display in the status bar appropriately if the calendar day changes (such as across midnight, a time zone change, or sleep/wake cycle).
Corrected descriptions of change case actions in the scripting
dictionary.
When performing a single-file Replace All, any collapsed folds will remain collapsed whenever possible. This will come at a performance cost if your document has an extremely large number of collapsed folds.
Fixed bug in which “Compare with Previous” for files in a Git working copy didn’t pick the correct revision for comparison, and so would usually report no differences.
Corrected button layout in the Software Update window.
Fixed bug in which a transient progress dialog might appear immediately during operations that otherwise wouldn’t have required one (because they finished quickly enough to not require a progress indication).
Reworked the text-to-speech implementation (Start Speaking) to use newer macOS APIs. Whether this is an improvement remains to be determined.
The link checker will no longer report an error when the empty fragment (“#”) is used as a link target.
Fixed a bug in internal Apple Event targeting in which text transforms would report an error when invoked while keyboard focus was in the sidebar, rather than performing the operation as requested.
Added accessibility identifiers and help strings for the table views in the Preferences window.
Fixed bug in which the “Remove Line Breaks” text factory operation would crash if the input text didn’t change as a result of the operation.
Improved emphasis delimiter handling in the Markdown language module to match the CommonMark specification, including flanking rules and depth matching.
Corrected syntax coloring in C-family languages in cases where a comment (or something else other than whitespace) immediately followed an “L” size-qualified numeric literal.
Allow $ as an identifier character in C-family languages.
Updated the built-in model lists and default models for various chat API services.
Fixed a bug in the Unix Shell Script language module in which
regular expressions used in if [[...]] conditionals would
usually break function scanning.
Made a change to allow new untitled documents to land in the active project document’s window, even one that was created for a folder. (The implicit contract is that the document will later be saved in the instaproject’s folder or added to the project document if it is not discarded.)
Made changes to improve the visibility of the default insertion point cursor.
Made changes to improve the visibility of the underline cursor.
Use the monospaced-digit system font in the software update download progress dialog.
Made a change to address a race condition in which autosaved documents (such as scratchpads) would spuriously report that the document had been changed on disk.
Added objc_precise_lifetime to the keyword list for Objective-C/C++.
Fixed bug in which the Emacs state panel grabbed keyboard focus when first opened.
Fixed bug in which Perl, Python, Ruby, or Unix Shell Script files which didn’t have #! lines would report an error when trying to run them as scripts from the Script menu or from the Apply Text Filter submenu. This solution is general, so if a language module supports in-editor execution of scripts in that language, those scripts may also be started from the Scripts (or filters) menu.
Reworked the internal implementation shell worksheets to fix an assortment of longstanding misbehaviors. Worksheets should now be more responsive to cancellation in cases where shell intrinsics are running; and syntax errors in sent commands will no longer cause the underlying shell process to exit prematurely.
Fixed bug in which the application would look in the wrong place for custom-configured host-specific SSH keys.
Made some micro-optimizations to nominally improve efficiency in some text transforms.
Made a change to work around WebKit behavior in live preview windows which caused clicks on in-page links to open the link location in the web browser, instead of navigating there in the preview.
Updated the scripting dictionary to include a using parameter
for extract; if using a Grep pattern for extraction, this
exposes the ability to specify the extraction pattern.
Fixed bug in which collapsed sidebar sections in a project previously saved to disk were not restored to their correct collapsed state when opening the project.
Added logic to the HTML function scanner so that it’s not
confused as often by ?> when it occurs inside of strings within
<?php...?> code blocks.
Fixed clipping of the focus ring around the search box in the Open Recent and Commands panels.
Corrected the Git branch name display in the status bar when the
file’s repository uses the reftables format.
Fixed bug in which Markdown structures inside of footnotes weren’t colored as expected.
The Space bar is no longer allowed to toggle disabled items in the Multi-File Search sources list.
Improved behavior when working with text containing grapheme clusters (typically, emoji combining surrogate pairs and a modifier joined by a zero-width joiner character).
Fixed bug in which pax format metadata would confuse the tar
file parser, leading to empty browser windows when opening tar
archives (compressed or otherwise) for reading.
Fixed bug in which certain tar archives with old-format signed-byte checksum headers would fail to load.
Made some layout corrections in the Expert Preferences settings.
Corrected layout in the Text Colors preferences.
Fixed layout glitches in the application-specific print panel settings.
Fixed bug in fold generation in very large C-family source files.
The subtitle in progress dialogs is drawn using the monospaced-digit system font, to minimize text shifting when displaying counted progress operations.
Allow language module completion of custom keywords beyond the base keyword and “predefined symbol” types.
Don’t report an error during software update when the download is cancelled.
Fixed crash which would occur with some files, when extracting metadata for display in the the file info panel.
Fixed Bonjour discovery of SFTP servers running macOS 13.0 and later.
Fixed bug in the Lasso language module, in which nulls in the Lasso source would cause it to hang. Thanks to Nir Yehoshua at Cipher Security Labs for reporting this issue.
Fixed bug in the Java language module in which successive
unbalanced generic starts (<) in a Java class definition would
cause an infinite recursion, resulting in a crash. Thanks to Nir
Yehoshua at Cipher Security Labs for reporting this issue.
Fixed bug in which in-application edits to a .gitignore file
didn’t take effect until the application was quit and relaunched.
Improved syntax coloring and other handling of Ruby heredocs in which the opening delimiter is suffixed by a simple method call.
Fixed bug in the VHDL and Verilog language modules in which syntax coloring would get out of sync after certain edits.
Fixed a memory leak of attributed text displayed during LSP interactions (such as completion and hover help).
Fixed memory leak when handling changes to ctags files on disk.
Armorplated the site of a crash reported when creating a new Note and certain malformations existed in the notebook on disk.
Corrected layout in the Apply Text Transform dialog box on macOS Tahoe.
LSP workspace detection will recognize a buildServer.json file
as an indicator for a workspace root.
Fixed a bug in which site deployment would not deploy anything if the project’s local site root was Git ignored.
Corrected behavior in site deployment in which an error was reported while trying to remove metadata from image files whose format didn’t support the operation.
Fixed bug in which the application-modal progress panel might not appear during certain operations (such as site deployment).
Corrected appearance and layout of the various buttons in the Find and Multi-File Search windows. (For better or worse, macOS 26 will tint these.)
Fixed bug in which a Sort Lines operation in a text factory didn’t honor the option to randomize ordering, if that was set.
Fixed an unnecessary beep in the Pattern Playground.
Fixed a memory leak in the INI file parser.
Added code to guard against a reported crash.