An amazing plugin for Firefox that add vi-style keybindings. Truly amazing.
Go to file
Oliver Blanthorn 341aa6621d
release 1.25.0
# Release 1.25.0 / 2026-08-28

Codename "Carpenter"

- New features

    - `:bind` can now distinguish keydown and keyup events with `<D-...>` and `<U-...>` ([#1645](https://github.com/tridactyl/tridactyl/issues/1645))
    - `:smoothscrollwizard` sets up true smooth scrolling key bindings ([#2170](https://github.com/tridactyl/tridactyl/issues/2170))
    - `:tabclose --match` can now close multiple tabs with literal, case-sensitive title or URL matches ([#4777](https://github.com/tridactyl/tridactyl/issues/4777))
    - `:find -r` now supports JavaScript regular expressions ([#1612](https://github.com/tridactyl/tridactyl/issues/1612))
    - `:find` has completions once more
    - `gr` is now bound to newly sandboxed `:reader` where our binds work ([#5453](https://github.com/tridactyl/tridactyl/issues/5453))
    - `modeindicatorshowlastex` can now show the Ex command that `:repeat` would execute in the mode indicator ([#1234](https://github.com/tridactyl/tridactyl/issues/1234))
    - `gI` lets you choose an input using hints ([#3209](https://github.com/tridactyl/tridactyl/issues/3209))
    - `#` in visual mode now yanks a link to the selected text fragment ([#5407](https://github.com/tridactyl/tridactyl/issues/5407))
    - `<C-o>x` executes the current ex-command on all completions ([#3133](https://github.com/tridactyl/tridactyl/issues/3133))
    - `:fillcmdline --wait` waits for the command line to close before returning for use in `:composite` ([#5423](https://github.com/tridactyl/tridactyl/issues/5423))
    - `:help` now falls back to `:apropos` matches when prefix matching finds nothing ([#5478](https://github.com/tridactyl/tridactyl/issues/5478))
    - `:abbreviate` expands command-line abbreviations as you type ([#675](https://github.com/tridactyl/tridactyl/issues/675))
    - `:define` now looks up glossary terms, which are also searchable via `:help` and `:apropos` ([#2980](https://github.com/tridactyl/tridactyl/issues/2980))
    - `:set historysort frequency | recent | frecency` lets you control `:open` completions ([#2276](https://github.com/tridactyl/tridactyl/issues/2276))
    - `repeatblacklist` lets you exclude ex commands from `:repeat` ([#4159](https://github.com/tridactyl/tridactyl/issues/4159))
    - `:set` completions now find settings containing the query when no names start with it ([#1175](https://github.com/tridactyl/tridactyl/issues/1175))
    - `<PageUp>` and `<PageDown>` now page (ish) through ex completions ([#4164](https://github.com/tridactyl/tridactyl/issues/4164))
    - `ga` now switches to the tab that most recently stopped playing audio when none is audible ([#5049](https://github.com/tridactyl/tridactyl/issues/5049))
    - `:tabnext --skip-discarded` and `:tabprev --skip-discarded` skip discarded tabs ([#5246](https://github.com/tridactyl/tridactyl/issues/5246))
    - `:findrc` displays the local RC file selected by automatic RC discovery ([#3806](https://github.com/tridactyl/tridactyl/issues/3806))
    - `DocFocus` and `DocBlur` autocmds can run commands when pages gain or lose focus ([#1109](https://github.com/tridactyl/tridactyl/issues/1109))
    - `:recontain`, `:containerclose`, `:containerdelete`, and `:containerupdate` now get completions ([#5066](https://github.com/tridactyl/tridactyl/issues/5066))
    - `:containercreate --or-update` creates missing containers or updates existing ones ([#3025](https://github.com/tridactyl/tridactyl/issues/3025))
    - `]]` and `[[` now recognise next/previous links in more languages ([#324](https://github.com/tridactyl/tridactyl/issues/324))
    - `:set themeprivacy true` hides the active theme from page root elements ([#1586](https://github.com/tridactyl/tridactyl/issues/1586))
    - `:find -s` and `:find -i` now override `findcase` for case-sensitive and case-insensitive searches ([#2286](https://github.com/tridactyl/tridactyl/issues/2286))
    - `ModeEnter` and `ModeLeave` autocmds run when Tridactyl changes mode ([#997](https://github.com/tridactyl/tridactyl/issues/997))
    - `:autocontaindelete` removes individual `autocontain` rules ([#3649](https://github.com/tridactyl/tridactyl/issues/3649))
    - `<C-o>` in insert mode now executes a single normal mode binding ([#2370](https://github.com/tridactyl/tridactyl/issues/2370))
    - ex-mode completions now fall back to documentation search for unknown commands ([#944](https://github.com/tridactyl/tridactyl/issues/944))
    - `:quickmarkremove` removes a quickmark and its associated `gn`, `go`, `gw`, and `gp` bindings ([#4724](https://github.com/tridactyl/tridactyl/issues/4724))
    - `:set modeindicatorshowkeys` now shows Vimperator hint filters in the mode indicator ([#1669](https://github.com/tridactyl/tridactyl/issues/1669))
    - `:sanitise tridactylconfig` clears stored user configuration without removing commandline history or custom themes ([#5472](https://github.com/tridactyl/tridactyl/issues/5472))
    - `:unkeymap` removes key translations set with `:keymap` ([#1169](https://github.com/tridactyl/tridactyl/issues/1169))
    - `completions.History.autoselect` can now select the first history completion automatically ([#1370](https://github.com/tridactyl/tridactyl/issues/1370))
    - `:set searchurlopen` controls whether searchurls appear in `:open`, `:tabopen` and `:winopen` completions ([#4741](https://github.com/tridactyl/tridactyl/issues/4741))
    - `:set bmarkopen` can now exclude bookmarks from `:open`, `:tabopen`, and `:winopen` completions ([#1817](https://github.com/tridactyl/tridactyl/issues/1817))
    - `:urlmodify -s` now supports setting multiple query parameters ([#3361](https://github.com/tridactyl/tridactyl/issues/3361))
    - `:reader` now shows the word count and estimated reading time ([#4681](https://github.com/tridactyl/tridactyl/issues/4681))
    - `:tgroupswitch` now autoselects matching tab groups ([#4649](https://github.com/tridactyl/tridactyl/issues/4649))
    - `:set completions.Tab.initialposition top|auto|active` added to control where `:tab` completions open ([#4177](https://github.com/tridactyl/tridactyl/issues/4177))
    - `<ArrowUp>` and `<ArrowDown>` navigate completions when one is selected ([#3732](https://github.com/tridactyl/tridactyl/issues/3732))
    - `:tabdetach` now accepts `#/%` magic indices
    - `:find` uses much less washed-out native CSS highlights in Firefox 140+
    - Commands starting with a space are no longer saved to command history ([#4763](https://github.com/tridactyl/tridactyl/issues/4763))
    - `:js -rc` caches JavaScript source until the page or background context unloads ([#3839](https://github.com/tridactyl/tridactyl/issues/3839))
    - `:set hinthideobscured true` hides hints for elements obscured by other elements ([#4746](https://github.com/tridactyl/tridactyl/issues/4746))
    - `countaware` can now enable or disable counts per URL or mode with `:seturl` and `:setmode` ([#4993](https://github.com/tridactyl/tridactyl/issues/4993))
    - `:urlmodify --safe` prevents repeated navigation to the same URL within one second, avoiding redirect loops in `:autocmd`s ([#516](https://github.com/tridactyl/tridactyl/issues/516))
    - `:set hintnames words` uses random short words for hints ([#5482](https://github.com/tridactyl/tridactyl/issues/5482))
    - `superignore` can now be toggled globally from the toolbar popup ([#822](https://github.com/tridactyl/tridactyl/issues/822))
    - `:colourscheme --url` reuses downloaded themes unless given `--update` to ease use in RC files
    - `:ttscontrol` now supports `play`, `pause`, `playpause`, and `stop` ([#217](https://github.com/tridactyl/tridactyl/issues/217))
    - `:downloads` now opens `about:downloads` in a new tab ([#615](https://github.com/tridactyl/tridactyl/issues/615))
    - `:dialog` opens Firefox `about:` pages, with `:d` as an alias ([#137](https://github.com/tridactyl/tridactyl/issues/137))
    - unambiguous prefixes of ex-commands are now accepted as ex-commands ([#3416](https://github.com/tridactyl/tridactyl/issues/3416))
    - `:guiset sidebar hide` hides the Firefox sidebar ([#5232](https://github.com/tridactyl/tridactyl/issues/5232))
    - `:unbind --all` unbinds every key in a mode, while `--mode=*` targets every mode ([#1774](https://github.com/tridactyl/tridactyl/issues/1774))
    - `text.unix_word_rubout` deletes back to the previous sequence of letters ([#3407](https://github.com/tridactyl/tridactyl/issues/3407))
    - `Tab` now highlights the selected hint label as well as the element ([#3751](https://github.com/tridactyl/tridactyl/issues/3751))
    - `,i` in the exemplar `.tridactylrc` opens Tridactyl GitHub issues by number

- Bug fixes

    - `:undo` should never randomly restore an older window rather than your most recently closed tab ([#772](https://github.com/tridactyl/tridactyl/issues/772))
    - `blacklistkeys` now supports keyseq syntax such as `<C-,>`; `:bind --mode=browser` binds are protected automatically ([#2712](https://github.com/tridactyl/tridactyl/issues/2712))
    - `leavegithubalone` now applies in all modes except ignore mode ([#2082](https://github.com/tridactyl/tridactyl/issues/2082))
    - `sanitise` no longer causes lines in RC files to be skipped ([#1409](https://github.com/tridactyl/tridactyl/issues/1409))
    - hints now appear above newfangled modal dialogs ([#4954](https://github.com/tridactyl/tridactyl/issues/4954))
    - `noiframe` now defaults to `lazy`, fixing a few pathological websites ([#639](https://github.com/tridactyl/tridactyl/issues/639))
    - `:jsonview` works again in FF152+
    - `:tab` and `:taball` no longer move the command line up when closing tabs ([#3174](https://github.com/tridactyl/tridactyl/issues/3174))
    - commands using `fillcmdline_tmp` no longer wait for its temporary message to disappear ([#5422](https://github.com/tridactyl/tridactyl/issues/5422))
    - `w` no longer collapses selections in visual mode ([#2100](https://github.com/tridactyl/tridactyl/issues/2100))
    - `:help` once again shows the full ex-command for related binds ([#1352](https://github.com/tridactyl/tridactyl/issues/1352))
    - `g;` now skips closed tabs ([#3506](https://github.com/tridactyl/tridactyl/issues/3506))
    - `gi` now remembers the last input across page loads ([#3124](https://github.com/tridactyl/tridactyl/issues/3124))
    - `:taball` now respects `:set tabsort mru` ([#4668](https://github.com/tridactyl/tridactyl/issues/4668))
    - JS hints now include elements with `onclick` handlers ([#5364](https://github.com/tridactyl/tridactyl/issues/5364))
    - tab changes are now batched and sent only to the active tab, reducing memory use when restoring large sessions ([#3973](https://github.com/tridactyl/tridactyl/issues/3973))
    - JS hints should no longer cause tabs to leak memory on pages with lots of dynamic content ([#5230](https://github.com/tridactyl/tridactyl/issues/5230))
    - mode indicator now updates correctly when focus changes ([#414](https://github.com/tridactyl/tridactyl/issues/414))
    - tab completions no longer accumulate listeners and objects, reducing memory usage ([#1302](https://github.com/tridactyl/tridactyl/issues/1302))
    - binds now work in same-origin iframes, including dynamically added frames (mostly Google Docs) ([#1971](https://github.com/tridactyl/tridactyl/issues/1971))
    - visual mode now works in same-origin iframes
    - scroll positions now restore correctly when going back or forward in history ([#834](https://github.com/tridactyl/tridactyl/issues/834))
    - `:keyfeed` can now be used in keybinds ([#5403](https://github.com/tridactyl/tridactyl/issues/5403))
    - `zz` now resets page zoom to Firefox's default zoom level ([#3581](https://github.com/tridactyl/tridactyl/issues/3581))
    - `:colourscheme --url` now infers the theme name from the URL filename ([#3289](https://github.com/tridactyl/tridactyl/issues/3289))
    - numeric `vimperator-reflow` hints no longer clash after filtering ([#5279](https://github.com/tridactyl/tridactyl/issues/5279))
    - `:find` highlights now stay aligned when pages resize, scroll, or update dynamically ([#2666](https://github.com/tridactyl/tridactyl/issues/2666))
    - `:tabfirst` and `:tablast` now always use Firefox's tab order, regardless of `tabsort` ([#4714](https://github.com/tridactyl/tridactyl/issues/4714))
    - `:unseturl` now completes URL patterns ([#3862](https://github.com/tridactyl/tridactyl/issues/3862))
    - `:guiset` now reports the profile path where it wrote `userChrome.css` ([#3064](https://github.com/tridactyl/tridactyl/issues/3064))
    - JS hints should no longer leak memory when pages replace elements ([#5425](https://github.com/tridactyl/tridactyl/issues/5425))
    - `;p` now filters out empty, whitespace-only and redundant text hints ([#5178](https://github.com/tridactyl/tridactyl/issues/5178))
    - `:tabdetach` now errors instead of moving a private tab into a non-private window when detaching fails
    - `:nmode` now ignores an initial keyup by default (`:nmode --strict` accepts it) ([#5475](https://github.com/tridactyl/tridactyl/issues/5475))
    - `:setpref` completions work again on Windows ([#1103](https://github.com/tridactyl/tridactyl/issues/1103))
    - `text.beginning_of_line` works again on inputs with selection-handling scripts ([#3890](https://github.com/tridactyl/tridactyl/issues/3890))
    - `:help` setting inputs now apply changes when pressing Enter ([#3129](https://github.com/tridactyl/tridactyl/issues/3129))
    - command completions now work correctly with aliases ([#5464](https://github.com/tridactyl/tridactyl/issues/5464))
    - `autocontain` now follows the configured proxy order, including failover proxies ([#4917](https://github.com/tridactyl/tridactyl/issues/4917))
    - `:tabdiscard --all` now discards all tabs even when a tab title contains 'all' (lol) ([#5147](https://github.com/tridactyl/tridactyl/issues/5147))
    - non-ASCII URLs now display correctly in completion panes and copy correctly ([#4519](https://github.com/tridactyl/tridactyl/issues/4519))
    - `:tabmove +1` and `:tabmove -1` now work correctly with hidden and pinned tabs ([#5441](https://github.com/tridactyl/tridactyl/issues/5441))
    - configuration changes no longer get lost when made in quick succession ([#5431](https://github.com/tridactyl/tridactyl/issues/5431))
    - `:hint` no longer shows hints for hidden or off-screen elements ([#5434](https://github.com/tridactyl/tridactyl/issues/5434))
    - Page keypresses should no longer be swallowed after cancelling a keybinding ([#4958](https://github.com/tridactyl/tridactyl/issues/4958))
    - `:autocontain` no longer loops when multiple containers share a name ([#2293](https://github.com/tridactyl/tridactyl/issues/2293))
    - Command-line messages and update checks no longer replace the command used by `:repeat`
    - `:editor` now reports errors instead of silently failing, including when no editable element was previously focused ([#4697](https://github.com/tridactyl/tridactyl/issues/4697))
    - `insert` and `input` modes no longer interpret leading numbers as numeric prefixes ([#4492](https://github.com/tridactyl/tridactyl/issues/4492))
    - `<C-u>` now works in multiline contenteditable elements ([#1151](https://github.com/tridactyl/tridactyl/issues/1151))
    - `<Space>` in the command line no longer inserts spaces out of order when input arrives quickly ([#5447](https://github.com/tridactyl/tridactyl/issues/5447))
    - `f` hint mode now ignores disabled form controls
    - `:urlincrement` preserves percent encoding ([#4723](https://github.com/tridactyl/tridactyl/issues/4723))
    - `:bind` now reports binds for the focused window's URL ([#5092](https://github.com/tridactyl/tridactyl/issues/5092))
    - site-specific settings now update correctly when switching between Firefox windows ([#5443](https://github.com/tridactyl/tridactyl/issues/5443))
    - `:autocontain` no longer creates duplicate containers when multiple matching tabs open at once ([#5290](https://github.com/tridactyl/tridactyl/issues/5290))
    - config migration now runs immediately, so settings changed during startup are no longer overwritten ([#5449](https://github.com/tridactyl/tridactyl/issues/5449))
    - `:mode` now reports an error instead of breaking Tridactyl when called without a mode ([#5388](https://github.com/tridactyl/tridactyl/issues/5388))
    - `:tabdetach` works again when Firefox cannot resolve the default new-window URI ([#5454](https://github.com/tridactyl/tridactyl/issues/5454))
    - `:tabopen` now matches autocontainer rules against canonicalised URLs
    - `:editor` now works with textareas that require input events to accept changes ([#5359](https://github.com/tridactyl/tridactyl/issues/5359))
    - insert mode now works for input elements in closed shadow DOMs ([#5412](https://github.com/tridactyl/tridactyl/issues/5412))
    - `:unbind` can now unbind binds inherited from other modes ([#5389](https://github.com/tridactyl/tridactyl/issues/5389))
    - `:reader` no longer overrides syntax highlighting in code blocks ([#4931](https://github.com/tridactyl/tridactyl/issues/4931))
    - `\\` in RC files now preserves a literal `\` ([#2334](https://github.com/tridactyl/tridactyl/issues/2334))
    - `:nmode` works when called from insert mode ([#4437](https://github.com/tridactyl/tridactyl/issues/4437))
    - `:open` and `:tabopen` now work with `file:` URLs from `searchurls` ([#1415](https://github.com/tridactyl/tridactyl/issues/1415))
    - expired `:reader` tabs now explain how to return with `:back` and run `:reader` again ([#5320](https://github.com/tridactyl/tridactyl/issues/5320))
    - `:set hintshift true` now automatically highlights the shifted hint ([#2418](https://github.com/tridactyl/tridactyl/issues/2418))
    - `:bmarks -b` now shows bookmark completions ([#4166](https://github.com/tridactyl/tridactyl/issues/4166))
    - hints no longer remain on the page after leaving `hint` mode, no matter how you left ([#1236](https://github.com/tridactyl/tridactyl/issues/1236))
    - more non-standard dropdowns now enter insert mode when focused ([#281](https://github.com/tridactyl/tridactyl/issues/281))
    - Vimperator hint filtering now matches spaces literally when Space is unbound ([#3029](https://github.com/tridactyl/tridactyl/issues/3029))
    - `:taball`, `:tabgrab`, and window completions now update when tabs change ([#2645](https://github.com/tridactyl/tridactyl/issues/2645))
    - custom themes no longer require a `tridactylrc` file ([#1378](https://github.com/tridactyl/tridactyl/issues/1378))
    - `:colourscheme --url` now more reliably applies newly downloaded custom themes ([#5307](https://github.com/tridactyl/tridactyl/issues/5307))
    - `gg` and `G` now scroll smoothly when `:set smoothscroll true` is enabled ([#3639](https://github.com/tridactyl/tridactyl/issues/3639))
    - `:gobble` now accepts `Tab` as part of the key sequence
    - `:bindwizard` now includes `<Tab>` in the generated key sequence ([#4772](https://github.com/tridactyl/tridactyl/issues/4772))
    - `:set modeindicatormodes.normal false` now hides the mode indicator immediately on page load ([#5085](https://github.com/tridactyl/tridactyl/issues/5085))
    - `:setnull` now offers setting completions ([#3673](https://github.com/tridactyl/tridactyl/issues/3673))
    - `<S-Space>` bindings now work ([#4175](https://github.com/tridactyl/tridactyl/issues/4175))
    - Vimperator hints now prefer exact matches over longer hints with the same prefix ([#2935](https://github.com/tridactyl/tridactyl/issues/2935))
    - `:source --url` no longer shows filesystem completions ([#2331](https://github.com/tridactyl/tridactyl/issues/2331))
    - `<C-o>w` now works with `:bmarks ` completions ([#5451](https://github.com/tridactyl/tridactyl/issues/5451))
    - scrolling works better on pages using CSS smooth scrolling ([#5452](https://github.com/tridactyl/tridactyl/issues/5452))
    - `:winopen -popup -c` now opens popup windows in the specified container ([#4959](https://github.com/tridactyl/tridactyl/issues/4959))
    - `fillcmdline` bindings now buffer page keypresses reliably, including aliases and `:composite` commands ([#5436](https://github.com/tridactyl/tridactyl/issues/5436))
    - `:hint` now reports invalid CSS selectors instead of hanging
    - `auconcreatecontainer` no longer creates containers just to look up proxies
    - `:focusinput -l` no longer remembers insubstantial inputs on page focus ([#5413](https://github.com/tridactyl/tridactyl/issues/5413))
    - `:winopen` no longer opens an extra dummy tab when using container plugins ([#4000](https://github.com/tridactyl/tridactyl/issues/4000))
    - Command line sessions no longer block each other after a command gets stuck ([#3411](https://github.com/tridactyl/tridactyl/issues/3411))
    - `blacklistkeys` now protects keys pressed in iframes (e.g. Google Docs!) ([#5480](https://github.com/tridactyl/tridactyl/issues/5480))
    - `file:` hints now open via `:open` instead of failing silently ([#5080](https://github.com/tridactyl/tridactyl/issues/5080))
    - hints no longer make animated elements disappear ([#3548](https://github.com/tridactyl/tridactyl/issues/3548))
    - `modeindicator` now updates without reloading the page ([#4738](https://github.com/tridactyl/tridactyl/issues/4738))
    - `<C-o>yy` now closes the command line after copying a completion ([#3256](https://github.com/tridactyl/tridactyl/issues/3256))
    - `:back` branches are now sorted by newest members ([#5492](https://github.com/tridactyl/tridactyl/issues/5492))
    - `modeindicator` now works on pages without a `<body>` ([#1163](https://github.com/tridactyl/tridactyl/issues/1163))
    - dark theme hint highlights now remain readable on light pages ([#4420](https://github.com/tridactyl/tridactyl/issues/4420))
    - mode indicator text no longer appears in Firefox's find results ([#2089](https://github.com/tridactyl/tridactyl/issues/2089))
    - `;x` and `;X` now work in same-origin iframes ([#3261](https://github.com/tridactyl/tridactyl/issues/3261))
    - counts are no longer interpreted in ex, ignore, or hint mode ([#1658](https://github.com/tridactyl/tridactyl/issues/1658))
    - content state listeners no longer run when nothing changed ([#2360](https://github.com/tridactyl/tridactyl/issues/2360))
    - completions update when navigating ex command history ([#5109](https://github.com/tridactyl/tridactyl/issues/5109))
    - `:autocmddelete` now works on default autocmds ([#4605](https://github.com/tridactyl/tridactyl/issues/4605))
    - `:tabopen -c` no longer loses its specified container in strict `autocontainmode` ([#3562](https://github.com/tridactyl/tridactyl/issues/3562))
    - `searchurls` now always encode search terms, including `#` ([#5122](https://github.com/tridactyl/tridactyl/issues/5122))
    - `:source` for local files and `:mktridactylrc` now show a helpful error when native is missing ([#3730](https://github.com/tridactyl/tridactyl/issues/3730))
    - `modeindicator` breaks fewer pages ([#821](https://github.com/tridactyl/tridactyl/issues/821))
    - `:tabopen` should no longer open tabs in the wrong window ([#1019](https://github.com/tridactyl/tridactyl/issues/1019))
    - completion results should no longer appear out of order when filtering is slow ([#4584](https://github.com/tridactyl/tridactyl/issues/4584))
    - `:native` now reports detailed native messenger errors ([#1555](https://github.com/tridactyl/tridactyl/issues/1555))
    - commandline now works on more pages with restrictive CSP ([#5474](https://github.com/tridactyl/tridactyl/issues/5474))
    - `:keymap .` works ([#2333](https://github.com/tridactyl/tridactyl/issues/2333))
    - `:extoptions` completions work again ([#5459](https://github.com/tridactyl/tridactyl/issues/5459))
    - `:winopen -c` now opens URLs directly in the specified container ([#5439](https://github.com/tridactyl/tridactyl/issues/5439))
    - configuration saving now preserves values that JSON stringification would discard
    - JS hints now use the same visibility checks as regular hints
    - `:fillcmdline_tmp` no longer blocks completions until its timeout expires ([#5402](https://github.com/tridactyl/tridactyl/issues/5402))
    - `followpagepatterns` now accepts ordered pattern arrays so `]]` and `[[` are less likely to jump straight to the first/last page ([#1730](https://github.com/tridactyl/tridactyl/issues/1730))
    - `:guiset` now reports native messenger write errors ([#2094](https://github.com/tridactyl/tridactyl/issues/2094))
    - beta builds now use the next release's version number rather than claiming to be pre-releases of the previous version
    - `HistoryState` autocmds now trigger reliably on same-document navigation ([#4329](https://github.com/tridactyl/tridactyl/issues/4329))
    - `:q` can no longer report “Message manager disconnected” when closing tabs ([#1528](https://github.com/tridactyl/tridactyl/issues/1528))
    - `:set newtab about:blank` now shows `&centerdot;` rather than `New Tab` as the tab title ([#5021](https://github.com/tridactyl/tridactyl/issues/5021))
    - macOS Firefox profile detection now finds profiles three directories deep ([#1627](https://github.com/tridactyl/tridactyl/issues/1627))
    - Missing `tridactylrc` errors now point to `:help source` and include native error details ([#4088](https://github.com/tridactyl/tridactyl/issues/4088))
    - `xclip` processes now exit after setting the clipboard ([#4822](https://github.com/tridactyl/tridactyl/issues/4822))
    - Native messenger errors now include the underlying error instead of hiding it ([#4827](https://github.com/tridactyl/tridactyl/issues/4827))
    - `:nativeopen` now works with Firefox Nightly on macOS ([#1113](https://github.com/tridactyl/tridactyl/issues/1113))
    - `:tabdiscard` now reports an error when no tab index is provided ([#5400](https://github.com/tridactyl/tridactyl/issues/5400))
    - `modeindicatormodes` now applies to the mode indicator on page load ([#2690](https://github.com/tridactyl/tridactyl/issues/2690))
    - ex-mode (commandline) help works again ([#5044](https://github.com/tridactyl/tridactyl/issues/5044))
    - hidden mode indicators no longer flash while scrolling ([#4760](https://github.com/tridactyl/tridactyl/issues/4760))
    - `find` no longer (fails to) run on Windows during Firefox profile detection ([#2130](https://github.com/tridactyl/tridactyl/issues/2130))
    - `:editor` now works in inputs inside elements with IDs starting with digits ([#2676](https://github.com/tridactyl/tridactyl/issues/2676))
    - `searchurls` now only interpolates documented `%s1-9` placeholders ([#3868](https://github.com/tridactyl/tridactyl/issues/3868))
    - `:js` now works with JavaScript filenames containing `-d` ([#3684](https://github.com/tridactyl/tridactyl/issues/3684))
    - `:guiset hoverlink left` works again after using `none` ([#1957](https://github.com/tridactyl/tridactyl/issues/1957))
    - `halloween` theme no longer breaks commands such as `:hint -y` ([#2025](https://github.com/tridactyl/tridactyl/issues/2025))

- Miscellaneous

    - `:bind` docs now explain how to use Firefox-reserved keys such as `<C-n>` via `about:keyboard` ([#5335](https://github.com/tridactyl/tridactyl/issues/5335))
    - `:help` navigation pane now links to commands, settings, tutorial, editor functions, hint mode commands, and the wiki ([#5194](https://github.com/tridactyl/tridactyl/issues/5194))
    - `:tutor` now has a navigation pane for jumping between tutorial pages ([#5311](https://github.com/tridactyl/tridactyl/issues/5311))
    - `:back` and `:forward` documentation now explains counts and the tab history tree ([#4737](https://github.com/tridactyl/tridactyl/issues/4737))
    - the changelog on the new tab now uses an accessible `<details>` toggle ([#5029](https://github.com/tridactyl/tridactyl/issues/5029))
    - `--tridactyl-search-highlight-color` and `--tridactyl-search-highlight-active-color` can now customise normal and active `:find` highlights ([#3040](https://github.com/tridactyl/tridactyl/issues/3040))
    - `:set` completions can now show column headings for settings, current values, possible values, and documentation ([#966](https://github.com/tridactyl/tridactyl/issues/966))
    - `:goto` completions now show heading trees like `:back` ([#5456](https://github.com/tridactyl/tridactyl/issues/5456))
    - `--tridactyl-container-border` lets themes style mode indicator borders in container tabs ([#3897](https://github.com/tridactyl/tridactyl/issues/3897))
    - `--mode` completions now show descriptions for each binding mode ([#3312](https://github.com/tridactyl/tridactyl/issues/3312))
    - `tri.l` now logs non-promises as well ([#4352](https://github.com/tridactyl/tridactyl/issues/4352))
    - `:tutor` previous-page links are now visible and labelled ([#5026](https://github.com/tridactyl/tridactyl/issues/5026))
    - `:set` now handles arrays in deep settings ([#2918](https://github.com/tridactyl/tridactyl/issues/2918))
    - `:hint -W` now uses the content script where possible ([#3569](https://github.com/tridactyl/tridactyl/issues/3569))
    - `:source` now runs config updaters after importing an RC file ([#1905](https://github.com/tridactyl/tridactyl/issues/1905))
    - builds now work in Git worktrees ([#5442](https://github.com/tridactyl/tridactyl/issues/5442))
    - `scripts/sign nosignbeta` no longer includes an `update_url` in unsigned beta builds ([#2720](https://github.com/tridactyl/tridactyl/issues/2720))
    - `:drawingstart` now shows a cursor to help you aim better ([#4006](https://github.com/tridactyl/tridactyl/issues/4006))
    - Tridactyl no longer errors when `PerformanceObserver` is unavailable ([#1757](https://github.com/tridactyl/tridactyl/issues/1757))
    - `wine-pyinstaller.sh` now supports newer versions of Wine and 7-Zip ([#1240](https://github.com/tridactyl/tridactyl/issues/1240))
    - `:tutor` no longer breaks the troubleshooting guide link ([#5209](https://github.com/tridactyl/tridactyl/issues/5209))
    - `scripts/version.js bump` now adds release notes to release commits and dates the matching changelog entry ([#517](https://github.com/tridactyl/tridactyl/issues/517))
    - `:source` and `:mkt` now document RC file syntax, search precedence, and one-time loading ([#3902](https://github.com/tridactyl/tridactyl/issues/3902))
    - `:tutor` now documents container commands, settings, and automatic container assignment ([#3008](https://github.com/tridactyl/tridactyl/issues/3008))
    - `:mode ignore` docs now explain its toggle shortcuts and how to bind custom toggles ([#2108](https://github.com/tridactyl/tridactyl/issues/2108))
    - website builds work again ([#5144](https://github.com/tridactyl/tridactyl/issues/5144))
    - `:colourscheme` docs now link to the custom theme guide and explain flashes while themes load ([#3466](https://github.com/tridactyl/tridactyl/issues/3466))
    - `profiledir` docs now explain automatic detection, absolute paths, and Firefox `-P`/`--profile` launch options ([#4149](https://github.com/tridactyl/tridactyl/issues/4149))
    - `:ttsread` docs now explain how to read selected text in visual mode ([#3848](https://github.com/tridactyl/tridactyl/issues/3848))
    - `yarn pretty` now shows the changes it makes to staged files ([#2514](https://github.com/tridactyl/tridactyl/issues/2514))
    - Firefox's "Never remember history" setting now has a troubleshooting note explaining its effect on Tridactyl's persistent state ([#4302](https://github.com/tridactyl/tridactyl/issues/4302))
    - daily E2E runs now test the latest Firefox beta to help us catch broken stuff before it reaches most users ([#5241](https://github.com/tridactyl/tridactyl/issues/5241))
    - `:open site [query]` jsurl added to example .tridactylrc for searching the current website ([#5358](https://github.com/tridactyl/tridactyl/issues/5358))
    - `:tutor` now explains how to inspect current bindings with `:viewconfig` and `:bind --mode=` ([#3228](https://github.com/tridactyl/tridactyl/issues/3228))
    - e2e tests now exit reliably after cleaning up all WebDriver instances
    - `browser-targets.json` now shares minimum browser versions between build targets
    - `:hint -k` and `:hint -K` documentation now clearly distinguishes deleting from hiding ([#5052](https://github.com/tridactyl/tridactyl/issues/5052))
    - TypeScript 6 and TypeDoc 0.28 are now used for builds and documentation (I had been putting this off for ~5 years) ([#5450](https://github.com/tridactyl/tridactyl/issues/5450))
    - `proxy` now documents that `none` disables the proxy and works with `:autocontain` ([#4226](https://github.com/tridactyl/tridactyl/issues/4226))
    - `:updatenag` now gives the correct steps for checking Tridactyl updates in Firefox ([#5415](https://github.com/tridactyl/tridactyl/issues/5415))
    - `:rssexec` e2e test is less flaky ([#5426](https://github.com/tridactyl/tridactyl/issues/5426))
    - on Windows `:nativeinstall` now suggests running cmd.exe as Administrator if installation fails ([#4512](https://github.com/tridactyl/tridactyl/issues/4512))
    - AMO credentials are now hidden from `scripts/sign` logs ([#3633](https://github.com/tridactyl/tridactyl/issues/3633))
    - `:guiset` help now explains how to find and set `profiledir` on Windows ([#4462](https://github.com/tridactyl/tridactyl/issues/4462))
    - `:bind` and `:gobble` docs now explain dynamic keybindings and the `:command` alias workaround ([#1985](https://github.com/tridactyl/tridactyl/issues/1985))
    - `profiledir` docs now warn against surrounding paths with quotes ([#4726](https://github.com/tridactyl/tridactyl/issues/4726))
    - E2E tests no longer fail when Google blocks CI
    - argument parsing now applies default option values consistently to `:find`, `:findnext`, `:tabprev`, and `:keyfeed` ([#4711](https://github.com/tridactyl/tridactyl/issues/4711))
    - `editorcmd` now documents `start /wait` for Windows editors ([#5072](https://github.com/tridactyl/tridactyl/issues/5072))
    - `:source` and `:sanitise` docs now warn that persisted settings may briefly apply at startup ([#1179](https://github.com/tridactyl/tridactyl/issues/1179))
    - RC file documentation now links to GitHub code search for other `tridactylrc` files ([#4736](https://github.com/tridactyl/tridactyl/issues/4736))
    - `<C-[>` is now unbound in the exemplar `.tridactylrc`, freeing it for back navigation ([#5365](https://github.com/tridactyl/tridactyl/issues/5365))
    - Normal mode tutorial now clearly explains keyword searches ([#5051](https://github.com/tridactyl/tridactyl/issues/5051))
    - `:discardall` now aliases the built-in `:tabdiscard --all` command in the example config ([#5479](https://github.com/tridactyl/tridactyl/issues/5479))
    - `:js` help now correctly displays examples for custom ex-commands
    - `searchurls.julia` has been removed from the example RC

Thanks to all of our contributors for this release: Oliver Blanthorn, Chic-Tweetz, mmustafasenoglu, gholk, glacambre, paris and wskozel.

Extra special thanks go to mmustafasenoglu and wskozel who both contributed for the first time.

Last, but not least - thank you to everyone who reported the issues we closed in this release: bovine3dom, glacambre, people who have since deleted their GitHub accounts, notJerl, cmcaine, GHolk, Rummskartoffel, indeedwatson, Monirzadeh, mozbugbox, alerque, antonva, avalonv, Chic-Tweetz, eboth, ELLIOTTCABLE, guy-who-googles, hejops, jkavalec, laur89, MoltenMonster, ok-nick, pataquets, rodrigo-morales-1, saulrh, utsekaj42, wavexx, a7u8, aavogt, abo-abo, adamency, alanoliveira, albert-ying, Alice-Null, allanwind, anmolmathias, antran22, Artikool5, asteroidcow, azatoth, bambams, basbebe, Betelgeuse1, bew, b-jazz, bodograumann, booxter, borazan, boriselec, bpmcl, braham-snyder, caputchinefrobles, cheonhyangzhang, codesoverhill, CoelacanthusHex, Corallus-Caninus, cprn, davidsierradz, dioobspm, dmpetroff, dotancohen, dwawlyn, dwolf42, e00E, farnoy, Flimm, frenchbeard, gcmurray1990, Geobert, glm4610, glyh, groundstation1, gsbabil, henk84, henkworks, herrsimon, heyzec, HiPhish, hnorkowski, hpfr, IceAsteroid, In-line, j-a-m-l, jcrowgey, jimrs, jjeffrey, j-lakeman, Jonta, jumper047, KAGEYAM4, kartynnik, kpeejp, kwstannard, lyterk, madduck, make-github-pseudonymous-again, Massimo-B, Mercvre80, mesaprotector, mightyiam, MilanV, minhduc0711, mist, mocamp3, mornfall, Nampuk, natefabian18, newbould5, nicksavoie, nkitsaini, noctuid, noib3, nullpointseven, numirias, nvkrishna77, otterlover24, OwenAR, oxysoft, pengowen123, pickfire, pmaziere, pnelson, pufferfish-connoisseur, pzzxqj, quisquama, Qwyntex, radgeRayden, raffaelemancuso, ricardoseriani, robertgzr, russsharek, rutgersc, scottjad, silmeth, solna86, stagnation, StarTroop, stef, synaps13, Terx37, ThinkChaos, timokau, timss, tom-mi, user471, Utopiah, vaibhav423, Vftdan, vulns-are-features-too, waterbear5, whnr, winchendonsprings, WloHu, Wolfbeta, WolodiaM, x-ji, xNyfPtx, ybc37, yegle and zsugabubus!
2026-08-28 11:08:42 +02:00
.github Fix #5510: make e2e headless by default 2026-08-22 11:32:03 +02:00
ci Move prettier to linter rather than pre-commit 2026-06-06 13:44:24 +02:00
contrib Fix #5303: Stop styling commandline 2025-12-03 12:51:04 +01:00
custom-eslint-rules Turn unsupported-apis into a rule factory 2026-07-11 15:02:07 +02:00
doc Add more words to the glossary 2026-07-27 13:35:03 +02:00
e2e_tests Fix #5510: make e2e headless by default 2026-08-22 11:32:03 +02:00
hooks Move prettier to linter rather than pre-commit 2026-06-06 13:44:24 +02:00
native Reapply "Bump native version to 0.5.0" 2024-10-06 17:55:29 +02:00
scripts Update thanks to include people who filed issues 2026-08-03 09:18:49 +02:00
src Fix #5503: add resize observer 2026-08-22 11:29:40 +02:00
vendor/qrcode fixed some typos in readme file and prettified it 2023-06-14 23:44:43 +05:30
.appveyor.yml s/npm/yarn 2019-05-31 16:48:53 +01:00
.editorconfig Add .editorconfig 2020-08-27 17:28:32 -04:00
.eslintignore Stop trying to lint non-project files 2021-03-16 22:06:47 +01:00
.eslintrc.js Update to ts6 2026-07-20 00:24:35 +02:00
.gitignore Re-implement metadata API on top of tsdoc output 2026-07-19 11:09:47 +02:00
.prettierrc Prevent prettier from adding line breaks to excmds 2018-04-13 19:17:22 +01:00
.tridactylrc Add non-ai google and newspaper theme to rc 2026-08-02 10:21:42 +02:00
AGENTS.md Fix #5377: add agents.md to encourage reviewable PRs 2026-04-20 12:25:26 +02:00
browser-targets.json Swap icky stringification for a proper clone 2026-07-16 13:02:20 +02:00
CHANGELOG.md release 1.25.0 2026-08-28 11:08:42 +02:00
contributing.md Fix #5078: broken link 2024-11-09 17:24:31 +01:00
funding.json Add funding.json for floss.fund 2026-05-17 13:43:47 +02:00
issue_template.md Fix #3172: encourage people to troubleshoot 2021-01-28 21:38:00 +01:00
jest.config.js Migrate jest to v29 2026-07-19 19:17:44 +02:00
LICENSE Bump copyright date 2019-12-29 11:35:11 +00:00
package.json Add runwithprofile to run in copy of real profile 2026-07-28 13:12:15 +02:00
privacy.md Fix #3375: add privacy policy 2021-02-17 13:41:52 +01:00
readme.md Fix #5049: ga picks last audible tab 2026-07-25 08:34:41 +02:00
tsconfig.eslint.json Ensure eslint sees temporary files 2020-06-18 15:29:18 +01:00
tsconfig.json Update to ts6 2026-07-20 00:24:35 +02:00
yarn.lock Fix #4681: add time estimate to :reader 2026-07-23 20:56:09 +02:00


Tridactyl Logo
Tridactyl

Replace Firefox's default control mechanism with one modelled on the one true editor, Vim.

Matrix Chat Join Gitter Chat Join Discord Chat Mozilla Addon Store

InstallationChangelogFirst LookFeaturesFAQContributing


Tridactyl GIF

Installation

Click this link in Firefox to install our latest "beta" build. If it doesn't install automatically, you may need to 1) rename the extension from .zip to .xpi and 2) open it with Firefox; a fool-proof method is to go to about:addons, click the extensions tab, click the cog in the top right, then click "Install Add-on From File...". If you want more options, read on.

Stable

Our "stable" builds are essentially just frozen versions of our beta builds. Our beta builds themselves are not much less stable; all our developers and about half of our users use the beta builds. Stable builds, however, do get new features documented in the changelog, whereas beta builds get new features before they are documented there.

Arch Linux

Run pacman -S firefox-tridactyl in a terminal and then restart Firefox twice.

All other operating systems (Microsoft Windows, Macintosh, Linux etc.)

Tridactyl stable can be installed from the Mozilla add-ons website (the AMO).

Beta

Click this in Firefox to install our "beta" builds. These betas used to be updated with each commit to master on this repo but are now built manually when bovine3dom remembers - see issue #3605. Your browser will automatically update from there once a day. If you want more frequent updates, you can change extensions.update.interval in about:config to whatever time you want, say, 15 minutes (900 seconds). There is also another beta build that comes without a new tab page. You can get it from here.

Extra features through Native Messaging

If you want to use advanced features such as edit-in-Vim, you'll also need to install the native messenger or executable, instructions for which can be found by typing :nativeinstall and hitting enter once you are in Tridactyl. Arch users can install the AUR package firefox-tridactyl-native instead.

Containerized/sandboxed Firefox Installations

Snap and Flatpak: Native Messaging support here is fairly recent and may require:

  • Upgrading to a beta version of Firefox (>= 106.0b6)
  • Enabling webextension permissions: flatpak permission-set webextensions tridactyl snap.firefox yes
  • Rebooting your system (and likely nothing short of it)

See this call for testing thread and this PR for more details and troubleshooting tips.

Firejail will require explicit path whitelisting, but should be feasible based on https://github.com/netblue30/firejail/issues/2109.

For other containerized installs, see troubleshooting steps in https://github.com/tridactyl/tridactyl/issues/2406 and the links above. With packaging that does support Native Messaging, the trick is usually ensuring the containerized app has permission to run the executable and can find the manifest json file.

Migrating between beta and stable builds

Our beta and stable versions store their configurations in separate places. To migrate between the two, see the wiki.

Changelog

The changelog for the stable versions can be found here.

First look

Type :help or press <F1> for online help once you're in, or :tutor for a friendly introduction. You might also find the unofficial Tridactyl Memrise course (requires login) useful for memorising keybinds.

Remember that Tridactyl cannot run on any page on about:*, data:*, view-source:* and file:*. We're sorry about that :(

If you're enjoying Tridactyl, or not, please leave a review on the AMO.

Highlighted features

Like Vim, Tridactyl is modal, with the default mode being "normal mode". In "normal mode", many functions are available using keybindings. In "command mode" (when the command line is shown), you can execute more complex commands, known as "ex-commands". All Tridactyl functionality can be accessed by ex-commands. You can bind any ex-command to a normal-mode shortcut. We also support a .tridactylrc file, of which there is an example in the root of this repository.

Default normal-mode bindings

This is a (non-exhaustive) list of the most common normal-mode bindings. Type :help to open the online help for more details.

  • : — activate the command line
  • Shift + Insert — enter "ignore mode". Press Shift + Insert again to return to "normal mode".
  • ZZ — close all tabs and windows, but only "save" them if your about:preferences are set to "show your tabs and windows from last time"
  • . — repeat the last command
  • <C-v> send a single keystroke to the current website, bypassing bindings

You can try :help key to know more about key. If it is an existing binding, it will take you to the help section of the command that will be executed when pressing key. For example :help . will take you to the help section of the repeat command.

Navigating with the current page

  • j/k — scroll down/up
  • h/l — scroll left/right
  • ^/$ — scroll to left/right margin
  • gg/G — scroll to start/end of page
  • f/F/gF — enter "hint mode" to select a link to follow. F to open in a background tab (note: hint characters should be typed in lowercase). gF to repeatedly open links until you hit <Escape>.
  • gi — scroll to and focus the last-used input on the page
  • r/R — reload page or hard reload page
  • yy — copy the current page URL to the clipboard
  • [[/]] — navigate backward/forward though paginated pages, for example comics, multi-part articles, search result pages, etc.
  • ]c/[c — increment/decrement the current URL by 1
  • gu — go to the parent of the current URL
  • gU — go to the root domain of the current URL
  • gr — open Firefox reader mode (note: Tridactyl will only work on our own :reader command which has complicated security implications)
  • zi/zo/zz — zoom in/out/reset zoom
  • <C-f>/<C-b> — jump to the next/previous part of the page
  • g? — Apply Caesar cipher to page (run g? again to switch back)
  • g! — Jumble words on page

Find mode

Find mode is still incomplete and uses the Firefox feature "Quick Find". This will be improved eventually.

  • / — open the Quick Find search box
  • / then <C-f> — open the Find in page search box
  • <C-g>/<C-G> — find the next/previous instance of the last find operation (note: these are the standard Firefox shortcuts)

Please note that Tridactyl overrides Firefox's <C-f> search, replacing it with a binding to go to the next part of the page. If you want to be able to use <C-f> to search for things, use <C-f> after opening the Quick Find box (/), or any input field such as the address bar or search bar (use default browser shortcuts to activate these). To allow usage of <C-f> at any time, use unbind <C-f> to unset the scrollpage binding.

Bookmarks and quickmarks

  • A — bookmark the current page
  • a — bookmark the current page, but allow the URL to be modified first
  • M<key> — bind a quickmark to the given key
  • go<key>/gn<key>/gw<key> — open a given quickmark in current tab/new tab/new window

If you want to use Firefox's default <C-b> binding to open the bookmarks sidebar, make sure to run unbind <C-b> because Tridactyl replaces this setting with one to go to the previous part of the page.

Marks

  • m a-zA-Z — set a local mark (lowercase letter), or a global mark (uppercase letter)
  • ` a-zA-Z — jump to a local mark (lowercase letter), or a global mark (uppercase letter)
  • `` — jump to the location before the last mark jump

Navigating to new pages:

  • o/O — open a URL (or default search) in this tab (O to pre-load current URL)
  • t/T — open a URL (or default search) in a new tab (T to pre-load current URL)
  • w/W — open a URL (or default search) in a new window (W to pre-load current URL)
  • p/P — open the clipboard contents in the current/new tab
  • s/S — force a search using the default Tridactyl search engine, opening in the current/new tab. This is useful when searching for something that would otherwise be treated as a URL by o or t
  • H/L — go back/forward in the tab history
  • gh/gH — go to the pages you have set with set home [url1] [url2] ...

Handling tabs

  • d — close the current tab
  • u — undo the last tab/window closure
  • gt/gT — go to the next/previous tab
  • g^ OR g0/g$ — go to the first/last tab
  • ga — go to the tab currently playing audio, or the one that most recently stopped
  • <C-^> — go to the last active tab
  • b — bring up a list of open tabs in the current window; you can type the tab ID or part of the title or URL to choose a tab

Extended hint mode

Extended hint modes allow you to perform actions on page items:

  • ;i/;I — open an image (in current/new tab)
  • ;s/;a — save/save-as the linked resource
  • ;S/;A — save/save-as the selected image
  • ;p — copy an element's text to the clipboard
  • ;P — copy an element's title/alt text to the clipboard
  • ;y — copy an element's link URL to the clipboard
  • ;# — copy an element's anchor URL to the clipboard
  • ;r — read the element's text with text-to-speech
  • ;k — delete an element from the page
  • ;; — focus an element

Additionally, you can hint elements matching a custom CSS selector with :hint -c [selector] which is useful for site-specific versions of the standard f hint mode.

Binding custom commands

You can bind your own shortcuts in normal mode with the :bind command. For example :bind gD composite tabduplicate; tabdetach to duplicate and detach the current tab. See :help bind for details about this command.

  • Navigation to any about:* pages using :open requires the native messenger.
  • Firefox will not load Tridactyl on about:*, some file:* URIs, view-source:*, or data:*. On these pages <C-,> - that's "Ctrl-Comma" - and the tri omnibox keyword are your escape hatches.
    • addons.mozilla.org is not supported.
  • Tridactyl now supports changing the Firefox GUI if you have the native messenger installed via guiset. There's quite a few options available, but guiset gui none is probably what you want, perhaps followed up with guiset tabs always. See :help guiset for a list of all possible options.

Frequently asked questions (FAQ)

  • Why doesn't Tridactyl work/why does it break the websites I'm trying to use? or 'Help! A website I use is totally blank when I try to use it with Tridactyl enabled!' or 'Why doesn't Tridactyl work on some pages?'

    Please visit our troubleshooting guide.

  • How can I change the default search engine?

    :set searchengine [searchurl name], e.g. :set searchengine google

    For instance, to use the European Space Agency as the default search engine (which may not necessarily be a good idea):

    :set searchurls.esa http://www.esa.int/esasearch?q=

    :set searchengine esa

    Note that this does not apply to :open when run without arguments, as it simply opens the newtab page which can be set like this:

    :set newtab [newtab url], e.g. :set newtab https://www.google.com

  • How can I add a search engine?

    :set searchurls.esa http://www.esa.int/esasearch?q=

    You can also add %s to specify exactly where the search query should go, which is useful for more inventive uses, such as

    :set searchurls.phrasebook https://translate.google.co.uk/#en/%s/my%20hovercraft%20is%20full%20of%20eels

    after which :open phrasebook [fr|de|la|es|hi|it...] will work as expected.

  • Can I import/export settings, and does Tridactyl use an external configuration file just like Vimperator?

    Yes. :source --url [URL] accepts a URL (which must contain only an RC file, e.g. raw.githubusercontent.com/...). If you have native working, $XDG_CONFIG_HOME/tridactyl/tridactylrc or ~/.tridactylrc will be read at startup via an autocmd and source. Run :findrc to see which local RC file this automatic search selected. There is an example file available on our repository, or you can search GitHub for other RC files (requires login).

    There's also mkt which exports your configuration to a file which may be read with source. (NB: this currently requires native).

  • How can I change the colors or theme used by Tridactyl?

    To use one of the built in themes use: :colors <color>. The current options are:

    • default
    • auto
    • dark (authored by @furgerf)
    • shydactyl (authored by @atrnh)
    • greenmat (authored by @caputchinefrobles)
    • halloween
    • quake
    • quakelight
    • midnight (authored by @karizma)
    • vimium
    • tokyonight

    Tridactyl can also load themes from disk or URL. You could use this for example to load one of the themes originally authored by @bezmi (tridactyl/base16-tridactyl). See :help colors for more information.

  • How to remap keybindings? or How can I bind keys using the control/alt key modifiers (eg: ctrl+^)?

    You can remap keys with :bind --mode=$mode $key $excmd. See :help bind for more information.

    Modifiers can be bound like this: :bind <C-f> scrollpage 1. Special keys can be bound too: :bind <F3> colors dark and with modifiers: :bind <S-F3> colors default and with multiple modifiers: :bind <SA-F3> composite set hintchars 1234567890 | set hintfiltermode vimperator-reflow

    The modifiers are case insensitive. Special key names are not. The names used are those reported by Javascript with a limited number of vim compatibility aliases (e.g. CR == Enter).

    If you want to bind <C-^> you'll find that you'll probably need to press Control+Shift+6 to trigger it. The default bind is <C-6> which does not require you to press shift.

    You can also create site specific binds with bindurl [url] ...

  • When I type 'f', can I type link names (like Vimperator) in order to narrow down the number of highlighted links?

    You can, thanks to @saulrh. First set hintfiltermode vimperator and then set hintchars 1234567890.

  • Where can I find a changelog for the different versions (to see what is new in the latest version)?

    Here.

  • Why can't I use my bookmark keywords?

    Mozilla doesn't give us access to them. See issue #73.

  • Can I set/get my bookmark tags from Tridactyl?

    No, Mozilla doesn't give us access to them either.

  • Why doesn't Tridactyl work on websites with frames?

    It should work on some frames now. See #122.

  • Can I change proxy via commands?

    Yes, see :help proxyadd

  • How do I disable Tridactyl on certain sites?

    To enter ignore mode automatically on a website, use blacklistadd like this: blacklistadd mail.google.com/mail. See :help blacklistadd. Also note that if you want something like the passkeys or ignorekeys features vimperator/pentadactyl had, you can use bindurl. See :help bindurl.

    If you want to more thoroughly disable Tridactyl on a website, for example to prevent it from injecting its CSS, use :seturl [url regex] superignore true. See :help seturl and :help superignore for more details.

  • How can I list the current bindings?

    viewconfig nmaps works OK, but Tridactyl commands won't work on the shown page for "security reasons". We'll eventually provide a better way. See #98. You can also look at :bind completions and :apropos

  • How can I know which mode I'm in/have a status line?

    Press j and see if you scroll down :) There's no status line yet: see #210, but we do have a "mode indicator" in the bottom right. It even goes purple when you're in a private window :).

  • Does anyone actually use Tridactyl?

    In addition to the developers, some other people do. Mozilla keeps tabs on stable users here, but, as of a while ago, you can't see that link if you aren't listed as a Tridactyl developer on the AMO. The maintainers guess the number of unstable users from unique IPs downloading the betas each week when they feel like it. Last time they checked there were 4600 of them. Unscientifically extrapolating from Arch linux's pop contest for package installations gives us an estimate of around 50,000 users.

  • How do I prevent websites from stealing focus?

    There are two ways: the first one is :seturl [URL regex] allowautofocus false (if you do this you'll probably also want to set browser.autofocus to false in about:config). This will prevent the page's focus() function from working and could break javascript text editors such as Ace or CodeMirror; you could equally run :set allowautofocus false and then use :seturl [URL regex for sites with text editors you use] allowautofocus true. The second method is :seturl [URL regex] preventautofocusjackhammer true which will repeatedly check that the page has not stolen focus at the cost of some CPU cycles, so use it sparingly. It works on more websites than allowautofocus false.

Contributing

Donations

We gratefully accept donations via GitHub Sponsors (we receive 100% of your donation), Liberapay (about 95% of your donation makes it to our account), PayPal (about 70% of your donation makes it to our bank account after fees) and Patreon (about 70% of your donation makes it to our account). If you can, please make this a monthly donation as it makes it much easier to plan. People who donate more than 10USD a month via GitHub or Patreon get a special monthly "tips and tricks" newsletter - see an example here. All GitHub and Patreon donors get a quarterly newsletter on Tridactyl development.

PayPal

Funds currently ensure that bovine3dom can afford to work on Tridactyl about one day a week.

Merchandise

We have some designs available on REDBUBBLE. There are often discount codes available - just search your favourite search engine for them. The T-shirts are quite good (I'm wearing one as I type this). The stickers are not the best quality we've ever seen. The clock looks amazing on the website. If anyone buys it I would love to see it.

We don't take any cut from the merchandise, so if you would like to donate, please do so via PayPal or Patreon above.

Building and installing

Onboarding:

git clone https://github.com/tridactyl/tridactyl.git
cd tridactyl
yarn install
yarn run build

Each time package.json or yarn.lock change after you checkout or pull, our git hook will try to run yarn install again. If it doesn't you should do it manually.

Addon is built in build/. Load it as a temporary addon in firefox with about:debugging or see Development loop.

If you want to install a local copy of the add-on into your developer or nightly build of Firefox then you can enable installing unsigned add-ons and then build it like so:

# Build tridactyl if you haven't done that yet
yarn run build
# Package for a browser
scripts/sign nosignbeta

If you want to build a signed copy (e.g. for the non-developer release), you can do that with web-ext sign. You'll need some keys for AMO and to edit the application id in src/manifest.json. There's a helper script in scripts/sign that's used by our build bot and for manual releases.

You can build unsigned copies with scripts/sign nosign{stable,beta}. NB: The stable versus beta part of the argument tells our build process which extension ID to use (and therefore which settings to use). If you want a stable build, make sure you are on the latest tag, i.e. git checkout $(git tag | grep '^[0-9]\+\.[0-9]\+\.[0-9]\+$' | sort -t. -k 1,1n -k 2,2n -k 3,3n | tail -1).

Maintainers create the next release after fetching tags with scripts/version.js next {0,1,2} [release name] and committing the changed manifest. Beta builds use that version while retaining the release name in their displayed version. Once its changelog entry is ready, scripts/version.js release dates the entry, commits it, and tags the version already in src/manifest.json.

If you are on a distribution which builds Firefox with --with-unsigned-addon-scopes= set to app and/or system (which is most of them by users: Arch, Debian, Ubuntu), you can install your unsigned copy of Tridactyl with scripts/install.sh [directory]. If you're on Arch, the correct directory is probably selected by default; on other distributions you might have to go hunting, but it probably looks like /usr/lib/firefox/browser/extensions.

Building on Windows

Development loop

yarn run build & yarn run run

You'll need to run yarn run build every time you edit the files, and press "r" in the yarn run run window to make sure that the files are properly reloaded.

You can speed up the build process after your first build by using yarn run rebuild instead. This skips rebuilding the metadata (used in completions), documentation, new tab page, and tutor, so don't use it if that's what you're trying to test.

Committing

A pre-commit hook is added by yarn install that simply runs yarn test. If you know that your commit doesn't break the tests you can commit with git commit -n to ignore the hooks. If you're making a PR, GitHub will check your build anyway once a maintainer has approved it.

Documentation

Ask in #tridactyl on matrix.org, Libera, gitter, or Discord. We're friendly!

Default keybindings are currently best discovered by reading the default config.

Development notes are in the doc directory, but they're mostly out of date now. Code is quite short and not too badly commented, though.

Principles and objectives

Principles:

  • Keyboard > mouse
  • default keybinds should be Vim-like
  • actions should be composable and repeatable
  • ex mode should expose all the browser functionality anyone might want
  • Arguable: most (all?) actions should have an ex mode version (departure from Vim?)
  • users can map and define their own actions and commands

Other objectives:

  • be fast - the whole point of a keyboard interface is to be more efficient, don't compromise that with slow code
  • don't crash - we're the new UI and we shouldn't crash
  • be maintainable - code should be well documented, reasoned about and tested.

Logo acknowledgement

The logo was designed by Jake Beazley using free vector art by www.Vecteezy.com