Showing preview only (4,831K chars total). Download the full file or copy to clipboard to get everything.
Repository: Eugeny/tabby
Branch: master
Commit: 19eb46a72b83
Files: 772
Total size: 4.5 MB
Directory structure:
gitextract_38kc1ygb/
├── .all-contributorsrc
├── .editorconfig
├── .eslintrc.yml
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── feature_request.md
│ │ └── issue-report.md
│ ├── dependabot.yml
│ ├── stale.yml
│ └── workflows/
│ ├── build.yml
│ ├── codeql-analysis.yml
│ ├── docs.yml
│ └── release.yml
├── .gitignore
├── .mergify.yml
├── .pug-lintrc.js
├── .vscode/
│ └── launch.json
├── .well-known/
│ └── funding-manifest-urls
├── CODE_OF_CONDUCT.md
├── HACKING.md
├── LICENSE
├── README.de-DE.md
├── README.es-ES.md
├── README.id-ID.md
├── README.it-IT.md
├── README.ja-JP.md
├── README.ko-KR.md
├── README.md
├── README.pl-PL.md
├── README.pt-BR.md
├── README.ru-RU.md
├── README.zh-CN.md
├── app/
│ ├── dev-app-update.yml
│ ├── index.pug
│ ├── lib/
│ │ ├── app.ts
│ │ ├── cli.ts
│ │ ├── config.ts
│ │ ├── index.ts
│ │ ├── lru.ts
│ │ ├── pluginManager.ts
│ │ ├── portable.ts
│ │ ├── pty.ts
│ │ ├── sentry.ts
│ │ ├── urlHandler.ts
│ │ ├── utfSplitter.ts
│ │ └── window.ts
│ ├── package.json
│ ├── patches/
│ │ └── @serialport+bindings-cpp+11.0.3.patch
│ ├── src/
│ │ ├── app.module.ts
│ │ ├── entry.preload.ts
│ │ ├── entry.ts
│ │ ├── global.scss
│ │ ├── pluginBlacklist.ts
│ │ ├── plugins.ts
│ │ ├── preload.scss
│ │ └── toastr.scss
│ ├── tsconfig.json
│ ├── tsconfig.main.json
│ ├── webpack.config.main.mjs
│ └── webpack.config.mjs
├── build/
│ ├── installer.nsh
│ ├── linux/
│ │ └── after-install.tpl
│ └── mac/
│ ├── entitlements.plist
│ └── icon.icns
├── electron-builder.yml
├── extras/
│ ├── automator-workflows/
│ │ ├── Open Tabby here.workflow/
│ │ │ └── Contents/
│ │ │ ├── Info.plist
│ │ │ ├── _CodeSignature/
│ │ │ │ ├── CodeDirectory
│ │ │ │ ├── CodeRequirements
│ │ │ │ ├── CodeRequirements-1
│ │ │ │ ├── CodeResources
│ │ │ │ └── CodeSignature
│ │ │ └── document.wflow
│ │ └── Paste path into Tabby.workflow/
│ │ └── Contents/
│ │ ├── Info.plist
│ │ ├── _CodeSignature/
│ │ │ ├── CodeDirectory
│ │ │ ├── CodeRequirements
│ │ │ ├── CodeRequirements-1
│ │ │ ├── CodeResources
│ │ │ └── CodeSignature
│ │ └── document.wflow
│ └── clink/
│ ├── CHANGES
│ ├── LICENSE
│ ├── clink.bat
│ ├── clink.lua
│ ├── clink_inputrc_base
│ ├── default_inputrc
│ └── default_settings
├── firebase.json
├── locale/
│ ├── STOP.txt
│ ├── af-ZA.po
│ ├── app.pot
│ ├── bg-BG.po
│ ├── cs-CZ.po
│ ├── da-DK.po
│ ├── de-DE.po
│ ├── en-GB.po
│ ├── en-US.po
│ ├── es-ES.po
│ ├── fr-FR.po
│ ├── hr-HR.po
│ ├── id-ID.po
│ ├── it-IT.po
│ ├── ja-JP.po
│ ├── ko-KR.po
│ ├── pl-PL.po
│ ├── pt-BR.po
│ ├── pt-PT.po
│ ├── ru-RU.po
│ ├── sr-SP.po
│ ├── sv-SE.po
│ ├── tr-TR.po
│ ├── uk-UA.po
│ ├── zh-CN.po
│ └── zh-TW.po
├── package.json
├── patches/
│ └── app-builder-lib+26.0.12.patch
├── scripts/
│ ├── build-docs.mjs
│ ├── build-linux.mjs
│ ├── build-macos.mjs
│ ├── build-modules.mjs
│ ├── build-native.mjs
│ ├── build-typings.mjs
│ ├── build-windows.mjs
│ ├── generate-icon-metadata.mjs
│ ├── i18n-extract.mjs
│ ├── install-deps.mjs
│ ├── prepackage-plugins.mjs
│ ├── publish-plugins.mjs
│ ├── sentry-upload.mjs
│ └── vars.mjs
├── snap/
│ └── snapcraft.yaml
├── tabby-auto-sudo-password/
│ ├── package.json
│ ├── src/
│ │ ├── decorator.ts
│ │ └── index.ts
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-community-color-schemes/
│ ├── .editorconfig
│ ├── package.json
│ ├── schemes/
│ │ ├── 3024 Day
│ │ ├── 3024 Night
│ │ ├── AdventureTime
│ │ ├── Afterglow
│ │ ├── AlienBlood
│ │ ├── Argonaut
│ │ ├── Arthur
│ │ ├── AtelierSulphurpool
│ │ ├── Atom
│ │ ├── AtomOneLight
│ │ ├── Base16 Default Dark
│ │ ├── Batman
│ │ ├── Belafonte Day
│ │ ├── Belafonte Night
│ │ ├── BirdsOfParadise
│ │ ├── Blazer
│ │ ├── Borland
│ │ ├── Bright Lights
│ │ ├── Broadcast
│ │ ├── Brogrammer
│ │ ├── C64
│ │ ├── CLRS
│ │ ├── Chalk
│ │ ├── Chalkboard
│ │ ├── Ciapre
│ │ ├── Cobalt Neon
│ │ ├── Cobalt2
│ │ ├── CrayonPonyFish
│ │ ├── Dark Pastel
│ │ ├── Darkside
│ │ ├── Desert
│ │ ├── DimmedMonokai
│ │ ├── DotGov
│ │ ├── Dracula
│ │ ├── Duotone Dark
│ │ ├── ENCOM
│ │ ├── Earthsong
│ │ ├── Elemental
│ │ ├── Elementary
│ │ ├── Espresso
│ │ ├── Espresso Libre
│ │ ├── Fideloper
│ │ ├── FirefoxDev
│ │ ├── Firewatch
│ │ ├── FishTank
│ │ ├── Flat
│ │ ├── Flatland
│ │ ├── Floraverse
│ │ ├── ForestBlue
│ │ ├── FrontEndDelight
│ │ ├── FunForrest
│ │ ├── Galaxy
│ │ ├── Github
│ │ ├── Glacier
│ │ ├── Grape
│ │ ├── Grass
│ │ ├── Gruvbox Dark
│ │ ├── Hardcore
│ │ ├── Harper
│ │ ├── Highway
│ │ ├── Hipster Green
│ │ ├── Homebrew
│ │ ├── Hurtado
│ │ ├── Hybrid
│ │ ├── IC_Green_PPL
│ │ ├── IC_Orange_PPL
│ │ ├── IR_Black
│ │ ├── Iceberg
│ │ ├── Jackie Brown
│ │ ├── Japanesque
│ │ ├── Jazz
│ │ ├── Jellybeans
│ │ ├── JetBrains Darcula
│ │ ├── Kibble
│ │ ├── Later This Evening
│ │ ├── Lavandula
│ │ ├── Light Owl
│ │ ├── LiquidCarbon
│ │ ├── LiquidCarbonTransparent
│ │ ├── LiquidCarbonTransparentInverse
│ │ ├── Man Page
│ │ ├── Material
│ │ ├── MaterialDark
│ │ ├── Mathias
│ │ ├── Medallion
│ │ ├── Melange Dark
│ │ ├── Misterioso
│ │ ├── Molokai
│ │ ├── MonaLisa
│ │ ├── Monokai Soda
│ │ ├── Monokai Vivid
│ │ ├── N0tch2k
│ │ ├── Neopolitan
│ │ ├── Neutron
│ │ ├── Night Owl
│ │ ├── NightLion v1
│ │ ├── NightLion v2
│ │ ├── Nord
│ │ ├── Novel
│ │ ├── Obsidian
│ │ ├── Ocean
│ │ ├── OceanicMaterial
│ │ ├── Ollie
│ │ ├── OneHalfDark
│ │ ├── OneHalfLight
│ │ ├── Pandora
│ │ ├── Paraiso Dark
│ │ ├── Parasio Dark
│ │ ├── PaulMillr
│ │ ├── PencilDark
│ │ ├── PencilLight
│ │ ├── Piatto Light
│ │ ├── Pnevma
│ │ ├── Pro
│ │ ├── Red Alert
│ │ ├── Red Sands
│ │ ├── Relaxed
│ │ ├── Rippedcasts
│ │ ├── Rose Pine
│ │ ├── Rose Pine Dawn
│ │ ├── Rose Pine Moon
│ │ ├── Royal
│ │ ├── Ryuuko
│ │ ├── SeaShells
│ │ ├── Seafoam Pastel
│ │ ├── Seti
│ │ ├── Shaman
│ │ ├── Slate
│ │ ├── Smyck
│ │ ├── SoftServer
│ │ ├── Solarized Darcula
│ │ ├── Solarized Dark
│ │ ├── Solarized Dark - Patched
│ │ ├── Solarized Dark Higher Contrast
│ │ ├── Solarized Light
│ │ ├── SpaceGray
│ │ ├── SpaceGray Eighties
│ │ ├── SpaceGray Eighties Dull
│ │ ├── Spacedust
│ │ ├── Spiderman
│ │ ├── Spring
│ │ ├── Square
│ │ ├── Sundried
│ │ ├── Symfonic
│ │ ├── Tango
│ │ ├── Teerb
│ │ ├── Terminal Basic
│ │ ├── Thayer Bright
│ │ ├── The Hulk
│ │ ├── TokyoNight
│ │ ├── TokyoNight Day
│ │ ├── TokyoNight Storm
│ │ ├── Tomorrow
│ │ ├── Tomorrow Night
│ │ ├── Tomorrow Night Blue
│ │ ├── Tomorrow Night Bright
│ │ ├── Tomorrow Night Eighties
│ │ ├── ToyChest
│ │ ├── Treehouse
│ │ ├── Twilight
│ │ ├── Ubuntu
│ │ ├── UnderTheSea
│ │ ├── Urple
│ │ ├── Vaughn
│ │ ├── VibrantInk
│ │ ├── Violet Dark
│ │ ├── Violet Light
│ │ ├── WarmNeon
│ │ ├── Wez
│ │ ├── WildCherry
│ │ ├── Wombat
│ │ ├── Wryan
│ │ ├── Zenburn
│ │ ├── ayu
│ │ ├── ayu_light
│ │ ├── base2tone-cave-dark
│ │ ├── base2tone-desert-dark
│ │ ├── base2tone-drawbridge-dark
│ │ ├── base2tone-evening-dark
│ │ ├── base2tone-forest-dark
│ │ ├── base2tone-heath-dark
│ │ ├── base2tone-heath-light
│ │ ├── base2tone-lake-dark
│ │ ├── base2tone-meadow-dark
│ │ ├── base2tone-morning-light
│ │ ├── base2tone-pool-dark
│ │ ├── base2tone-sea-dark
│ │ ├── base2tone-space-dark
│ │ ├── deep
│ │ └── idleToes
│ ├── src/
│ │ ├── colorSchemes.ts
│ │ └── index.ts
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-core/
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── api/
│ │ │ ├── cli.ts
│ │ │ ├── commands.ts
│ │ │ ├── configProvider.ts
│ │ │ ├── fileProvider.ts
│ │ │ ├── hostApp.ts
│ │ │ ├── hostWindow.ts
│ │ │ ├── hotkeyProvider.ts
│ │ │ ├── index.ts
│ │ │ ├── mainProcess.ts
│ │ │ ├── menu.ts
│ │ │ ├── platform.ts
│ │ │ ├── profileProvider.ts
│ │ │ ├── selector.ts
│ │ │ ├── tabContextMenuProvider.ts
│ │ │ ├── tabRecovery.ts
│ │ │ ├── theme.ts
│ │ │ └── toolbarButtonProvider.ts
│ │ ├── cli.ts
│ │ ├── commands.ts
│ │ ├── components/
│ │ │ ├── appRoot.component.pug
│ │ │ ├── appRoot.component.scss
│ │ │ ├── appRoot.component.ts
│ │ │ ├── base.component.ts
│ │ │ ├── baseTab.component.ts
│ │ │ ├── checkbox.component.ts
│ │ │ ├── profileIcon.component.pug
│ │ │ ├── profileIcon.component.scss
│ │ │ ├── profileIcon.component.ts
│ │ │ ├── promptModal.component.pug
│ │ │ ├── promptModal.component.ts
│ │ │ ├── renameTabModal.component.pug
│ │ │ ├── renameTabModal.component.ts
│ │ │ ├── safeModeModal.component.pug
│ │ │ ├── safeModeModal.component.ts
│ │ │ ├── selectorModal.component.pug
│ │ │ ├── selectorModal.component.scss
│ │ │ ├── selectorModal.component.ts
│ │ │ ├── selfPositioning.component.ts
│ │ │ ├── splitTab.component.scss
│ │ │ ├── splitTab.component.ts
│ │ │ ├── splitTabDropZone.component.scss
│ │ │ ├── splitTabDropZone.component.ts
│ │ │ ├── splitTabPaneLabel.component.scss
│ │ │ ├── splitTabPaneLabel.component.ts
│ │ │ ├── splitTabSpanner.component.scss
│ │ │ ├── splitTabSpanner.component.ts
│ │ │ ├── startPage.component.pug
│ │ │ ├── startPage.component.scss
│ │ │ ├── startPage.component.ts
│ │ │ ├── tabBody.component.scss
│ │ │ ├── tabBody.component.ts
│ │ │ ├── tabBody.deep.component.css
│ │ │ ├── tabHeader.component.pug
│ │ │ ├── tabHeader.component.scss
│ │ │ ├── tabHeader.component.ts
│ │ │ ├── titleBar.component.pug
│ │ │ ├── titleBar.component.scss
│ │ │ ├── titleBar.component.ts
│ │ │ ├── toggle.component.scss
│ │ │ ├── toggle.component.ts
│ │ │ ├── transfersMenu.component.pug
│ │ │ ├── transfersMenu.component.scss
│ │ │ ├── transfersMenu.component.ts
│ │ │ ├── unlockVaultModal.component.pug
│ │ │ ├── unlockVaultModal.component.ts
│ │ │ ├── welcomeTab.component.pug
│ │ │ ├── welcomeTab.component.scss
│ │ │ ├── welcomeTab.component.ts
│ │ │ ├── windowControls.component.pug
│ │ │ ├── windowControls.component.scss
│ │ │ └── windowControls.component.ts
│ │ ├── config.ts
│ │ ├── configDefaults.linux.yaml
│ │ ├── configDefaults.macos.yaml
│ │ ├── configDefaults.web.yaml
│ │ ├── configDefaults.windows.yaml
│ │ ├── configDefaults.yaml
│ │ ├── directives/
│ │ │ ├── alwaysVisibleTypeahead.directive.ts
│ │ │ ├── autofocus.directive.ts
│ │ │ ├── cdkAutoDropGroup.directive.ts
│ │ │ ├── dropZone.directive.pug
│ │ │ ├── dropZone.directive.scss
│ │ │ ├── dropZone.directive.ts
│ │ │ └── fastHtmlBind.directive.ts
│ │ ├── hotkeys.ts
│ │ ├── icons.json
│ │ ├── index.ts
│ │ ├── profiles.ts
│ │ ├── services/
│ │ │ ├── app.service.ts
│ │ │ ├── commands.service.ts
│ │ │ ├── config.service.ts
│ │ │ ├── docking.service.ts
│ │ │ ├── fileProviders.service.ts
│ │ │ ├── homeBase.service.ts
│ │ │ ├── hotkeys.service.ts
│ │ │ ├── hotkeys.util.ts
│ │ │ ├── locale.service.ts
│ │ │ ├── log.service.ts
│ │ │ ├── notifications.service.ts
│ │ │ ├── profiles.service.ts
│ │ │ ├── selector.service.ts
│ │ │ ├── tabRecovery.service.ts
│ │ │ ├── tabs.service.ts
│ │ │ ├── themes.service.ts
│ │ │ ├── updater.service.ts
│ │ │ └── vault.service.ts
│ │ ├── tabContextMenu.ts
│ │ ├── theme.new.scss
│ │ ├── theme.ts
│ │ ├── theme.vars.scss
│ │ ├── theme.vendor.scss
│ │ ├── utfSplitter.ts
│ │ └── utils.ts
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-electron/
│ ├── package.json
│ ├── src/
│ │ ├── colorSchemes.ts
│ │ ├── config.ts
│ │ ├── hotkeys.ts
│ │ ├── index.ts
│ │ ├── pathDrop.ts
│ │ ├── pty.ts
│ │ ├── services/
│ │ │ ├── dockMenu.service.ts
│ │ │ ├── docking.service.ts
│ │ │ ├── electron.service.ts
│ │ │ ├── fileProvider.service.ts
│ │ │ ├── hostApp.service.ts
│ │ │ ├── hostWindow.service.ts
│ │ │ ├── log.service.ts
│ │ │ ├── platform.service.ts
│ │ │ ├── shellIntegration.service.ts
│ │ │ ├── touchbar.service.ts
│ │ │ ├── uac.service.ts
│ │ │ └── updater.service.ts
│ │ ├── sftpContextMenu.ts
│ │ ├── shells/
│ │ │ ├── cmder.ts
│ │ │ ├── cygwin32.ts
│ │ │ ├── cygwin64.ts
│ │ │ ├── gitBash.ts
│ │ │ ├── linuxDefault.ts
│ │ │ ├── macDefault.ts
│ │ │ ├── msys2.ts
│ │ │ ├── posix.ts
│ │ │ ├── powershellCore.ts
│ │ │ ├── vs.ts
│ │ │ ├── winDefault.ts
│ │ │ ├── windowsBase.ts
│ │ │ ├── windowsStock.ts
│ │ │ └── wsl.ts
│ │ └── sshImporters.ts
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-linkifier/
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── api.ts
│ │ ├── config.ts
│ │ ├── decorator.ts
│ │ ├── handlers.ts
│ │ └── index.ts
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-local/
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── api.ts
│ │ ├── buttonProvider.ts
│ │ ├── cli.ts
│ │ ├── components/
│ │ │ ├── commandLineEditor.component.pug
│ │ │ ├── commandLineEditor.component.ts
│ │ │ ├── environmentEditor.component.pug
│ │ │ ├── environmentEditor.component.scss
│ │ │ ├── environmentEditor.component.ts
│ │ │ ├── localProfileSettings.component.pug
│ │ │ ├── localProfileSettings.component.ts
│ │ │ ├── shellSettingsTab.component.pug
│ │ │ ├── shellSettingsTab.component.ts
│ │ │ └── terminalTab.component.ts
│ │ ├── config.ts
│ │ ├── hotkeys.ts
│ │ ├── index.ts
│ │ ├── profiles.ts
│ │ ├── recoveryProvider.ts
│ │ ├── services/
│ │ │ └── terminal.service.ts
│ │ ├── session.ts
│ │ ├── settings.ts
│ │ └── tabContextMenu.ts
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-plugin-manager/
│ ├── package.json
│ ├── src/
│ │ ├── components/
│ │ │ ├── pluginsSettingsTab.component.pug
│ │ │ ├── pluginsSettingsTab.component.scss
│ │ │ └── pluginsSettingsTab.component.ts
│ │ ├── index.ts
│ │ ├── services/
│ │ │ └── pluginManager.service.ts
│ │ └── settings.ts
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-serial/
│ ├── package.json
│ ├── src/
│ │ ├── api.ts
│ │ ├── components/
│ │ │ ├── serialProfileSettings.component.pug
│ │ │ ├── serialProfileSettings.component.ts
│ │ │ ├── serialTab.component.pug
│ │ │ ├── serialTab.component.scss
│ │ │ └── serialTab.component.ts
│ │ ├── config.ts
│ │ ├── hotkeys.ts
│ │ ├── index.ts
│ │ ├── profiles.ts
│ │ ├── recoveryProvider.ts
│ │ └── services/
│ │ └── serial.service.ts
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-settings/
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ ├── api.ts
│ │ ├── buttonProvider.ts
│ │ ├── components/
│ │ │ ├── configSyncSettingsTab.component.pug
│ │ │ ├── configSyncSettingsTab.component.ts
│ │ │ ├── editProfileGroupModal.component.pug
│ │ │ ├── editProfileGroupModal.component.ts
│ │ │ ├── editProfileModal.component.pug
│ │ │ ├── editProfileModal.component.ts
│ │ │ ├── hotkeyInputModal.component.pug
│ │ │ ├── hotkeyInputModal.component.scss
│ │ │ ├── hotkeyInputModal.component.ts
│ │ │ ├── hotkeySettingsTab.component.pug
│ │ │ ├── hotkeySettingsTab.component.ts
│ │ │ ├── multiHotkeyInput.component.pug
│ │ │ ├── multiHotkeyInput.component.scss
│ │ │ ├── multiHotkeyInput.component.ts
│ │ │ ├── profilesSettingsTab.component.pug
│ │ │ ├── profilesSettingsTab.component.scss
│ │ │ ├── profilesSettingsTab.component.ts
│ │ │ ├── releaseNotesTab.component.pug
│ │ │ ├── releaseNotesTab.component.scss
│ │ │ ├── releaseNotesTab.component.ts
│ │ │ ├── setVaultPassphraseModal.component.pug
│ │ │ ├── setVaultPassphraseModal.component.ts
│ │ │ ├── settingsTab.component.pug
│ │ │ ├── settingsTab.component.scss
│ │ │ ├── settingsTab.component.ts
│ │ │ ├── settingsTabBody.component.ts
│ │ │ ├── showSecretModal.component.pug
│ │ │ ├── showSecretModal.component.ts
│ │ │ ├── vaultSettingsTab.component.pug
│ │ │ ├── vaultSettingsTab.component.ts
│ │ │ ├── windowSettingsTab.component.pug
│ │ │ └── windowSettingsTab.component.ts
│ │ ├── config.ts
│ │ ├── hotkeys.ts
│ │ ├── index.ts
│ │ ├── services/
│ │ │ └── configSync.service.ts
│ │ └── settings.ts
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-ssh/
│ ├── package.json
│ ├── src/
│ │ ├── algorithms.ts
│ │ ├── api/
│ │ │ ├── contextMenu.ts
│ │ │ ├── importer.ts
│ │ │ ├── index.ts
│ │ │ └── interfaces.ts
│ │ ├── components/
│ │ │ ├── hostKeyPromptModal.component.pug
│ │ │ ├── hostKeyPromptModal.component.ts
│ │ │ ├── keyboardInteractiveAuthPanel.component.pug
│ │ │ ├── keyboardInteractiveAuthPanel.component.scss
│ │ │ ├── keyboardInteractiveAuthPanel.component.ts
│ │ │ ├── sftpCreateDirectoryModal.component.pug
│ │ │ ├── sftpCreateDirectoryModal.component.ts
│ │ │ ├── sftpDeleteModal.component.pug
│ │ │ ├── sftpDeleteModal.component.ts
│ │ │ ├── sftpPanel.component.pug
│ │ │ ├── sftpPanel.component.scss
│ │ │ ├── sftpPanel.component.ts
│ │ │ ├── sshPortForwardingConfig.component.pug
│ │ │ ├── sshPortForwardingConfig.component.ts
│ │ │ ├── sshPortForwardingModal.component.pug
│ │ │ ├── sshPortForwardingModal.component.ts
│ │ │ ├── sshProfileSettings.component.pug
│ │ │ ├── sshProfileSettings.component.ts
│ │ │ ├── sshSettingsTab.component.pug
│ │ │ ├── sshSettingsTab.component.ts
│ │ │ ├── sshTab.component.pug
│ │ │ ├── sshTab.component.scss
│ │ │ └── sshTab.component.ts
│ │ ├── config.ts
│ │ ├── hotkeys.ts
│ │ ├── index.ts
│ │ ├── profiles.ts
│ │ ├── recoveryProvider.ts
│ │ ├── services/
│ │ │ ├── passwordStorage.service.ts
│ │ │ ├── ssh.service.ts
│ │ │ ├── sshKnownHosts.service.ts
│ │ │ └── sshMultiplexer.service.ts
│ │ ├── session/
│ │ │ ├── forwards.ts
│ │ │ ├── sftp.ts
│ │ │ ├── shell.ts
│ │ │ ├── ssh.ts
│ │ │ └── x11.ts
│ │ ├── settings.ts
│ │ ├── sftpContextMenu.ts
│ │ └── tabContextMenu.ts
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-telnet/
│ ├── package.json
│ ├── src/
│ │ ├── components/
│ │ │ ├── telnetProfileSettings.component.pug
│ │ │ ├── telnetProfileSettings.component.ts
│ │ │ ├── telnetTab.component.pug
│ │ │ ├── telnetTab.component.scss
│ │ │ └── telnetTab.component.ts
│ │ ├── config.ts
│ │ ├── hotkeys.ts
│ │ ├── index.ts
│ │ ├── profiles.ts
│ │ ├── recoveryProvider.ts
│ │ └── session.ts
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-terminal/
│ ├── README.md
│ ├── package.json
│ ├── patches/
│ │ └── ansi-color+0.2.1.patch
│ ├── src/
│ │ ├── api/
│ │ │ ├── baseTerminalTab.component.ts
│ │ │ ├── colorSchemeProvider.ts
│ │ │ ├── connectableTerminalTab.component.ts
│ │ │ ├── contextMenuProvider.ts
│ │ │ ├── decorator.ts
│ │ │ ├── interfaces.ts
│ │ │ └── middleware.ts
│ │ ├── bell.ogg
│ │ ├── cli.ts
│ │ ├── colorSchemes.ts
│ │ ├── components/
│ │ │ ├── appearanceSettingsTab.component.pug
│ │ │ ├── appearanceSettingsTab.component.scss
│ │ │ ├── appearanceSettingsTab.component.ts
│ │ │ ├── baseTerminalTab.component.pug
│ │ │ ├── baseTerminalTab.component.scss
│ │ │ ├── colorPicker.component.pug
│ │ │ ├── colorPicker.component.scss
│ │ │ ├── colorPicker.component.ts
│ │ │ ├── colorSchemePreview.component.pug
│ │ │ ├── colorSchemePreview.component.scss
│ │ │ ├── colorSchemePreview.component.ts
│ │ │ ├── colorSchemeSelector.component.pug
│ │ │ ├── colorSchemeSelector.component.ts
│ │ │ ├── colorSchemeSettingsForMode.component.pug
│ │ │ ├── colorSchemeSettingsForMode.component.scss
│ │ │ ├── colorSchemeSettingsForMode.component.ts
│ │ │ ├── colorSchemeSettingsTab.component.pug
│ │ │ ├── colorSchemeSettingsTab.component.ts
│ │ │ ├── inputProcessingSettings.component.pug
│ │ │ ├── inputProcessingSettings.component.ts
│ │ │ ├── loginScriptsSettings.component.pug
│ │ │ ├── loginScriptsSettings.component.ts
│ │ │ ├── searchPanel.component.pug
│ │ │ ├── searchPanel.component.scss
│ │ │ ├── searchPanel.component.ts
│ │ │ ├── streamProcessingSettings.component.pug
│ │ │ ├── streamProcessingSettings.component.ts
│ │ │ ├── terminalSettingsTab.component.pug
│ │ │ ├── terminalSettingsTab.component.ts
│ │ │ ├── terminalToolbar.component.pug
│ │ │ ├── terminalToolbar.component.scss
│ │ │ └── terminalToolbar.component.ts
│ │ ├── config.ts
│ │ ├── features/
│ │ │ ├── debug.ts
│ │ │ └── zmodem.ts
│ │ ├── frontends/
│ │ │ ├── frontend.ts
│ │ │ ├── xterm.css
│ │ │ └── xtermFrontend.ts
│ │ ├── helpers.ts
│ │ ├── hotkeys.ts
│ │ ├── index.ts
│ │ ├── middleware/
│ │ │ ├── inputProcessing.ts
│ │ │ ├── loginScriptProcessing.ts
│ │ │ ├── oscProcessing.ts
│ │ │ ├── streamProcessing.ts
│ │ │ └── utf8Splitter.ts
│ │ ├── services/
│ │ │ └── multifocus.service.ts
│ │ ├── session.ts
│ │ ├── settings.ts
│ │ └── tabContextMenu.ts
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-uac/
│ ├── .gitignore
│ ├── UAC/
│ │ ├── UAC.cpp
│ │ ├── UAC.vcxproj
│ │ ├── UAC.vcxproj.filters
│ │ ├── UAC.vcxproj.user
│ │ ├── app.manifest
│ │ ├── stdafx.cpp
│ │ ├── stdafx.h
│ │ └── targetver.h
│ └── UAC.sln
├── tabby-web/
│ ├── package.json
│ ├── src/
│ │ ├── components/
│ │ │ ├── messageBoxModal.component.pug
│ │ │ └── messageBoxModal.component.ts
│ │ ├── config.ts
│ │ ├── index.ts
│ │ ├── platform.ts
│ │ ├── services/
│ │ │ ├── hostApp.service.ts
│ │ │ ├── hostWindow.service.ts
│ │ │ ├── log.service.ts
│ │ │ └── updater.service.ts
│ │ └── styles.scss
│ ├── tsconfig.json
│ ├── tsconfig.typings.json
│ └── webpack.config.mjs
├── tabby-web-demo/
│ ├── data/
│ │ ├── linux.iso
│ │ ├── v86.wasm
│ │ └── v86_all.js
│ ├── package.json
│ ├── src/
│ │ ├── buttonProvider.ts
│ │ ├── components/
│ │ │ └── terminalTab.component.ts
│ │ ├── index.ts
│ │ ├── profiles.ts
│ │ └── session.ts
│ ├── tsconfig.json
│ └── webpack.config.mjs
├── tsconfig.json
├── typedoc.mjs
├── web/
│ ├── entry.preload.ts
│ ├── entry.ts
│ ├── package.json
│ ├── patches/
│ │ └── browserify-sign+4.2.1.patch
│ ├── polyfills.buffer.ts
│ ├── polyfills.ts
│ ├── tsconfig.json
│ └── webpack.config.mjs
├── webpack.config.mjs
└── webpack.plugin.config.mjs
================================================
FILE CONTENTS
================================================
================================================
FILE: .all-contributorsrc
================================================
{
"files": [
"README.md",
"README.zh-CN.md",
"README.ru-RU.md",
"README.ko-KR.md",
"README.it-IT.md",
"README.de-DE.md",
"README.id-ID.md",
"README.ja-JP.md",
"README.pt-BR.md",
"README.es-ES.md"
],
"imageSize": 100,
"commit": false,
"contributors": [
{
"login": "mezner",
"name": "Russell Myers",
"avatar_url": "https://avatars2.githubusercontent.com/u/184085?v=4",
"profile": "http://www.russellmyers.com",
"contributions": [
"code"
]
},
{
"login": "ehwarren",
"name": "Austin Warren",
"avatar_url": "https://avatars1.githubusercontent.com/u/3991658?v=4",
"profile": "http://www.morwire.com",
"contributions": [
"code"
]
},
{
"login": "Drachenkaetzchen",
"name": "Felicia Hummel",
"avatar_url": "https://avatars1.githubusercontent.com/u/162974?v=4",
"profile": "https://github.com/Drachenkaetzchen",
"contributions": [
"code"
]
},
{
"login": "mikemaccana",
"name": "Mike MacCana",
"avatar_url": "https://avatars2.githubusercontent.com/u/172594?v=4",
"profile": "https://github.com/mikemaccana",
"contributions": [
"test",
"design"
]
},
{
"login": "yxuko",
"name": "Yacine Kanzari",
"avatar_url": "https://avatars1.githubusercontent.com/u/1786317?v=4",
"profile": "https://github.com/yxuko",
"contributions": [
"code"
]
},
{
"login": "BBJip",
"name": "BBJip",
"avatar_url": "https://avatars2.githubusercontent.com/u/32908927?v=4",
"profile": "https://github.com/BBJip",
"contributions": [
"code"
]
},
{
"login": "Futagirl",
"name": "Futagirl",
"avatar_url": "https://avatars2.githubusercontent.com/u/33533958?v=4",
"profile": "https://github.com/Futagirl",
"contributions": [
"design"
]
},
{
"login": "levrik",
"name": "Levin Rickert",
"avatar_url": "https://avatars3.githubusercontent.com/u/9491603?v=4",
"profile": "https://www.levrik.io",
"contributions": [
"code"
]
},
{
"login": "kwonoj",
"name": "OJ Kwon",
"avatar_url": "https://avatars2.githubusercontent.com/u/1210596?v=4",
"profile": "https://kwonoj.github.io",
"contributions": [
"code"
]
},
{
"login": "Domain",
"name": "domain",
"avatar_url": "https://avatars2.githubusercontent.com/u/903197?v=4",
"profile": "https://github.com/Domain",
"contributions": [
"plugin",
"code"
]
},
{
"login": "kbjr",
"name": "James Brumond",
"avatar_url": "https://avatars1.githubusercontent.com/u/195127?v=4",
"profile": "http://www.jbrumond.me",
"contributions": [
"plugin"
]
},
{
"login": "Tyriar",
"name": "Daniel Imms",
"avatar_url": "https://avatars0.githubusercontent.com/u/2193314?v=4",
"profile": "http://www.growingwiththeweb.com",
"contributions": [
"code",
"plugin",
"test"
]
},
{
"login": "baflo",
"name": "Florian Bachmann",
"avatar_url": "https://avatars2.githubusercontent.com/u/834350?v=4",
"profile": "https://github.com/baflo",
"contributions": [
"code"
]
},
{
"login": "mischah",
"name": "Michael Kühnel",
"avatar_url": "https://avatars2.githubusercontent.com/u/441011?v=4",
"profile": "http://michael-kuehnel.de",
"contributions": [
"code",
"design"
]
},
{
"login": "NieLeben",
"name": "Tilmann Meyer",
"avatar_url": "https://avatars3.githubusercontent.com/u/47182955?v=4",
"profile": "https://github.com/NieLeben",
"contributions": [
"code"
]
},
{
"login": "PMExtra",
"name": "PM Extra",
"avatar_url": "https://avatars3.githubusercontent.com/u/11289158?v=4",
"profile": "http://www.jubeat.net",
"contributions": [
"bug"
]
},
{
"login": "IgnusG",
"name": "Jonathan",
"avatar_url": "https://avatars1.githubusercontent.com/u/6438760?v=4",
"profile": "https://jjuhas.keybase.pub//",
"contributions": [
"code"
]
},
{
"login": "hammster",
"name": "Hans Koch",
"avatar_url": "https://avatars0.githubusercontent.com/u/1093709?v=4",
"profile": "https://hans-koch.me",
"contributions": [
"code"
]
},
{
"login": "ThePuzzlemaker",
"name": "Dak Smyth",
"avatar_url": "https://avatars3.githubusercontent.com/u/12666617?v=4",
"profile": "http://thepuzzlemaker.info",
"contributions": [
"code"
]
},
{
"login": "yfwz100",
"name": "Wang Zhi",
"avatar_url": "https://avatars2.githubusercontent.com/u/983211?v=4",
"profile": "http://yfwz100.github.io",
"contributions": [
"code"
]
},
{
"login": "jack1142",
"name": "jack1142",
"avatar_url": "https://avatars0.githubusercontent.com/u/6032823?v=4",
"profile": "https://github.com/jack1142",
"contributions": [
"code"
]
},
{
"login": "hdougie",
"name": "Howie Douglas",
"avatar_url": "https://avatars1.githubusercontent.com/u/450799?v=4",
"profile": "https://github.com/hdougie",
"contributions": [
"code"
]
},
{
"login": "ckaczor",
"name": "Chris Kaczor",
"avatar_url": "https://avatars2.githubusercontent.com/u/180906?v=4",
"profile": "https://chriskaczor.com",
"contributions": [
"code"
]
},
{
"login": "boxmein",
"name": "Johannes Kadak",
"avatar_url": "https://avatars1.githubusercontent.com/u/358714?v=4",
"profile": "https://www.boxmein.net",
"contributions": [
"code"
]
},
{
"login": "LeSeulArtichaut",
"name": "LeSeulArtichaut",
"avatar_url": "https://avatars1.githubusercontent.com/u/38361244?v=4",
"profile": "https://github.com/LeSeulArtichaut",
"contributions": [
"code"
]
},
{
"login": "CyrilTaylor",
"name": "Cyril Taylor",
"avatar_url": "https://avatars0.githubusercontent.com/u/12631466?v=4",
"profile": "https://github.com/CyrilTaylor",
"contributions": [
"code"
]
},
{
"login": "nstefanou",
"name": "nstefanou",
"avatar_url": "https://avatars3.githubusercontent.com/u/51129173?v=4",
"profile": "https://github.com/nstefanou",
"contributions": [
"code",
"plugin"
]
},
{
"login": "orin220444",
"name": "orin220444",
"avatar_url": "https://avatars3.githubusercontent.com/u/30747229?v=4",
"profile": "https://github.com/orin220444",
"contributions": [
"code"
]
},
{
"login": "Goobles",
"name": "Gobius Dolhain",
"avatar_url": "https://avatars3.githubusercontent.com/u/8776771?v=4",
"profile": "https://github.com/Goobles",
"contributions": [
"code"
]
},
{
"login": "3l0w",
"name": "Gwilherm Folliot",
"avatar_url": "https://avatars2.githubusercontent.com/u/37798980?v=4",
"profile": "https://github.com/3l0w",
"contributions": [
"code"
]
},
{
"login": "dimitory",
"name": "Dmitry Pronin",
"avatar_url": "https://avatars0.githubusercontent.com/u/475955?v=4",
"profile": "https://github.com/Dimitory",
"contributions": [
"code"
]
},
{
"login": "JonathanBeverley",
"name": "Jonathan Beverley",
"avatar_url": "https://avatars1.githubusercontent.com/u/20328966?v=4",
"profile": "https://github.com/JonathanBeverley",
"contributions": [
"code"
]
},
{
"login": "zend",
"name": "Zenghai Liang",
"avatar_url": "https://avatars1.githubusercontent.com/u/25160?v=4",
"profile": "https://github.com/zend",
"contributions": [
"code"
]
},
{
"login": "matishadow",
"name": "Mateusz Tracz",
"avatar_url": "https://avatars0.githubusercontent.com/u/9083085?v=4",
"profile": "https://about.me/matishadow",
"contributions": [
"code"
]
},
{
"login": "pinpins",
"name": "pinpin",
"avatar_url": "https://avatars3.githubusercontent.com/u/36234677?v=4",
"profile": "https://zergpool.com",
"contributions": [
"code"
]
},
{
"login": "TakuroOnoda",
"name": "Takuro Onoda",
"avatar_url": "https://avatars0.githubusercontent.com/u/1407926?v=4",
"profile": "https://github.com/TakuroOnoda",
"contributions": [
"code"
]
},
{
"login": "frauhottelmann",
"name": "frauhottelmann",
"avatar_url": "https://avatars2.githubusercontent.com/u/902705?v=4",
"profile": "https://github.com/frauhottelmann",
"contributions": [
"code"
]
},
{
"login": "VectorKappa",
"name": "Piotr Patalong",
"avatar_url": "https://avatars.githubusercontent.com/u/29167842?v=4",
"profile": "http://patalong.pl",
"contributions": [
"design"
]
},
{
"login": "clarkwang",
"name": "Clark Wang",
"avatar_url": "https://avatars.githubusercontent.com/u/157076?v=4",
"profile": "https://github.com/clarkwang",
"contributions": [
"code"
]
},
{
"login": "iamchating",
"name": "iamchating",
"avatar_url": "https://avatars.githubusercontent.com/u/7088153?v=4",
"profile": "https://github.com/iamchating",
"contributions": [
"code"
]
},
{
"login": "starxg",
"name": "starxg",
"avatar_url": "https://avatars.githubusercontent.com/u/34997494?v=4",
"profile": "https://github.com/starxg",
"contributions": [
"plugin"
]
},
{
"login": "lambdalisue",
"name": "Alisue",
"avatar_url": "https://avatars.githubusercontent.com/u/546312?v=4",
"profile": "http://hashnote.net/",
"contributions": [
"design"
]
},
{
"login": "ydcool",
"name": "Dominic Yin",
"avatar_url": "https://avatars.githubusercontent.com/u/5668295?v=4",
"profile": "https://github.com/ydcool",
"contributions": [
"code"
]
},
{
"login": "bdr99",
"name": "Brandon Rothweiler",
"avatar_url": "https://avatars.githubusercontent.com/u/2292715?v=4",
"profile": "https://github.com/bdr99",
"contributions": [
"design"
]
},
{
"login": "logicmachine123",
"name": "Logic Machine",
"avatar_url": "https://avatars.githubusercontent.com/u/63876444?v=4",
"profile": "https://git.io/JnP49",
"contributions": [
"doc"
]
},
{
"login": "cypherbits",
"name": "cypherbits",
"avatar_url": "https://avatars.githubusercontent.com/u/10424900?v=4",
"profile": "https://github.com/cypherbits",
"contributions": [
"doc"
]
},
{
"login": "KingMob",
"name": "Matthew Davidson",
"avatar_url": "https://avatars.githubusercontent.com/u/946421?v=4",
"profile": "https://modulolotus.net",
"contributions": [
"code"
]
},
{
"login": "al-wi",
"name": "Alexander Wiedemann",
"avatar_url": "https://avatars.githubusercontent.com/u/11092199?v=4",
"profile": "https://github.com/al-wi",
"contributions": [
"code"
]
},
{
"login": "BoYeonJang",
"name": "장보연",
"avatar_url": "https://avatars.githubusercontent.com/u/59506394?v=4",
"profile": "https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375",
"contributions": [
"doc"
]
},
{
"login": "Me1onRind",
"name": "zZ",
"avatar_url": "https://avatars.githubusercontent.com/u/19531270?v=4",
"profile": "https://github.com/Me1onRind",
"contributions": [
"code"
]
},
{
"login": "tainoNZ",
"name": "Aaron Davison",
"avatar_url": "https://avatars.githubusercontent.com/u/49261322?v=4",
"profile": "https://github.com/tainoNZ",
"contributions": [
"code"
]
},
{
"login": "composer404",
"name": "Przemyslaw Kozik",
"avatar_url": "https://avatars.githubusercontent.com/u/58251560?v=4",
"profile": "https://github.com/composer404",
"contributions": [
"design"
]
},
{
"login": "highfredo",
"name": "Alfredo Arellano de la Fuente",
"avatar_url": "https://avatars.githubusercontent.com/u/5951524?v=4",
"profile": "https://github.com/highfredo",
"contributions": [
"code"
]
},
{
"login": "NessunKim",
"name": "MH Kim",
"avatar_url": "https://avatars.githubusercontent.com/u/12974079?v=4",
"profile": "https://github.com/NessunKim",
"contributions": [
"code"
]
},
{
"login": "jaimeadf",
"name": "Marmota",
"avatar_url": "https://avatars.githubusercontent.com/u/40345645?v=4",
"profile": "https://discord.gg/4c5EVTBhtp",
"contributions": [
"design"
]
},
{
"login": "TENX-S",
"name": "Ares Andrew",
"avatar_url": "https://avatars.githubusercontent.com/u/40336192?v=4",
"profile": "https://ares.zone",
"contributions": [
"doc"
]
},
{
"login": "gkor",
"name": "George Korsnick",
"avatar_url": "https://avatars.githubusercontent.com/u/780052?v=4",
"profile": "https://usual.io/",
"contributions": [
"financial"
]
},
{
"login": "uluhonolulu",
"name": "Artem Smirnov",
"avatar_url": "https://avatars.githubusercontent.com/u/872764?v=4",
"profile": "https://about.me/ulu",
"contributions": [
"financial"
]
},
{
"login": "nevotheless",
"name": "Tim Kopplow",
"avatar_url": "https://avatars.githubusercontent.com/u/779797?v=4",
"profile": "https://github.com/nevotheless",
"contributions": [
"financial"
]
},
{
"login": "mrthock",
"name": "mrthock",
"avatar_url": "https://avatars.githubusercontent.com/u/88901709?v=4",
"profile": "https://github.com/mrthock",
"contributions": [
"financial"
]
},
{
"login": "lrottach",
"name": "Lukas Rottach",
"avatar_url": "https://avatars.githubusercontent.com/u/50323692?v=4",
"profile": "https://github.com/lrottach",
"contributions": [
"financial"
]
},
{
"login": "boonkerz",
"name": "boonkerz",
"avatar_url": "https://avatars.githubusercontent.com/u/277321?v=4",
"profile": "https://github.com/boonkerz",
"contributions": [
"code",
"translation"
]
},
{
"login": "milotype",
"name": "Milo Ivir",
"avatar_url": "https://avatars.githubusercontent.com/u/43657314?v=4",
"profile": "https://github.com/milotype",
"contributions": [
"translation"
]
},
{
"login": "JasonCubic",
"name": "JasonCubic",
"avatar_url": "https://avatars.githubusercontent.com/u/8921015?v=4",
"profile": "https://github.com/JasonCubic",
"contributions": [
"design"
]
},
{
"login": "MaxWaldorf",
"name": "MaxWaldorf",
"avatar_url": "https://avatars.githubusercontent.com/u/15877853?v=4",
"profile": "https://github.com/MaxWaldorf",
"contributions": [
"infra"
]
},
{
"login": "mwz",
"name": "Michael Wizner",
"avatar_url": "https://avatars.githubusercontent.com/u/1190768?v=4",
"profile": "https://github.com/mwz",
"contributions": [
"code"
]
},
{
"login": "mgrulich",
"name": "Martin",
"avatar_url": "https://avatars.githubusercontent.com/u/781036?v=4",
"profile": "https://github.com/mgrulich",
"contributions": [
"code"
]
},
{
"login": "piersandro",
"name": "Piersandro Guerrera",
"avatar_url": "https://avatars.githubusercontent.com/u/19996309?v=4",
"profile": "https://github.com/piersandro",
"contributions": [
"doc",
"translation"
]
},
{
"login": "0x973",
"name": "0x973",
"avatar_url": "https://avatars.githubusercontent.com/u/19320096?v=4",
"profile": "https://github.com/0x973",
"contributions": [
"code"
]
},
{
"login": "Allenator",
"name": "Allenator",
"avatar_url": "https://avatars.githubusercontent.com/u/11794943?v=4",
"profile": "https://github.com/Allenator",
"contributions": [
"doc"
]
},
{
"login": "microhobby",
"name": "Matheus Castello",
"avatar_url": "https://avatars.githubusercontent.com/u/2633321?v=4",
"profile": "http://microhobby.com.br/blog",
"contributions": [
"code"
]
},
{
"login": "Jai-JAP",
"name": "Jai A P",
"avatar_url": "https://avatars.githubusercontent.com/u/78354625?v=4",
"profile": "https://github.com/Jai-JAP",
"contributions": [
"platform"
]
},
{
"login": "ysc3839",
"name": "Richard Yu",
"avatar_url": "https://avatars.githubusercontent.com/u/12028138?v=4",
"profile": "https://blog.ysc3839.com",
"contributions": [
"code"
]
},
{
"login": "artu-ole",
"name": "artu-ole",
"avatar_url": "https://avatars.githubusercontent.com/u/15938416?v=4",
"profile": "https://github.com/artu-ole",
"contributions": [
"code"
]
},
{
"login": "TimaGribanov",
"name": "Timofey Gribanov",
"avatar_url": "https://avatars.githubusercontent.com/u/48593815?v=4",
"profile": "https://timagribanov.github.io/",
"contributions": [
"doc",
"translation"
]
},
{
"login": "ChristianBingman",
"name": "Christian Bingman",
"avatar_url": "https://avatars.githubusercontent.com/u/42191425?v=4",
"profile": "https://git.christianbingman.com",
"contributions": [
"code"
]
},
{
"login": "Ox0400",
"name": "zhipeng",
"avatar_url": "https://avatars.githubusercontent.com/u/5310853?v=4",
"profile": "http://zhangzhipeng2023.cn/",
"contributions": [
"code"
]
},
{
"login": "woodmeal",
"name": "woodmeal",
"avatar_url": "https://avatars.githubusercontent.com/u/104011197?v=4",
"profile": "https://github.com/woodmeal",
"contributions": [
"code"
]
},
{
"login": "MagicLike",
"name": "MagicLike",
"avatar_url": "https://avatars.githubusercontent.com/u/82117109?v=4",
"profile": "https://magiclike.codeberg.page/",
"contributions": [
"doc"
]
},
{
"login": "hisamafahri",
"name": "Hisam Fahri",
"avatar_url": "https://avatars.githubusercontent.com/u/65691613?v=4",
"profile": "https://github.com/hisamafahri",
"contributions": [
"code"
]
},
{
"login": "LiangchengJ",
"name": "Liangcheng Juves",
"avatar_url": "https://avatars.githubusercontent.com/u/48881023?v=4",
"profile": "https://liangchengj.com",
"contributions": [
"code"
]
},
{
"login": "attet",
"name": "Atte Timonen",
"avatar_url": "https://avatars.githubusercontent.com/u/1911416?v=4",
"profile": "https://github.com/attet",
"contributions": [
"code"
]
},
{
"login": "joaompinto",
"name": "João Pinto",
"avatar_url": "https://avatars.githubusercontent.com/u/1143125?v=4",
"profile": "https://www.linkedin.com/in/joaolmpinto/",
"contributions": [
"doc"
]
},
{
"login": "Qiming-Liu",
"name": "Alan",
"avatar_url": "https://avatars.githubusercontent.com/u/68600416?v=4",
"profile": "https://github.com/Qiming-Liu",
"contributions": [
"code"
]
},
{
"login": "74th",
"name": "Atsushi Morimoto",
"avatar_url": "https://avatars.githubusercontent.com/u/1060011?v=4",
"profile": "https://74th.tech/",
"contributions": [
"financial"
]
},
{
"login": "aarles",
"name": "Arles",
"avatar_url": "https://avatars.githubusercontent.com/u/5369096?v=4",
"profile": "https://arles.red/",
"contributions": [
"financial"
]
},
{
"login": "six2dez",
"name": "six2dez",
"avatar_url": "https://avatars.githubusercontent.com/u/24670991?v=4",
"profile": "https://pentestbook.six2dez.com/",
"contributions": [
"financial"
]
},
{
"login": "CandiceJoy",
"name": "Candice",
"avatar_url": "https://avatars.githubusercontent.com/u/8854890?v=4",
"profile": "https://github.com/CandiceJoy",
"contributions": [
"financial"
]
},
{
"login": "kingrowen",
"name": "Rowen Willabus",
"avatar_url": "https://avatars.githubusercontent.com/u/13178700?v=4",
"profile": "https://github.com/kingrowen",
"contributions": [
"financial"
]
},
{
"login": "HengY1Sky",
"name": "HengY1Coding✨",
"avatar_url": "https://avatars.githubusercontent.com/u/98681454?v=4",
"profile": "https://hengy1.top/",
"contributions": [
"financial"
]
},
{
"login": "FrancisHG",
"name": "Francis Gelderloos",
"avatar_url": "https://avatars.githubusercontent.com/u/1611626?v=4",
"profile": "https://github.com/FrancisHG",
"contributions": [
"financial"
]
},
{
"login": "astromasoud",
"name": "astromasoud",
"avatar_url": "https://avatars.githubusercontent.com/u/18737721?v=4",
"profile": "https://github.com/astromasoud",
"contributions": [
"financial"
]
},
{
"login": "Spirit55555",
"name": "Anders G. Jørgensen",
"avatar_url": "https://avatars.githubusercontent.com/u/2357565?v=4",
"profile": "https://spirit55555.dk/",
"contributions": [
"financial"
]
},
{
"login": "djradon",
"name": "Dave Richardson",
"avatar_url": "https://avatars.githubusercontent.com/u/5224156?v=4",
"profile": "https://github.com/djradon",
"contributions": [
"financial"
]
},
{
"login": "tpberntsen",
"name": "Thomas Peter Berntsen",
"avatar_url": "https://avatars.githubusercontent.com/u/922318?v=4",
"profile": "https://twitter.com/tpberntsen",
"contributions": [
"financial"
]
},
{
"login": "eltociear",
"name": "Ikko Ashimine",
"avatar_url": "https://avatars.githubusercontent.com/u/22633385?v=4",
"profile": "https://bandism.net/",
"contributions": [
"doc"
]
},
{
"login": "giejqf",
"name": "giejqf",
"avatar_url": "https://avatars.githubusercontent.com/u/9211230?v=4",
"profile": "https://github.com/giejqf",
"contributions": [
"code"
]
},
{
"login": "LacazeThomas",
"name": "Thomas LACAZE",
"avatar_url": "https://avatars.githubusercontent.com/u/19855907?v=4",
"profile": "https://github.com/LacazeThomas",
"contributions": [
"code"
]
},
{
"login": "princemaple",
"name": "Po Chen",
"avatar_url": "https://avatars.githubusercontent.com/u/1329716?v=4",
"profile": "https://pochen.me/",
"contributions": [
"financial"
]
},
{
"login": "mzmznasipadang",
"name": "Victor Chandra",
"avatar_url": "https://avatars.githubusercontent.com/u/41635105?v=4",
"profile": "https://victorchandra.carrd.co/",
"contributions": [
"doc"
]
},
{
"login": "daniel347x",
"name": "Dan Nissenbaum",
"avatar_url": "https://avatars.githubusercontent.com/u/309746?v=4",
"profile": "https://github.com/daniel347x",
"contributions": [
"financial"
]
},
{
"login": "DunklerPhoenix",
"name": "RogueThorn",
"avatar_url": "https://avatars.githubusercontent.com/u/1261305?v=4",
"profile": "https://github.com/DunklerPhoenix",
"contributions": [
"financial"
]
},
{
"login": "spenserblack",
"name": "Spenser Black",
"avatar_url": "https://avatars.githubusercontent.com/u/8546709?v=4",
"profile": "http://spenserblack.github.io",
"contributions": [
"code"
]
},
{
"login": "zuedev",
"name": "Alex",
"avatar_url": "https://avatars.githubusercontent.com/u/24614929?v=4",
"profile": "https://github.com/zuedev",
"contributions": [
"financial"
]
},
{
"login": "HengY1Cola",
"name": "HengY1Coding✨",
"avatar_url": "https://avatars.githubusercontent.com/u/98681454?v=4",
"profile": "https://hengy1.top/",
"contributions": [
"financial"
]
},
{
"login": "dcarrero",
"name": "David Carrero",
"avatar_url": "https://avatars.githubusercontent.com/u/195768?v=4",
"profile": "https://www.stackscale.com/",
"contributions": [
"doc"
]
},
{
"login": "zhoro",
"name": "Andrii Zhovtiak",
"avatar_url": "https://avatars.githubusercontent.com/u/1105687?v=4",
"profile": "https://github.com/zhoro",
"contributions": [
"code"
]
},
{
"login": "JohnMasoner",
"name": "Mason Ma",
"avatar_url": "https://avatars.githubusercontent.com/u/42313377?v=4",
"profile": "https://github.com/JohnMasoner",
"contributions": [
"financial"
]
},
{
"login": "ntimo",
"name": "Timo",
"avatar_url": "https://avatars.githubusercontent.com/u/6145026?v=4",
"profile": "https://github.com/ntimo",
"contributions": [
"financial"
]
},
{
"login": "EvinRWatson",
"name": "Evin Watson",
"avatar_url": "https://avatars.githubusercontent.com/u/24227251?v=4",
"profile": "https://www.linkedin.com/in/evinwatson/",
"contributions": [
"doc"
]
},
{
"login": "deulizealand",
"name": "Hendra Juli",
"avatar_url": "https://avatars.githubusercontent.com/u/15981200?v=4",
"profile": "https://t.me/hendrjl",
"contributions": [
"doc"
]
},
{
"login": "wkricowski",
"name": "Wellinton Kricowski",
"avatar_url": "https://avatars.githubusercontent.com/u/36803521?v=4",
"profile": "https://github.com/wkricowski",
"contributions": [
"financial",
"doc"
]
},
{
"login": "almzau",
"name": "Allan",
"avatar_url": "https://avatars.githubusercontent.com/u/29115846?v=4",
"profile": "https://github.com/almzau",
"contributions": [
"design"
]
},
{
"login": "BenjaminBrandmeier",
"name": "Benjamin Brandmeier",
"avatar_url": "https://avatars.githubusercontent.com/u/17959794?v=4",
"profile": "https://oidamo.de",
"contributions": [
"code"
]
},
{
"login": "patric1025",
"name": "patric1025",
"avatar_url": "https://avatars.githubusercontent.com/u/65654040?v=4",
"profile": "https://github.com/patric1025",
"contributions": [
"translation"
]
},
{
"login": "hermitpopcorn",
"name": "hermitpopcorn",
"avatar_url": "https://avatars.githubusercontent.com/u/16042129?v=4",
"profile": "https://github.com/hermitpopcorn",
"contributions": [
"code"
]
},
{
"login": "joshuatz",
"name": "Joshua Tzucker",
"avatar_url": "https://avatars.githubusercontent.com/u/17817563?v=4",
"profile": "https://joshuatz.com/",
"contributions": [
"financial"
]
},
{
"login": "luxifr",
"name": "luxifr",
"avatar_url": "https://avatars.githubusercontent.com/u/665715?v=4",
"profile": "https://github.com/luxifr",
"contributions": [
"financial"
]
},
{
"login": "ukulanne",
"name": "Anne Summers",
"avatar_url": "https://avatars.githubusercontent.com/u/28586666?v=4",
"profile": "https://github.com/ukulanne",
"contributions": [
"financial"
]
},
{
"login": "Clem-Fern",
"name": "Clem",
"avatar_url": "https://avatars.githubusercontent.com/u/20025949?v=4",
"profile": "https://github.com/Clem-Fern",
"contributions": [
"code"
]
},
{
"login": "elizabeth-dev",
"name": "Elizabeth Martín Campos",
"avatar_url": "https://avatars.githubusercontent.com/u/13015727?v=4",
"profile": "https://github.com/elizabeth-dev",
"contributions": [
"code"
]
},
{
"login": "siccous",
"name": "Tomáš Hruška",
"avatar_url": "https://avatars.githubusercontent.com/u/7812885?v=4",
"profile": "https://github.com/siccous",
"contributions": [
"code"
]
},
{
"login": "karaketir16",
"name": "Osman Karaketir",
"avatar_url": "https://avatars.githubusercontent.com/u/27349806?v=4",
"profile": "https://github.com/karaketir16",
"contributions": [
"code"
]
},
{
"login": "CryptoGnome",
"name": "Crypto Gnome",
"avatar_url": "https://avatars.githubusercontent.com/u/33667144?v=4",
"profile": "https://www.gnomegarden.io/",
"contributions": [
"financial"
]
},
{
"login": "rbukovansky",
"name": "Richard Bukovansky",
"avatar_url": "https://avatars.githubusercontent.com/u/1004491?v=4",
"profile": "https://github.com/rbukovansky",
"contributions": [
"financial"
]
},
{
"login": "pseudocc",
"name": "catlas",
"avatar_url": "https://avatars.githubusercontent.com/u/85104110?v=4",
"profile": "https://github.com/pseudocc",
"contributions": [
"financial"
]
},
{
"login": "Kapocsi",
"name": "Thomas Kapocsi",
"avatar_url": "https://avatars.githubusercontent.com/u/84490604?v=4",
"profile": "http://kapocsi.ca",
"contributions": [
"doc"
]
},
{
"login": "dylhack",
"name": "Dylan Hackworth",
"avatar_url": "https://avatars.githubusercontent.com/u/27179786?v=4",
"profile": "https://dylhack.dev/",
"contributions": [
"financial"
]
},
{
"login": "echo304",
"name": "Sangboak Lee",
"avatar_url": "https://avatars.githubusercontent.com/u/16456651?v=4",
"profile": "https://github.com/echo304",
"contributions": [
"code"
]
},
{
"login": "qyecst",
"name": "qyecst",
"avatar_url": "https://avatars.githubusercontent.com/u/13901864?v=4",
"profile": "https://github.com/qyecst",
"contributions": [
"code"
]
},
{
"login": "DehanLUO",
"name": "Han",
"avatar_url": "https://avatars.githubusercontent.com/u/53093688?v=4",
"profile": "https://github.com/DehanLUO",
"contributions": [
"code"
]
},
{
"login": "wljince007",
"name": "wljince007",
"avatar_url": "https://avatars.githubusercontent.com/u/88243938?v=4",
"profile": "https://github.com/wljince007",
"contributions": [
"code"
]
},
{
"login": "FeroTheFox",
"name": "fero",
"avatar_url": "https://avatars.githubusercontent.com/u/52982404?v=4",
"profile": "https://github.com/FeroTheFox",
"contributions": [
"code"
]
},
{
"login": "siebsie23",
"name": "Sibren",
"avatar_url": "https://avatars.githubusercontent.com/u/25083973?v=4",
"profile": "https://siebsie23.nl/",
"contributions": [
"code"
]
},
{
"login": "nwalser",
"name": "Nathaniel Walser",
"avatar_url": "https://avatars.githubusercontent.com/u/33339996?v=4",
"profile": "https://www.nathaniel-walser.com",
"contributions": [
"code"
]
},
{
"login": "aaronhuggins",
"name": "Aaron Huggins",
"avatar_url": "https://avatars.githubusercontent.com/u/16567111?v=4",
"profile": "https://github.com/aaronhuggins",
"contributions": [
"design"
]
},
{
"login": "zKXDEX",
"name": "KDex",
"avatar_url": "https://avatars.githubusercontent.com/u/66271780?v=4",
"profile": "https://zkxdex.github.io/",
"contributions": [
"code"
]
},
{
"login": "kimbob13",
"name": "ChangHwan Kim",
"avatar_url": "https://avatars.githubusercontent.com/u/26755098?v=4",
"profile": "https://github.com/kimbob13",
"contributions": [
"code"
]
},
{
"login": "ashneilson",
"name": "Ash Neilson",
"avatar_url": "https://avatars.githubusercontent.com/u/35913512?v=4",
"profile": "https://github.com/ashneilson",
"contributions": [
"code"
]
},
{
"login": "cfs4819",
"name": "Chen Fansong",
"avatar_url": "https://avatars.githubusercontent.com/u/53071761?v=4",
"profile": "https://github.com/cfs4819",
"contributions": [
"code"
]
},
{
"login": "Mxmilu666",
"name": "Mxmilu",
"avatar_url": "https://avatars.githubusercontent.com/u/82694310?v=4",
"profile": "https://5k.work/",
"contributions": [
"code"
]
},
{
"login": "C41M50N",
"name": "Charles Buffington",
"avatar_url": "https://avatars.githubusercontent.com/u/29805363?v=4",
"profile": "https://cbuff.dev",
"contributions": [
"code"
]
},
{
"login": "GeminiLn",
"name": "Yu Qin",
"avatar_url": "https://avatars.githubusercontent.com/u/12425057?v=4",
"profile": "https://github.com/GeminiLn",
"contributions": [
"code"
]
},
{
"login": "fireblue",
"name": "fireblue",
"avatar_url": "https://avatars.githubusercontent.com/u/1034929?v=4",
"profile": "https://github.com/fireblue",
"contributions": [
"code"
]
},
{
"login": "marko1616",
"name": "marko1616",
"avatar_url": "https://avatars.githubusercontent.com/u/45327989?v=4",
"profile": "https://github.com/marko1616",
"contributions": [
"code"
]
},
{
"login": "SelfHosted-Club",
"name": "SelfHosted",
"avatar_url": "https://avatars.githubusercontent.com/u/128927132?v=4",
"profile": "https://www.selfhosted.sg/",
"contributions": [
"financial"
]
},
{
"login": "xhiroga",
"name": "Hiroaki Ogasawara",
"avatar_url": "https://avatars.githubusercontent.com/u/13391129?v=4",
"profile": "http://hiroga.hatenablog.com/",
"contributions": [
"code"
]
},
{
"login": "geodic",
"name": "geodic",
"avatar_url": "https://avatars.githubusercontent.com/u/64704703?v=4",
"profile": "https://github.com/geodic",
"contributions": [
"code"
]
},
{
"login": "pfoundation",
"name": "P Foundation",
"avatar_url": "https://avatars.githubusercontent.com/u/80860929?v=4",
"profile": "https://p.foundation/",
"contributions": [
"financial"
]
},
{
"login": "et304383",
"name": "et304383",
"avatar_url": "https://avatars.githubusercontent.com/u/2693414?v=4",
"profile": "https://github.com/et304383",
"contributions": [
"code"
]
},
{
"login": "ajkrj",
"name": "ajkrj",
"avatar_url": "https://avatars.githubusercontent.com/u/210226755?v=4",
"profile": "https://github.com/ajkrj",
"contributions": [
"code"
]
},
{
"login": "leoberbert",
"name": "Leonardo Berbert",
"avatar_url": "https://avatars.githubusercontent.com/u/16724862?v=4",
"profile": "https://www.linkedin.com/in/leoberbert/",
"contributions": [
"code"
]
}
],
"contributorsPerLine": 7,
"projectName": "tabby",
"projectOwner": "Eugeny",
"repoType": "github",
"repoHost": "https://github.com",
"commitConvention": "none",
"skipCi": true,
"commitType": "docs"
}
================================================
FILE: .editorconfig
================================================
root = true
[*]
end_of_line = LF
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.sln]
indent_style = tab
# TODO Determine if there is a preferred tab width for this file type
# Programming/Scripts
[*.{js,ts}]
indent_style = space
indent_size = 4
[*.cpp]
indent_style = tab
# TODO Determine if there is a preferred tab width for this file type
# Markup
[*.pug]
indent_style = space
indent_size = 4
# Stylesheets
[*.scss]
indent_style = space
indent_size = 4
# Data Files
[*.json]
indent_style = space
indent_size = 2
[*.{yaml,yml}]
indent_style = space
indent_size = 2
================================================
FILE: .eslintrc.yml
================================================
settings:
import/parsers:
'@typescript-eslint/parser': ['.ts']
import/resolver:
typescript:
project:
- tsconfig.json
- tabby-*/tsconfig.json
node: true
env:
browser: true
es6: true
node: true
commonjs: true
overrides:
- files: '*.mjs'
plugins:
- 'import'
parserOptions:
sourceType: module
ecmaVersion: latest
- files: '*.ts'
parser: '@typescript-eslint/parser'
parserOptions:
project:
- tsconfig.json
- '*/tsconfig.typings.json'
extends:
- 'plugin:@typescript-eslint/all'
- plugin:import/recommended
- plugin:import/typescript
plugins:
- '@typescript-eslint'
- import
rules:
'@typescript-eslint/semi':
- error
- never
'@typescript-eslint/indent':
- error
- 4
'@typescript-eslint/explicit-member-accessibility':
- error
- accessibility: no-public
overrides:
parameterProperties: explicit
'@typescript-eslint/no-require-imports': off
'@typescript-eslint/no-parameter-properties': off
'@typescript-eslint/explicit-function-return-type': off
'@typescript-eslint/no-explicit-any': off
'@typescript-eslint/no-magic-numbers': off
'@typescript-eslint/member-delimiter-style': off
'@typescript-eslint/promise-function-async': off
'@typescript-eslint/require-array-sort-compare': off
'@typescript-eslint/no-floating-promises': off
'@typescript-eslint/prefer-readonly': off
'@typescript-eslint/require-await': off
'@typescript-eslint/strict-boolean-expressions': off
'@typescript-eslint/no-misused-promises':
- error
- checksVoidReturn: false
'@typescript-eslint/typedef': off
'@typescript-eslint/consistent-type-imports': off
'@typescript-eslint/sort-type-union-intersection-members': off
'@typescript-eslint/no-use-before-define':
- error
- classes: false
no-duplicate-imports: error
array-bracket-spacing:
- error
- never
block-scoped-var: error
brace-style: off
'@typescript-eslint/brace-style':
- error
- 1tbs
- allowSingleLine: true
computed-property-spacing:
- error
- never
comma-dangle: off
'@typescript-eslint/comma-dangle':
- error
- always-multiline
curly: error
eol-last: error
eqeqeq:
- error
- smart
max-depth:
- 1
- 5
max-statements:
- 1
- 80
no-multiple-empty-lines: error
no-mixed-spaces-and-tabs: error
no-trailing-spaces: error
'@typescript-eslint/no-unused-vars':
- error
- vars: all
args: after-used
argsIgnorePattern: ^_
no-undef: error
no-var: error
object-curly-spacing: off
'@typescript-eslint/object-curly-spacing':
- error
- always
quote-props:
- warn
- as-needed
- keywords: true
numbers: true
quotes: off
'@typescript-eslint/quotes':
- error
- single
- allowTemplateLiterals: true
'@typescript-eslint/no-confusing-void-expression':
- error
- ignoreArrowShorthand: true
'@typescript-eslint/no-non-null-assertion': off
'@typescript-eslint/no-unnecessary-condition':
- error
- allowConstantLoopConditions: true
'@typescript-eslint/restrict-template-expressions': off
'@typescript-eslint/prefer-readonly-parameter-types': off
'@typescript-eslint/no-unsafe-member-access': off
'@typescript-eslint/no-unsafe-call': off
'@typescript-eslint/no-unsafe-return': off
'@typescript-eslint/no-unsafe-assignment': off
'@typescript-eslint/naming-convention': off
'@typescript-eslint/lines-between-class-members':
- error
- always
- exceptAfterSingleLine: true
'@typescript-eslint/dot-notation': off
'@typescript-eslint/no-implicit-any-catch': off
'@typescript-eslint/member-ordering': off
'@typescript-eslint/no-var-requires': off
'@typescript-eslint/no-unsafe-argument': off
'@typescript-eslint/restrict-plus-operands': off
'@typescript-eslint/space-infix-ops': off
'@typescript-eslint/no-type-alias':
- error
- allowAliases: in-unions-and-intersections
allowLiterals: always
allowCallbacks: always
'@typescript-eslint/sort-type-constituents': off
'@typescript-eslint/parameter-properties':
- error
- prefer: parameter-property
'import/no-named-as-default-member': off
'@typescript-eslint/consistent-type-exports': off
'@typescript-eslint/consistent-generic-constructors': off
'keyword-spacing': off
'@typescript-eslint/keyword-spacing': off
'@typescript-eslint/class-methods-use-this': off
'@typescript-eslint/lines-around-comment': off
'@typescript-eslint/no-redundant-type-constituents': off # broken
================================================
FILE: .github/FUNDING.yml
================================================
github: eugeny
open_collective: tabby
ko_fi: eugeny
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
<!--
# RULES:
* **ENGLISH ONLY** - this issue tracker is English-only. Please respect the people who take time to help you with your problems.
* Search existing issues first: https://github.com/Eugeny/tabby/issues
-->
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/ISSUE_TEMPLATE/issue-report.md
================================================
---
name: Issue report
about: Report a problem
title: ''
labels: 'T: Bug'
assignees: ''
---
<!--
# READ CAREFULLY:
* **ENGLISH ONLY** - this issue tracker is English-only. Please respect the people who take time to help you with your problems.
* Search existing issues first: https://github.com/Eugeny/tabby/issues
* Test with the latest Tabby version: https://github.com/Eugeny/tabby/releases
* Disable third-party plugins.
-->
**Describe the problem**:
[A clear and concise description of what the bug is.]
**To Reproduce**:
[Steps to reproduce the behavior]
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/app"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/tabby-core"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/tabby-settings"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/tabby-terminal"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/tabby-local"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/tabby-community-color-schemes"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/tabby-electron"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/tabby-web"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/tabby-plugin-manager"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/tabby-ssh"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
================================================
FILE: .github/stale.yml
================================================
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 180
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 90
# Issues with these labels will never be considered stale
exemptLabels:
- "T: Enhancement"
- "S: Confirmed"
# Label to use when marking an issue as stale
staleLabel: "S: Stale"
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed in two weeks unless you comment.
Thank you for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
================================================
FILE: .github/workflows/build.yml
================================================
name: Package-Build
on: [push, pull_request]
jobs:
Lint:
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Installing Node
uses: actions/setup-node@v4.4.0
with:
node-version: 22
- name: Install deps
run: |
sudo apt-get update && sudo apt-get install -y libfontconfig1-dev
npm i -g yarn
cd app
yarn
cd ..
rm app/node_modules/.yarn-integrity
yarn
- name: Build typings
run: yarn run build:typings
- name: Lint
run: yarn run lint
macOS-Build:
runs-on: macos-15
needs: Lint
strategy:
matrix:
include:
- arch: x86_64
rust_triple: x86_64-apple-darwin
- arch: arm64
rust_triple: aarch64-apple-darwin
fail-fast: false
env:
ARCH: ${{matrix.arch}}
RUST_TARGET_TRIPLE: ${{matrix.rust_triple}}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Installing Node
uses: actions/setup-node@v4.4.0
with:
node-version: 22
- run: rustup target add ${{matrix.rust_triple}}
- name: Install deps
run: |
yarn --network-timeout 1000000
env:
ARCH: ${{matrix.arch}}
- name: Webpack
run: yarn run build
- name: Prepackage plugins
run: scripts/prepackage-plugins.mjs
env:
ARCH: ${{matrix.arch}}
- run: sed -i '' 's/updateInfo = await/\/\/updateInfo = await/g' node_modules/app-builder-lib/out/targets/ArchiveTarget.js
# Work around electron-builder beta bug
- run: ln -s ../../node_modules/electron app/node_modules
- name: Build and sign packages
run: scripts/build-macos.mjs
if: github.event_name == 'push' && (github.ref_protected || startsWith(github.ref, 'refs/tags'))
env:
ARCH: ${{matrix.arch}}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPSTORE_USERNAME: ${{ secrets.APPSTORE_USERNAME }}
APPSTORE_PASSWORD: ${{ secrets.APPSTORE_PASSWORD }}
USE_HARD_LINKS: false
# DEBUG: electron-builder,electron-builder:*
- name: Build packages without signing
run: scripts/build-macos.mjs
if: "! (github.event_name == 'push' && (github.ref_protected || startsWith(github.ref, 'refs/tags')))"
env:
ARCH: ${{matrix.arch}}
# DEBUG: electron-builder,electron-builder:*
- name: Upload symbols
run: |
sudo npm install -g @sentry/cli --unsafe-perm
./scripts/sentry-upload.mjs
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
- name: Package artifacts
run: |
mkdir artifact-dmg
mv dist/*.dmg artifact-dmg/
mkdir artifact-zip
mv dist/*.zip artifact-zip/
- uses: actions/upload-artifact@master
name: Upload DMG
with:
name: macOS .dmg (${{matrix.arch}})
path: artifact-dmg
- uses: actions/upload-artifact@master
name: Upload ZIP
with:
name: macOS .zip (${{matrix.arch}})
path: artifact-zip
Linux-Build:
runs-on: ${{matrix.os}}
needs: Lint
strategy:
matrix:
include:
- build-arch: x64
arch: amd64
rust_triple: x86_64-unknown-linux-gnu
os: ubuntu-24.04
- build-arch: arm64
arch: arm64
rust_triple: aarch64-unknown-linux-gnu
triplet: aarch64-linux-gnu-
os: ubuntu-24.04-arm
- build-arch: arm
arch: armhf
rust_triple: arm-unknown-linux-gnueabihf
triplet: arm-linux-gnueabihf-
os: ubuntu-24.04
fail-fast: false
env:
CC: ${{matrix.triplet}}gcc
CXX: ${{matrix.triplet}}g++
ARCH: ${{matrix.build-arch}}
npm_config_arch: ${{matrix.build-arch}}
npm_config_target_arch: ${{matrix.build-arch}}
RUST_TARGET_TRIPLE: ${{matrix.rust_triple}}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Node
uses: actions/setup-node@v4.4.0
with:
node-version: 22
- name: Install FPM
run: |
sudo gem install fpm
- run: rustup target add ${{matrix.rust_triple}}
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install libfontconfig1-dev libarchive-tools zsh crossbuild-essential-${{matrix.arch}}
- name: Setup tar to run as root
run: sudo chmod u+s "$(command -v tar)"
if: matrix.build-arch == 'arm'
- name: Download cached sysroot
uses: actions/cache@v3
id: dl-cached-sysroot
if: matrix.build-arch == 'arm'
with:
key: sysroot-${{matrix.build-arch}}
path: /${{matrix.build-arch}}-sysroot
- name: Setup crossbuild sysroot
run: |
sudo apt-get update -y && sudo apt-get install debootstrap qemu-user-static binfmt-support -y
sudo qemu-debootstrap --include=libfontconfig1-dev,libsecret-1-dev,libnss3,libatk1.0-0,libatk-bridge2.0-0,libgdk-pixbuf2.0-0,libgtk-3-0,libgbm1 --variant=buildd --exclude=snapd --components=main,restricted,universe,multiverse --extractor=dpkg-deb --arch ${{matrix.arch}} bionic /${{matrix.build-arch}}-sysroot/ http://ports.ubuntu.com/ubuntu-ports/
sudo find /${{matrix.build-arch}}-sysroot -type l -lname '/*' -exec sh -c 'file="$0"; dir=$(dirname "$file"); target=$(readlink "$0"); prefix=$(dirname "$dir" | sed 's@[^/]*@\.\.@g'); newtarget="$prefix$target"; ln -snf $newtarget $file' {} \; ;
if: matrix.build-arch == 'arm' && steps.dl-cached-sysroot.outputs.cache-hit != 'true'
- name: Setup env to use ${{matrix.build-arch}} sysroot
run: |
echo "CFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV
echo "CXXFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV
echo "LDFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV
[[ ${npm_config_arch} == 'arm' ]] && echo "npm_config_arch=armv7l" >> $GITHUB_ENV
if [[ ${{matrix.arch}} == 'armhf' ]]; then
echo "PKG_CONFIG_PATH=/${{matrix.build-arch}}-sysroot/usr/lib/pkgconfig/:/${{matrix.build-arch}}-sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig/" >> $GITHUB_ENV
elif [[ ${{matrix.arch}} == 'arm64' ]]; then
echo "PKG_CONFIG_PATH=/${{matrix.build-arch}}-sysroot/usr/lib/pkgconfig/:/${{matrix.build-arch}}-sysroot/usr/lib/aarch64-linux-gnu/pkgconfig/" >> $GITHUB_ENV
fi
if: matrix.build-arch == 'arm'
- name: Install npm_modules (native)
run: |
npm i -g yarn node-gyp
yarn --network-timeout 1000000 --arch=${{matrix.build-arch}} --target-arch=${{matrix.build-arch}}
- name: Webpack (${{matrix.arch}})
run: yarn run build --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}}
- name: Prepackage plugins (${{matrix.arch}})
run: scripts/prepackage-plugins.mjs
- name: Build packages (${{matrix.arch}})
run: scripts/build-linux.mjs
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
USE_HARD_LINKS: false
USE_SYSTEM_FPM: true
# DEBUG: electron-builder,electron-builder:*
- name: Build web resources (amd64 only)
run: zsh -c 'tar czf tabby-web.tar.gz (tabby-*|web)/dist'
if: matrix.build-arch == 'x64'
- name: Upload symbols (amd64 only)
run: |
sudo npm install -g @sentry/cli --unsafe-perm
./scripts/sentry-upload.mjs
if: matrix.build-arch == 'x64'
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
- name: Upload packages to packagecloud.io
uses: TykTechnologies/packagecloud-action@main
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
env:
PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }}
with:
repo: 'eugeny/tabby'
dir: 'dist'
rpmvers: 'el/9 el/8 ol/6 ol/7'
debvers: 'ubuntu/bionic ubuntu/focal ubuntu/hirsute ubuntu/impish ubuntu/jammy ubuntu/kinetic ubuntu/noble ubuntu/oracular debian/jessie debian/stretch debian/buster debian/bullseye debian/bookworm debian/trixie debian/forky debian/duke debian/testing debian/unstable debian/sid'
- uses: actions/upload-artifact@master
name: Upload AppImage (${{matrix.arch}})
with:
name: Linux AppImage (${{matrix.arch}})
path: dist/*.AppImage
- uses: actions/upload-artifact@master
name: Upload DEB (${{matrix.arch}})
with:
name: Linux DEB (${{matrix.arch}})
path: dist/*.deb
- uses: actions/upload-artifact@master
name: Upload RPM (${{matrix.arch}})
with:
name: Linux RPM (${{matrix.arch}})
path: dist/*.rpm
- uses: actions/upload-artifact@master
name: Upload Pacman Package (${{matrix.arch}})
with:
name: Linux Pacman (${{matrix.arch}})
path: dist/*.pacman
- uses: actions/upload-artifact@master
name: Upload Linux tarball (${{matrix.arch}})
with:
name: Linux tarball (${{matrix.arch}})
path: dist/*.tar.gz
- uses: actions/upload-artifact@master
name: Upload web tarball (amd64 only)
with:
name: Web tarball
path: tabby-web.tar.gz
if: matrix.build-arch == 'x64'
Windows-Build:
runs-on: windows-latest
needs: Lint
strategy:
matrix:
include:
- arch: x64
rust_triple: x86_64-pc-windows-msvc
- arch: arm64
rust_triple: aarch64-pc-windows-msvc
fail-fast: false
env:
RUST_TARGET_TRIPLE: ${{matrix.rust_triple}}
ARCH: ${{matrix.arch}}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Code signing with Software Trust Manager
uses: digicert/ssm-code-signing@v1.1.1
if: github.event_name == 'push' && (startsWith(github.ref, 'refs/tags'))
env:
FORCE_DOWNLOAD_TOOLS: 'true'
- name: Installing Node
uses: actions/setup-node@v4.4.0
with:
node-version: 22
- run: npm i -g npx
- run: rustup target add ${{matrix.rust_triple}}
- name: Update node-gyp
run: |
npm install --global node-gyp@10.2.0
npm prefix -g | % {npm config set node_gyp "$_\node_modules\node-gyp\bin\node-gyp.js"}
- name: Build
shell: powershell
run: |
npm i -g yar node-gyp
yarn --network-timeout 1000000
yarn run build
node scripts/prepackage-plugins.mjs
env:
ARCH: ${{matrix.arch}}
- name: Decode certificate
if: github.event_name == 'push' && (startsWith(github.ref, 'refs/tags'))
env:
SM_CLIENT_CERT_FILE_B64: ${{ secrets.SM_CLIENT_CERT_FILE_B64 }}
run: |
SM_CLIENT_CERT_FILE=$RUNNER_TEMP/certificate.p12
echo "$SM_CLIENT_CERT_FILE_B64" | base64 --decode > $SM_CLIENT_CERT_FILE
echo "SM_CLIENT_CERT_FILE=$SM_CLIENT_CERT_FILE" >> "$GITHUB_ENV"
shell: bash
- name: Build and sign packages
if: github.event_name == 'push' && (startsWith(github.ref, 'refs/tags'))
shell: powershell
run: |
Get-FileHash $env:SM_CLIENT_CERT_FILE -Algorithm MD5
smksp_registrar.exe list
smctl.exe healthcheck
smctl.exe keypair ls
smctl windows certsync --keypair-alias $env:SM_KEYPAIR_ALIAS
smctl.exe certificate ls
C:\Windows\System32\certutil.exe -csp "DigiCert Signing Manager KSP" -key -user
smksp_cert_sync.exe
# not used but necessary for electron-builder to run
$env:WIN_CSC_LINK=$env:SM_CLIENT_CERT_FILE
$env:WIN_CSC_KEY_PASSWORD=$env:SM_CLIENT_CERT_PASSWORD
node scripts/build-windows.mjs
env:
ARCH: ${{matrix.arch}}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
SM_CLIENT_CERT_PASSWORD: ${{ secrets.SM_CLIENT_CERT_PASSWORD }}
SM_PUBLISHER_NAME: ${{ secrets.SM_PUBLISHER_NAME }}
SM_API_KEY: ${{ secrets.SM_API_KEY }}
SM_HOST: ${{ vars.SM_HOST }}
SM_CODE_SIGNING_CERT_SHA1_HASH: ${{ vars.SM_CODE_SIGNING_CERT_SHA1_HASH }}
SM_KEYPAIR_ALIAS: ${{ vars.SM_KEYPAIR_ALIAS }}
# DEBUG: electron-builder,electron-builder:*
- name: Build packages without signing
run: node scripts/build-windows.mjs
if: "! (github.event_name == 'push' && (startsWith(github.ref, 'refs/tags')))"
env:
ARCH: ${{matrix.arch}}
- name: Upload symbols
run: |
npm install @sentry/cli
node scripts/sentry-upload.mjs
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
- name: Package artifacts
run: |
mkdir artifact-setup
mv dist/*-setup-*.exe artifact-setup/
mkdir artifact-portable
mv dist/*-portable-*.zip artifact-portable/
- uses: actions/upload-artifact@master
name: Upload installer
with:
name: Windows installer (${{matrix.arch}})
path: artifact-setup
- uses: actions/upload-artifact@master
name: Upload portable build
with:
name: Windows portable build (${{matrix.arch}})
path: artifact-portable
================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ master ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
schedule:
- cron: '26 7 * * 4'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'javascript' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://git.io/codeql-language-support
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# ℹ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
================================================
FILE: .github/workflows/docs.yml
================================================
name: Docs
on: push
jobs:
build:
runs-on: ubuntu-latest
if: ${{ github.actor != 'dependabot[bot]' }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Installing Node
uses: actions/setup-node@v4.4.0
with:
node-version: 22
- name: Build
run: |
sudo apt update && sudo apt install libfontconfig1-dev
yarn cache clean
cd app
yarn
cd ..
rm app/node_modules/.yarn-integrity
yarn
yarn run build:typings
yarn run docs
env:
DOCS_PRIVATE_KEY: ${{ secrets.DOCS_PRIVATE_KEY }}
- uses: FirebaseExtended/action-hosting-deploy@v0
with:
repoToken: '${{ secrets.GITHUB_TOKEN }}'
firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_TABBY_DOCS }}'
channelId: live
projectId: tabby-docs
================================================
FILE: .github/workflows/release.yml
================================================
---
name: "tagged-release"
on:
push:
tags:
- "v*"
jobs:
tagged-release:
name: "Tagged Release"
runs-on: "ubuntu-latest"
steps:
- uses: "marvinpinto/action-automatic-releases@latest"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: false
draft: true
================================================
FILE: .gitignore
================================================
app/node_modules
app/assets/webpack
node_modules
build/files.wxs
dist
*/dist
*/typings
*.tsbuildinfo
*.xcworkspacedata
*.xcuserstate
*.wixpdb
.DS_Store
.DS_Store?
coverage
.nyc_output
npm-debug.log
builtin-plugins
package-lock.json
yarn-error.log
docs/api
.travis.ssh.key
*.code-workspace
.idea/
.electron-symbols
sentry.properties
sentry-symbols.js
*.psd
crowdin.yml
.crowdin.env
================================================
FILE: .mergify.yml
================================================
pull_request_rules:
- name: automatic merge on CI success and review
conditions:
- "status-success=Windows Build / Build"
- "status-success=macOS Build / Build"
- "status-success=Linux Build / Build"
- "status-success=continuous-integration/appveyor/pr"
- "#approved-reviews-by>=1"
- "#changes-requested-reviews-by=0"
- base=master
actions:
merge:
method: merge
strict: true
================================================
FILE: .pug-lintrc.js
================================================
module.export = {
}
================================================
FILE: .vscode/launch.json
================================================
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Electron: Main",
"protocol": "inspector",
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
"env": {
"TABBY_DEV": "1"
},
"runtimeArgs": [
"--remote-debugging-port=9223",
"app"
],
"windows": {
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"
}
},
{
"name": "Electron: Renderer",
"type": "pwa-chrome",
"request": "attach",
"port": 9223,
"webRoot": "${workspaceFolder}",
"timeout": 30000
}
],
"compounds": [
{
"name": "Electron: All",
"configurations": [
"Electron: Main",
"Electron: Renderer"
]
}
]
}
================================================
FILE: .well-known/funding-manifest-urls
================================================
https://null.page/funding.json
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at e@ajenti.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
================================================
FILE: HACKING.md
================================================
# Some background
Tabby is an Electron app, with the frontend written in Typescript with the help of Angular framework. It's built using Webpack.
# Getting started
First of all, clone this repository.
# Install Dependencies
- [Node.js](https://nodejs.org/en/download/) **version 15 or newer*
- [Yarn](https://yarnpkg.com/)
First, from within the `tabby` directory install the dependencies via yarn:
```
# macOS & Windows:
yarn
```
```
# Linux (Debian/Ubuntu here as an example)
sudo apt install libfontconfig-dev libsecret-1-dev libarchive-tools libnss3 libatk1.0-0 libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm1 cmake
yarn
```
_⚠️Note: If you forked this repository, you may need to pull down the tags from this repository before installing node modules. `git pull --tags upstream master`_
Build Tabby:
```
yarn run build
```
Start Tabby
```
yarn start
```
# Building an installer
To build an installer, first complete a "normal" build as described above and then run:
```
node scripts/prepackage-plugins.mjs
node scripts/build-windows.mjs
# or
node scripts/build-linux.mjs
# or
node scripts/build-macos.mjs
```
The artifacts will be produced in the `dist` folder.
# Project layout
```
tabby
├─ app # Electron app, just the bare essentials
| ├─ src # Electron renderer code
| └─ main.js # Electron main entry point
├─ build
├─ clink # Clink distribution, for Windows
├─ scripts # Maintenance scripts
├─ tabby-community-color-schemes # Plugin that provides color schemes
├─ tabby-core # Plugin that provides base UI and tab management
├─ tabby-electron # Plugin that provides Electron-specific functions
├─ tabby-local # Plugin that provides local shells and profiles
├─ tabby-plugin-manager # Plugin that installs other plugins
├─ tabby-settings # Plugin that provides the settings tab
├─ tabby-terminal # Plugin that provides terminal tabs
└─ tabby-web # Plugin that provides web-specific functions
```
# Plugin layout
```
tabby-pluginname
├─ src # Typescript code
| ├─ components # Angular components
| | ├─ foo.component.ts # Code
| | ├─ foo.component.scss # Styles
| | └─ foo.component.pug # Template
| ├─ services # Angular services
| | └─ foo.service.ts
| ├─ api.ts # Publicly exported API
| └─ index.ts # Module entry point
├─ package.json
├─ tsconfig.json
└─ webpack.config.js
```
# Plugins
The app will load all plugins from the source checkout in the dev mode, from the user's plugins directory at all times (click `Open Plugins Directory` under `Settings` > `Plugins`) and from the directory specified by the `TABBY_PLUGINS` environment var.
Only modules whose `package.json` file contains a `tabby-plugin` keyword will be loaded.
If you're currently in your plugin's directory, start Tabby as `TABBY_PLUGINS=$(pwd) tabby --debug`
A plugin should only provide a default export, which should be a `NgModule` class (or a `NgModuleWithDependencies` where applicable). This module will be injected as a dependency to the app's root module.
```javascript
import { NgModule } from '@angular/core'
@NgModule()
export default class MyModule {
constructor () {
console.log('Angular engaged, cap\'n.')
}
}
```
Plugins provide functionality by exporting singular or multi providers:
```javascript
import { NgModule, Injectable } from '@angular/core'
import { ToolbarButtonProvider, ToolbarButton } from 'tabby-core'
@Injectable()
export class MyButtonProvider extends ToolbarButtonProvider {
provide (): ToolbarButton[] {
return [{
icon: 'star',
title: 'Foobar',
weight: 10,
click: () => {
alert('Woohoo!')
}
}]
}
}
@NgModule({
providers: [
{ provide: ToolbarButtonProvider, useClass: MyButtonProvider, multi: true },
],
})
export default class MyModule { }
```
See `tabby-core/src/api.ts`, `tabby-settings/src/api.ts`, `tabby-local/src/api.ts` and `tabby-terminal/src/api.ts` for the available extension points.
Also check out [the example plugin](https://github.com/Eugeny/tabby-clippy).
Publish your plugin on NPM with a `tabby-plugin` keyword to make it appear in the Plugin Manager.
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2017 Tabby Developers
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: README.de-DE.md
================================================
[](https://tabby.sh)
<p align="center">
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="Alle GitHub Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>   <a href="https://translate.tabby.sh/"><img alt="Übersetzen" src="https://shields.io/badge/Übersetzen-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a> <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Abonnieren-Nachrichten-blue?logo=twitter&style=for-the-badge&color=blue"></a>
</p>
<p align="center">
<a href="https://ko-fi.com/J3J8KWTF">
<img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
</a>
</p>
----
### Downloads:
* [Neueste Version](https://github.com/Eugeny/tabby/releases/latest)
* [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-basiert](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-basiert](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
* [Neueste nightly Version](https://nightly.link/Eugeny/tabby/workflows/build/master)
<br/>
<p align="center">
Diese README ist auch verfügbar in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
</p>
----
[**Tabby**](https://tabby.sh) (ehemals **Terminus**) ist ein äußerst konfigurierbarer Terminalemulator, SSH- und serieller Client für Windows, macOS und Linux
* Integrierter SSH- und Telnet-Client und Verbindungsmanager
* Integriertes serielles Terminal
* Theming und Farbschemata
* Vollständig konfigurierbare Tastenkombinationen und Multi-Akkord-Tastenkombinationen
* Geteilte Fenster
* Merkt sich deine Tabs
* Unterstützung für PowerShell (und PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder und CMD
* Direkte Dateiübertragung von/zu SSH-Sitzungen über Zmodem
* Vollständige Unicode-Unterstützung, einschließlich Zeichen mit doppelter Breite
* Kein Abbruch bei schnell ablaufenden Ausgaben
* Richtiges Shell-Erlebnis unter Windows, einschließlich Tabulator-Vervollständigung (über Clink)
* Integrierter verschlüsselter Container für SSH-Secrets und Konfiguration
* SSH-, SFTP- und Telnet-Client verfügbar als [Web-App](https://tabby.sh/app) (auch [selbstgehostet](https://github.com/Eugeny/tabby-web)).
# Inhaltsverzeichnis <!-- omit in toc -->
- [Was Tabby ist und was nicht](#what-tabby-is-and-isnt)
- [Terminal-Funktionen](#terminal-features)
- [SSH Client](#ssh-client)
- [Serielles Terminal](#serial-terminal)
- [Portabel](#portable)
- [Plugins](#plugins)
- [Themen](#themes)
- [Beitragen](#contributing)
<a name="about"></a>
# Was Tabby ist und was nicht
**Tabby ist** eine Alternative zu Windows Standard-Terminal (conhost), PowerShell ISE, PuTTY, macOS Terminal.app und iTerm
**Tabby ist weder** eine neue Shell noch ein MinGW- oder Cygwin-Ersatz. Sie ist auch nicht gerade sparsam - wenn die RAM-Nutzung von Bedeutung ist, solltest Du [Conemu](https://conemu.github.io) oder [Alacritty](https://github.com/jwilm/alacritty) in Betracht ziehen.
<a name="terminal"></a>
# Terminal-Funktionen

* Ein VT220-Terminal + verschiedene Erweiterungen
* Mehrere verschachtelte, geteilte Fenster
* Tabs auf jeder Seite des Fensters
* Optional andockbares Fenster mit einem globalen Spawn-Hotkey ("Quake-Konsole")
* Fortschrittserkennung
* Benachrichtigung bei Prozessabschluss
* Einfügen in Klammern, mehrzeilige Einfügewarnungen
* Schriftart-Ligaturen
* Benutzerdefinierte Shell-Profile
* Optionales RMB-Einfügen und Kopieren bei Auswahl (PuTTY-Stil)
<a name="ssh"></a>
# SSH Client

* SSH2-Client mit einem Verbindungsmanager
* X11 und Portweiterleitung
* Automatisches Jump-Host-Management
* Agent-Weiterleitung (inkl. Pageant und Windows-eigenem OpenSSH-Agent)
* Anmeldeskripte
<a name="serial"></a>
# Serielles Terminal
* Gespeicherte Verbindungen
* Unterstützung von Readline-Eingaben
* Optionale hexadezimale Byte-für-Byte-Eingabe und Hexdump-Ausgabe
* Newline-Konvertierung
* Automatische Wiederverbindung
<a name="portable"></a>
# Portabel
Tabby läuft als portable Anwendung unter Windows, wenn Sie einen `data`-Ordner am selben Ort erstellen, an dem sich auch `Tabby.exe` befindet.
<a name="plugins"></a>
# Plugins
Plugins und Themen können direkt aus der Ansicht "Einstellungen" in Tabby installiert werden.
* [docker](https://github.com/Eugeny/tabby-docker) - Verbindung zu Docker-Containern
* [title-control](https://github.com/kbjr/terminus-title-control) - ermöglicht die Änderung des Titels der Terminal-Tabs durch Angabe eines Präfixes, Suffixes und/oder zu entfernender Strings
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - schnelles Senden von Befehlen an eine oder alle Terminal-Tabs
* [save-output](https://github.com/Eugeny/tabby-save-output) - speichert Terminalausgaben in einer Datei
* [sync-config](https://github.com/starxg/terminus-sync-config) - synchronisiert die Konfiguration mit Gist oder Gitee
* [clippy](https://github.com/Eugeny/tabby-clippy) - ein Beispiel-Plugin, das einen die ganze Zeit nervt
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - ermöglicht das Erstellen eigener Workspace-Profile auf Basis der angegebenen Konfiguration
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - öffnet den Standard-Systembrowser mit einem Text, der aus dem Tabby Tab ausgewählt wurde
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - Öffnet ein SFTP-Tab für SSH-Verbindungen ähnlich wie SecureCRT
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - In-App-Web-Authentifizierungspopups (Hauptsächlich für die in-Browser-Authentifizierung von Warpgate entwickelt)
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Leistungsstarke Model Context Protocol Server-Integration für Tabby, die sich nahtlos mit KI-Assistenten über MCP-Clients wie Cursor und Windsurf verbindet und Ihren Terminal-Workflow mit intelligenten KI-Funktionen verbessert.
<a name="themes"></a>
# Themen
* [hype](https://github.com/Eugeny/tabby-theme-hype) - ein von Hyper inspiriertes Thema
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - das entspannte Thema für Tabby
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox)
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10)
* [altair](https://github.com/yxuko/terminus-altair)
# Sponsoren <!-- omit in toc -->
[](https://packagecloud.io)
[**packagecloud**](https://packagecloud.io) bietet kostenloses Debian/RPM-Repository-Hosting an
<a name="contributing"></a>
# Beitragen
Pull Requests und Plugins sind willkommen!
Siehe [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) und [API docs](https://docs.tabby.sh/) für Informationen über den Aufbau des Projekts und ein sehr kurzes Tutorial zur Plugin-Entwicklung.
---
<a name="contributors"></a>
Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt="Russell Myers"/><br /><sub><b>Russell Myers</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mezner" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt="Austin Warren"/><br /><sub><b>Austin Warren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ehwarren" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt="Felicia Hummel"/><br /><sub><b>Felicia Hummel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Drachenkaetzchen" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt="Mike MacCana"/><br /><sub><b>Mike MacCana</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mikemaccana" title="Tests">⚠️</a> <a href="#design-mikemaccana" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt="Yacine Kanzari"/><br /><sub><b>Yacine Kanzari</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yxuko" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt="BBJip"/><br /><sub><b>BBJip</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BBJip" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt="Futagirl"/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt="Levin Rickert"/><br /><sub><b>Levin Rickert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=levrik" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt="OJ Kwon"/><br /><sub><b>OJ Kwon</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kwonoj" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt="domain"/><br /><sub><b>domain</b></sub></a><br /><a href="#plugin-Domain" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Domain" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt="James Brumond"/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt="Daniel Imms"/><br /><sub><b>Daniel Imms</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Code">💻</a> <a href="#plugin-Tyriar" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt="Florian Bachmann"/><br /><sub><b>Florian Bachmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=baflo" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt="Michael Kühnel"/><br /><sub><b>Michael Kühnel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mischah" title="Code">💻</a> <a href="#design-mischah" title="Design">🎨</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt="Tilmann Meyer"/><br /><sub><b>Tilmann Meyer</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NieLeben" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt="PM Extra"/><br /><sub><b>PM Extra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/issues?q=author%3APMExtra" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt="Jonathan"/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=IgnusG" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt="Hans Koch"/><br /><sub><b>Hans Koch</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hammster" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt="Dak Smyth"/><br /><sub><b>Dak Smyth</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ThePuzzlemaker" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt="Wang Zhi"/><br /><sub><b>Wang Zhi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yfwz100" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt="jack1142"/><br /><sub><b>jack1142</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=jack1142" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt="Howie Douglas"/><br /><sub><b>Howie Douglas</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hdougie" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt="Chris Kaczor"/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ckaczor" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt="Johannes Kadak"/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boxmein" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt="LeSeulArtichaut"/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt="Cyril Taylor"/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=CyrilTaylor" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt="nstefanou"/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt="orin220444"/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=orin220444" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt="Gobius Dolhain"/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Goobles" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt="Gwilherm Folliot"/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=3l0w" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt="Dmitry Pronin"/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dimitory" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt="Jonathan Beverley"/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=JonathanBeverley" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt="Zenghai Liang"/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zend" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt="Mateusz Tracz"/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=matishadow" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt="pinpin"/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=pinpins" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt="Takuro Onoda"/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TakuroOnoda" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt="frauhottelmann"/><br /><sub><b>frauhottelmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=frauhottelmann" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt="Piotr Patalong"/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt="Clark Wang"/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=clarkwang" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt="iamchating"/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=iamchating" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt="starxg"/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt="Alisue"/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt="Dominic Yin"/><br /><sub><b>Dominic Yin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ydcool" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bdr99"><img src="https://avatars.githubusercontent.com/u/2292715?v=4?s=100" width="100px;" alt="Brandon Rothweiler"/><br /><sub><b>Brandon Rothweiler</b></sub></a><br /><a href="#design-bdr99" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://git.io/JnP49"><img src="https://avatars.githubusercontent.com/u/63876444?v=4?s=100" width="100px;" alt="Logic Machine"/><br /><sub><b>Logic Machine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=logicmachine123" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt="cypherbits"/><br /><sub><b>cypherbits</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cypherbits" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt="Matthew Davidson"/><br /><sub><b>Matthew Davidson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=KingMob" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt="Alexander Wiedemann"/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt="장보연"/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt="zZ"/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt="Aaron Davison"/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt="Przemyslaw Kozik"/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt="Alfredo Arellano de la Fuente"/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt="MH Kim"/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt="Marmota"/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt="Ares Andrew"/><br /><sub><b>Ares Andrew</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TENX-S" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt="George Korsnick"/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt="Artem Smirnov"/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt="Tim Kopplow"/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt="mrthock"/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt="Lukas Rottach"/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt="boonkerz"/><br /><sub><b>boonkerz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boonkerz" title="Code">💻</a> <a href="#translation-boonkerz" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt="Milo Ivir"/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt="JasonCubic"/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt="MaxWaldorf"/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt="Matheus Castello"/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt="Jai A P"/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt="Richard Yu"/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt="artu-ole"/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt="Timofey Gribanov"/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a> <a href="#translation-TimaGribanov" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt="Christian Bingman"/><br /><sub><b>Christian Bingman</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ChristianBingman" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt="zhipeng"/><br /><sub><b>zhipeng</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Ox0400" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt="woodmeal"/><br /><sub><b>woodmeal</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=woodmeal" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://magiclike.codeberg.page/"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt="MagicLike"/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hisamafahri"><img src="https://avatars.githubusercontent.com/u/65691613?v=4?s=100" width="100px;" alt="Hisam Fahri"/><br /><sub><b>Hisam Fahri</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hisamafahri" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://liangchengj.com"><img src="https://avatars.githubusercontent.com/u/48881023?v=4?s=100" width="100px;" alt="Liangcheng Juves"/><br /><sub><b>Liangcheng Juves</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LiangchengJ" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/attet"><img src="https://avatars.githubusercontent.com/u/1911416?v=4?s=100" width="100px;" alt="Atte Timonen"/><br /><sub><b>Atte Timonen</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=attet" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/joaolmpinto/"><img src="https://avatars.githubusercontent.com/u/1143125?v=4?s=100" width="100px;" alt="João Pinto"/><br /><sub><b>João Pinto</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=joaompinto" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Qiming-Liu"><img src="https://avatars.githubusercontent.com/u/68600416?v=4?s=100" width="100px;" alt="Alan"/><br /><sub><b>Alan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Qiming-Liu" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://74th.tech/"><img src="https://avatars.githubusercontent.com/u/1060011?v=4?s=100" width="100px;" alt="Atsushi Morimoto"/><br /><sub><b>Atsushi Morimoto</b></sub></a><br /><a href="#financial-74th" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://arles.red/"><img src="https://avatars.githubusercontent.com/u/5369096?v=4?s=100" width="100px;" alt="Arles"/><br /><sub><b>Arles</b></sub></a><br /><a href="#financial-aarles" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://pentestbook.six2dez.com/"><img src="https://avatars.githubusercontent.com/u/24670991?v=4?s=100" width="100px;" alt="six2dez"/><br /><sub><b>six2dez</b></sub></a><br /><a href="#financial-six2dez" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CandiceJoy"><img src="https://avatars.githubusercontent.com/u/8854890?v=4?s=100" width="100px;" alt="Candice"/><br /><sub><b>Candice</b></sub></a><br /><a href="#financial-CandiceJoy" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kingrowen"><img src="https://avatars.githubusercontent.com/u/13178700?v=4?s=100" width="100px;" alt="Rowen Willabus"/><br /><sub><b>Rowen Willabus</b></sub></a><br /><a href="#financial-kingrowen" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://hengy1.top/"><img src="https://avatars.githubusercontent.com/u/98681454?v=4?s=100" width="100px;" alt="HengY1Coding✨"/><br /><sub><b>HengY1Coding✨</b></sub></a><br /><a href="#financial-HengY1Sky" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FrancisHG"><img src="https://avatars.githubusercontent.com/u/1611626?v=4?s=100" width="100px;" alt="Francis Gelderloos"/><br /><sub><b>Francis Gelderloos</b></sub></a><br /><a href="#financial-FrancisHG" title="Financial">💵</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/astromasoud"><img src="https://avatars.githubusercontent.com/u/18737721?v=4?s=100" width="100px;" alt="astromasoud"/><br /><sub><b>astromasoud</b></sub></a><br /><a href="#financial-astromasoud" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://spirit55555.dk/"><img src="https://avatars.githubusercontent.com/u/2357565?v=4?s=100" width="100px;" alt="Anders G. Jørgensen"/><br /><sub><b>Anders G. Jørgensen</b></sub></a><br /><a href="#financial-Spirit55555" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/djradon"><img src="https://avatars.githubusercontent.com/u/5224156?v=4?s=100" width="100px;" alt="Dave Richardson"/><br /><sub><b>Dave Richardson</b></sub></a><br /><a href="#financial-djradon" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/tpberntsen"><img src="https://avatars.githubusercontent.com/u/922318?v=4?s=100" width="100px;" alt="Thomas Peter Berntsen"/><br /><sub><b>Thomas Peter Berntsen</b></sub></a><br /><a href="#financial-tpberntsen" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://bandism.net/"><img src="https://avatars.githubusercontent.com/u/22633385?v=4?s=100" width="100px;" alt="Ikko Ashimine"/><br /><sub><b>Ikko Ashimine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=eltociear" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/giejqf"><img src="https://avatars.githubusercontent.com/u/9211230?v=4?s=100" width="100px;" alt="giejqf"/><br /><sub><b>giejqf</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=giejqf" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LacazeThomas"><img src="https://avatars.githubusercontent.com/u/19855907?v=4?s=100" width="100px;" alt="Thomas LACAZE"/><br /><sub><b>Thomas LACAZE</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LacazeThomas" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://pochen.me/"><img src="https://avatars.githubusercontent.com/u/1329716?v=4?s=100" width="100px;" alt="Po Chen"/><br /><sub><b>Po Chen</b></sub></a><br /><a href="#financial-princemaple" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://victorchandra.carrd.co/"><img src="https://avatars.githubusercontent.com/u/41635105?v=4?s=100" width="100px;" alt="Victor Chandra"/><br /><sub><b>Victor Chandra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mzmznasipadang" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/daniel347x"><img src="https://avatars.githubusercontent.com/u/309746?v=4?s=100" width="100px;" alt="Dan Nissenbaum"/><br /><sub><b>Dan Nissenbaum</b></sub></a><br /><a href="#financial-daniel347x" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DunklerPhoenix"><img src="https://avatars.githubusercontent.com/u/1261305?v=4?s=100" width="100px;" alt="RogueThorn"/><br /><sub><b>RogueThorn</b></sub></a><br /><a href="#financial-DunklerPhoenix" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://spenserblack.github.io"><img src="https://avatars.githubusercontent.com/u/8546709?v=4?s=100" width="100px;" alt="Spenser Black"/><br /><sub><b>Spenser Black</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=spenserblack" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zuedev"><img src="https://avatars.githubusercontent.com/u/24614929?v=4?s=100" width="100px;" alt="Alex"/><br /><sub><b>Alex</b></sub></a><br /><a href="#financial-zuedev" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://hengy1.top/"><img src="https://avatars.githubusercontent.com/u/98681454?v=4?s=100" width="100px;" alt="HengY1Coding✨"/><br /><sub><b>HengY1Coding✨</b></sub></a><br /><a href="#financial-HengY1Cola" title="Financial">💵</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://www.stackscale.com/"><img src="https://avatars.githubusercontent.com/u/195768?v=4?s=100" width="100px;" alt="David Carrero"/><br /><sub><b>David Carrero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dcarrero" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zhoro"><img src="https://avatars.githubusercontent.com/u/1105687?v=4?s=100" width="100px;" alt="Andrii Zhovtiak"/><br /><sub><b>Andrii Zhovtiak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zhoro" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JohnMasoner"><img src="https://avatars.githubusercontent.com/u/42313377?v=4?s=100" width="100px;" alt="Mason Ma"/><br /><sub><b>Mason Ma</b></sub></a><br /><a href="#financial-JohnMasoner" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ntimo"><img src="https://avatars.githubusercontent.com/u/6145026?v=4?s=100" width="100px;" alt="Timo"/><br /><sub><b>Timo</b></sub></a><br /><a href="#financial-ntimo" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/evinwatson/"><img src="https://avatars.githubusercontent.com/u/24227251?v=4?s=100" width="100px;" alt="Evin Watson"/><br /><sub><b>Evin Watson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=EvinRWatson" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://t.me/hendrjl"><img src="https://avatars.githubusercontent.com/u/15981200?v=4?s=100" width="100px;" alt="Hendra Juli"/><br /><sub><b>Hendra Juli</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=deulizealand" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wkricowski"><img src="https://avatars.githubusercontent.com/u/36803521?v=4?s=100" width="100px;" alt="Wellinton Kricowski"/><br /><sub><b>Wellinton Kricowski</b></sub></a><br /><a href="#financial-wkricowski" title="Financial">💵</a> <a href="https://github.com/Eugeny/tabby/commits?author=wkricowski" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/almzau"><img src="https://avatars.githubusercontent.com/u/29115846?v=4?s=100" width="100px;" alt="Allan"/><br /><sub><b>Allan</b></sub></a><br /><a href="#design-almzau" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://oidamo.de"><img src="https://avatars.githubusercontent.com/u/17959794?v=4?s=100" width="100px;" alt="Benjamin Brandmeier"/><br /><sub><b>Benjamin Brandmeier</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BenjaminBrandmeier" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/patric1025"><img src="https://avatars.githubusercontent.com/u/65654040?v=4?s=100" width="100px;" alt="patric1025"/><br /><sub><b>patric1025</b></sub></a><br /><a href="#translation-patric1025" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hermitpopcorn"><img src="https://avatars.githubusercontent.com/u/16042129?v=4?s=100" width="100px;" alt="hermitpopcorn"/><br /><sub><b>hermitpopcorn</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hermitpopcorn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://joshuatz.com/"><img src="https://avatars.githubusercontent.com/u/17817563?v=4?s=100" width="100px;" alt="Joshua Tzucker"/><br /><sub><b>Joshua Tzucker</b></sub></a><br /><a href="#financial-joshuatz" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luxifr"><img src="https://avatars.githubusercontent.com/u/665715?v=4?s=100" width="100px;" alt="luxifr"/><br /><sub><b>luxifr</b></sub></a><br /><a href="#financial-luxifr" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ukulanne"><img src="https://avatars.githubusercontent.com/u/28586666?v=4?s=100" width="100px;" alt="Anne Summers"/><br /><sub><b>Anne Summers</b></sub></a><br /><a href="#financial-ukulanne" title="Financial">💵</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Clem-Fern"><img src="https://avatars.githubusercontent.com/u/20025949?v=4?s=100" width="100px;" alt="Clem"/><br /><sub><b>Clem</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Clem-Fern" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/elizabeth-dev"><img src="https://avatars.githubusercontent.com/u/13015727?v=4?s=100" width="100px;" alt="Elizabeth Martín Campos"/><br /><sub><b>Elizabeth Martín Campos</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=elizabeth-dev" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/siccous"><img src="https://avatars.githubusercontent.com/u/7812885?v=4?s=100" width="100px;" alt="Tomáš Hruška"/><br /><sub><b>Tomáš Hruška</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siccous" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/karaketir16"><img src="https://avatars.githubusercontent.com/u/27349806?v=4?s=100" width="100px;" alt="Osman Karaketir"/><br /><sub><b>Osman Karaketir</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=karaketir16" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.gnomegarden.io/"><img src="https://avatars.githubusercontent.com/u/33667144?v=4?s=100" width="100px;" alt="Crypto Gnome"/><br /><sub><b>Crypto Gnome</b></sub></a><br /><a href="#financial-CryptoGnome" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rbukovansky"><img src="https://avatars.githubusercontent.com/u/1004491?v=4?s=100" width="100px;" alt="Richard Bukovansky"/><br /><sub><b>Richard Bukovansky</b></sub></a><br /><a href="#financial-rbukovansky" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pseudocc"><img src="https://avatars.githubusercontent.com/u/85104110?v=4?s=100" width="100px;" alt="catlas"/><br /><sub><b>catlas</b></sub></a><br /><a href="#financial-pseudocc" title="Financial">💵</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://kapocsi.ca"><img src="https://avatars.githubusercontent.com/u/84490604?v=4?s=100" width="100px;" alt="Thomas Kapocsi"/><br /><sub><b>Thomas Kapocsi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Kapocsi" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://dylhack.dev/"><img src="https://avatars.githubusercontent.com/u/27179786?v=4?s=100" width="100px;" alt="Dylan Hackworth"/><br /><sub><b>Dylan Hackworth</b></sub></a><br /><a href="#financial-dylhack" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/echo304"><img src="https://avatars.githubusercontent.com/u/16456651?v=4?s=100" width="100px;" alt="Sangboak Lee"/><br /><sub><b>Sangboak Lee</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=echo304" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/qyecst"><img src="https://avatars.githubusercontent.com/u/13901864?v=4?s=100" width="100px;" alt="qyecst"/><br /><sub><b>qyecst</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=qyecst" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DehanLUO"><img src="https://avatars.githubusercontent.com/u/53093688?v=4?s=100" width="100px;" alt="Han"/><br /><sub><b>Han</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=DehanLUO" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.selfhosted.sg/"><img src="https://avatars.githubusercontent.com/u/128927132?v=4?s=100" width="100px;" alt="SelfHosted"/><br /><sub><b>SelfHosted</b></sub></a><br /><a href="#financial-SelfHosted-Club" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hiroga.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/13391129?v=4?s=100" width="100px;" alt="Hiroaki Ogasawara"/><br /><sub><b>Hiroaki Ogasawara</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=xhiroga" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://p.foundation/"><img src="https://avatars.githubusercontent.com/u/80860929?v=4?s=100" width="100px;" alt="P Foundation"/><br /><sub><b>P Foundation</b></sub></a><br /><a href="#financial-pfoundation" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/et304383"><img src="https://avatars.githubusercontent.com/u/2693414?v=4?s=100" width="100px;" alt="et304383"/><br /><sub><b>et304383</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=et304383" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ajkrj"><img src="https://avatars.githubusercontent.com/u/210226755?v=4?s=100" width="100px;" alt="ajkrj"/><br /><sub><b>ajkrj</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ajkrj" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/leoberbert/"><img src="https://avatars.githubusercontent.com/u/16724862?v=4?s=100" width="100px;" alt="Leonardo Berbert"/><br /><sub><b>Leonardo Berbert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=leoberbert" title="Code">💻</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
Dieses Projekt folgt der [all-contributors](https://github.com/all-contributors/all-contributors) Spezifikation. Beiträge jeglicher Art sind willkommen!
================================================
FILE: README.es-ES.md
================================================
[](https://tabby.sh)
<p align="center">
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="Todas las revisiones en GitHub" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>   <a href="https://translate.tabby.sh/"><img alt="Translate" src="https://shields.io/badge/Translate-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a> <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Subscribe-News-blue?logo=twitter&style=for-the-badge&color=blue"></a>
</p>
<p align="center">
<a href="https://ko-fi.com/J3J8KWTF">
<img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
</a>
</p>
----
### Descargas:
* [Última versión](https://github.com/Eugeny/tabby/releases/latest)
* [Repositorios](https://packagecloud.io/eugeny/tabby): [Basado en Debian/Ubuntu](https://packagecloud.io/eugeny/tabby/install#bash-deb), [basado en RPM](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
* [Última versión nocturna](https://nightly.link/Eugeny/tabby/workflows/build/master)
<br/>
<p align="center">
Este fichero README está disponible en: <a href="./README.md">:gb: English</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.id-ID.md">:id: Bahasa Indonesia</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
</p>
----
[**Tabby**](https://tabby.sh) (anteriormente **Terminus**) es un emulador de terminal, SSH y cliente serie altamente configurable parar Windows, macOS y Linux
* Cliente y gestor de conexiones SSH y Telnet integrados
* Terminal serie integrado
* Esquemas de colores y temas
* Totalmente configurable con atajos y atajos múltiples
* Paneles divididos
* Recuerda tus pestañas
* Soporte para PowerShell (y PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder y CMD
* Transferencia de ficheros directa desde/a sesiones SSH via Zmodem
* Soporte completo Unicode incluyendo caracteres dobles
* No se bloquea con las salidas rápidas
* Experiencia adecuada del shell en Windows, incluyendo la finalización de pestañas (via Clink)
* Contenedor encriptado integrado para los secretos SSH y la configuración
* Cliente SSH, SFTP y Telnet disponible como [aplicación web](https://tabby.sh/app) (incluso [auto-alojada](https://github.com/Eugeny/tabby-web)).
# Contenidos <!-- omit in toc -->
- [¿Qué es Tabby y que no es?](#what-tabby-is-and-isnt)
- [Características de Terminal](#terminal-features)
- [Cliente SSH](#ssh-client)
- [Terminal Serie](#serial-terminal)
- [Portable](#portable)
- [Plugins](#plugins)
- [Temas](#themes)
- [Contribuciones](#contributing)
<a name="about"></a>
# ¿Qué es Tabby y que no es?
* **Tabby es** una alternativa al terminal estándar de Windows (cohost), PowerShell ISE, PuTTY, macOS Terminal.app e iTerm
* **Tabby no es** un nuevo shell o un sustituto de MinGW o de Cygwin. Tampo es ligero - si el uso de RAM es importante, considera [Conemu](https://conemu.github.io) o [Alacritty](https://github.com/jwilm/alacritty)
<a name="terminal"></a>
# Características de Terminal

* Un terminal VT220 + varias extensiones
* Múltiples paneles divididos anidados
* Pestañas en cualquier lado de la ventana
* Ventana acoplable opcional con una tecla de acceso directo global ("consola de Quake")
* Detección del progreso
* Notificación de la finalización del proceso
* Pegar entre corchetes, avisos de pegar multilínea
* Tipos de letra ligados
* Perfiles personalizados en el shell
* Opción de pegar y copiar al seleccionar RMB (estilo PuTTY)
<a name="ssh"></a>
# Cliente SSH

* Cliente SSH2 con gestor de conexiones
* X11 y reenvío de puertos
* Gestión de host de salto automático
* Reenvío de agentes (incluido el agente de Pageant y el agente OpenSSH nativo de Windows)
* Scripts de inicio de sesión
<a name="serial"></a>
# Terminal Serie
* Conexiones guardadas
* Soporte de entrada de línea de lectura
* Entrada hexagonal byte a byte y salida hexdump opcionales
* Conversión de la nueva línea
* Reconexión automática
<a name="portable"></a>
# Portable
Tabby se ejecutará como una aplicación portátil en Windows, si crea una carpeta `data` en la misma ubicación donde se encuentra `Tabby.exe`.
<a name="plugins"></a>
# Plugins
Los plugins y los temas se pueden instalar directamente desde la vista de Configuración dentro de Tabby.
* [docker](https://github.com/Eugeny/tabby-docker) - conectarse a los contenedores Docker
* [title-control](https://github.com/kbjr/terminus-title-control) - permite modificar el título de las pestañas de los terminales proporcionando un prefijo, un sufijo y/o cadenas a eliminar
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - enviar rápidamente comandos a una o a todas las pestañas del terminal
* [save-output](https://github.com/Eugeny/tabby-save-output) - registrar la salida del terminal en un archivo
* [sync-config](https://github.com/starxg/terminus-sync-config) - sincronizar la configuración con Gist o Gitee
* [clippy](https://github.com/Eugeny/tabby-clippy) - un ejemplo de plugin que te molesta todo el tiempo
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - permite crear perfiles de espacio de trabajo personalizados basados en la configuración dada
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - abre el navegador del sistema por defecto con un texto seleccionado en la pestaña de Tabby's
* [sftp-tab](https://github.com/wljince007/tabby-sftp-tab) - abre una pestaña sftp para la conexión ssh como SecureCRT
* [web-auth-handler](https://github.com/Jazzmoon/tabby-web-auth-handler) - Ventanas emergentes de autenticación web dentro de la app (Construidas principalmente para la autenticación en el navegador de warpgate)
* [mcp-server](https://github.com/thuanpham582002/tabby-mcp-server) - Potente integración del servidor de Protocolo de Contexto de Modelo para Tabby que se conecta sin problemas con asistentes de IA a través de clientes MCP como Cursor y Windsurf, mejorando tu flujo de trabajo en terminal con capacidades inteligentes de IA.
<a name="themes"></a>
# Temas
* [hype](https://github.com/Eugeny/tabby-theme-hype) - Tema inspirado en Hyper
* [relaxed](https://github.com/Relaxed-Theme/relaxed-terminal-themes#terminus) - El tema relajado para Tabby
* [gruvbox](https://github.com/porkloin/terminus-theme-gruvbox)
* [windows10](https://www.npmjs.com/package/terminus-theme-windows10)
* [altair](https://github.com/yxuko/terminus-altair)
# Patrocinadores <!-- omit in toc -->
[](https://packagecloud.io)
[**packagecloud**](https://packagecloud.io) ha proporcionado alojamiento gratuito de repositorios Debian/RPM
[](https://keygen.sh/?via=eugene)
[**keygen**](https://keygen.sh/?via=eugene) ha proporcionado alojamiento gratuito para la liberación y la actualización automática
<a name="contributing"></a>
# Contribuciones
¡Solicitudes de Pull y plugins son bienvenidas!
Mira [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) y [documentación API](https://docs.tabby.sh/) para obtener información sobre el diseño del proyecto y un breve tutorial de desarrollo de plugins.
---
<a name="contributors"></a>
Gracias a estas maravillosas personas ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://www.russellmyers.com"><img src="https://avatars2.githubusercontent.com/u/184085?v=4?s=100" width="100px;" alt="Russell Myers"/><br /><sub><b>Russell Myers</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mezner" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.morwire.com"><img src="https://avatars1.githubusercontent.com/u/3991658?v=4?s=100" width="100px;" alt="Austin Warren"/><br /><sub><b>Austin Warren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ehwarren" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Drachenkaetzchen"><img src="https://avatars1.githubusercontent.com/u/162974?v=4?s=100" width="100px;" alt="Felicia Hummel"/><br /><sub><b>Felicia Hummel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Drachenkaetzchen" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mikemaccana"><img src="https://avatars2.githubusercontent.com/u/172594?v=4?s=100" width="100px;" alt="Mike MacCana"/><br /><sub><b>Mike MacCana</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mikemaccana" title="Tests">⚠️</a> <a href="#design-mikemaccana" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yxuko"><img src="https://avatars1.githubusercontent.com/u/1786317?v=4?s=100" width="100px;" alt="Yacine Kanzari"/><br /><sub><b>Yacine Kanzari</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yxuko" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BBJip"><img src="https://avatars2.githubusercontent.com/u/32908927?v=4?s=100" width="100px;" alt="BBJip"/><br /><sub><b>BBJip</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BBJip" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Futagirl"><img src="https://avatars2.githubusercontent.com/u/33533958?v=4?s=100" width="100px;" alt="Futagirl"/><br /><sub><b>Futagirl</b></sub></a><br /><a href="#design-Futagirl" title="Design">🎨</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://www.levrik.io"><img src="https://avatars3.githubusercontent.com/u/9491603?v=4?s=100" width="100px;" alt="Levin Rickert"/><br /><sub><b>Levin Rickert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=levrik" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://kwonoj.github.io"><img src="https://avatars2.githubusercontent.com/u/1210596?v=4?s=100" width="100px;" alt="OJ Kwon"/><br /><sub><b>OJ Kwon</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kwonoj" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Domain"><img src="https://avatars2.githubusercontent.com/u/903197?v=4?s=100" width="100px;" alt="domain"/><br /><sub><b>domain</b></sub></a><br /><a href="#plugin-Domain" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Domain" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.jbrumond.me"><img src="https://avatars1.githubusercontent.com/u/195127?v=4?s=100" width="100px;" alt="James Brumond"/><br /><sub><b>James Brumond</b></sub></a><br /><a href="#plugin-kbjr" title="Plugin/utility libraries">🔌</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.growingwiththeweb.com"><img src="https://avatars0.githubusercontent.com/u/2193314?v=4?s=100" width="100px;" alt="Daniel Imms"/><br /><sub><b>Daniel Imms</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Code">💻</a> <a href="#plugin-Tyriar" title="Plugin/utility libraries">🔌</a> <a href="https://github.com/Eugeny/tabby/commits?author=Tyriar" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/baflo"><img src="https://avatars2.githubusercontent.com/u/834350?v=4?s=100" width="100px;" alt="Florian Bachmann"/><br /><sub><b>Florian Bachmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=baflo" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://michael-kuehnel.de"><img src="https://avatars2.githubusercontent.com/u/441011?v=4?s=100" width="100px;" alt="Michael Kühnel"/><br /><sub><b>Michael Kühnel</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mischah" title="Code">💻</a> <a href="#design-mischah" title="Design">🎨</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/NieLeben"><img src="https://avatars3.githubusercontent.com/u/47182955?v=4?s=100" width="100px;" alt="Tilmann Meyer"/><br /><sub><b>Tilmann Meyer</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NieLeben" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.jubeat.net"><img src="https://avatars3.githubusercontent.com/u/11289158?v=4?s=100" width="100px;" alt="PM Extra"/><br /><sub><b>PM Extra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/issues?q=author%3APMExtra" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://jjuhas.keybase.pub//"><img src="https://avatars1.githubusercontent.com/u/6438760?v=4?s=100" width="100px;" alt="Jonathan"/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=IgnusG" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://hans-koch.me"><img src="https://avatars0.githubusercontent.com/u/1093709?v=4?s=100" width="100px;" alt="Hans Koch"/><br /><sub><b>Hans Koch</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hammster" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://thepuzzlemaker.info"><img src="https://avatars3.githubusercontent.com/u/12666617?v=4?s=100" width="100px;" alt="Dak Smyth"/><br /><sub><b>Dak Smyth</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ThePuzzlemaker" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://yfwz100.github.io"><img src="https://avatars2.githubusercontent.com/u/983211?v=4?s=100" width="100px;" alt="Wang Zhi"/><br /><sub><b>Wang Zhi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yfwz100" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jack1142"><img src="https://avatars0.githubusercontent.com/u/6032823?v=4?s=100" width="100px;" alt="jack1142"/><br /><sub><b>jack1142</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=jack1142" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hdougie"><img src="https://avatars1.githubusercontent.com/u/450799?v=4?s=100" width="100px;" alt="Howie Douglas"/><br /><sub><b>Howie Douglas</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hdougie" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4?s=100" width="100px;" alt="Chris Kaczor"/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ckaczor" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4?s=100" width="100px;" alt="Johannes Kadak"/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boxmein" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4?s=100" width="100px;" alt="LeSeulArtichaut"/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4?s=100" width="100px;" alt="Cyril Taylor"/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=CyrilTaylor" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4?s=100" width="100px;" alt="nstefanou"/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4?s=100" width="100px;" alt="orin220444"/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=orin220444" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4?s=100" width="100px;" alt="Gobius Dolhain"/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Goobles" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4?s=100" width="100px;" alt="Gwilherm Folliot"/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=3l0w" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4?s=100" width="100px;" alt="Dmitry Pronin"/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dimitory" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4?s=100" width="100px;" alt="Jonathan Beverley"/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=JonathanBeverley" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4?s=100" width="100px;" alt="Zenghai Liang"/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zend" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4?s=100" width="100px;" alt="Mateusz Tracz"/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=matishadow" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4?s=100" width="100px;" alt="pinpin"/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=pinpins" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4?s=100" width="100px;" alt="Takuro Onoda"/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TakuroOnoda" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/frauhottelmann"><img src="https://avatars2.githubusercontent.com/u/902705?v=4?s=100" width="100px;" alt="frauhottelmann"/><br /><sub><b>frauhottelmann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=frauhottelmann" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://patalong.pl"><img src="https://avatars.githubusercontent.com/u/29167842?v=4?s=100" width="100px;" alt="Piotr Patalong"/><br /><sub><b>Piotr Patalong</b></sub></a><br /><a href="#design-VectorKappa" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt="Clark Wang"/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=clarkwang" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt="iamchating"/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=iamchating" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt="starxg"/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt="Alisue"/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt="Dominic Yin"/><br /><sub><b>Dominic Yin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ydcool" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bdr99"><img src="https://avatars.githubusercontent.com/u/2292715?v=4?s=100" width="100px;" alt="Brandon Rothweiler"/><br /><sub><b>Brandon Rothweiler</b></sub></a><br /><a href="#design-bdr99" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://git.io/JnP49"><img src="https://avatars.githubusercontent.com/u/63876444?v=4?s=100" width="100px;" alt="Logic Machine"/><br /><sub><b>Logic Machine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=logicmachine123" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cypherbits"><img src="https://avatars.githubusercontent.com/u/10424900?v=4?s=100" width="100px;" alt="cypherbits"/><br /><sub><b>cypherbits</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cypherbits" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://modulolotus.net"><img src="https://avatars.githubusercontent.com/u/946421?v=4?s=100" width="100px;" alt="Matthew Davidson"/><br /><sub><b>Matthew Davidson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=KingMob" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt="Alexander Wiedemann"/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt="장보연"/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt="zZ"/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt="Aaron Davison"/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt="Przemyslaw Kozik"/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt="Alfredo Arellano de la Fuente"/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt="MH Kim"/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://discord.gg/4c5EVTBhtp"><img src="https://avatars.githubusercontent.com/u/40345645?v=4?s=100" width="100px;" alt="Marmota"/><br /><sub><b>Marmota</b></sub></a><br /><a href="#design-jaimeadf" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://ares.zone"><img src="https://avatars.githubusercontent.com/u/40336192?v=4?s=100" width="100px;" alt="Ares Andrew"/><br /><sub><b>Ares Andrew</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TENX-S" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://usual.io/"><img src="https://avatars.githubusercontent.com/u/780052?v=4?s=100" width="100px;" alt="George Korsnick"/><br /><sub><b>George Korsnick</b></sub></a><br /><a href="#financial-gkor" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://about.me/ulu"><img src="https://avatars.githubusercontent.com/u/872764?v=4?s=100" width="100px;" alt="Artem Smirnov"/><br /><sub><b>Artem Smirnov</b></sub></a><br /><a href="#financial-uluhonolulu" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nevotheless"><img src="https://avatars.githubusercontent.com/u/779797?v=4?s=100" width="100px;" alt="Tim Kopplow"/><br /><sub><b>Tim Kopplow</b></sub></a><br /><a href="#financial-nevotheless" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mrthock"><img src="https://avatars.githubusercontent.com/u/88901709?v=4?s=100" width="100px;" alt="mrthock"/><br /><sub><b>mrthock</b></sub></a><br /><a href="#financial-mrthock" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lrottach"><img src="https://avatars.githubusercontent.com/u/50323692?v=4?s=100" width="100px;" alt="Lukas Rottach"/><br /><sub><b>Lukas Rottach</b></sub></a><br /><a href="#financial-lrottach" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/boonkerz"><img src="https://avatars.githubusercontent.com/u/277321?v=4?s=100" width="100px;" alt="boonkerz"/><br /><sub><b>boonkerz</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=boonkerz" title="Code">💻</a> <a href="#translation-boonkerz" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/milotype"><img src="https://avatars.githubusercontent.com/u/43657314?v=4?s=100" width="100px;" alt="Milo Ivir"/><br /><sub><b>Milo Ivir</b></sub></a><br /><a href="#translation-milotype" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JasonCubic"><img src="https://avatars.githubusercontent.com/u/8921015?v=4?s=100" width="100px;" alt="JasonCubic"/><br /><sub><b>JasonCubic</b></sub></a><br /><a href="#design-JasonCubic" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MaxWaldorf"><img src="https://avatars.githubusercontent.com/u/15877853?v=4?s=100" width="100px;" alt="MaxWaldorf"/><br /><sub><b>MaxWaldorf</b></sub></a><br /><a href="#infra-MaxWaldorf" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mwz"><img src="https://avatars.githubusercontent.com/u/1190768?v=4?s=100" width="100px;" alt="Michael Wizner"/><br /><sub><b>Michael Wizner</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mwz" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mgrulich"><img src="https://avatars.githubusercontent.com/u/781036?v=4?s=100" width="100px;" alt="Martin"/><br /><sub><b>Martin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mgrulich" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piersandro"><img src="https://avatars.githubusercontent.com/u/19996309?v=4?s=100" width="100px;" alt="Piersandro Guerrera"/><br /><sub><b>Piersandro Guerrera</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=piersandro" title="Documentation">📖</a> <a href="#translation-piersandro" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/0x973"><img src="https://avatars.githubusercontent.com/u/19320096?v=4?s=100" width="100px;" alt="0x973"/><br /><sub><b>0x973</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=0x973" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allenator"><img src="https://avatars.githubusercontent.com/u/11794943?v=4?s=100" width="100px;" alt="Allenator"/><br /><sub><b>Allenator</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Allenator" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://microhobby.com.br/blog"><img src="https://avatars.githubusercontent.com/u/2633321?v=4?s=100" width="100px;" alt="Matheus Castello"/><br /><sub><b>Matheus Castello</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=microhobby" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Jai-JAP"><img src="https://avatars.githubusercontent.com/u/78354625?v=4?s=100" width="100px;" alt="Jai A P"/><br /><sub><b>Jai A P</b></sub></a><br /><a href="#platform-Jai-JAP" title="Packaging/porting to new platform">📦</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://blog.ysc3839.com"><img src="https://avatars.githubusercontent.com/u/12028138?v=4?s=100" width="100px;" alt="Richard Yu"/><br /><sub><b>Richard Yu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ysc3839" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/artu-ole"><img src="https://avatars.githubusercontent.com/u/15938416?v=4?s=100" width="100px;" alt="artu-ole"/><br /><sub><b>artu-ole</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=artu-ole" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://timagribanov.github.io/"><img src="https://avatars.githubusercontent.com/u/48593815?v=4?s=100" width="100px;" alt="Timofey Gribanov"/><br /><sub><b>Timofey Gribanov</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=TimaGribanov" title="Documentation">📖</a> <a href="#translation-TimaGribanov" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://git.christianbingman.com"><img src="https://avatars.githubusercontent.com/u/42191425?v=4?s=100" width="100px;" alt="Christian Bingman"/><br /><sub><b>Christian Bingman</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ChristianBingman" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://zhangzhipeng2023.cn/"><img src="https://avatars.githubusercontent.com/u/5310853?v=4?s=100" width="100px;" alt="zhipeng"/><br /><sub><b>zhipeng</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Ox0400" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/woodmeal"><img src="https://avatars.githubusercontent.com/u/104011197?v=4?s=100" width="100px;" alt="woodmeal"/><br /><sub><b>woodmeal</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=woodmeal" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://magiclike.codeberg.page/"><img src="https://avatars.githubusercontent.com/u/82117109?v=4?s=100" width="100px;" alt="MagicLike"/><br /><sub><b>MagicLike</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=MagicLike" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hisamafahri"><img src="https://avatars.githubusercontent.com/u/65691613?v=4?s=100" width="100px;" alt="Hisam Fahri"/><br /><sub><b>Hisam Fahri</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hisamafahri" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://liangchengj.com"><img src="https://avatars.githubusercontent.com/u/48881023?v=4?s=100" width="100px;" alt="Liangcheng Juves"/><br /><sub><b>Liangcheng Juves</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LiangchengJ" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/attet"><img src="https://avatars.githubusercontent.com/u/1911416?v=4?s=100" width="100px;" alt="Atte Timonen"/><br /><sub><b>Atte Timonen</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=attet" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/joaolmpinto/"><img src="https://avatars.githubusercontent.com/u/1143125?v=4?s=100" width="100px;" alt="João Pinto"/><br /><sub><b>João Pinto</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=joaompinto" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Qiming-Liu"><img src="https://avatars.githubusercontent.com/u/68600416?v=4?s=100" width="100px;" alt="Alan"/><br /><sub><b>Alan</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Qiming-Liu" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://74th.tech/"><img src="https://avatars.githubusercontent.com/u/1060011?v=4?s=100" width="100px;" alt="Atsushi Morimoto"/><br /><sub><b>Atsushi Morimoto</b></sub></a><br /><a href="#financial-74th" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://arles.red/"><img src="https://avatars.githubusercontent.com/u/5369096?v=4?s=100" width="100px;" alt="Arles"/><br /><sub><b>Arles</b></sub></a><br /><a href="#financial-aarles" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://pentestbook.six2dez.com/"><img src="https://avatars.githubusercontent.com/u/24670991?v=4?s=100" width="100px;" alt="six2dez"/><br /><sub><b>six2dez</b></sub></a><br /><a href="#financial-six2dez" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/CandiceJoy"><img src="https://avatars.githubusercontent.com/u/8854890?v=4?s=100" width="100px;" alt="Candice"/><br /><sub><b>Candice</b></sub></a><br /><a href="#financial-CandiceJoy" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kingrowen"><img src="https://avatars.githubusercontent.com/u/13178700?v=4?s=100" width="100px;" alt="Rowen Willabus"/><br /><sub><b>Rowen Willabus</b></sub></a><br /><a href="#financial-kingrowen" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://hengy1.top/"><img src="https://avatars.githubusercontent.com/u/98681454?v=4?s=100" width="100px;" alt="HengY1Coding✨"/><br /><sub><b>HengY1Coding✨</b></sub></a><br /><a href="#financial-HengY1Sky" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FrancisHG"><img src="https://avatars.githubusercontent.com/u/1611626?v=4?s=100" width="100px;" alt="Francis Gelderloos"/><br /><sub><b>Francis Gelderloos</b></sub></a><br /><a href="#financial-FrancisHG" title="Financial">💵</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/astromasoud"><img src="https://avatars.githubusercontent.com/u/18737721?v=4?s=100" width="100px;" alt="astromasoud"/><br /><sub><b>astromasoud</b></sub></a><br /><a href="#financial-astromasoud" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://spirit55555.dk/"><img src="https://avatars.githubusercontent.com/u/2357565?v=4?s=100" width="100px;" alt="Anders G. Jørgensen"/><br /><sub><b>Anders G. Jørgensen</b></sub></a><br /><a href="#financial-Spirit55555" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/djradon"><img src="https://avatars.githubusercontent.com/u/5224156?v=4?s=100" width="100px;" alt="Dave Richardson"/><br /><sub><b>Dave Richardson</b></sub></a><br /><a href="#financial-djradon" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/tpberntsen"><img src="https://avatars.githubusercontent.com/u/922318?v=4?s=100" width="100px;" alt="Thomas Peter Berntsen"/><br /><sub><b>Thomas Peter Berntsen</b></sub></a><br /><a href="#financial-tpberntsen" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://bandism.net/"><img src="https://avatars.githubusercontent.com/u/22633385?v=4?s=100" width="100px;" alt="Ikko Ashimine"/><br /><sub><b>Ikko Ashimine</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=eltociear" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/giejqf"><img src="https://avatars.githubusercontent.com/u/9211230?v=4?s=100" width="100px;" alt="giejqf"/><br /><sub><b>giejqf</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=giejqf" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LacazeThomas"><img src="https://avatars.githubusercontent.com/u/19855907?v=4?s=100" width="100px;" alt="Thomas LACAZE"/><br /><sub><b>Thomas LACAZE</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=LacazeThomas" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://pochen.me/"><img src="https://avatars.githubusercontent.com/u/1329716?v=4?s=100" width="100px;" alt="Po Chen"/><br /><sub><b>Po Chen</b></sub></a><br /><a href="#financial-princemaple" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://victorchandra.carrd.co/"><img src="https://avatars.githubusercontent.com/u/41635105?v=4?s=100" width="100px;" alt="Victor Chandra"/><br /><sub><b>Victor Chandra</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mzmznasipadang" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/daniel347x"><img src="https://avatars.githubusercontent.com/u/309746?v=4?s=100" width="100px;" alt="Dan Nissenbaum"/><br /><sub><b>Dan Nissenbaum</b></sub></a><br /><a href="#financial-daniel347x" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DunklerPhoenix"><img src="https://avatars.githubusercontent.com/u/1261305?v=4?s=100" width="100px;" alt="RogueThorn"/><br /><sub><b>RogueThorn</b></sub></a><br /><a href="#financial-DunklerPhoenix" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://spenserblack.github.io"><img src="https://avatars.githubusercontent.com/u/8546709?v=4?s=100" width="100px;" alt="Spenser Black"/><br /><sub><b>Spenser Black</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=spenserblack" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zuedev"><img src="https://avatars.githubusercontent.com/u/24614929?v=4?s=100" width="100px;" alt="Alex"/><br /><sub><b>Alex</b></sub></a><br /><a href="#financial-zuedev" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://hengy1.top/"><img src="https://avatars.githubusercontent.com/u/98681454?v=4?s=100" width="100px;" alt="HengY1Coding✨"/><br /><sub><b>HengY1Coding✨</b></sub></a><br /><a href="#financial-HengY1Cola" title="Financial">💵</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://www.stackscale.com/"><img src="https://avatars.githubusercontent.com/u/195768?v=4?s=100" width="100px;" alt="David Carrero"/><br /><sub><b>David Carrero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=dcarrero" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zhoro"><img src="https://avatars.githubusercontent.com/u/1105687?v=4?s=100" width="100px;" alt="Andrii Zhovtiak"/><br /><sub><b>Andrii Zhovtiak</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zhoro" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JohnMasoner"><img src="https://avatars.githubusercontent.com/u/42313377?v=4?s=100" width="100px;" alt="Mason Ma"/><br /><sub><b>Mason Ma</b></sub></a><br /><a href="#financial-JohnMasoner" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ntimo"><img src="https://avatars.githubusercontent.com/u/6145026?v=4?s=100" width="100px;" alt="Timo"/><br /><sub><b>Timo</b></sub></a><br /><a href="#financial-ntimo" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/evinwatson/"><img src="https://avatars.githubusercontent.com/u/24227251?v=4?s=100" width="100px;" alt="Evin Watson"/><br /><sub><b>Evin Watson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=EvinRWatson" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://t.me/hendrjl"><img src="https://avatars.githubusercontent.com/u/15981200?v=4?s=100" width="100px;" alt="Hendra Juli"/><br /><sub><b>Hendra Juli</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=deulizealand" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wkricowski"><img src="https://avatars.githubusercontent.com/u/36803521?v=4?s=100" width="100px;" alt="Wellinton Kricowski"/><br /><sub><b>Wellinton Kricowski</b></sub></a><br /><a href="#financial-wkricowski" title="Financial">💵</a> <a href="https://github.com/Eugeny/tabby/commits?author=wkricowski" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/almzau"><img src="https://avatars.githubusercontent.com/u/29115846?v=4?s=100" width="100px;" alt="Allan"/><br /><sub><b>Allan</b></sub></a><br /><a href="#design-almzau" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://oidamo.de"><img src="https://avatars.githubusercontent.com/u/17959794?v=4?s=100" width="100px;" alt="Benjamin Brandmeier"/><br /><sub><b>Benjamin Brandmeier</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BenjaminBrandmeier" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/patric1025"><img src="https://avatars.githubusercontent.com/u/65654040?v=4?s=100" width="100px;" alt="patric1025"/><br /><sub><b>patric1025</b></sub></a><br /><a href="#translation-patric1025" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hermitpopcorn"><img src="https://avatars.githubusercontent.com/u/16042129?v=4?s=100" width="100px;" alt="hermitpopcorn"/><br /><sub><b>hermitpopcorn</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=hermitpopcorn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://joshuatz.com/"><img src="https://avatars.githubusercontent.com/u/17817563?v=4?s=100" width="100px;" alt="Joshua Tzucker"/><br /><sub><b>Joshua Tzucker</b></sub></a><br /><a href="#financial-joshuatz" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/luxifr"><img src="https://avatars.githubusercontent.com/u/665715?v=4?s=100" width="100px;" alt="luxifr"/><br /><sub><b>luxifr</b></sub></a><br /><a href="#financial-luxifr" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ukulanne"><img src="https://avatars.githubusercontent.com/u/28586666?v=4?s=100" width="100px;" alt="Anne Summers"/><br /><sub><b>Anne Summers</b></sub></a><br /><a href="#financial-ukulanne" title="Financial">💵</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Clem-Fern"><img src="https://avatars.githubusercontent.com/u/20025949?v=4?s=100" width="100px;" alt="Clem"/><br /><sub><b>Clem</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Clem-Fern" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/elizabeth-dev"><img src="https://avatars.githubusercontent.com/u/13015727?v=4?s=100" width="100px;" alt="Elizabeth Martín Campos"/><br /><sub><b>Elizabeth Martín Campos</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=elizabeth-dev" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/siccous"><img src="https://avatars.githubusercontent.com/u/7812885?v=4?s=100" width="100px;" alt="Tomáš Hruška"/><br /><sub><b>Tomáš Hruška</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siccous" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/karaketir16"><img src="https://avatars.githubusercontent.com/u/27349806?v=4?s=100" width="100px;" alt="Osman Karaketir"/><br /><sub><b>Osman Karaketir</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=karaketir16" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.gnomegarden.io/"><img src="https://avatars.githubusercontent.com/u/33667144?v=4?s=100" width="100px;" alt="Crypto Gnome"/><br /><sub><b>Crypto Gnome</b></sub></a><br /><a href="#financial-CryptoGnome" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rbukovansky"><img src="https://avatars.githubusercontent.com/u/1004491?v=4?s=100" width="100px;" alt="Richard Bukovansky"/><br /><sub><b>Richard Bukovansky</b></sub></a><br /><a href="#financial-rbukovansky" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pseudocc"><img src="https://avatars.githubusercontent.com/u/85104110?v=4?s=100" width="100px;" alt="catlas"/><br /><sub><b>catlas</b></sub></a><br /><a href="#financial-pseudocc" title="Financial">💵</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://kapocsi.ca"><img src="https://avatars.githubusercontent.com/u/84490604?v=4?s=100" width="100px;" alt="Thomas Kapocsi"/><br /><sub><b>Thomas Kapocsi</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Kapocsi" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://dylhack.dev/"><img src="https://avatars.githubusercontent.com/u/27179786?v=4?s=100" width="100px;" alt="Dylan Hackworth"/><br /><sub><b>Dylan Hackworth</b></sub></a><br /><a href="#financial-dylhack" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/echo304"><img src="https://avatars.githubusercontent.com/u/16456651?v=4?s=100" width="100px;" alt="Sangboak Lee"/><br /><sub><b>Sangboak Lee</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=echo304" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/qyecst"><img src="https://avatars.githubusercontent.com/u/13901864?v=4?s=100" width="100px;" alt="qyecst"/><br /><sub><b>qyecst</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=qyecst" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DehanLUO"><img src="https://avatars.githubusercontent.com/u/53093688?v=4?s=100" width="100px;" alt="Han"/><br /><sub><b>Han</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=DehanLUO" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wljince007"><img src="https://avatars.githubusercontent.com/u/88243938?v=4?s=100" width="100px;" alt="wljince007"/><br /><sub><b>wljince007</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=wljince007" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FeroTheFox"><img src="https://avatars.githubusercontent.com/u/52982404?v=4?s=100" width="100px;" alt="fero"/><br /><sub><b>fero</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=FeroTheFox" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://siebsie23.nl/"><img src="https://avatars.githubusercontent.com/u/25083973?v=4?s=100" width="100px;" alt="Sibren"/><br /><sub><b>Sibren</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=siebsie23" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.nathaniel-walser.com"><img src="https://avatars.githubusercontent.com/u/33339996?v=4?s=100" width="100px;" alt="Nathaniel Walser"/><br /><sub><b>Nathaniel Walser</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=nwalser" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aaronhuggins"><img src="https://avatars.githubusercontent.com/u/16567111?v=4?s=100" width="100px;" alt="Aaron Huggins"/><br /><sub><b>Aaron Huggins</b></sub></a><br /><a href="#design-aaronhuggins" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://zkxdex.github.io/"><img src="https://avatars.githubusercontent.com/u/66271780?v=4?s=100" width="100px;" alt="KDex"/><br /><sub><b>KDex</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=zKXDEX" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kimbob13"><img src="https://avatars.githubusercontent.com/u/26755098?v=4?s=100" width="100px;" alt="ChangHwan Kim"/><br /><sub><b>ChangHwan Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=kimbob13" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ashneilson"><img src="https://avatars.githubusercontent.com/u/35913512?v=4?s=100" width="100px;" alt="Ash Neilson"/><br /><sub><b>Ash Neilson</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ashneilson" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cfs4819"><img src="https://avatars.githubusercontent.com/u/53071761?v=4?s=100" width="100px;" alt="Chen Fansong"/><br /><sub><b>Chen Fansong</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=cfs4819" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.selfhosted.sg/"><img src="https://avatars.githubusercontent.com/u/128927132?v=4?s=100" width="100px;" alt="SelfHosted"/><br /><sub><b>SelfHosted</b></sub></a><br /><a href="#financial-SelfHosted-Club" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://hiroga.hatenablog.com/"><img src="https://avatars.githubusercontent.com/u/13391129?v=4?s=100" width="100px;" alt="Hiroaki Ogasawara"/><br /><sub><b>Hiroaki Ogasawara</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=xhiroga" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://p.foundation/"><img src="https://avatars.githubusercontent.com/u/80860929?v=4?s=100" width="100px;" alt="P Foundation"/><br /><sub><b>P Foundation</b></sub></a><br /><a href="#financial-pfoundation" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/et304383"><img src="https://avatars.githubusercontent.com/u/2693414?v=4?s=100" width="100px;" alt="et304383"/><br /><sub><b>et304383</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=et304383" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ajkrj"><img src="https://avatars.githubusercontent.com/u/210226755?v=4?s=100" width="100px;" alt="ajkrj"/><br /><sub><b>ajkrj</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ajkrj" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/leoberbert/"><img src="https://avatars.githubusercontent.com/u/16724862?v=4?s=100" width="100px;" alt="Leonardo Berbert"/><br /><sub><b>Leonardo Berbert</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=leoberbert" title="Code">💻</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
Este proyecto sigue la especificación [all-contributors](https://github.com/all-contributors/all-contributors). ¡Las contribuciones de cualquier tipo son bienvenidas!.
================================================
FILE: README.id-ID.md
================================================
[](https://tabby.sh)
<p align="center">
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a>   <a href="https://translate.tabby.sh/"><img alt="Translate" src="https://shields.io/badge/Translate-UI-white?logo=googletranslate&style=for-the-badge&color=white&logoColor=fff"></a> <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Subscribe-News-blue?logo=twitter&style=for-the-badge&color=blue"></a>
</p>
<p align="center">
<a href="https://ko-fi.com/J3J8KWTF">
<img src="https://cdn.ko-fi.com/cdn/kofi3.png?v=2" width="150">
</a>
</p>
----
### Downloads:
* [Rilis Terbaru](https://github.com/Eugeny/tabby/releases/latest)
* [Repositories](https://packagecloud.io/eugeny/tabby): [Debian/Ubuntu-based](https://packagecloud.io/eugeny/tabby/install#bash-deb), [RPM-based](https://packagecloud.io/eugeny/tabby/install#bash-rpm)
* [Latest nightly build](https://nightly.link/Eugeny/tabby/workflows/build/master)
<br/>
<p align="center">
This README is also available in: <a href="./README.md">:gb: English</a> · <a href="./README.es-ES.md">:es: Spanish</a> · <a href="./README.ru-RU.md">:ru: Русский</a> · <a href="./README.ko-KR.md">:kr: 한국어</a> · <a href="./README.zh-CN.md">:cn: 简体中文</a> · <a href="./README.it-IT.md">:it: Italiano</a> · <a href="./README.de-DE.md">:de: Deutsch</a> · <a href="./README.ja-JP.md">:jp: 日本語</a> · <a href="./README.pt-BR.md">:brazil: Português</a> · <a href="./README.pl-PL.md">:poland: Polski</a>
</p>
----
[**Tabby**](https://tabby.sh) (sebelumnya **Terminus**) adalah emulator terminal, SSH, dan klien serial yang sangat dapat dikonfigurasi untuk Windows, macOS, dan Linux
* Integrasi SSH dan klien Telnet dan Koneksi Manager
* Integrasi terminal serial
* Tema dan skema warna
* Pintasan yang dapat dikonfigurasi sepenuhnya dan pintasan multi-chord
* Panel yang bisa dipisahkan
* Mengingat tab anda
* Mendukung PowerShell (dan PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder dan CMD
* File transfer secara langsung dari/ke sesi SSH melalui Zmodem
* Mendukung Unicode termasuk karakter double-width
* Tidak tersendat dengan output yang tampil dengan cepat
* Pengalaman shell yang tepat di Windows termasuk penyelesaian tab (melalui Clink)
* Terintegrasi dengan wadah terenkripsi untuk rahasia dan konfigurasi SSH
* SSH, SFTP dan klien Telnet tersedia sebagai [aplikasi web](https://tabby.sh/app) (dan juga [self-hosted](https://github.com/Eugeny/tabby-web)).
# Contents <!-- omit in toc -->
- [Apa itu Tabby dan bukan Tabby](#what-tabby-is-and-isnt)
- [Fitur Terminal](#terminal-features)
- [SSH Client](#ssh-client)
- [Serial Terminal](#serial-terminal)
- [Portabel](#portable)
- [Plugins](#plugins)
- [Tema](#themes)
- [Kontribusi](#contributing)
<a name="about"></a>
# Apa itu Tabby dan bukan Tabby
* **Tabby adalah** sebuah alternatif untuk terminal standar Windows' (conhost), PowerShell ISE, PuTTY, macOS Terminal.app dan iTerm
* **Tabby bukan** shell yang baru atau pengganti MinGW atau Cygwin. Dan bukan aplikasi ringan - jika mengutamakan penggunaan RAM, mungkin boleh mencoba [Conemu](https://conemu.github.io) atau [Alacritty](https://github.com/jwilm/alacritty)
<a name="terminal"></a>
# Fitur terminal

* Terminal VT220 + berbagai macam ekstensi
* Beberapa pembagian panel
* Tab di sisi mana pun dari jendela
* Jendela dockable opsional dengan hotkey spawn global ("Quake console")
* Deteksi Progres
* Notifikasi saat proses telah selesai
* Tempel tanda kurung, peringatan tempel multiline
* Pengikat font
* Kustom profil shell
* Opsional tempel RMB dan copy-on select (PuTTY style)
<a name="ssh"></a>
# Klien SSH

* Klien SSH2 dengan manajemen koneksi
* X11 dan port forwarding
* Otomatis berpindah host management
* Agent forwarding (termasuk Pageant dan Windows native OpenSSH Agent)
* Login scripts
<a name="serial"></a>
# Serial Terminal
* Koneksi yang disimpan
* Support Readline input
* Opsional hex byte-by-byte input dan hexdump output
* Konversi Newline
* Rekoneksi secara otomatis
<a name="portable"></a>
# Portabel
Tabby tetap bisa berjalan sebagai aplikasi portabel di Windows, jika anda membuat folder `data` di tempat yang sama dengan `Tabby.exe`.
<a name="plugins"></a>
#
gitextract_38kc1ygb/ ├── .all-contributorsrc ├── .editorconfig ├── .eslintrc.yml ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── feature_request.md │ │ └── issue-report.md │ ├── dependabot.yml │ ├── stale.yml │ └── workflows/ │ ├── build.yml │ ├── codeql-analysis.yml │ ├── docs.yml │ └── release.yml ├── .gitignore ├── .mergify.yml ├── .pug-lintrc.js ├── .vscode/ │ └── launch.json ├── .well-known/ │ └── funding-manifest-urls ├── CODE_OF_CONDUCT.md ├── HACKING.md ├── LICENSE ├── README.de-DE.md ├── README.es-ES.md ├── README.id-ID.md ├── README.it-IT.md ├── README.ja-JP.md ├── README.ko-KR.md ├── README.md ├── README.pl-PL.md ├── README.pt-BR.md ├── README.ru-RU.md ├── README.zh-CN.md ├── app/ │ ├── dev-app-update.yml │ ├── index.pug │ ├── lib/ │ │ ├── app.ts │ │ ├── cli.ts │ │ ├── config.ts │ │ ├── index.ts │ │ ├── lru.ts │ │ ├── pluginManager.ts │ │ ├── portable.ts │ │ ├── pty.ts │ │ ├── sentry.ts │ │ ├── urlHandler.ts │ │ ├── utfSplitter.ts │ │ └── window.ts │ ├── package.json │ ├── patches/ │ │ └── @serialport+bindings-cpp+11.0.3.patch │ ├── src/ │ │ ├── app.module.ts │ │ ├── entry.preload.ts │ │ ├── entry.ts │ │ ├── global.scss │ │ ├── pluginBlacklist.ts │ │ ├── plugins.ts │ │ ├── preload.scss │ │ └── toastr.scss │ ├── tsconfig.json │ ├── tsconfig.main.json │ ├── webpack.config.main.mjs │ └── webpack.config.mjs ├── build/ │ ├── installer.nsh │ ├── linux/ │ │ └── after-install.tpl │ └── mac/ │ ├── entitlements.plist │ └── icon.icns ├── electron-builder.yml ├── extras/ │ ├── automator-workflows/ │ │ ├── Open Tabby here.workflow/ │ │ │ └── Contents/ │ │ │ ├── Info.plist │ │ │ ├── _CodeSignature/ │ │ │ │ ├── CodeDirectory │ │ │ │ ├── CodeRequirements │ │ │ │ ├── CodeRequirements-1 │ │ │ │ ├── CodeResources │ │ │ │ └── CodeSignature │ │ │ └── document.wflow │ │ └── Paste path into Tabby.workflow/ │ │ └── Contents/ │ │ ├── Info.plist │ │ ├── _CodeSignature/ │ │ │ ├── CodeDirectory │ │ │ ├── CodeRequirements │ │ │ ├── CodeRequirements-1 │ │ │ ├── CodeResources │ │ │ └── CodeSignature │ │ └── document.wflow │ └── clink/ │ ├── CHANGES │ ├── LICENSE │ ├── clink.bat │ ├── clink.lua │ ├── clink_inputrc_base │ ├── default_inputrc │ └── default_settings ├── firebase.json ├── locale/ │ ├── STOP.txt │ ├── af-ZA.po │ ├── app.pot │ ├── bg-BG.po │ ├── cs-CZ.po │ ├── da-DK.po │ ├── de-DE.po │ ├── en-GB.po │ ├── en-US.po │ ├── es-ES.po │ ├── fr-FR.po │ ├── hr-HR.po │ ├── id-ID.po │ ├── it-IT.po │ ├── ja-JP.po │ ├── ko-KR.po │ ├── pl-PL.po │ ├── pt-BR.po │ ├── pt-PT.po │ ├── ru-RU.po │ ├── sr-SP.po │ ├── sv-SE.po │ ├── tr-TR.po │ ├── uk-UA.po │ ├── zh-CN.po │ └── zh-TW.po ├── package.json ├── patches/ │ └── app-builder-lib+26.0.12.patch ├── scripts/ │ ├── build-docs.mjs │ ├── build-linux.mjs │ ├── build-macos.mjs │ ├── build-modules.mjs │ ├── build-native.mjs │ ├── build-typings.mjs │ ├── build-windows.mjs │ ├── generate-icon-metadata.mjs │ ├── i18n-extract.mjs │ ├── install-deps.mjs │ ├── prepackage-plugins.mjs │ ├── publish-plugins.mjs │ ├── sentry-upload.mjs │ └── vars.mjs ├── snap/ │ └── snapcraft.yaml ├── tabby-auto-sudo-password/ │ ├── package.json │ ├── src/ │ │ ├── decorator.ts │ │ └── index.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-community-color-schemes/ │ ├── .editorconfig │ ├── package.json │ ├── schemes/ │ │ ├── 3024 Day │ │ ├── 3024 Night │ │ ├── AdventureTime │ │ ├── Afterglow │ │ ├── AlienBlood │ │ ├── Argonaut │ │ ├── Arthur │ │ ├── AtelierSulphurpool │ │ ├── Atom │ │ ├── AtomOneLight │ │ ├── Base16 Default Dark │ │ ├── Batman │ │ ├── Belafonte Day │ │ ├── Belafonte Night │ │ ├── BirdsOfParadise │ │ ├── Blazer │ │ ├── Borland │ │ ├── Bright Lights │ │ ├── Broadcast │ │ ├── Brogrammer │ │ ├── C64 │ │ ├── CLRS │ │ ├── Chalk │ │ ├── Chalkboard │ │ ├── Ciapre │ │ ├── Cobalt Neon │ │ ├── Cobalt2 │ │ ├── CrayonPonyFish │ │ ├── Dark Pastel │ │ ├── Darkside │ │ ├── Desert │ │ ├── DimmedMonokai │ │ ├── DotGov │ │ ├── Dracula │ │ ├── Duotone Dark │ │ ├── ENCOM │ │ ├── Earthsong │ │ ├── Elemental │ │ ├── Elementary │ │ ├── Espresso │ │ ├── Espresso Libre │ │ ├── Fideloper │ │ ├── FirefoxDev │ │ ├── Firewatch │ │ ├── FishTank │ │ ├── Flat │ │ ├── Flatland │ │ ├── Floraverse │ │ ├── ForestBlue │ │ ├── FrontEndDelight │ │ ├── FunForrest │ │ ├── Galaxy │ │ ├── Github │ │ ├── Glacier │ │ ├── Grape │ │ ├── Grass │ │ ├── Gruvbox Dark │ │ ├── Hardcore │ │ ├── Harper │ │ ├── Highway │ │ ├── Hipster Green │ │ ├── Homebrew │ │ ├── Hurtado │ │ ├── Hybrid │ │ ├── IC_Green_PPL │ │ ├── IC_Orange_PPL │ │ ├── IR_Black │ │ ├── Iceberg │ │ ├── Jackie Brown │ │ ├── Japanesque │ │ ├── Jazz │ │ ├── Jellybeans │ │ ├── JetBrains Darcula │ │ ├── Kibble │ │ ├── Later This Evening │ │ ├── Lavandula │ │ ├── Light Owl │ │ ├── LiquidCarbon │ │ ├── LiquidCarbonTransparent │ │ ├── LiquidCarbonTransparentInverse │ │ ├── Man Page │ │ ├── Material │ │ ├── MaterialDark │ │ ├── Mathias │ │ ├── Medallion │ │ ├── Melange Dark │ │ ├── Misterioso │ │ ├── Molokai │ │ ├── MonaLisa │ │ ├── Monokai Soda │ │ ├── Monokai Vivid │ │ ├── N0tch2k │ │ ├── Neopolitan │ │ ├── Neutron │ │ ├── Night Owl │ │ ├── NightLion v1 │ │ ├── NightLion v2 │ │ ├── Nord │ │ ├── Novel │ │ ├── Obsidian │ │ ├── Ocean │ │ ├── OceanicMaterial │ │ ├── Ollie │ │ ├── OneHalfDark │ │ ├── OneHalfLight │ │ ├── Pandora │ │ ├── Paraiso Dark │ │ ├── Parasio Dark │ │ ├── PaulMillr │ │ ├── PencilDark │ │ ├── PencilLight │ │ ├── Piatto Light │ │ ├── Pnevma │ │ ├── Pro │ │ ├── Red Alert │ │ ├── Red Sands │ │ ├── Relaxed │ │ ├── Rippedcasts │ │ ├── Rose Pine │ │ ├── Rose Pine Dawn │ │ ├── Rose Pine Moon │ │ ├── Royal │ │ ├── Ryuuko │ │ ├── SeaShells │ │ ├── Seafoam Pastel │ │ ├── Seti │ │ ├── Shaman │ │ ├── Slate │ │ ├── Smyck │ │ ├── SoftServer │ │ ├── Solarized Darcula │ │ ├── Solarized Dark │ │ ├── Solarized Dark - Patched │ │ ├── Solarized Dark Higher Contrast │ │ ├── Solarized Light │ │ ├── SpaceGray │ │ ├── SpaceGray Eighties │ │ ├── SpaceGray Eighties Dull │ │ ├── Spacedust │ │ ├── Spiderman │ │ ├── Spring │ │ ├── Square │ │ ├── Sundried │ │ ├── Symfonic │ │ ├── Tango │ │ ├── Teerb │ │ ├── Terminal Basic │ │ ├── Thayer Bright │ │ ├── The Hulk │ │ ├── TokyoNight │ │ ├── TokyoNight Day │ │ ├── TokyoNight Storm │ │ ├── Tomorrow │ │ ├── Tomorrow Night │ │ ├── Tomorrow Night Blue │ │ ├── Tomorrow Night Bright │ │ ├── Tomorrow Night Eighties │ │ ├── ToyChest │ │ ├── Treehouse │ │ ├── Twilight │ │ ├── Ubuntu │ │ ├── UnderTheSea │ │ ├── Urple │ │ ├── Vaughn │ │ ├── VibrantInk │ │ ├── Violet Dark │ │ ├── Violet Light │ │ ├── WarmNeon │ │ ├── Wez │ │ ├── WildCherry │ │ ├── Wombat │ │ ├── Wryan │ │ ├── Zenburn │ │ ├── ayu │ │ ├── ayu_light │ │ ├── base2tone-cave-dark │ │ ├── base2tone-desert-dark │ │ ├── base2tone-drawbridge-dark │ │ ├── base2tone-evening-dark │ │ ├── base2tone-forest-dark │ │ ├── base2tone-heath-dark │ │ ├── base2tone-heath-light │ │ ├── base2tone-lake-dark │ │ ├── base2tone-meadow-dark │ │ ├── base2tone-morning-light │ │ ├── base2tone-pool-dark │ │ ├── base2tone-sea-dark │ │ ├── base2tone-space-dark │ │ ├── deep │ │ └── idleToes │ ├── src/ │ │ ├── colorSchemes.ts │ │ └── index.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-core/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── api/ │ │ │ ├── cli.ts │ │ │ ├── commands.ts │ │ │ ├── configProvider.ts │ │ │ ├── fileProvider.ts │ │ │ ├── hostApp.ts │ │ │ ├── hostWindow.ts │ │ │ ├── hotkeyProvider.ts │ │ │ ├── index.ts │ │ │ ├── mainProcess.ts │ │ │ ├── menu.ts │ │ │ ├── platform.ts │ │ │ ├── profileProvider.ts │ │ │ ├── selector.ts │ │ │ ├── tabContextMenuProvider.ts │ │ │ ├── tabRecovery.ts │ │ │ ├── theme.ts │ │ │ └── toolbarButtonProvider.ts │ │ ├── cli.ts │ │ ├── commands.ts │ │ ├── components/ │ │ │ ├── appRoot.component.pug │ │ │ ├── appRoot.component.scss │ │ │ ├── appRoot.component.ts │ │ │ ├── base.component.ts │ │ │ ├── baseTab.component.ts │ │ │ ├── checkbox.component.ts │ │ │ ├── profileIcon.component.pug │ │ │ ├── profileIcon.component.scss │ │ │ ├── profileIcon.component.ts │ │ │ ├── promptModal.component.pug │ │ │ ├── promptModal.component.ts │ │ │ ├── renameTabModal.component.pug │ │ │ ├── renameTabModal.component.ts │ │ │ ├── safeModeModal.component.pug │ │ │ ├── safeModeModal.component.ts │ │ │ ├── selectorModal.component.pug │ │ │ ├── selectorModal.component.scss │ │ │ ├── selectorModal.component.ts │ │ │ ├── selfPositioning.component.ts │ │ │ ├── splitTab.component.scss │ │ │ ├── splitTab.component.ts │ │ │ ├── splitTabDropZone.component.scss │ │ │ ├── splitTabDropZone.component.ts │ │ │ ├── splitTabPaneLabel.component.scss │ │ │ ├── splitTabPaneLabel.component.ts │ │ │ ├── splitTabSpanner.component.scss │ │ │ ├── splitTabSpanner.component.ts │ │ │ ├── startPage.component.pug │ │ │ ├── startPage.component.scss │ │ │ ├── startPage.component.ts │ │ │ ├── tabBody.component.scss │ │ │ ├── tabBody.component.ts │ │ │ ├── tabBody.deep.component.css │ │ │ ├── tabHeader.component.pug │ │ │ ├── tabHeader.component.scss │ │ │ ├── tabHeader.component.ts │ │ │ ├── titleBar.component.pug │ │ │ ├── titleBar.component.scss │ │ │ ├── titleBar.component.ts │ │ │ ├── toggle.component.scss │ │ │ ├── toggle.component.ts │ │ │ ├── transfersMenu.component.pug │ │ │ ├── transfersMenu.component.scss │ │ │ ├── transfersMenu.component.ts │ │ │ ├── unlockVaultModal.component.pug │ │ │ ├── unlockVaultModal.component.ts │ │ │ ├── welcomeTab.component.pug │ │ │ ├── welcomeTab.component.scss │ │ │ ├── welcomeTab.component.ts │ │ │ ├── windowControls.component.pug │ │ │ ├── windowControls.component.scss │ │ │ └── windowControls.component.ts │ │ ├── config.ts │ │ ├── configDefaults.linux.yaml │ │ ├── configDefaults.macos.yaml │ │ ├── configDefaults.web.yaml │ │ ├── configDefaults.windows.yaml │ │ ├── configDefaults.yaml │ │ ├── directives/ │ │ │ ├── alwaysVisibleTypeahead.directive.ts │ │ │ ├── autofocus.directive.ts │ │ │ ├── cdkAutoDropGroup.directive.ts │ │ │ ├── dropZone.directive.pug │ │ │ ├── dropZone.directive.scss │ │ │ ├── dropZone.directive.ts │ │ │ └── fastHtmlBind.directive.ts │ │ ├── hotkeys.ts │ │ ├── icons.json │ │ ├── index.ts │ │ ├── profiles.ts │ │ ├── services/ │ │ │ ├── app.service.ts │ │ │ ├── commands.service.ts │ │ │ ├── config.service.ts │ │ │ ├── docking.service.ts │ │ │ ├── fileProviders.service.ts │ │ │ ├── homeBase.service.ts │ │ │ ├── hotkeys.service.ts │ │ │ ├── hotkeys.util.ts │ │ │ ├── locale.service.ts │ │ │ ├── log.service.ts │ │ │ ├── notifications.service.ts │ │ │ ├── profiles.service.ts │ │ │ ├── selector.service.ts │ │ │ ├── tabRecovery.service.ts │ │ │ ├── tabs.service.ts │ │ │ ├── themes.service.ts │ │ │ ├── updater.service.ts │ │ │ └── vault.service.ts │ │ ├── tabContextMenu.ts │ │ ├── theme.new.scss │ │ ├── theme.ts │ │ ├── theme.vars.scss │ │ ├── theme.vendor.scss │ │ ├── utfSplitter.ts │ │ └── utils.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-electron/ │ ├── package.json │ ├── src/ │ │ ├── colorSchemes.ts │ │ ├── config.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── pathDrop.ts │ │ ├── pty.ts │ │ ├── services/ │ │ │ ├── dockMenu.service.ts │ │ │ ├── docking.service.ts │ │ │ ├── electron.service.ts │ │ │ ├── fileProvider.service.ts │ │ │ ├── hostApp.service.ts │ │ │ ├── hostWindow.service.ts │ │ │ ├── log.service.ts │ │ │ ├── platform.service.ts │ │ │ ├── shellIntegration.service.ts │ │ │ ├── touchbar.service.ts │ │ │ ├── uac.service.ts │ │ │ └── updater.service.ts │ │ ├── sftpContextMenu.ts │ │ ├── shells/ │ │ │ ├── cmder.ts │ │ │ ├── cygwin32.ts │ │ │ ├── cygwin64.ts │ │ │ ├── gitBash.ts │ │ │ ├── linuxDefault.ts │ │ │ ├── macDefault.ts │ │ │ ├── msys2.ts │ │ │ ├── posix.ts │ │ │ ├── powershellCore.ts │ │ │ ├── vs.ts │ │ │ ├── winDefault.ts │ │ │ ├── windowsBase.ts │ │ │ ├── windowsStock.ts │ │ │ └── wsl.ts │ │ └── sshImporters.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-linkifier/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── api.ts │ │ ├── config.ts │ │ ├── decorator.ts │ │ ├── handlers.ts │ │ └── index.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-local/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── api.ts │ │ ├── buttonProvider.ts │ │ ├── cli.ts │ │ ├── components/ │ │ │ ├── commandLineEditor.component.pug │ │ │ ├── commandLineEditor.component.ts │ │ │ ├── environmentEditor.component.pug │ │ │ ├── environmentEditor.component.scss │ │ │ ├── environmentEditor.component.ts │ │ │ ├── localProfileSettings.component.pug │ │ │ ├── localProfileSettings.component.ts │ │ │ ├── shellSettingsTab.component.pug │ │ │ ├── shellSettingsTab.component.ts │ │ │ └── terminalTab.component.ts │ │ ├── config.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── profiles.ts │ │ ├── recoveryProvider.ts │ │ ├── services/ │ │ │ └── terminal.service.ts │ │ ├── session.ts │ │ ├── settings.ts │ │ └── tabContextMenu.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-plugin-manager/ │ ├── package.json │ ├── src/ │ │ ├── components/ │ │ │ ├── pluginsSettingsTab.component.pug │ │ │ ├── pluginsSettingsTab.component.scss │ │ │ └── pluginsSettingsTab.component.ts │ │ ├── index.ts │ │ ├── services/ │ │ │ └── pluginManager.service.ts │ │ └── settings.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-serial/ │ ├── package.json │ ├── src/ │ │ ├── api.ts │ │ ├── components/ │ │ │ ├── serialProfileSettings.component.pug │ │ │ ├── serialProfileSettings.component.ts │ │ │ ├── serialTab.component.pug │ │ │ ├── serialTab.component.scss │ │ │ └── serialTab.component.ts │ │ ├── config.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── profiles.ts │ │ ├── recoveryProvider.ts │ │ └── services/ │ │ └── serial.service.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-settings/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── api.ts │ │ ├── buttonProvider.ts │ │ ├── components/ │ │ │ ├── configSyncSettingsTab.component.pug │ │ │ ├── configSyncSettingsTab.component.ts │ │ │ ├── editProfileGroupModal.component.pug │ │ │ ├── editProfileGroupModal.component.ts │ │ │ ├── editProfileModal.component.pug │ │ │ ├── editProfileModal.component.ts │ │ │ ├── hotkeyInputModal.component.pug │ │ │ ├── hotkeyInputModal.component.scss │ │ │ ├── hotkeyInputModal.component.ts │ │ │ ├── hotkeySettingsTab.component.pug │ │ │ ├── hotkeySettingsTab.component.ts │ │ │ ├── multiHotkeyInput.component.pug │ │ │ ├── multiHotkeyInput.component.scss │ │ │ ├── multiHotkeyInput.component.ts │ │ │ ├── profilesSettingsTab.component.pug │ │ │ ├── profilesSettingsTab.component.scss │ │ │ ├── profilesSettingsTab.component.ts │ │ │ ├── releaseNotesTab.component.pug │ │ │ ├── releaseNotesTab.component.scss │ │ │ ├── releaseNotesTab.component.ts │ │ │ ├── setVaultPassphraseModal.component.pug │ │ │ ├── setVaultPassphraseModal.component.ts │ │ │ ├── settingsTab.component.pug │ │ │ ├── settingsTab.component.scss │ │ │ ├── settingsTab.component.ts │ │ │ ├── settingsTabBody.component.ts │ │ │ ├── showSecretModal.component.pug │ │ │ ├── showSecretModal.component.ts │ │ │ ├── vaultSettingsTab.component.pug │ │ │ ├── vaultSettingsTab.component.ts │ │ │ ├── windowSettingsTab.component.pug │ │ │ └── windowSettingsTab.component.ts │ │ ├── config.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── services/ │ │ │ └── configSync.service.ts │ │ └── settings.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-ssh/ │ ├── package.json │ ├── src/ │ │ ├── algorithms.ts │ │ ├── api/ │ │ │ ├── contextMenu.ts │ │ │ ├── importer.ts │ │ │ ├── index.ts │ │ │ └── interfaces.ts │ │ ├── components/ │ │ │ ├── hostKeyPromptModal.component.pug │ │ │ ├── hostKeyPromptModal.component.ts │ │ │ ├── keyboardInteractiveAuthPanel.component.pug │ │ │ ├── keyboardInteractiveAuthPanel.component.scss │ │ │ ├── keyboardInteractiveAuthPanel.component.ts │ │ │ ├── sftpCreateDirectoryModal.component.pug │ │ │ ├── sftpCreateDirectoryModal.component.ts │ │ │ ├── sftpDeleteModal.component.pug │ │ │ ├── sftpDeleteModal.component.ts │ │ │ ├── sftpPanel.component.pug │ │ │ ├── sftpPanel.component.scss │ │ │ ├── sftpPanel.component.ts │ │ │ ├── sshPortForwardingConfig.component.pug │ │ │ ├── sshPortForwardingConfig.component.ts │ │ │ ├── sshPortForwardingModal.component.pug │ │ │ ├── sshPortForwardingModal.component.ts │ │ │ ├── sshProfileSettings.component.pug │ │ │ ├── sshProfileSettings.component.ts │ │ │ ├── sshSettingsTab.component.pug │ │ │ ├── sshSettingsTab.component.ts │ │ │ ├── sshTab.component.pug │ │ │ ├── sshTab.component.scss │ │ │ └── sshTab.component.ts │ │ ├── config.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── profiles.ts │ │ ├── recoveryProvider.ts │ │ ├── services/ │ │ │ ├── passwordStorage.service.ts │ │ │ ├── ssh.service.ts │ │ │ ├── sshKnownHosts.service.ts │ │ │ └── sshMultiplexer.service.ts │ │ ├── session/ │ │ │ ├── forwards.ts │ │ │ ├── sftp.ts │ │ │ ├── shell.ts │ │ │ ├── ssh.ts │ │ │ └── x11.ts │ │ ├── settings.ts │ │ ├── sftpContextMenu.ts │ │ └── tabContextMenu.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-telnet/ │ ├── package.json │ ├── src/ │ │ ├── components/ │ │ │ ├── telnetProfileSettings.component.pug │ │ │ ├── telnetProfileSettings.component.ts │ │ │ ├── telnetTab.component.pug │ │ │ ├── telnetTab.component.scss │ │ │ └── telnetTab.component.ts │ │ ├── config.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── profiles.ts │ │ ├── recoveryProvider.ts │ │ └── session.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-terminal/ │ ├── README.md │ ├── package.json │ ├── patches/ │ │ └── ansi-color+0.2.1.patch │ ├── src/ │ │ ├── api/ │ │ │ ├── baseTerminalTab.component.ts │ │ │ ├── colorSchemeProvider.ts │ │ │ ├── connectableTerminalTab.component.ts │ │ │ ├── contextMenuProvider.ts │ │ │ ├── decorator.ts │ │ │ ├── interfaces.ts │ │ │ └── middleware.ts │ │ ├── bell.ogg │ │ ├── cli.ts │ │ ├── colorSchemes.ts │ │ ├── components/ │ │ │ ├── appearanceSettingsTab.component.pug │ │ │ ├── appearanceSettingsTab.component.scss │ │ │ ├── appearanceSettingsTab.component.ts │ │ │ ├── baseTerminalTab.component.pug │ │ │ ├── baseTerminalTab.component.scss │ │ │ ├── colorPicker.component.pug │ │ │ ├── colorPicker.component.scss │ │ │ ├── colorPicker.component.ts │ │ │ ├── colorSchemePreview.component.pug │ │ │ ├── colorSchemePreview.component.scss │ │ │ ├── colorSchemePreview.component.ts │ │ │ ├── colorSchemeSelector.component.pug │ │ │ ├── colorSchemeSelector.component.ts │ │ │ ├── colorSchemeSettingsForMode.component.pug │ │ │ ├── colorSchemeSettingsForMode.component.scss │ │ │ ├── colorSchemeSettingsForMode.component.ts │ │ │ ├── colorSchemeSettingsTab.component.pug │ │ │ ├── colorSchemeSettingsTab.component.ts │ │ │ ├── inputProcessingSettings.component.pug │ │ │ ├── inputProcessingSettings.component.ts │ │ │ ├── loginScriptsSettings.component.pug │ │ │ ├── loginScriptsSettings.component.ts │ │ │ ├── searchPanel.component.pug │ │ │ ├── searchPanel.component.scss │ │ │ ├── searchPanel.component.ts │ │ │ ├── streamProcessingSettings.component.pug │ │ │ ├── streamProcessingSettings.component.ts │ │ │ ├── terminalSettingsTab.component.pug │ │ │ ├── terminalSettingsTab.component.ts │ │ │ ├── terminalToolbar.component.pug │ │ │ ├── terminalToolbar.component.scss │ │ │ └── terminalToolbar.component.ts │ │ ├── config.ts │ │ ├── features/ │ │ │ ├── debug.ts │ │ │ └── zmodem.ts │ │ ├── frontends/ │ │ │ ├── frontend.ts │ │ │ ├── xterm.css │ │ │ └── xtermFrontend.ts │ │ ├── helpers.ts │ │ ├── hotkeys.ts │ │ ├── index.ts │ │ ├── middleware/ │ │ │ ├── inputProcessing.ts │ │ │ ├── loginScriptProcessing.ts │ │ │ ├── oscProcessing.ts │ │ │ ├── streamProcessing.ts │ │ │ └── utf8Splitter.ts │ │ ├── services/ │ │ │ └── multifocus.service.ts │ │ ├── session.ts │ │ ├── settings.ts │ │ └── tabContextMenu.ts │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-uac/ │ ├── .gitignore │ ├── UAC/ │ │ ├── UAC.cpp │ │ ├── UAC.vcxproj │ │ ├── UAC.vcxproj.filters │ │ ├── UAC.vcxproj.user │ │ ├── app.manifest │ │ ├── stdafx.cpp │ │ ├── stdafx.h │ │ └── targetver.h │ └── UAC.sln ├── tabby-web/ │ ├── package.json │ ├── src/ │ │ ├── components/ │ │ │ ├── messageBoxModal.component.pug │ │ │ └── messageBoxModal.component.ts │ │ ├── config.ts │ │ ├── index.ts │ │ ├── platform.ts │ │ ├── services/ │ │ │ ├── hostApp.service.ts │ │ │ ├── hostWindow.service.ts │ │ │ ├── log.service.ts │ │ │ └── updater.service.ts │ │ └── styles.scss │ ├── tsconfig.json │ ├── tsconfig.typings.json │ └── webpack.config.mjs ├── tabby-web-demo/ │ ├── data/ │ │ ├── linux.iso │ │ ├── v86.wasm │ │ └── v86_all.js │ ├── package.json │ ├── src/ │ │ ├── buttonProvider.ts │ │ ├── components/ │ │ │ └── terminalTab.component.ts │ │ ├── index.ts │ │ ├── profiles.ts │ │ └── session.ts │ ├── tsconfig.json │ └── webpack.config.mjs ├── tsconfig.json ├── typedoc.mjs ├── web/ │ ├── entry.preload.ts │ ├── entry.ts │ ├── package.json │ ├── patches/ │ │ └── browserify-sign+4.2.1.patch │ ├── polyfills.buffer.ts │ ├── polyfills.ts │ ├── tsconfig.json │ └── webpack.config.mjs ├── webpack.config.mjs └── webpack.plugin.config.mjs
SYMBOL INDEX (2111 symbols across 266 files)
FILE: app/lib/app.ts
class Application (line 20) | class Application {
method constructor (line 29) | constructor (private configStore: any) {
method init (line 106) | init (): void {
method newWindow (line 112) | async newWindow (options?: WindowOptions): Promise<Window> {
method onGlobalHotkey (line 139) | onGlobalHotkey (): void {
method presentAllWindows (line 158) | presentAllWindows (): void {
method broadcast (line 164) | broadcast (event: string, ...args: any[]): void {
method broadcastExcept (line 170) | broadcastExcept (event: string, except: WebContents, ...args: any[]): ...
method send (line 178) | async send (event: string, ...args: any[]): Promise<void> {
method enableTray (line 185) | enableTray (): void {
method disableTray (line 211) | disableTray (): void {
method hasWindows (line 219) | hasWindows (): boolean {
method focus (line 223) | focus (): void {
method handleSecondInstance (line 229) | async handleSecondInstance (argv: string[], cwd: string): Promise<void> {
method useBuiltinGraphics (line 237) | private useBuiltinGraphics (): void {
method setupMenu (line 247) | private setupMenu () {
FILE: app/lib/cli.ts
type YargsOption (line 3) | interface YargsOption {
type CommandConfig (line 11) | interface CommandConfig {
type ParserConfig (line 18) | interface ParserConfig {
function createParserConfig (line 25) | function createParserConfig (cwd: string): ParserConfig {
function applyOptionsToYargs (line 101) | function applyOptionsToYargs (yargsInstance: any, options: Record<string...
function createParserFromConfig (line 108) | function createParserFromConfig (config: ParserConfig) {
function parseArgs (line 128) | function parseArgs (argv: string[], cwd: string): any {
FILE: app/lib/config.ts
function migrateConfig (line 11) | function migrateConfig (): void {
function loadConfig (line 20) | function loadConfig (): any {
function saveConfig (line 30) | async function saveConfig (content: string): Promise<void> {
FILE: app/lib/index.ts
method click (line 98) | click () {
FILE: app/lib/pluginManager.ts
class PluginManager (line 4) | class PluginManager {
method ensureLoaded (line 8) | async ensureLoaded (): Promise<void> {
method install (line 26) | async install (path: string, name: string, version: string): Promise<v...
method uninstall (line 32) | async uninstall (path: string, name: string): Promise<void> {
FILE: app/lib/pty.ts
class PTYDataQueue (line 8) | class PTYDataQueue {
method constructor (line 17) | constructor (private pty: nodePTY.IPty, private onData: (data: Buffer)...
method push (line 26) | push (data: Buffer) {
method ack (line 31) | ack (length: number) {
method maybeEmit (line 36) | private maybeEmit () {
method emitData (line 72) | private emitData (data: Buffer) {
method pause (line 78) | private pause () {
method resume (line 83) | private resume () {
class PTY (line 90) | class PTY {
method constructor (line 95) | constructor (private id: string, private app: Application, ...args: an...
method getPID (line 111) | getPID (): number {
method resize (line 115) | resize (columns: number, rows: number): void {
method write (line 121) | write (buffer: Buffer): void {
method ackData (line 127) | ackData (length: number): void {
method kill (line 131) | kill (signal?: string): void {
method emit (line 135) | private emit (event: string, ...args: any[]) {
class PTYManager (line 140) | class PTYManager {
method init (line 143) | init (app: Application): void {
FILE: app/lib/sentry.ts
constant SENTRY_DSN (line 3) | const SENTRY_DSN = 'https://4717a0a7ee0b4429bd3a0f06c3d7eec3@sentry.io/1...
method integrations (line 15) | integrations (integrations) {
FILE: app/lib/urlHandler.ts
function isTabbyURL (line 4) | function isTabbyURL (arg: string): boolean {
function parseTabbyURL (line 8) | function parseTabbyURL (url: string, cwd: string = process.cwd()): any {
FILE: app/lib/utfSplitter.ts
class UTF8Splitter (line 7) | class UTF8Splitter {
method write (line 10) | write (data: Buffer): Buffer {
method flush (line 27) | flush (): Buffer {
FILE: app/lib/window.ts
type WindowOptions (line 21) | interface WindowOptions {
class Window (line 34) | class Window {
method visible$ (line 50) | get visible$ (): Observable<boolean> { return this.visible }
method closed$ (line 51) | get closed$ (): Observable<void> { return this.closed }
method constructor (line 54) | constructor (private application: Application, private configStore: an...
method makeMain (line 182) | makeMain (): void {
method setVibrancy (line 187) | setVibrancy (enabled: boolean, type?: string, userRequested?: boolean)...
method setDarkMode (line 211) | setDarkMode (mode: string): void {
method focus (line 223) | focus (): void {
method send (line 227) | send (event: string, ...args: any[]): void {
method isDestroyed (line 238) | isDestroyed (): boolean {
method isFocused (line 242) | isFocused (): boolean {
method isVisible (line 246) | isVisible (): boolean {
method isDockedOnTop (line 250) | isDockedOnTop (): boolean {
method hide (line 254) | async hide (): Promise<void> {
method show (line 270) | async show (): Promise<void> {
method present (line 276) | async present (): Promise<void> {
method passCliArguments (line 281) | passCliArguments (argv: string[], cwd: string, secondInstance: boolean...
method enableDockedWindowStyles (line 290) | private async enableDockedWindowStyles (enabled: boolean) {
method setupWindowManagement (line 322) | private setupWindowManagement () {
method on (line 481) | on (event: string, listener: (...args: any[]) => void): void {
method setupUpdater (line 490) | private setupUpdater () {
method destroy (line 519) | private destroy () {
FILE: app/src/app.module.ts
function getRootModule (line 6) | function getRootModule (plugins: any[]) {
FILE: app/src/entry.ts
function bootstrap (line 34) | async function bootstrap (bootstrapData: BootstrapData, plugins: PluginI...
FILE: app/src/pluginBlacklist.ts
constant PLUGIN_BLACKLIST (line 1) | const PLUGIN_BLACKLIST = [
FILE: app/src/plugins.ts
function normalizePath (line 11) | function normalizePath (p: string): string {
type ProgressCallback (line 67) | type ProgressCallback = (current: number, total: number) => void
function initModuleLookup (line 69) | function initModuleLookup (userPluginsPath: string): void {
constant PLUGIN_PREFIX (line 96) | const PLUGIN_PREFIX = 'tabby-'
constant LEGACY_PLUGIN_PREFIX (line 97) | const LEGACY_PLUGIN_PREFIX = 'terminus-'
function getCandidateLocationsInPluginDir (line 99) | async function getCandidateLocationsInPluginDir (pluginDir: any): Promis...
function getPluginCandidateLocation (line 131) | async function getPluginCandidateLocation (paths: any): Promise<{ plugin...
function parsePluginInfo (line 156) | async function parsePluginInfo (pluginDir: string, packageName: string):...
function findPlugins (line 191) | async function findPlugins (): Promise<PluginInfo[]> {
function loadPlugins (line 229) | async function loadPlugins (foundPlugins: PluginInfo[], progress: Progre...
FILE: tabby-auto-sudo-password/src/decorator.ts
constant SUDO_PROMPT_REGEX (line 6) | const SUDO_PROMPT_REGEX = /^\[sudo\] password for ([^:]+):\s*$/im
class AutoSudoPasswordMiddleware (line 8) | class AutoSudoPasswordMiddleware extends SessionMiddleware {
method constructor (line 13) | constructor (
method feedFromSession (line 18) | feedFromSession (data: Buffer): void {
method feedFromTerminal (line 28) | feedFromTerminal (data: Buffer): void {
method handlePrompt (line 45) | async handlePrompt (username: string): Promise<void> {
method loadPassword (line 54) | async loadPassword (username: string): Promise<string| null> {
class AutoSudoPasswordDecorator (line 63) | class AutoSudoPasswordDecorator extends TerminalDecorator {
method constructor (line 64) | constructor (
method attachToSession (line 70) | private attachToSession (tab: SSHTabComponent) {
method attach (line 77) | attach (tab: BaseTerminalTabComponent<any>): void {
FILE: tabby-auto-sudo-password/src/index.ts
class AutoSudoPasswordModule (line 16) | class AutoSudoPasswordModule { }
FILE: tabby-community-color-schemes/src/colorSchemes.ts
class ColorSchemes (line 7) | class ColorSchemes extends TerminalColorSchemeProvider {
method getSchemes (line 8) | async getSchemes (): Promise<TerminalColorScheme[]> {
FILE: tabby-community-color-schemes/src/index.ts
class PopularThemesModule (line 11) | class PopularThemesModule { } // eslint-disable-line @typescript-eslint/...
FILE: tabby-core/src/api/cli.ts
type CLIEvent (line 1) | interface CLIEvent {
FILE: tabby-core/src/api/commands.ts
type CommandLocation (line 5) | enum CommandLocation {
class Command (line 11) | class Command {
method fromToolbarButton (line 35) | static fromToolbarButton (button: ToolbarButton): Command {
method fromMenuItem (line 53) | static fromMenuItem (item: MenuItemOptions): Command {
type CommandContext (line 62) | interface CommandContext {
FILE: tabby-core/src/api/fileProvider.ts
method isAvailable (line 7) | async isAvailable (): Promise<boolean> {
FILE: tabby-core/src/api/hostApp.ts
type Platform (line 5) | enum Platform {
method settingsUIRequest$ (line 26) | get settingsUIRequest$ (): Observable<void> { return this.settingsUIRequ...
method configChangeBroadcast$ (line 31) | get configChangeBroadcast$ (): Observable<void> { return this.configChan...
method constructor (line 33) | constructor (
method emitReady (line 42) | emitReady (): void { }
FILE: tabby-core/src/api/hostWindow.ts
method windowShown$ (line 8) | get windowShown$ (): Observable<void> { return this.windowShown }
method windowCloseRequest$ (line 13) | get windowCloseRequest$ (): Observable<void> { return this.windowCloseRe...
method windowMoved$ (line 14) | get windowMoved$ (): Observable<void> { return this.windowMoved }
method windowFocused$ (line 15) | get windowFocused$ (): Observable<void> { return this.windowFocused }
method openDevTools (line 32) | openDevTools (): void { }
method bringToFront (line 35) | bringToFront (): void { }
FILE: tabby-core/src/api/hotkeyProvider.ts
type HotkeyDescription (line 1) | interface HotkeyDescription {
type Hotkey (line 6) | interface Hotkey {
FILE: tabby-core/src/api/mainProcess.ts
constant BOOTSTRAP_DATA (line 1) | const BOOTSTRAP_DATA = 'BOOTSTRAP_DATA'
type PluginInfo (line 3) | interface PluginInfo {
type BootstrapData (line 16) | interface BootstrapData {
FILE: tabby-core/src/api/menu.ts
type MenuItemOptions (line 1) | interface MenuItemOptions {
FILE: tabby-core/src/api/platform.ts
type ClipboardContent (line 5) | interface ClipboardContent {
type MessageBoxOptions (line 10) | interface MessageBoxOptions {
type MessageBoxResult (line 19) | interface MessageBoxResult {
method getSpeed (line 28) | getSpeed (): number {
method getCompletedBytes (line 32) | getCompletedBytes (): number {
method getStatus (line 36) | getStatus (): string {
method getTotalSize (line 40) | getTotalSize (): number {
method isComplete (line 44) | isComplete (): boolean {
method isCancelled (line 48) | isCancelled (): boolean {
method cancel (line 52) | cancel (): void {
method setStatus (line 57) | setStatus (status: string): void {
method setTotalSize (line 61) | setTotalSize (size: number): void {
method setCompleted (line 65) | setCompleted (completed: boolean): void {
method increaseProgress (line 69) | protected increaseProgress (bytes: number): void {
method readAll (line 101) | async readAll (): Promise<Uint8Array> {
type FileUploadOptions (line 116) | interface FileUploadOptions {
class DirectoryUpload (line 120) | class DirectoryUpload {
method constructor (line 123) | constructor (private name = '') {
method getName (line 127) | getName (): string {
method getChildrens (line 131) | getChildrens (): (FileUpload|DirectoryUpload)[] {
method pushChildren (line 135) | pushChildren (item: FileUpload|DirectoryUpload): void {
type PlatformTheme (line 140) | type PlatformTheme = 'light'|'dark'
method fileTransferStarted$ (line 145) | get fileTransferStarted$ (): Observable<FileTransfer> { return this.file...
method displayMetricsChanged$ (line 146) | get displayMetricsChanged$ (): Observable<void> { return this.displayMet...
method themeChanged$ (line 147) | get themeChanged$ (): Observable<PlatformTheme> { return this.themeChang...
method startUploadFromDragEvent (line 163) | async startUploadFromDragEvent (event: DragEvent, multiple = false): Pro...
method getConfigPath (line 211) | getConfigPath (): string|null {
method showItemInFolder (line 215) | showItemInFolder (path: string): void {
method isProcessRunning (line 219) | async isProcessRunning (name: string): Promise<boolean> {
method installPlugin (line 223) | async installPlugin (name: string, version: string): Promise<void> {
method uninstallPlugin (line 227) | async uninstallPlugin (name: string): Promise<void> {
method getWinSCPPath (line 231) | getWinSCPPath (): string|null {
method exec (line 235) | async exec (app: string, argv: string[]): Promise<void> {
method isShellIntegrationSupported (line 239) | isShellIntegrationSupported (): boolean {
method isShellIntegrationInstalled (line 243) | async isShellIntegrationInstalled (): Promise<boolean> {
method installShellIntegration (line 247) | async installShellIntegration (): Promise<void> {
method uninstallShellIntegration (line 251) | async uninstallShellIntegration (): Promise<void> {
method openPath (line 255) | openPath (path: string): void {
method getTheme (line 259) | getTheme (): PlatformTheme {
class HTMLFileUpload (line 274) | class HTMLFileUpload extends FileUpload {
method constructor (line 278) | constructor (private file: File) {
method getName (line 284) | getName (): string {
method getMode (line 288) | getMode (): number {
method getSize (line 292) | getSize (): number {
method read (line 296) | async read (): Promise<Uint8Array> {
method bringToFront (line 307) | bringToFront (): void { }
method close (line 310) | close (): void { }
FILE: tabby-core/src/api/profileProvider.ts
type Profile (line 8) | interface Profile {
type ConnectableProfile (line 25) | interface ConnectableProfile extends Profile {
type PartialProfile (line 29) | type PartialProfile<T extends Profile> = Omit<Omit<Omit<{
type ProfileGroup (line 39) | interface ProfileGroup {
type PartialProfileGroup (line 47) | type PartialProfileGroup<T extends ProfileGroup> = Omit<Omit<{
type ProfileSettingsComponent (line 54) | interface ProfileSettingsComponent<P extends Profile, PP extends Profile...
method getSuggestedName (line 69) | getSuggestedName (profile: PartialProfile<P>): string|null {
method deleteProfile (line 75) | deleteProfile (profile: P): void { }
FILE: tabby-core/src/api/selector.ts
type SelectorOption (line 1) | interface SelectorOption<T> {
FILE: tabby-core/src/api/tabRecovery.ts
type RecoveryToken (line 4) | interface RecoveryToken {
FILE: tabby-core/src/api/toolbarButtonProvider.ts
type ToolbarButton (line 4) | interface ToolbarButton {
FILE: tabby-core/src/cli.ts
class ProfileCLIHandler (line 9) | class ProfileCLIHandler extends CLIHandler {
method constructor (line 13) | constructor (
method handle (line 20) | async handle (event: CLIEvent): Promise<boolean> {
method handleOpenProfile (line 38) | private async handleOpenProfile (profileName: string) {
method handleOpenRecentProfile (line 48) | private async handleOpenRecentProfile (profileNumber: number) {
method handleOpenQuickConnect (line 57) | private async handleOpenQuickConnect (providerId: string, query: strin...
class LastCLIHandler (line 77) | class LastCLIHandler extends CLIHandler {
method constructor (line 81) | constructor (private hostApp: HostAppService) {
method handle (line 85) | async handle (event: CLIEvent): Promise<boolean> {
FILE: tabby-core/src/commands.ts
class CoreCommandProvider (line 11) | class CoreCommandProvider extends CommandProvider {
method constructor (line 12) | constructor (
method activate (line 20) | async activate () {
method provide (line 27) | async provide (): Promise<Command[]> {
FILE: tabby-core/src/components/appRoot.component.ts
function makeTabAnimation (line 21) | function makeTabAnimation (dimension: string, size: number) {
class AppRootComponent (line 64) | class AppRootComponent {
method constructor (line 80) | constructor (
method ngOnInit (line 189) | async ngOnInit () {
method onDragOver (line 197) | onDragOver () {
method onDrop (line 202) | onDrop () {
method hasVerticalTabs (line 206) | hasVerticalTabs () {
method targetTabSize (line 210) | get targetTabSize (): any {
method onTabsReordered (line 217) | onTabsReordered (event: CdkDragDrop<BaseTabComponent[]>) {
method onTransfersChange (line 229) | onTransfersChange () {
method isVibrant (line 235) | get isVibrant () {
method getToolbarButtons (line 239) | private async getToolbarButtons (aboveZero: boolean): Promise<Command[...
method toggleMaximize (line 244) | toggleMaximize (): void {
method isTitleBarNeeded (line 248) | protected isTitleBarNeeded (): boolean {
FILE: tabby-core/src/components/base.component.ts
type CancellableEvent (line 3) | interface CancellableEvent {
class SubscriptionContainer (line 10) | class SubscriptionContainer {
method isEmpty (line 14) | isEmpty (): boolean {
method addEventListener (line 18) | addEventListener (element: HTMLElement, event: string, handler: EventL...
method subscribe (line 28) | subscribe <T> (observable: Observable<T>, handler: (v: T) => void): vo...
method cancelAll (line 32) | cancelAll (): void {
class BaseComponent (line 44) | class BaseComponent {
method destroyed$ (line 45) | protected get destroyed$ (): Observable<void> { return this._destroyed }
method addEventListenerUntilDestroyed (line 49) | addEventListenerUntilDestroyed (element: HTMLElement, event: string, h...
method subscribeUntilDestroyed (line 53) | subscribeUntilDestroyed <T> (observable: Observable<T>, handler: (v: T...
method ngOnDestroy (line 57) | ngOnDestroy (): void {
FILE: tabby-core/src/components/baseTab.component.ts
type BaseTabProcess (line 11) | interface BaseTabProcess {
type GetRecoveryTokenOptions (line 15) | interface GetRecoveryTokenOptions {
method color (line 52) | get color (): string|null { return this._color }
method color (line 53) | set color (value: string|null) { this._color = value }
method icon (line 59) | get icon (): string|null { return this._icon }
method icon (line 60) | set icon (value: string|null) { this._icon = value }
method focused$ (line 85) | get focused$ (): Observable<void> { return this.focused }
method blurred$ (line 86) | get blurred$ (): Observable<void> { return this.blurred }
method visibility$ (line 88) | get visibility$ (): Observable<boolean> { return this.visibility }
method titleChange$ (line 89) | get titleChange$ (): Observable<string> { return this.titleChange.pipe(d...
method progress$ (line 90) | get progress$ (): Observable<number|null> { return this.progress.pipe(di...
method activity$ (line 91) | get activity$ (): Observable<boolean> { return this.activity }
method destroyed$ (line 92) | get destroyed$ (): Observable<void> { return this.destroyed }
method recoveryStateChangedHint$ (line 93) | get recoveryStateChangedHint$ (): Observable<void> { return this.recover...
method constructor (line 97) | protected constructor (injector: Injector) {
method setTitle (line 114) | setTitle (title: string): void {
method setProgress (line 126) | setProgress (progress: number|null): void {
method displayActivity (line 133) | displayActivity (): void {
method clearActivity (line 143) | clearActivity (): void {
method getRecoveryToken (line 157) | async getRecoveryToken (options?: GetRecoveryTokenOptions): Promise<Reco...
method getCurrentProcess (line 164) | async getCurrentProcess (): Promise<BaseTabProcess|null> {
method canClose (line 171) | async canClose (): Promise<boolean> {
method emitFocused (line 175) | emitFocused (): void {
method emitBlurred (line 179) | emitBlurred (): void {
method emitVisibility (line 184) | emitVisibility (visibility: boolean): void {
method insertIntoContainer (line 188) | insertIntoContainer (container: ViewContainerRef): EmbeddedViewRef<any> {
method removeFromContainer (line 194) | removeFromContainer (): void {
method topmostParent (line 206) | get topmostParent (): BaseTabComponent|null {
method destroy (line 217) | destroy (skipDestroyedEvent = false): void {
method ngOnDestroy (line 235) | ngOnDestroy (): void {
FILE: tabby-core/src/components/checkbox.component.ts
class CheckboxComponent (line 18) | class CheckboxComponent implements ControlValueAccessor {
method click (line 24) | click () {
method writeValue (line 36) | writeValue (obj: any) {
method registerOnChange (line 40) | registerOnChange (fn: any): void {
method registerOnTouched (line 44) | registerOnTouched (fn: any): void {
method setDisabledState (line 48) | setDisabledState (isDisabled: boolean) {
FILE: tabby-core/src/components/profileIcon.component.ts
class ProfileIconComponent (line 11) | class ProfileIconComponent extends BaseComponent {
method isHTML (line 15) | get isHTML (): boolean {
FILE: tabby-core/src/components/promptModal.component.ts
class PromptModalComponent (line 8) | class PromptModalComponent {
method constructor (line 16) | constructor (
method ngOnInit (line 20) | ngOnInit (): void {
method ok (line 26) | ok (): void {
method cancel (line 33) | cancel (): void {
FILE: tabby-core/src/components/renameTabModal.component.ts
class RenameTabModalComponent (line 10) | class RenameTabModalComponent {
method constructor (line 14) | constructor (
method ngOnInit (line 18) | ngOnInit () {
method save (line 25) | save () {
method close (line 29) | close () {
FILE: tabby-core/src/components/safeModeModal.component.ts
class SafeModeModalComponent (line 8) | class SafeModeModalComponent {
method constructor (line 11) | constructor (
method close (line 17) | close (): void {
FILE: tabby-core/src/components/selectorModal.component.ts
class SelectorModalComponent (line 13) | class SelectorModalComponent<T> {
method constructor (line 23) | constructor (public modalInstance: NgbActiveModal) {
method ngOnInit (line 27) | ngOnInit (): void {
method onKeyDown (line 32) | onKeyDown (event: KeyboardEvent): void {
method onKeyUp (line 69) | onKeyUp (event: KeyboardEvent): void {
method onFilterChange (line 75) | onFilterChange (): void {
method filterMatches (line 102) | filterMatches (option: SelectorOption<T>, terms: string[]): boolean {
method getOptionText (line 107) | getOptionText (option: SelectorOption<T>): string {
method selectOption (line 114) | selectOption (option: SelectorOption<T>): void {
method canEditSelected (line 119) | canEditSelected (): boolean {
method close (line 123) | close (): void {
FILE: tabby-core/src/components/selfPositioning.component.ts
method constructor (line 11) | constructor (protected element: ElementRef) { super() }
method setDimensions (line 13) | protected setDimensions (x: number, y: number, w: number, h: number, uni...
FILE: tabby-core/src/components/splitTab.component.ts
type SplitOrientation (line 9) | type SplitOrientation = 'v' | 'h'
type SplitDirection (line 10) | type SplitDirection = 'r' | 't' | 'b' | 'l'
type ResizeDirection (line 11) | type ResizeDirection = 'v' | 'h' | 'dv' | 'dh'
class SplitContainer (line 16) | class SplitContainer {
method getAllTabs (line 37) | getAllTabs (): BaseTabComponent[] {
method normalize (line 52) | normalize (): void {
method equalize (line 89) | equalize (): void {
method getOffsetRatio (line 101) | getOffsetRatio (index: number): number {
method serialize (line 109) | async serialize (tabsRecovery: TabRecoveryService, options?: GetRecove...
type SplitSpannerInfo (line 130) | interface SplitSpannerInfo {
type SplitDropZoneInfo (line 142) | type SplitDropZoneInfo = {
class SplitTabComponent (line 191) | class SplitTabComponent extends BaseTabComponent implements AfterViewIni...
method tabAdded$ (line 234) | get tabAdded$ (): Observable<BaseTabComponent> { return this.tabAdded }
method tabAdopted$ (line 239) | get tabAdopted$ (): Observable<BaseTabComponent> { return this.tabAdop...
method tabRemoved$ (line 241) | get tabRemoved$ (): Observable<BaseTabComponent> { return this.tabRemo...
method splitAdjusted$ (line 246) | get splitAdjusted$ (): Observable<SplitSpannerInfo> { return this.spli...
method focusChanged$ (line 251) | get focusChanged$ (): Observable<BaseTabComponent> { return this.focus...
method initialized$ (line 256) | get initialized$ (): Observable<void> { return this.initialized }
method constructor (line 259) | constructor (
method ngAfterViewInit (line 372) | async ngAfterViewInit (): Promise<void> {
method ngOnDestroy (line 393) | ngOnDestroy (): void {
method getAllTabs (line 400) | getAllTabs (): BaseTabComponent[] {
method getFocusedTab (line 404) | getFocusedTab (): BaseTabComponent|null {
method getMaximizedTab (line 408) | getMaximizedTab (): BaseTabComponent|null {
method focus (line 412) | focus (tab: BaseTabComponent): void {
method maximize (line 428) | maximize (tab: BaseTabComponent|null): void {
method focusAnyIn (line 436) | focusAnyIn (parent?: BaseTabComponent | SplitContainer): void {
method addTab (line 447) | addTab (tab: BaseTabComponent, relative: BaseTabComponent|null, side: ...
method add (line 454) | async add (thing: BaseTabComponent|SplitContainer, relative: BaseTabCo...
method removeTab (line 530) | removeTab (tab: BaseTabComponent): void {
method replaceTab (line 553) | replaceTab (tab: BaseTabComponent, newTab: BaseTabComponent): void {
method resizePane (line 572) | resizePane (direction: ResizeDirection): void {
method getPaneRect (line 638) | private getPaneRect (pane: BaseTabComponent): DOMRect {
method getNearestPaneInDirection (line 644) | getNearestPaneInDirection (from: BaseTabComponent, direction: SplitDir...
method navigate (line 679) | navigate (dir: SplitDirection): void {
method navigateLinear (line 687) | navigateLinear (delta: number): void {
method navigateSpecific (line 698) | navigateSpecific (target: number): void {
method splitTab (line 707) | async splitTab (tab: BaseTabComponent, dir: SplitDirection): Promise<B...
method getParentOf (line 718) | getParentOf (tab: BaseTabComponent | SplitContainer, root?: SplitConta...
method canClose (line 735) | async canClose (): Promise<boolean> {
method getRecoveryToken (line 740) | async getRecoveryToken (options?: GetRecoveryTokenOptions): Promise<an...
method getCurrentProcess (line 745) | async getCurrentProcess (): Promise<BaseTabProcess|null> {
method onSpannerAdjusted (line 750) | onSpannerAdjusted (spanner: SplitSpannerInfo): void {
method onSpannerResizing (line 756) | onSpannerResizing (state: boolean): void {
method onTabDropped (line 761) | onTabDropped (tab: BaseTabComponent, zone: SplitDropZoneInfo) { // esl...
method destroy (line 774) | destroy (): void {
method layout (line 781) | layout (): void {
method clearActivity (line 788) | clearActivity (): void {
method icon (line 795) | get icon (): string|null {
method icon (line 799) | set icon (icon: string|null) {
method color (line 805) | get color (): string|null {
method color (line 809) | set color (color: string|null) {
method equalize (line 815) | equalize (): void {
method updateTitle (line 820) | private updateTitle (): void {
method attachTabView (line 833) | private attachTabView (tab: BaseTabComponent) {
method observeUntilChildDetached (line 876) | private observeUntilChildDetached<T> (tab: BaseTabComponent, event: Ob...
method onAfterTabAdded (line 882) | private onAfterTabAdded (tab: BaseTabComponent) {
method layoutInternal (line 890) | private layoutInternal (root: SplitContainer, x: number, y: number, w:...
method recoverContainer (line 1030) | private async recoverContainer (root: SplitContainer, state: any) {
class SplitTabRecoveryProvider (line 1064) | class SplitTabRecoveryProvider extends TabRecoveryProvider<SplitTabCompo...
method applicableTo (line 1065) | async applicableTo (recoveryToken: RecoveryToken): Promise<boolean> {
method recover (line 1069) | async recover (recoveryToken: RecoveryToken): Promise<NewTabParameters...
FILE: tabby-core/src/components/splitTabDropZone.component.ts
class SplitTabDropZoneComponent (line 23) | class SplitTabDropZoneComponent extends SelfPositioningComponent {
method constructor (line 31) | constructor (
method canActivateFor (line 42) | canActivateFor (tab: BaseTabComponent): boolean {
method ngOnChanges (line 52) | ngOnChanges () {
method layout (line 56) | layout () {
FILE: tabby-core/src/components/splitTabPaneLabel.component.ts
class SplitTabPaneLabelComponent (line 24) | class SplitTabPaneLabelComponent extends SelfPositioningComponent {
method constructor (line 30) | constructor (
method ngOnChanges (line 49) | ngOnChanges () {
method onTabDragStart (line 53) | onTabDragStart (tab: BaseTabComponent): void {
method onTabDragEnd (line 57) | onTabDragEnd (): void {
method layout (line 64) | layout () {
FILE: tabby-core/src/components/splitTabSpanner.component.ts
class SplitTabSpannerComponent (line 12) | class SplitTabSpannerComponent extends SelfPositioningComponent {
method constructor (line 23) | constructor (element: ElementRef) {
method ngAfterViewInit (line 27) | ngAfterViewInit () {
method ngOnChanges (line 72) | ngOnChanges () {
method reset (line 92) | reset () {
FILE: tabby-core/src/components/startPage.component.ts
class StartPageComponent (line 13) | class StartPageComponent {
method constructor (line 17) | constructor (
method sanitizeIcon (line 27) | sanitizeIcon (icon?: string): any {
method buttonsTrackBy (line 32) | buttonsTrackBy (_, btn: Command): any {
FILE: tabby-core/src/components/tabBody.component.ts
class TabBodyComponent (line 16) | class TabBodyComponent implements OnChanges {
method ngOnChanges (line 21) | ngOnChanges (changes) {
method detach (line 30) | detach () {
method ngOnDestroy (line 34) | ngOnDestroy () {
FILE: tabby-core/src/components/tabHeader.component.ts
class TabHeaderComponent (line 21) | class TabHeaderComponent extends BaseComponent {
method constructor (line 28) | constructor (
method ngOnInit (line 48) | ngOnInit () {
method buildContextMenu (line 58) | async buildContextMenu (): Promise<MenuItemOptions[]> {
method onTabDragStart (line 81) | onTabDragStart (tab: BaseTabComponent) {
method onTabDragEnd (line 85) | onTabDragEnd () {
method isFlexWidthEnabled (line 92) | get isFlexWidthEnabled (): boolean {
method onDoubleClick (line 96) | onDoubleClick ($event: MouseEvent): void {
method onMouseDown (line 101) | async onMouseDown ($event: MouseEvent) {
method onMouseUp (line 107) | async onMouseUp ($event: MouseEvent) {
method onContextMenu (line 113) | async onContextMenu ($event: MouseEvent) {
FILE: tabby-core/src/components/titleBar.component.ts
class TitleBarComponent (line 10) | class TitleBarComponent {
method constructor (line 13) | constructor (public hostWindow: HostWindowService) { }
FILE: tabby-core/src/components/toggle.component.ts
class ToggleComponent (line 19) | class ToggleComponent extends CheckboxComponent {
FILE: tabby-core/src/components/transfersMenu.component.ts
class TransfersMenuComponent (line 11) | class TransfersMenuComponent {
method constructor (line 15) | constructor (
method isDownload (line 20) | isDownload (transfer: FileTransfer): boolean {
method getProgress (line 24) | getProgress (transfer: FileTransfer): number {
method showTransfer (line 28) | showTransfer (transfer: FileTransfer): void {
method removeTransfer (line 35) | removeTransfer (transfer: FileTransfer): void {
method removeAll (line 43) | async removeAll (): Promise<void> {
FILE: tabby-core/src/components/unlockVaultModal.component.ts
class UnlockVaultModalComponent (line 8) | class UnlockVaultModalComponent {
method constructor (line 14) | constructor (
method ngOnInit (line 18) | ngOnInit (): void {
method ok (line 25) | ok (): void {
method cancel (line 33) | cancel (): void {
method getRememberForDisplay (line 37) | getRememberForDisplay (rememberOption: number): string {
FILE: tabby-core/src/components/welcomeTab.component.ts
class WelcomeTabComponent (line 14) | class WelcomeTabComponent extends BaseTabComponent {
method constructor (line 18) | constructor (
method closeAndDisable (line 28) | async closeAndDisable () {
FILE: tabby-core/src/components/windowControls.component.ts
class WindowControlsComponent (line 12) | class WindowControlsComponent {
method constructor (line 13) | constructor (public hostWindow: HostWindowService, public app: AppServ...
method closeWindow (line 15) | async closeWindow () {
FILE: tabby-core/src/config.ts
class CoreConfigProvider (line 5) | class CoreConfigProvider extends ConfigProvider {
FILE: tabby-core/src/directives/alwaysVisibleTypeahead.directive.ts
class AlwaysVisibleTypeaheadDirective (line 7) | class AlwaysVisibleTypeaheadDirective implements AfterViewInit {
method constructor (line 8) | constructor (private el: ElementRef) { }
method ngAfterViewInit (line 10) | ngAfterViewInit (): void {
FILE: tabby-core/src/directives/autofocus.directive.ts
class AutofocusDirective (line 7) | class AutofocusDirective implements AfterViewInit {
method constructor (line 8) | constructor (private el: ElementRef) { }
method ngAfterViewInit (line 10) | ngAfterViewInit (): void {
FILE: tabby-core/src/directives/cdkAutoDropGroup.directive.ts
class FakeDropGroup (line 4) | class FakeDropGroup {
class CdkAutoDropGroup (line 12) | class CdkAutoDropGroup implements OnInit {
method constructor (line 17) | constructor (
method ngOnInit (line 21) | ngOnInit (): void {
FILE: tabby-core/src/directives/dropZone.directive.ts
class DropZoneDirective (line 9) | class DropZoneDirective implements AfterViewInit {
method constructor (line 13) | constructor (
method ngAfterViewInit (line 18) | ngAfterViewInit (): void {
method removeHint (line 39) | private removeHint () {
FILE: tabby-core/src/directives/fastHtmlBind.directive.ts
class FastHtmlBindDirective (line 8) | class FastHtmlBindDirective implements OnChanges {
method constructor (line 11) | constructor (
method ngOnChanges (line 16) | ngOnChanges (): void {
FILE: tabby-core/src/hotkeys.ts
class AppHotkeyProvider (line 8) | class AppHotkeyProvider extends HotkeyProvider {
method constructor (line 260) | constructor (
method provide (line 265) | async provide (): Promise<HotkeyDescription[]> {
FILE: tabby-core/src/index.ts
function TranslateMessageFormatCompilerFactory (line 57) | function TranslateMessageFormatCompilerFactory (): TranslateMessageForma...
constant PROVIDERS (line 61) | const PROVIDERS = [
class AppModule (line 151) | class AppModule { // eslint-disable-line @typescript-eslint/no-extraneou...
method constructor (line 152) | constructor (
method showSelector (line 211) | async showSelector (provider: ProfileProvider<Profile>): Promise<void> {
method showGroupSelector (line 243) | async showGroupSelector (group: PartialProfileGroup<ProfileGroup>): Pr...
method forRoot (line 258) | static forRoot (): ModuleWithProviders<AppModule> {
FILE: tabby-core/src/profiles.ts
type SplitLayoutProfileOptions (line 8) | interface SplitLayoutProfileOptions {
type SplitLayoutProfile (line 12) | interface SplitLayoutProfile extends Profile {
class SplitLayoutProfilesService (line 17) | class SplitLayoutProfilesService extends ProfileProvider<SplitLayoutProf...
method constructor (line 26) | constructor (
method getBuiltinProfiles (line 33) | async getBuiltinProfiles (): Promise<PartialProfile<SplitLayoutProfile...
method getNewTabParameters (line 37) | async getNewTabParameters (profile: SplitLayoutProfile): Promise<NewTa...
method getDescription (line 41) | getDescription (): string {
method createProfile (line 45) | async createProfile (tab: SplitTabComponent, name: string): Promise<vo...
FILE: tabby-core/src/services/app.service.ts
class CompletionObserver (line 19) | class CompletionObserver {
method done$ (line 20) | get done$ (): Observable<void> { return this.done }
method destroyed$ (line 21) | get destroyed$ (): Observable<void> { return this.destroyed }
method constructor (line 26) | constructor (private tab: BaseTabComponent) {
method tick (line 31) | async tick () {
method stop (line 38) | stop () {
class AppService (line 47) | class AppService {
method activeTab (line 50) | get activeTab (): BaseTabComponent|null { return this._activeTab ?? nu...
method activeTabChange$ (line 67) | get activeTabChange$ (): Observable<BaseTabComponent|null> { return th...
method tabOpened$ (line 68) | get tabOpened$ (): Observable<BaseTabComponent> { return this.tabOpened }
method tabsChanged$ (line 69) | get tabsChanged$ (): Observable<void> { return this.tabsChanged }
method tabRemoved$ (line 70) | get tabRemoved$ (): Observable<BaseTabComponent> { return this.tabRemo...
method tabClosed$ (line 71) | get tabClosed$ (): Observable<BaseTabComponent> { return this.tabClosed }
method tabDragActive$ (line 72) | get tabDragActive$ (): Observable<BaseTabComponent|null> { return this...
method ready$ (line 75) | get ready$ (): Observable<void> { return this.ready }
method constructor (line 78) | private constructor (
method addTabRaw (line 122) | addTabRaw (tab: BaseTabComponent, index: number|null = null): void {
method removeTab (line 161) | removeTab (tab: BaseTabComponent): void {
method openNewTabRaw (line 174) | openNewTabRaw <T extends BaseTabComponent> (params: NewTabParameters<T...
method openNewTab (line 184) | openNewTab <T extends BaseTabComponent> (params: NewTabParameters<T>):...
method wrapAndAddTab (line 196) | wrapAndAddTab (tab: BaseTabComponent): SplitTabComponent {
method reopenLastTab (line 203) | async reopenLastTab (): Promise<BaseTabComponent|null> {
method selectTab (line 220) | selectTab (tab: BaseTabComponent|null): void {
method getParentTab (line 244) | getParentTab (tab: BaseTabComponent): SplitTabComponent|null {
method toggleLastTab (line 256) | toggleLastTab (): void {
method nextTab (line 263) | nextTab (): void {
method previousTab (line 277) | previousTab (): void {
method moveSelectedTabLeft (line 291) | moveSelectedTabLeft (): void {
method moveSelectedTabRight (line 305) | moveSelectedTabRight (): void {
method swapTabs (line 319) | swapTabs (a: BaseTabComponent, b: BaseTabComponent): void {
method renameTab (line 326) | renameTab (tab: BaseTabComponent): void {
method emitTabsChanged (line 337) | emitTabsChanged (): void {
method closeTab (line 341) | async closeTab (tab: BaseTabComponent, checkCanClose?: boolean): Promi...
method duplicateTab (line 356) | async duplicateTab (tab: BaseTabComponent): Promise<BaseTabComponent|n...
method closeAllTabs (line 367) | async closeAllTabs (): Promise<boolean> {
method closeWindow (line 379) | async closeWindow (): Promise<void> {
method emitReady (line 390) | emitReady (): void {
method emitTabDragStarted (line 397) | emitTabDragStarted (tab: BaseTabComponent): void {
method emitTabDragEnded (line 402) | emitTabDragEnded (): void {
method observeTabCompletion (line 410) | observeTabCompletion (tab: BaseTabComponent): Observable<void> {
method stopObservingTabCompletion (line 421) | stopObservingTabCompletion (tab: BaseTabComponent): void {
method showSelector (line 426) | showSelector <T> (name: string, options: SelectorOption<T>[]): Promise...
method explodeTab (line 430) | explodeTab (tab: SplitTabComponent): SplitTabComponent[] {
method combineTabsInto (line 439) | combineTabsInto (into: SplitTabComponent): void {
FILE: tabby-core/src/services/commands.service.ts
class CommandService (line 6) | class CommandService {
method constructor (line 9) | constructor (
method getCommands (line 21) | async getCommands (context: CommandContext): Promise<Command[]> {
method run (line 87) | async run (id: string, context: CommandContext): Promise<void> {
method showSelector (line 93) | async showSelector (): Promise<void> {
FILE: tabby-core/src/services/config.service.ts
constant LATEST_VERSION (line 22) | const LATEST_VERSION = 1
function isStructuralMember (line 24) | function isStructuralMember (v): v is AnyRec {
function isNonStructuralObjectMember (line 29) | function isNonStructuralObjectMember (v): boolean {
type AnyRec (line 34) | type AnyRec = Record<string, any>
type IsRecord (line 37) | type IsRecord<T> = T extends object
type ProxifiedConfig (line 43) | type ProxifiedConfig<T extends AnyRec> = {
type FullyDefined (line 51) | type FullyDefined<T> = T extends object
class ConfigProxy (line 57) | class ConfigProxy<T extends AnyRec> {
method constructor (line 58) | constructor (real: Partial<T>, defaults: T) {
method __getValue (line 131) | __getValue (_key: keyof T): any { }
method __setValue (line 133) | __setValue (_key: keyof T, _value: any) { }
method __getDefault (line 135) | __getDefault (_key: keyof T): any { }
method __cleanup (line 137) | __cleanup () { }
class ConfigService (line 144) | class ConfigService {
method ready$ (line 156) | get ready$ (): Observable<boolean> { return this.ready }
method changed$ (line 164) | get changed$ (): Observable<void> { return this.changed }
method constructor (line 167) | private constructor (
method mergeDefaults (line 183) | mergeDefaults (): unknown {
method getDefaults (line 198) | getDefaults (): Record<string, any> {
method load (line 217) | async load (): Promise<void> {
method save (line 230) | async save (): Promise<void> {
method readRaw (line 245) | readRaw (): string {
method writeRaw (line 254) | async writeRaw (data: string): Promise<void> {
method requestRestart (line 261) | requestRestart (): void {
method enabledServices (line 271) | enabledServices<T extends object> (services: T[]|undefined): T[] { // ...
method init (line 298) | private async init () {
method emitChange (line 309) | private emitChange (): void {
method migrate (line 315) | private migrate (config) {
method maybeDecryptConfig (line 457) | private async maybeDecryptConfig (store) {
method maybeEncryptConfig (line 513) | private async maybeEncryptConfig (store) {
FILE: tabby-core/src/services/docking.service.ts
method screensChanged$ (line 9) | get screensChanged$ (): Observable<void> { return this.screensChanged }
FILE: tabby-core/src/services/fileProviders.service.ts
class FileProvidersService (line 6) | class FileProvidersService {
method constructor (line 8) | private constructor (
method selectAndStoreFile (line 15) | async selectAndStoreFile (description: string): Promise<string> {
method retrieveFile (line 21) | async retrieveFile (key: string): Promise<Buffer> {
method selectProvider (line 32) | async selectProvider (): Promise<FileProvider> {
FILE: tabby-core/src/services/homeBase.service.ts
class HomeBaseService (line 8) | class HomeBaseService {
method constructor (line 13) | private constructor (
method openGitHub (line 26) | openGitHub (): void {
method openDiscord (line 30) | openDiscord (): void {
method openTranslations (line 34) | openTranslations (): void {
method reportBug (line 38) | reportBug (): void {
method enableAnalytics (line 47) | enableAnalytics (): void {
method getAnalyticsProperties (line 59) | getAnalyticsProperties (): Record<string, string> {
FILE: tabby-core/src/services/hotkeys.service.ts
type PartialHotkeyMatch (line 9) | interface PartialHotkeyMatch {
type PastKeystroke (line 15) | interface PastKeystroke {
class HotkeysService (line 21) | class HotkeysService {
method unfilteredHotkey$ (line 31) | get unfilteredHotkey$ (): Observable<string> { return this._hotkey }
method hotkey$ (line 36) | get hotkey$ (): Observable<string> {
method hotkeyOff$ (line 45) | get hotkeyOff$ (): Observable<string> { return this._hotkeyOff }
method key$ (line 50) | get key$ (): Observable<KeyName> { return this._key }
method keyEvent$ (line 55) | get keyEvent$ (): Observable<KeyboardEvent> { return this._keyEvent }
method keystroke$ (line 60) | get keystroke$ (): Observable<Keystroke> { return this._keystroke }
method constructor (line 78) | private constructor (
method pushKeyEvent (line 114) | pushKeyEvent (eventName: string, nativeEvent: KeyboardEvent): void {
method getCurrentKeystrokes (line 189) | getCurrentKeystrokes (): Keystroke[] {
method matchActiveHotkey (line 196) | matchActiveHotkey (partial = false): string|null {
method clearCurrentKeystrokes (line 249) | clearCurrentKeystrokes (): void {
method getHotkeyDescription (line 257) | getHotkeyDescription (id: string): HotkeyDescription {
method enable (line 261) | enable (): void {
method disable (line 265) | disable (): void {
method isEnabled (line 269) | isEnabled (): boolean {
method getHotkeyDescriptions (line 273) | async getHotkeyDescriptions (): Promise<HotkeyDescription[]> {
method updateModifiers (line 282) | private updateModifiers (event: KeyEventData) {
method emitHotkeyOn (line 298) | private emitHotkeyOn (hotkey: string) {
method emitHotkeyOff (line 310) | private emitHotkeyOff (hotkey: string) {
method getHotkeysConfig (line 316) | private getHotkeysConfig () {
method getHotkeysConfigRecursive (line 320) | private getHotkeysConfigRecursive (branch: any) {
method addPressedKey (line 345) | private addPressedKey (keyName: KeyName, eventData: KeyEventData) {
method removePressedKey (line 350) | private removePressedKey (key: KeyName) {
FILE: tabby-core/src/services/hotkeys.util.ts
type KeyEventData (line 14) | interface KeyEventData {
constant REGEX_LATIN_KEYNAME (line 26) | const REGEX_LATIN_KEYNAME = /^[A-Za-z]$/
type KeyName (line 28) | type KeyName = string
type Keystroke (line 29) | type Keystroke = string
function getKeyName (line 31) | function getKeyName (event: KeyEventData): KeyName {
function getKeystrokeName (line 73) | function getKeystrokeName (keys: KeyName[]): Keystroke {
FILE: tabby-core/src/services/locale.service.ts
function flattenMessageFormatTranslation (line 56) | function flattenMessageFormatTranslation (po: any) {
class CustomMissingTranslationHandler (line 65) | class CustomMissingTranslationHandler extends MissingTranslationHandler {
method handle (line 69) | handle (params: { key: string, translateService: TranslateService, int...
class LocaleService (line 79) | class LocaleService {
method localeChanged$ (line 181) | get localeChanged$ (): Observable<string> {
method constructor (line 188) | constructor (
method patchTranslateService (line 209) | private patchTranslateService (translate: TranslateService) {
method refresh (line 227) | refresh (): void {
method setLocale (line 240) | async setLocale (lang: string): Promise<void> {
method getLocale (line 256) | getLocale (): string {
class TabbyFormatedDatePipe (line 264) | class TabbyFormatedDatePipe implements PipeTransform {
method constructor (line 266) | constructor (private locale: LocaleService) {}
method transform (line 268) | transform (date: string): string {
FILE: tabby-core/src/services/log.service.ts
method constructor (line 2) | constructor (protected name: string) { }
method debug (line 4) | debug (...args: any[]): void {
method info (line 8) | info (...args: any[]): void {
method warn (line 12) | warn (...args: any[]): void {
method error (line 16) | error (...args: any[]): void {
method log (line 20) | log (...args: any[]): void {
class ConsoleLogger (line 27) | class ConsoleLogger extends Logger {
method doLog (line 28) | protected doLog (level: string, ...args: any[]): void {
FILE: tabby-core/src/services/notifications.service.ts
class NotificationsService (line 5) | class NotificationsService {
method constructor (line 6) | private constructor (
method notice (line 10) | notice (text: string): void {
method info (line 16) | info (text: string, details?: string): void {
method error (line 20) | error (text: string, details?: string): void {
FILE: tabby-core/src/services/profiles.service.ts
class ProfilesService (line 16) | class ProfilesService {
method constructor (line 32) | constructor (
method getProviders (line 45) | getProviders (): ProfileProvider<Profile>[] {
method providerForProfile (line 49) | providerForProfile <T extends Profile> (profile: PartialProfile<T>): P...
method getDescription (line 54) | getDescription <P extends Profile> (profile: PartialProfile<P>): strin...
method getConfigProxyForProfile (line 68) | getConfigProxyForProfile <P extends Profile> (profile: PartialProfile<...
method getProfiles (line 78) | async getProfiles (options?: { includeBuiltin?: boolean, clone?: boole...
method newProfile (line 98) | async newProfile (profile: PartialProfile<Profile>, options?: { genId?...
method writeProfile (line 114) | async writeProfile (profile: PartialProfile<Profile>): Promise<void> {
method deleteProfile (line 129) | async deleteProfile (profile: PartialProfile<Profile>): Promise<void> {
method bulkDeleteProfiles (line 146) | async bulkDeleteProfiles (filter: (p: PartialProfile<Profile>) => bool...
method openNewTabForProfile (line 162) | async openNewTabForProfile <P extends Profile> (profile: PartialProfil...
method newTabParametersForProfile (line 170) | async newTabParametersForProfile <P extends Profile> (profile: Partial...
method launchProfile (line 189) | async launchProfile (profile: PartialProfile<Profile>): Promise<void> {
method getProfileHotkeyName (line 203) | static getProfileHotkeyName (profile: PartialProfile<Profile>): string {
method selectorOptionForProfile (line 211) | selectorOptionForProfile <P extends Profile, T> (profile: PartialProfi...
method showProfileSelector (line 226) | showProfileSelector (): Promise<PartialProfile<Profile>|null> {
method getRecentProfiles (line 317) | getRecentProfiles (): PartialProfile<Profile>[] {
method quickConnect (line 323) | async quickConnect (query: string): Promise<PartialProfile<Profile>|nu...
method getProviderDefaults (line 344) | getProviderDefaults (provider: ProfileProvider<Profile>): any {
method setProviderDefaults (line 353) | setProviderDefaults (provider: ProfileProvider<Profile>, pdefaults: an...
method getProfileDefaults (line 363) | getProfileDefaults (profile: PartialProfile<Profile>, options?: { skip...
method getSyncProfileGroups (line 382) | getSyncProfileGroups (): PartialProfileGroup<ProfileGroup>[] {
method getProfileGroups (line 391) | async getProfileGroups (options?: { includeProfiles?: boolean, include...
method newProfileGroup (line 454) | async newProfileGroup (group: PartialProfileGroup<ProfileGroup>, optio...
method writeProfileGroup (line 470) | async writeProfileGroup (group: PartialProfileGroup<ProfileGroup>): Pr...
method deleteProfileGroup (line 483) | async deleteProfileGroup (group: PartialProfileGroup<ProfileGroup>, op...
method resolveProfileGroupName (line 503) | resolveProfileGroupName (groupId: string): string {
method getProviderProfileGroupDefaults (line 512) | getProviderProfileGroupDefaults (groupId: string, provider: ProfilePro...
FILE: tabby-core/src/services/selector.service.ts
class SelectorService (line 9) | class SelectorService {
method active (line 12) | get active (): boolean {
method constructor (line 17) | private constructor (
method show (line 21) | show <T> (name: string, options: SelectorOption<T>[]): Promise<T> {
FILE: tabby-core/src/services/tabRecovery.service.ts
class TabRecoveryService (line 10) | class TabRecoveryService {
method constructor (line 14) | private constructor (
method saveTabs (line 22) | async saveTabs (tabs: BaseTabComponent[]): Promise<void> {
method getFullRecoveryToken (line 33) | async getFullRecoveryToken (tab: BaseTabComponent, options?: GetRecove...
method recoverTab (line 49) | async recoverTab (token: RecoveryToken): Promise<NewTabParameters<Base...
method recoverTabs (line 70) | async recoverTabs (): Promise<NewTabParameters<BaseTabComponent>[]> {
FILE: tabby-core/src/services/tabs.service.ts
type TabComponentType (line 6) | interface TabComponentType<T extends BaseTabComponent> {
type NewTabParameters (line 11) | interface NewTabParameters<T extends BaseTabComponent> {
class TabsService (line 24) | class TabsService {
method constructor (line 26) | private constructor (
method create (line 35) | create <T extends BaseTabComponent> (params: NewTabParameters<T>): T {
method duplicate (line 48) | async duplicate (tab: BaseTabComponent): Promise<BaseTabComponent|null> {
FILE: tabby-core/src/services/themes.service.ts
class ThemesService (line 10) | class ThemesService {
method themeChanged$ (line 11) | get themeChanged$ (): Observable<Theme> { return this.themeChanged }
method constructor (line 18) | private constructor (
method getConfigStoreOrDefaults (line 41) | private getConfigStoreOrDefaults (): any {
method applyThemeVariables (line 46) | private applyThemeVariables () {
method ensureContrast (line 175) | private ensureContrast (color: Color, against: Color): Color {
method increaseContrast (line 181) | private increaseContrast (color: Color, against: Color, step=1.1): Col...
method findTheme (line 193) | findTheme (name: string): Theme|null {
method findCurrentTheme (line 197) | findCurrentTheme (): Theme {
method _getActiveColorScheme (line 202) | _getActiveColorScheme (): any {
method applyTheme (line 217) | applyTheme (theme: Theme): void {
method applyCurrentTheme (line 228) | private applyCurrentTheme (): void {
FILE: tabby-core/src/services/vault.service.ts
constant PBKDF_ITERATIONS (line 13) | const PBKDF_ITERATIONS = 100000
constant PBKDF_DIGEST (line 14) | const PBKDF_DIGEST = 'sha512'
constant PBKDF_SALT_LENGTH (line 15) | const PBKDF_SALT_LENGTH = 64 / 8
constant CRYPT_ALG (line 16) | const CRYPT_ALG = 'aes-256-cbc'
constant CRYPT_KEY_LENGTH (line 17) | const CRYPT_KEY_LENGTH = 256 / 8
constant CRYPT_IV_LENGTH (line 18) | const CRYPT_IV_LENGTH = 128 / 8
type StoredVault (line 20) | interface StoredVault {
type VaultSecret (line 27) | interface VaultSecret {
type VaultFileSecret (line 33) | interface VaultFileSecret extends VaultSecret {
type Vault (line 40) | interface Vault {
type VaultSecretKey (line 46) | interface VaultSecretKey { }
function migrateVaultContent (line 48) | function migrateVaultContent (content: any): Vault {
function deriveVaultKey (line 55) | function deriveVaultKey (passphrase: string, salt: Buffer): Promise<Buff...
function encryptVault (line 65) | async function encryptVault (content: Vault, passphrase: string): Promis...
function decryptVault (line 82) | async function decryptVault (vault: StoredVault, passphrase: string): Pr...
constant VAULT_SECRET_TYPE_FILE (line 96) | const VAULT_SECRET_TYPE_FILE = 'file'
class VaultService (line 102) | class VaultService {
method ready$ (line 104) | get ready$ (): Observable<boolean> { return this.ready }
method contentChanged$ (line 106) | get contentChanged$ (): Observable<void> { return this.contentChanged }
method constructor (line 113) | private constructor (
method setEnabled (line 121) | async setEnabled (enabled: boolean, passphrase?: string): Promise<void> {
method isOpen (line 132) | isOpen (): boolean {
method forgetPassphrase (line 136) | forgetPassphrase (): void {
method decrypt (line 140) | async decrypt (storage: StoredVault, passphrase?: string): Promise<Vau...
method load (line 155) | async load (passphrase?: string): Promise<Vault|null> {
method encrypt (line 162) | async encrypt (vault: Vault, passphrase?: string): Promise<StoredVault...
method save (line 172) | async save (vault: Vault, passphrase?: string): Promise<void> {
method getPassphrase (line 178) | async getPassphrase (): Promise<string> {
method getSecret (line 192) | async getSecret (type: string, key: VaultSecretKey): Promise<VaultSecr...
method addSecret (line 207) | async addSecret (secret: VaultSecret): Promise<void> {
method updateSecret (line 218) | async updateSecret (secret: VaultSecret, update: VaultSecret): Promise...
method removeSecret (line 232) | async removeSecret (type: string, key: VaultSecretKey): Promise<void> {
method keyMatches (line 242) | private keyMatches (key: VaultSecretKey, secret: VaultSecret): boolean {
method setStore (line 246) | setStore (store: StoredVault): void {
method isEnabled (line 252) | isEnabled (): boolean {
class VaultFileProvider (line 259) | class VaultFileProvider extends FileProvider {
method constructor (line 263) | constructor (
method isAvailable (line 272) | async isAvailable (): Promise<boolean> {
method selectAndStoreFile (line 276) | async selectAndStoreFile (description: string): Promise<string> {
method addNewFile (line 302) | async addNewFile (description: string): Promise<string> {
method retrieveFile (line 320) | async retrieveFile (key: string): Promise<Buffer> {
FILE: tabby-core/src/tabContextMenu.ts
class TabManagementContextMenu (line 20) | class TabManagementContextMenu extends TabContextMenuItemProvider {
method constructor (line 23) | constructor (
method getItems (line 30) | async getItems (tab: BaseTabComponent): Promise<MenuItemOptions[]> {
class CommonOptionsContextMenu (line 101) | class CommonOptionsContextMenu extends TabContextMenuItemProvider {
method constructor (line 104) | constructor (
method getItems (line 113) | async getItems (tab: BaseTabComponent, tabHeader?: boolean): Promise<M...
class TaskCompletionContextMenu (line 167) | class TaskCompletionContextMenu extends TabContextMenuItemProvider {
method constructor (line 168) | constructor (
method getItems (line 175) | async getItems (tab: BaseTabComponent): Promise<MenuItemOptions[]> {
class ProfilesContextMenu (line 240) | class ProfilesContextMenu extends TabContextMenuItemProvider {
method constructor (line 243) | constructor (
method switchTabProfile (line 264) | async switchTabProfile (tab: BaseTabComponent) {
method getItems (line 285) | async getItems (tab: BaseTabComponent): Promise<MenuItemOptions[]> {
FILE: tabby-core/src/theme.ts
class NewTheme (line 7) | class NewTheme extends Theme {
FILE: tabby-core/src/utfSplitter.ts
class UTF8Splitter (line 7) | class UTF8Splitter {
method write (line 10) | write (data: Buffer): Buffer {
method flush (line 27) | flush (): Buffer {
FILE: tabby-core/src/utils.ts
constant WIN_BUILD_CONPTY_SUPPORTED (line 5) | const WIN_BUILD_CONPTY_SUPPORTED = 17692
constant WIN_BUILD_CONPTY_STABLE (line 6) | const WIN_BUILD_CONPTY_STABLE = 18309
constant WIN_BUILD_WSL_EXE_DISTRO_FLAG (line 7) | const WIN_BUILD_WSL_EXE_DISTRO_FLAG = 17763
constant WIN_BUILD_FLUENT_BG_SUPPORTED (line 8) | const WIN_BUILD_FLUENT_BG_SUPPORTED = 17063
function getWindows10Build (line 10) | function getWindows10Build (): number|undefined {
function isWindowsBuild (line 14) | function isWindowsBuild (build: number): boolean {
function getCSSFontFamily (line 20) | function getCSSFontFamily (config: any): string {
function wrapPromise (line 31) | function wrapPromise <T> (zone: NgZone, promise: Promise<T>): Promise<T> {
class ResettableTimeout (line 41) | class ResettableTimeout {
method constructor (line 44) | constructor (private fn: () => void, private timeout: number) {}
method set (line 46) | set (timeout?: number): void {
method clear (line 51) | clear (): void {
constant TAB_COLORS (line 58) | const TAB_COLORS = [
function serializeFunction (line 68) | function serializeFunction <T extends () => Promise<any>> (fn: T): T {
FILE: tabby-electron/src/colorSchemes.ts
class HyperColorSchemes (line 8) | class HyperColorSchemes extends TerminalColorSchemeProvider {
method getSchemes (line 9) | async getSchemes (): Promise<TerminalColorScheme[]> {
FILE: tabby-electron/src/config.ts
class ElectronConfigProvider (line 4) | class ElectronConfigProvider extends ConfigProvider {
FILE: tabby-electron/src/hotkeys.ts
class ElectronHotkeyProvider (line 6) | class ElectronHotkeyProvider extends HotkeyProvider {
method constructor (line 18) | constructor (private translate: TranslateService) { super() }
method provide (line 20) | async provide (): Promise<HotkeyDescription[]> {
FILE: tabby-electron/src/index.ts
class ElectronModule (line 85) | class ElectronModule {
method constructor (line 86) | constructor (
method registerGlobalHotkey (line 148) | private registerGlobalHotkey () {
method updateVibrancy (line 172) | private updateVibrancy () {
method updateDarkMode (line 182) | private updateDarkMode () {
method updateWindowControlsColor (line 187) | private updateWindowControlsColor () {
FILE: tabby-electron/src/pathDrop.ts
class PathDropDecorator (line 7) | class PathDropDecorator extends TerminalDecorator {
method attach (line 8) | attach (terminal: BaseTerminalTabComponent<any>): void {
method injectPath (line 22) | private injectPath (terminal: BaseTerminalTabComponent<any>, path: str...
FILE: tabby-electron/src/pty.ts
class ElectronPTYInterface (line 16) | class ElectronPTYInterface extends PTYInterface {
method spawn (line 17) | async spawn (...options: any[]): Promise<PTYProxy> {
method restore (line 22) | async restore (id: string): Promise<ElectronPTYProxy|null> {
class ElectronPTYProxy (line 31) | class ElectronPTYProxy extends PTYProxy {
method constructor (line 35) | constructor (
method getID (line 60) | getID (): string {
method getTruePID (line 64) | getTruePID (): Promise<number> {
method getPID (line 68) | async getPID (): Promise<number> {
method subscribe (line 72) | subscribe (event: string, handler: (..._: any[]) => void): void {
method ackData (line 79) | ackData (length: number): void {
method unsubscribeAll (line 83) | unsubscribeAll (): void {
method resize (line 89) | async resize (columns: number, rows: number): Promise<void> {
method write (line 93) | async write (data: Buffer): Promise<void> {
method kill (line 97) | async kill (signal?: string): Promise<void> {
method getChildProcesses (line 101) | async getChildProcesses (): Promise<ChildProcess[]> {
method getChildProcessesInternal (line 105) | async getChildProcessesInternal (truePID: number): Promise<ChildProces...
method getWorkingDirectory (line 136) | async getWorkingDirectory (): Promise<string|null> {
FILE: tabby-electron/src/services/dockMenu.service.ts
class DockMenuService (line 7) | class DockMenuService {
method constructor (line 10) | private constructor (
method update (line 21) | async update (): Promise<void> {
FILE: tabby-electron/src/services/docking.service.ts
class ElectronDockingService (line 8) | class ElectronDockingService extends DockingService {
method constructor (line 9) | constructor (
method dock (line 26) | dock (): void {
method getScreens (line 78) | getScreens (): Screen[] {
method getCurrentScreen (line 91) | private getCurrentScreen (): Display {
method repositionWindow (line 95) | private repositionWindow () {
FILE: tabby-electron/src/services/electron.service.ts
type MessageBoxResponse (line 5) | interface MessageBoxResponse {
class ElectronService (line 11) | class ElectronService {
method constructor (line 29) | private constructor () {
FILE: tabby-electron/src/services/fileProvider.service.ts
class ElectronFileProvider (line 8) | class ElectronFileProvider extends FileProvider {
method constructor (line 11) | constructor (
method selectAndStoreFile (line 18) | async selectAndStoreFile (description: string): Promise<string> {
method retrieveFile (line 33) | async retrieveFile (key: string): Promise<Buffer> {
FILE: tabby-electron/src/services/hostApp.service.ts
class ElectronHostAppService (line 7) | class ElectronHostAppService extends HostAppService {
method platform (line 8) | get platform (): Platform {
method configPlatform (line 12) | get configPlatform (): Platform {
method constructor (line 20) | constructor (
method newWindow (line 57) | newWindow (): void {
method saveConfig (line 61) | async saveConfig (data: string): Promise<void> {
method emitReady (line 65) | emitReady (): void {
method relaunch (line 69) | relaunch (): void {
method quit (line 83) | quit (): void {
FILE: tabby-electron/src/services/hostWindow.service.ts
type Bounds (line 6) | interface Bounds {
class ElectronHostWindow (line 14) | class ElectronHostWindow extends HostWindowService {
method isFullscreen (line 15) | get isFullscreen (): boolean { return this._isFullscreen }
method constructor (line 20) | constructor (
method getWindow (line 63) | getWindow (): BrowserWindow {
method openDevTools (line 67) | openDevTools (): void {
method reload (line 71) | reload (): void {
method setTitle (line 75) | setTitle (title?: string): void {
method toggleFullscreen (line 79) | toggleFullscreen (): void {
method minimize (line 83) | minimize (): void {
method isMaximized (line 87) | isMaximized (): boolean {
method toggleMaximize (line 91) | toggleMaximize (): void {
method close (line 99) | close (): void {
method setBounds (line 103) | setBounds (bounds: Bounds): void {
method setAlwaysOnTop (line 107) | setAlwaysOnTop (flag: boolean): void {
method setTouchBar (line 111) | setTouchBar (touchBar: TouchBar): void {
method setTrafficLightPosition (line 115) | setTrafficLightPosition (x: number, y: number): void {
method setOpacity (line 119) | setOpacity (opacity: number): void {
method setProgressBar (line 123) | setProgressBar (value: number): void {
method bringToFront (line 127) | bringToFront (): void {
FILE: tabby-electron/src/services/log.service.ts
class WinstonAndConsoleLogger (line 32) | class WinstonAndConsoleLogger extends ConsoleLogger {
method constructor (line 33) | constructor (private winstonLogger: winston.Logger, name: string) {
method doLog (line 37) | protected doLog (level: string, ...args: any[]): void {
class ElectronLogService (line 44) | class ElectronLogService {
method constructor (line 48) | constructor (electron: ElectronService) {
method create (line 52) | create (name: string): Logger {
FILE: tabby-electron/src/services/platform.service.ts
class ElectronPlatformService (line 26) | class ElectronPlatformService extends PlatformService {
method constructor (line 30) | constructor (
method getAllFiles (line 50) | async getAllFiles (dir: string, root: DirectoryUpload): Promise<Direct...
method readClipboard (line 65) | readClipboard (): string {
method setClipboard (line 69) | setClipboard (content: ClipboardContent): void {
method installPlugin (line 73) | async installPlugin (name: string, version: string): Promise<void> {
method uninstallPlugin (line 77) | async uninstallPlugin (name: string): Promise<void> {
method isProcessRunning (line 81) | async isProcessRunning (name: string): Promise<boolean> {
method getWinSCPPath (line 93) | getWinSCPPath (): string|null {
method exec (line 103) | async exec (app: string, argv: string[]): Promise<void> {
method isShellIntegrationSupported (line 107) | isShellIntegrationSupported (): boolean {
method isShellIntegrationInstalled (line 111) | async isShellIntegrationInstalled (): Promise<boolean> {
method installShellIntegration (line 115) | async installShellIntegration (): Promise<void> {
method uninstallShellIntegration (line 119) | async uninstallShellIntegration (): Promise<void> {
method loadConfig (line 123) | async loadConfig (): Promise<string> {
method saveConfig (line 131) | async saveConfig (content: string): Promise<void> {
method getConfigPath (line 135) | getConfigPath (): string|null {
method showItemInFolder (line 139) | showItemInFolder (p: string): void {
method openExternal (line 143) | openExternal (url: string): void {
method openPath (line 147) | openPath (p: string): void {
method getOSRelease (line 151) | getOSRelease (): string {
method getAppVersion (line 155) | getAppVersion (): string {
method listFonts (line 159) | async listFonts (): Promise<string[]> {
method popupContextMenu (line 179) | popupContextMenu (menu: MenuItemOptions[], _event?: MouseEvent): void {
method rewrapMenuItemOptions (line 183) | rewrapMenuItemOptions (menu: MenuItemOptions): MenuItemOptions {
method showMessageBox (line 195) | async showMessageBox (options: MessageBoxOptions): Promise<MessageBoxR...
method quit (line 199) | quit (): void {
method startUpload (line 203) | async startUpload (options?: FileUploadOptions, paths?: string[]): Pro...
method startUploadDirectory (line 233) | async startUploadDirectory (paths?: string[]): Promise<DirectoryUpload> {
method startDownload (line 255) | async startDownload (name: string, mode: number, size: number, filePat...
method startDownloadDirectory (line 274) | async startDownloadDirectory (name: string, estimatedSize?: number): P...
method _registerFileTransfer (line 293) | _registerFileTransfer (transfer: FileTransfer): void {
method setErrorHandler (line 297) | setErrorHandler (handler: (_: any) => void): void {
method pickDirectory (line 303) | async pickDirectory (title?: string, buttonLabel?: string): Promise<st...
method getTheme (line 318) | getTheme (): PlatformTheme {
class ElectronFileUpload (line 327) | class ElectronFileUpload extends FileUpload {
method constructor (line 334) | constructor (private filePath: string, private electron: ElectronServi...
method open (line 340) | async open (): Promise<void> {
method getName (line 348) | getName (): string {
method getMode (line 352) | getMode (): number {
method getSize (line 356) | getSize (): number {
method read (line 360) | async read (): Promise<Uint8Array> {
method close (line 369) | close (): void {
class ElectronFileDownload (line 375) | class ElectronFileDownload extends FileDownload {
method constructor (line 379) | constructor (
method open (line 390) | async open (): Promise<void> {
method getName (line 394) | getName (): string {
method getSize (line 398) | getSize (): number {
method write (line 402) | async write (buffer: Uint8Array): Promise<void> {
method close (line 414) | close (): void {
class ElectronDirectoryDownload (line 420) | class ElectronDirectoryDownload extends DirectoryDownload {
method constructor (line 423) | constructor (
method open (line 435) | async open (): Promise<void> {
method getName (line 439) | getName (): string {
method getSize (line 443) | getSize (): number {
method createDirectory (line 447) | async createDirectory (relativePath: string): Promise<void> {
method createFile (line 452) | async createFile (relativePath: string, mode: number, size: number): P...
method close (line 461) | close (): void {
FILE: tabby-electron/src/services/shellIntegration.service.ts
class ShellIntegrationService (line 15) | class ShellIntegrationService {
method constructor (line 37) | private constructor (
method isInstalled (line 53) | async isInstalled (): Promise<boolean> {
method install (line 62) | async install (): Promise<void> {
method remove (line 86) | async remove (): Promise<void> {
method updatePaths (line 98) | private async updatePaths (): Promise<void> {
FILE: tabby-electron/src/services/touchbar.service.ts
class TouchbarService (line 9) | class TouchbarService {
method constructor (line 12) | private constructor (
method update (line 40) | update (): void {
method shortenTitle (line 53) | private shortenTitle (title: string): string {
FILE: tabby-electron/src/services/uac.service.ts
class ElectronUACService (line 9) | class ElectronUACService extends UACService {
method constructor (line 10) | constructor (
method patchSessionOptionsForUAC (line 17) | patchSessionOptionsForUAC (sessionOptions: SessionOptions): SessionOpt...
FILE: tabby-electron/src/services/updater.service.ts
constant UPDATES_URL (line 7) | const UPDATES_URL = 'https://api.github.com/repos/eugeny/tabby/releases/...
class ElectronUpdaterService (line 10) | class ElectronUpdaterService extends UpdaterService {
method constructor (line 16) | constructor (
method check (line 61) | async check (): Promise<boolean> {
method update (line 118) | async update (): Promise<void> {
FILE: tabby-electron/src/sftpContextMenu.ts
class EditSFTPContextMenu (line 13) | class EditSFTPContextMenu extends SFTPContextMenuItemProvider {
method constructor (line 16) | constructor (
method getItems (line 23) | async getItems (item: SFTPFile, panel: SFTPPanelComponent): Promise<Me...
method edit (line 41) | private async edit (item: SFTPFile, sftp: SFTPSession) {
FILE: tabby-electron/src/shells/cmder.ts
class CmderShellProvider (line 9) | class CmderShellProvider extends ShellProvider {
method constructor (line 10) | constructor (
method provide (line 16) | async provide (): Promise<Shell[]> {
FILE: tabby-electron/src/shells/cygwin32.ts
class Cygwin32ShellProvider (line 15) | class Cygwin32ShellProvider extends ShellProvider {
method constructor (line 16) | constructor (
method provide (line 22) | async provide (): Promise<Shell[]> {
FILE: tabby-electron/src/shells/cygwin64.ts
class Cygwin64ShellProvider (line 15) | class Cygwin64ShellProvider extends ShellProvider {
method constructor (line 16) | constructor (
method provide (line 22) | async provide (): Promise<Shell[]> {
FILE: tabby-electron/src/shells/gitBash.ts
class GitBashShellProvider (line 16) | class GitBashShellProvider extends WindowsBaseShellProvider {
method constructor (line 18) | constructor (
method provide (line 25) | async provide (): Promise<Shell[]> {
FILE: tabby-electron/src/shells/linuxDefault.ts
class LinuxDefaultShellProvider (line 9) | class LinuxDefaultShellProvider extends ShellProvider {
method constructor (line 12) | constructor (
method provide (line 21) | async provide (): Promise<Shell[]> {
FILE: tabby-electron/src/shells/macDefault.ts
class MacOSDefaultShellProvider (line 9) | class MacOSDefaultShellProvider extends ShellProvider {
method constructor (line 12) | constructor (
method provide (line 19) | async provide (): Promise<Shell[]> {
method getDefaultShellCached (line 33) | private async getDefaultShellCached () {
method getDefaultShell (line 40) | private async getDefaultShell (): Promise<string> {
FILE: tabby-electron/src/shells/msys2.ts
class MSYS2ShellProvider (line 10) | class MSYS2ShellProvider extends ShellProvider {
method constructor (line 11) | constructor (
method provide (line 17) | async provide (): Promise<Shell[]> {
FILE: tabby-electron/src/shells/posix.ts
class POSIXShellsProvider (line 10) | class POSIXShellsProvider extends ShellProvider {
method constructor (line 11) | constructor (
method provide (line 17) | async provide (): Promise<Shell[]> {
FILE: tabby-electron/src/shells/powershellCore.ts
class PowerShellCoreShellProvider (line 15) | class PowerShellCoreShellProvider extends WindowsBaseShellProvider {
method constructor (line 17) | constructor (
method provide (line 24) | async provide (): Promise<Shell[]> {
FILE: tabby-electron/src/shells/vs.ts
class VSDevToolsProvider (line 18) | class VSDevToolsProvider extends ShellProvider {
method constructor (line 19) | constructor (
method provide (line 25) | async provide (): Promise<Shell[]> {
FILE: tabby-electron/src/shells/winDefault.ts
class WindowsDefaultShellProvider (line 12) | class WindowsDefaultShellProvider extends ShellProvider {
method constructor (line 15) | constructor (
method provide (line 30) | async provide (): Promise<Shell[]> {
FILE: tabby-electron/src/shells/windowsBase.ts
method constructor (line 6) | constructor (
method getEnvironment (line 13) | protected getEnvironment (): any {
FILE: tabby-electron/src/shells/windowsStock.ts
class WindowsStockShellsProvider (line 13) | class WindowsStockShellsProvider extends WindowsBaseShellProvider {
method constructor (line 14) | constructor (
method provide (line 22) | async provide (): Promise<Shell[]> {
method getPowerShellPath (line 74) | private async getPowerShellPath () {
FILE: tabby-electron/src/shells/wsl.ts
class WSLShellProvider (line 40) | class WSLShellProvider extends ShellProvider {
method constructor (line 41) | constructor (
method provide (line 47) | async provide (): Promise<Shell[]> {
FILE: tabby-electron/src/sshImporters.ts
type SSHProfilePropertyNames (line 20) | enum SSHProfilePropertyNames {
function decodeTarget (line 57) | function decodeTarget (SSHProperty: string): string {
function convertSSHConfigValuesToString (line 68) | function convertSSHConfigValuesToString (arg: string | string[] | object...
function parseSSHConfigFile (line 94) | async function parseSSHConfigFile (
function hashSSHProfileName (line 148) | async function hashSSHProfileName (name: string) {
function convertHostToSSHProfile (line 157) | async function convertHostToSSHProfile (host: string, settings: Record<s...
function convertToSSHProfiles (line 306) | async function convertToSSHProfiles (config: SSHConfig): Promise<Partial...
class OpenSSHImporter (line 358) | class OpenSSHImporter extends SSHProfileImporter {
method getProfiles (line 359) | async getProfiles (): Promise<PartialProfile<SSHProfile>[]> {
class StaticFileImporter (line 376) | class StaticFileImporter extends SSHProfileImporter {
method constructor (line 379) | constructor (
method getProfiles (line 386) | async getProfiles (): Promise<PartialProfile<SSHProfile>[]> {
class PrivateKeyLocator (line 408) | class PrivateKeyLocator extends AutoPrivateKeyLocator {
method getKeys (line 409) | async getKeys (): Promise<[string, Buffer][]> {
FILE: tabby-linkifier/src/api.ts
method convert (line 7) | convert (uri: string, _tab?: BaseTerminalTabComponent<any>): Promise<str...
method verify (line 11) | verify (_uri: string, _tab?: BaseTerminalTabComponent<any>): Promise<boo...
method fullMatchRegex (line 18) | get fullMatchRegex (): RegExp {
FILE: tabby-linkifier/src/config.ts
class ClickableLinksConfigProvider (line 4) | class ClickableLinksConfigProvider extends ConfigProvider {
FILE: tabby-linkifier/src/decorator.ts
class LinkHighlighterDecorator (line 8) | class LinkHighlighterDecorator extends TerminalDecorator {
method constructor (line 9) | constructor (
method attach (line 17) | attach (tab: BaseTerminalTabComponent<any>): void {
method willHandleEvent (line 70) | private willHandleEvent (event: MouseEvent) {
FILE: tabby-linkifier/src/handlers.ts
class URLHandler (line 12) | class URLHandler extends LinkHandler {
method constructor (line 19) | constructor (private platform: PlatformService) {
method handle (line 23) | handle (uri: string): void {
class IPHandler (line 29) | class IPHandler extends LinkHandler {
method constructor (line 34) | constructor (private platform: PlatformService) {
method handle (line 38) | handle (uri: string): void {
class BaseFileHandler (line 43) | class BaseFileHandler extends LinkHandler {
method constructor (line 44) | constructor (
method handle (line 51) | async handle (uri: string): Promise<void> {
method verify (line 59) | async verify (uri: string): Promise<boolean> {
method convert (line 68) | async convert (uri: string, tab?: BaseTerminalTabComponent<any>): Prom...
class UnixFileHandler (line 81) | class UnixFileHandler extends BaseFileHandler {
method constructor (line 85) | constructor (
class WindowsFileHandler (line 95) | class WindowsFileHandler extends BaseFileHandler {
method constructor (line 98) | constructor (
method convert (line 105) | convert (uri: string, tab?: BaseTerminalTabComponent<any>): Promise<st...
FILE: tabby-linkifier/src/index.ts
class LinkifierModule (line 25) | class LinkifierModule { }
FILE: tabby-local/src/api.ts
type Shell (line 3) | interface Shell {
type SessionOptions (line 34) | interface SessionOptions {
type LocalProfile (line 46) | interface LocalProfile extends BaseTerminalProfile {
type ChildProcess (line 50) | interface ChildProcess {
FILE: tabby-local/src/buttonProvider.ts
class ButtonProvider (line 8) | class ButtonProvider extends ToolbarButtonProvider {
method constructor (line 9) | constructor (
method provide (line 16) | provide (): ToolbarButton[] {
FILE: tabby-local/src/cli.ts
class TerminalCLIHandler (line 8) | class TerminalCLIHandler extends CLIHandler {
method constructor (line 12) | constructor (
method handle (line 19) | async handle (event: CLIEvent): Promise<boolean> {
method handleOpenDirectory (line 33) | private async handleOpenDirectory (directory: string) {
method handleRunCommand (line 45) | private handleRunCommand (command: string[]) {
class OpenPathCLIHandler (line 60) | class OpenPathCLIHandler extends CLIHandler {
method constructor (line 64) | constructor (
method handle (line 73) | async handle (event: CLIEvent): Promise<boolean> {
class AutoOpenTabCLIHandler (line 120) | class AutoOpenTabCLIHandler extends CLIHandler {
method constructor (line 124) | constructor (
method handle (line 132) | async handle (event: CLIEvent): Promise<boolean> {
FILE: tabby-local/src/components/commandLineEditor.component.ts
class CommandLineEditorComponent (line 11) | class CommandLineEditorComponent {
method model (line 16) | get model (): SessionOptions {
method model (line 20) | set model (value: SessionOptions) {
method switchToCommand (line 25) | switchToCommand () {
method switchToArgv (line 30) | switchToArgv () {
method parseCommand (line 34) | parseCommand () {
method updateCommand (line 40) | updateCommand () {
method trackByIndex (line 47) | trackByIndex (index) {
FILE: tabby-local/src/components/environmentEditor.component.ts
class EnvironmentEditorComponent (line 11) | class EnvironmentEditorComponent {
method model (line 16) | get model (): any {
method model (line 20) | set model (value) {
method getModel (line 25) | getModel () {
method emitUpdate (line 33) | emitUpdate () {
method addEnvironmentVar (line 38) | addEnvironmentVar () {
method removeEnvironmentVar (line 42) | removeEnvironmentVar (key: string) {
method shouldShowExample (line 47) | shouldShowExample (): boolean {
method addExample (line 51) | addExample (): void {
FILE: tabby-local/src/components/localProfileSettings.component.ts
class LocalProfileSettingsComponent (line 12) | class LocalProfileSettingsComponent implements ProfileSettingsComponent<...
method constructor (line 15) | constructor (
method pickWorkingDirectory (line 20) | async pickWorkingDirectory (): Promise<void> {
FILE: tabby-local/src/components/shellSettingsTab.component.ts
class ShellSettingsTabComponent (line 8) | class ShellSettingsTabComponent {
method constructor (line 14) | constructor (
FILE: tabby-local/src/components/terminalTab.component.ts
class TerminalTabComponent (line 15) | class TerminalTabComponent extends BaseTerminalTabComponent<LocalProfile> {
method constructor (line 20) | constructor (
method ngOnInit (line 27) | ngOnInit (): void {
method onFrontendReady (line 51) | protected onFrontendReady (): void {
method initializeSession (line 57) | initializeSession (columns: number, rows: number): void {
method getRecoveryToken (line 78) | async getRecoveryToken (options?: GetRecoveryTokenOptions): Promise<an...
method getCurrentProcess (line 94) | async getCurrentProcess (): Promise<BaseTabProcess|null> {
method canClose (line 104) | async canClose (): Promise<boolean> {
method ngOnDestroy (line 126) | ngOnDestroy (): void {
method isSessionExplicitlyTerminated (line 135) | protected isSessionExplicitlyTerminated (): boolean {
FILE: tabby-local/src/config.ts
class TerminalConfigProvider (line 4) | class TerminalConfigProvider extends ConfigProvider {
FILE: tabby-local/src/hotkeys.ts
class LocalTerminalHotkeyProvider (line 6) | class LocalTerminalHotkeyProvider extends HotkeyProvider {
method constructor (line 14) | constructor (private translate: TranslateService) { super() }
method provide (line 16) | async provide (): Promise<HotkeyDescription[]> {
FILE: tabby-local/src/index.ts
class LocalTerminalModule (line 68) | class LocalTerminalModule { // eslint-disable-line @typescript-eslint/no...
method constructor (line 69) | private constructor (
FILE: tabby-local/src/profiles.ts
class LocalProfilesService (line 10) | class LocalProfilesService extends ProfileProvider<LocalProfile> {
method constructor (line 30) | constructor (
method getBuiltinProfiles (line 38) | async getBuiltinProfiles (): Promise<PartialProfile<LocalProfile>[]> {
method getNewTabParameters (line 49) | async getNewTabParameters (profile: LocalProfile): Promise<NewTabParam...
method getShells (line 73) | async getShells (): Promise<Shell[]> {
method optionsFromShell (line 78) | optionsFromShell (shell: Shell): SessionOptions {
method getSuggestedName (line 88) | getSuggestedName (profile: LocalProfile): string {
method getDescription (line 92) | getDescription (profile: PartialProfile<LocalProfile>): string {
FILE: tabby-local/src/recoveryProvider.ts
class RecoveryProvider (line 8) | class RecoveryProvider extends TabRecoveryProvider<TerminalTabComponent> {
method constructor (line 9) | constructor (private injector: Injector) { super() }
method applicableTo (line 11) | async applicableTo (recoveryToken: RecoveryToken): Promise<boolean> {
method recover (line 15) | async recover (recoveryToken: RecoveryToken): Promise<NewTabParameters...
FILE: tabby-local/src/services/terminal.service.ts
class TerminalService (line 8) | class TerminalService {
method constructor (line 12) | private constructor (
method getDefaultProfile (line 20) | async getDefaultProfile (): Promise<PartialProfile<LocalProfile>> {
method openTab (line 33) | async openTab (profile?: PartialProfile<LocalProfile>|null, cwd?: stri...
FILE: tabby-local/src/session.ts
function mergeEnv (line 10) | function mergeEnv (...envs) {
function substituteEnv (line 24) | function substituteEnv (env: Record<string, string>) {
class Session (line 40) | class Session extends BaseSession {
method constructor (line 51) | constructor (
method start (line 61) | async start (options: SessionOptions): Promise<void> {
method getID (line 160) | getID (): string|null {
method resize (line 164) | resize (columns: number, rows: number): void {
method write (line 168) | write (data: Buffer): void {
method kill (line 177) | kill (signal?: string): void {
method getChildProcesses (line 181) | async getChildProcesses (): Promise<ChildProcess[]> {
method gracefullyKillProcess (line 185) | async gracefullyKillProcess (): Promise<void> {
method supportsWorkingDirectory (line 205) | supportsWorkingDirectory (): boolean {
method getWorkingDirectory (line 209) | async getWorkingDirectory (): Promise<string|null> {
method guessWindowsCWD (line 240) | private guessWindowsCWD (data: string) {
FILE: tabby-local/src/settings.ts
class ShellSettingsTabProvider (line 9) | class ShellSettingsTabProvider extends SettingsTabProvider {
method constructor (line 14) | constructor (private hostApp: HostAppService) {
method getComponentType (line 18) | getComponentType (): any {
FILE: tabby-local/src/tabContextMenu.ts
class NewTabContextMenu (line 9) | class NewTabContextMenu extends TabContextMenuItemProvider {
method constructor (line 12) | constructor (
method getItems (line 22) | async getItems (tab: BaseTabComponent, tabHeader?: boolean): Promise<M...
FILE: tabby-plugin-manager/src/components/pluginsSettingsTab.component.ts
type BusyState (line 10) | enum BusyState { Installing = 'Installing', Uninstalling = 'Uninstalling' }
constant FORCE_ENABLE (line 12) | const FORCE_ENABLE = ['tabby-core', 'tabby-settings', 'tabby-electron', ...
class PluginsSettingsTabComponent (line 21) | class PluginsSettingsTabComponent {
method constructor (line 38) | constructor (
method ngOnInit (line 45) | ngOnInit () {
method openPluginsFolder (line 80) | openPluginsFolder (): void {
method searchAvailable (line 84) | searchAvailable (query: string) {
method searchInstalled (line 88) | searchInstalled (query: string) {
method isAlreadyInstalled (line 92) | isAlreadyInstalled (plugin: PluginInfo): boolean {
method installPlugin (line 96) | async installPlugin (plugin: PluginInfo): Promise<void> {
method uninstallPlugin (line 111) | async uninstallPlugin (plugin: PluginInfo): Promise<void> {
method upgradePlugin (line 126) | async upgradePlugin (plugin: PluginInfo): Promise<void> {
method showPluginInfo (line 130) | showPluginInfo (plugin: PluginInfo) {
method showPluginHomepage (line 134) | showPluginHomepage (plugin: PluginInfo) {
method isPluginEnabled (line 138) | isPluginEnabled (plugin: PluginInfo) {
method canDisablePlugin (line 142) | canDisablePlugin (plugin: PluginInfo) {
method togglePlugin (line 146) | togglePlugin (plugin: PluginInfo) {
method enablePlugin (line 154) | enablePlugin (plugin: PluginInfo) {
method disablePlugin (line 160) | disablePlugin (plugin: PluginInfo) {
FILE: tabby-plugin-manager/src/index.ts
class PluginManagerModule (line 27) | class PluginManagerModule { } // eslint-disable-line @typescript-eslint/...
FILE: tabby-plugin-manager/src/services/pluginManager.service.ts
constant OFFICIAL_NPM_ACCOUNT (line 8) | const OFFICIAL_NPM_ACCOUNT = 'eugenepankov'
class PluginManagerService (line 12) | class PluginManagerService {
method constructor (line 17) | private constructor (
method listAvailable (line 28) | listAvailable (query?: string): Observable<PluginInfo[]> {
method listInstalled (line 48) | listInstalled (query: string): Observable<PluginInfo[]> {
method _listAvailableInternal (line 52) | _listAvailableInternal (namePrefix: string, keyword: string, query?: s...
method installPlugin (line 86) | async installPlugin (plugin: PluginInfo): Promise<void> {
method uninstallPlugin (line 97) | async uninstallPlugin (plugin: PluginInfo): Promise<void> {
FILE: tabby-plugin-manager/src/settings.ts
class PluginsSettingsTabProvider (line 8) | class PluginsSettingsTabProvider extends SettingsTabProvider {
method getComponentType (line 12) | getComponentType (): any {
FILE: tabby-serial/src/api.ts
type SerialProfile (line 9) | interface SerialProfile extends ConnectableTerminalProfile {
type SerialProfileOptions (line 13) | interface SerialProfileOptions extends StreamProcessingOptions, LoginScr...
constant BAUD_RATES (line 27) | const BAUD_RATES = [
type SerialPortInfo (line 31) | interface SerialPortInfo {
class SlowFeedMiddleware (line 36) | class SlowFeedMiddleware extends SessionMiddleware {
method feedFromTerminal (line 37) | feedFromTerminal (data: Buffer): void {
class SerialSession (line 44) | class SerialSession extends BaseSession {
method serviceMessage$ (line 47) | get serviceMessage$ (): Observable<string> { return this.serviceMessage }
method constructor (line 54) | constructor (injector: Injector, public profile: SerialProfile) {
method start (line 74) | async start (): Promise<void> {
method write (line 138) | write (data: Buffer): void {
method destroy (line 142) | async destroy (): Promise<void> {
method resize (line 148) | resize (_, __) {
method kill (line 152) | kill (_?: string): void {
method emitServiceMessage (line 156) | emitServiceMessage (msg: string): void {
method getChildProcesses (line 161) | async getChildProcesses (): Promise<any[]> {
method gracefullyKillProcess (line 165) | async gracefullyKillProcess (): Promise<void> {
method supportsWorkingDirectory (line 169) | supportsWorkingDirectory (): boolean {
method getWorkingDirectory (line 173) | async getWorkingDirectory (): Promise<string|null> {
FILE: tabby-serial/src/components/serialProfileSettings.component.ts
class SerialProfileSettingsComponent (line 13) | class SerialProfileSettingsComponent implements ProfileSettingsComponent...
method constructor (line 18) | constructor (
method ngOnInit (line 44) | async ngOnInit () {
FILE: tabby-serial/src/components/serialTab.component.ts
class SerialTabComponent (line 16) | class SerialTabComponent extends ConnectableTerminalTabComponent<SerialP...
method constructor (line 21) | constructor (
method ngOnInit (line 29) | ngOnInit () {
method initializeSession (line 54) | async initializeSession () {
method attachSessionHandlers (line 74) | protected attachSessionHandlers () {
method onSessionDestroyed (line 82) | protected onSessionDestroyed (): void {
method changeBaudRate (line 91) | async changeBaudRate () {
method isSessionExplicitlyTerminated (line 102) | protected isSessionExplicitlyTerminated (): boolean {
FILE: tabby-serial/src/config.ts
class SerialConfigProvider (line 4) | class SerialConfigProvider extends ConfigProvider {
FILE: tabby-serial/src/hotkeys.ts
class SerialHotkeyProvider (line 6) | class SerialHotkeyProvider extends HotkeyProvider {
method constructor (line 18) | constructor (private translate: TranslateService) { super() }
method provide (line 20) | async provide (): Promise<HotkeyDescription[]> {
FILE: tabby-serial/src/index.ts
class SerialModule (line 38) | class SerialModule { } // eslint-disable-line @typescript-eslint/no-extr...
FILE: tabby-serial/src/profiles.ts
class SerialProfilesService (line 12) | class SerialProfilesService extends ConnectableProfileProvider<SerialPro...
method constructor (line 38) | constructor (
method getBuiltinProfiles (line 47) | async getBuiltinProfiles (): Promise<SerialProfile[]> {
method getNewTabParameters (line 84) | async getNewTabParameters (profile: SerialProfile): Promise<NewTabPara...
method getSuggestedName (line 100) | getSuggestedName (profile: SerialProfile): string {
method getDescription (line 104) | getDescription (profile: SerialProfile): string {
FILE: tabby-serial/src/recoveryProvider.ts
class RecoveryProvider (line 8) | class RecoveryProvider extends TabRecoveryProvider<SerialTabComponent> {
method constructor (line 9) | constructor (private injector: Injector) { super() }
method applicableTo (line 11) | async applicableTo (recoveryToken: RecoveryToken): Promise<boolean> {
method recover (line 15) | async recover (recoveryToken: RecoveryToken): Promise<NewTabParameters...
FILE: tabby-serial/src/services/serial.service.ts
class SerialService (line 10) | class SerialService {
method constructor (line 11) | private constructor (
method detectBinding (line 16) | detectBinding (): typeof AbstractBinding {
method listPorts (line 20) | async listPorts (): Promise<SerialPortInfo[]> {
method quickConnect (line 32) | quickConnect (query: string): Promise<SerialTabComponent|null> {
FILE: tabby-settings/src/api.ts
method getComponentType (line 11) | getComponentType (): any {
FILE: tabby-settings/src/buttonProvider.ts
class ButtonProvider (line 8) | class ButtonProvider extends ToolbarButtonProvider {
method constructor (line 9) | constructor (
method provide (line 25) | provide (): ToolbarButton[] {
method open (line 35) | open (): void {
FILE: tabby-settings/src/components/configSyncSettingsTab.component.ts
class ConfigSyncSettingsTabComponent (line 13) | class ConfigSyncSettingsTabComponent extends BaseComponent {
method constructor (line 20) | constructor (
method ngOnInit (line 32) | async ngOnInit () {
method testConnection (line 37) | async testConnection () {
method loadConfigs (line 53) | async loadConfigs () {
method uploadAsNew (line 57) | async uploadAsNew () {
method uploadAndSync (line 72) | async uploadAndSync (cfg: Config) {
method downloadAndSync (line 93) | async downloadAndSync (cfg: Config) {
method delete (line 111) | async delete (cfg: Config) {
method hasMatchingRemoteConfig (line 129) | hasMatchingRemoteConfig () {
method isActiveConfig (line 133) | isActiveConfig (c: Config) {
method openSyncHost (line 137) | openSyncHost () {
method openTabbyWebInfo (line 145) | openTabbyWebInfo () {
FILE: tabby-settings/src/components/editProfileGroupModal.component.ts
class EditProfileGroupModalComponent (line 10) | class EditProfileGroupModalComponent<G extends ProfileGroup> {
method constructor (line 14) | constructor (
method save (line 20) | save () {
method cancel (line 24) | cancel () {
method editDefaults (line 28) | editDefaults (provider: ProfileProvider<Profile>) {
method deleteDefaults (line 32) | async deleteDefaults (provider: ProfileProvider<Profile>): Promise<voi...
type EditProfileGroupModalComponentResult (line 51) | interface EditProfileGroupModalComponentResult<G extends ProfileGroup> {
FILE: tabby-settings/src/components/editProfileModal.component.ts
class EditProfileModalComponent (line 18) | class EditProfileModalComponent<P extends Profile, PP extends ProfilePro...
method constructor (line 30) | constructor (
method ngOnInit (line 58) | ngOnInit () {
method ngAfterViewInit (line 62) | ngAfterViewInit () {
method save (line 90) | save () {
method cancel (line 102) | cancel () {
method isConnectable (line 106) | isConnectable (): boolean {
FILE: tabby-settings/src/components/hotkeyInputModal.component.ts
constant INPUT_TIMEOUT (line 6) | const INPUT_TIMEOUT = 1000
class HotkeyInputModalComponent (line 38) | class HotkeyInputModalComponent extends BaseComponent {
method constructor (line 45) | constructor (
method splitKeys (line 62) | splitKeys (keys: string): string[] {
method ngOnInit (line 66) | ngOnInit (): void {
method ngOnDestroy (line 80) | ngOnDestroy (): void {
method close (line 87) | close (): void {
FILE: tabby-settings/src/components/hotkeySettingsTab.component.ts
class HotkeySettingsTabComponent (line 19) | class HotkeySettingsTabComponent {
method constructor (line 24) | constructor (
method getHotkeys (line 35) | getHotkeys (id: string): Hotkey[] {
method setHotkeys (line 43) | setHotkeys (id: string, hotkeys: Hotkey[]) {
method hotkeyFilterFn (line 59) | hotkeyFilterFn (hotkey: HotkeyDescription, query: string): boolean {
method getAllDuplicateHotkeys (line 64) | private getAllDuplicateHotkeys (): string[] {
method detectDuplicates (line 74) | private detectDuplicates (strokes: string[] | string): Hotkey {
method toHotkeyIdentifier (line 80) | private toHotkeyIdentifier (hotkey: string[] | string): string {
FILE: tabby-settings/src/components/multiHotkeyInput.component.ts
class MultiHotkeyInputComponent (line 14) | class MultiHotkeyInputComponent {
method constructor (line 18) | constructor (
method ngOnChanges (line 22) | ngOnChanges (): void {
method editItem (line 26) | editItem (item: Hotkey): void {
method addItem (line 33) | addItem (): void {
method removeItem (line 40) | removeItem (item: Hotkey): void {
method storeUpdatedHotkeys (line 45) | private storeUpdatedHotkeys () {
FILE: tabby-settings/src/components/profilesSettingsTab.component.ts
type CollapsableProfileGroup (line 12) | interface CollapsableProfileGroup extends ProfileGroup {
class ProfilesSettingsTabComponent (line 21) | class ProfilesSettingsTabComponent extends BaseComponent {
method constructor (line 30) | constructor (
method ngOnInit (line 44) | async ngOnInit (): Promise<void> {
method refreshProfiles (line 51) | async refreshProfiles (): Promise<void> {
method launchProfile (line 58) | launchProfile (profile: PartialProfile<Profile>): void {
method newProfile (line 62) | async newProfile (base?: PartialProfile<Profile>): Promise<void> {
method editProfile (line 101) | async editProfile (profile: PartialProfile<Profile>): Promise<void> {
method showProfileEditModal (line 110) | async showProfileEditModal (profile: PartialProfile<Profile>): Promise...
method deleteProfile (line 131) | async deleteProfile (profile: PartialProfile<Profile>): Promise<void> {
method newProfileGroup (line 149) | async newProfileGroup (): Promise<void> {
method editProfileGroup (line 159) | async editProfileGroup (group: PartialProfileGroup<CollapsableProfileG...
method showProfileGroupEditModal (line 168) | async showProfileGroupEditModal (group: PartialProfileGroup<Collapsabl...
method editProfileGroupDefaults (line 189) | private async editProfileGroupDefaults (group: PartialProfileGroup<Col...
method deleteProfileGroup (line 216) | async deleteProfileGroup (group: PartialProfileGroup<ProfileGroup>): P...
method refreshProfileGroups (line 250) | async refreshProfileGroups (): Promise<void> {
method isGroupVisible (line 259) | isGroupVisible (group: PartialProfileGroup<ProfileGroup>): boolean {
method isProfileVisible (line 263) | isProfileVisible (profile: PartialProfile<Profile>): boolean {
method getDescription (line 267) | getDescription (profile: PartialProfile<Profile>): string|null {
method getTypeLabel (line 271) | getTypeLabel (profile: PartialProfile<Profile>): string {
method getTypeColorClass (line 279) | getTypeColorClass (profile: PartialProfile<Profile>): string {
method toggleGroupCollapse (line 288) | toggleGroupCollapse (group: PartialProfileGroup<CollapsableProfileGrou...
method editDefaults (line 296) | async editDefaults (provider: ProfileProvider<Profile>): Promise<void> {
method deleteDefaults (line 319) | async deleteDefaults (provider: ProfileProvider<Profile>): Promise<voi...
method blacklistProfile (line 337) | blacklistProfile (profile: PartialProfile<Profile>): void {
method unblacklistProfile (line 342) | unblacklistProfile (profile: PartialProfile<Profile>): void {
method isProfileBlacklisted (line 347) | isProfileBlacklisted (profile: PartialProfile<Profile>): boolean {
method getQuickConnectProviders (line 351) | getQuickConnectProviders (): ProfileProvider<Profile>[] {
method saveProfileGroupCollapse (line 358) | private saveProfileGroupCollapse (group: PartialProfileGroup<Collapsab...
method collapsableIntoPartialProfileGroup (line 364) | private static collapsableIntoPartialProfileGroup (group: PartialProfi...
method intoPartialCollapsableProfileGroup (line 370) | private static intoPartialCollapsableProfileGroup (group: PartialProfi...
FILE: tabby-settings/src/components/releaseNotesTab.component.ts
type Release (line 8) | interface Release {
class ReleaseNotesComponent (line 21) | class ReleaseNotesComponent extends BaseTabComponent {
method constructor (line 25) | constructor (translate: TranslateService, injector: Injector) {
method loadReleases (line 31) | async loadReleases (page) {
method onScrolled (line 45) | onScrolled () {
FILE: tabby-settings/src/components/setVaultPassphraseModal.component.ts
class SetVaultPassphraseModalComponent (line 8) | class SetVaultPassphraseModalComponent {
method constructor (line 13) | constructor (
method ngOnInit (line 17) | ngOnInit (): void {
method ok (line 23) | ok (): void {
method cancel (line 27) | cancel (): void {
FILE: tabby-settings/src/components/settingsTab.component.ts
class SettingsTabComponent (line 31) | class SettingsTabComponent extends BaseTabComponent {
method constructor (line 43) | constructor (
method ngOnInit (line 74) | async ngOnInit () {
method toggleShellIntegration (line 78) | async toggleShellIntegration () {
method ngOnDestroy (line 87) | ngOnDestroy () {
method restartApp (line 91) | restartApp () {
method saveConfiguration (line 96) | saveConfiguration (requireRestart?: boolean) {
method saveConfigFile (line 103) | saveConfigFile () {
method showConfigFile (line 109) | showConfigFile () {
method isConfigFileValid (line 113) | isConfigFileValid () {
method checkForUpdates (line 122) | async checkForUpdates () {
method showReleaseNotes (line 128) | showReleaseNotes () {
FILE: tabby-settings/src/components/settingsTabBody.component.ts
class SettingsTabBodyComponent (line 16) | class SettingsTabBodyComponent {
method constructor (line 21) | constructor (private componentFactoryResolver: ComponentFactoryResolve...
method ngAfterViewInit (line 23) | ngAfterViewInit (): void {
FILE: tabby-settings/src/components/showSecretModal.component.ts
class ShowSecretModalComponent (line 9) | class ShowSecretModalComponent {
method constructor (line 13) | constructor (
method close (line 18) | close (): void {
method copySecret (line 22) | copySecret (): void {
FILE: tabby-settings/src/components/vaultSettingsTab.component.ts
class VaultSettingsTabComponent (line 14) | class VaultSettingsTabComponent extends BaseComponent {
method constructor (line 20) | constructor (
method loadVault (line 33) | async loadVault (): Promise<void> {
method enableVault (line 37) | async enableVault () {
method disableVault (line 46) | async disableVault () {
method changePassphrase (line 63) | async changePassphrase () {
method toggleConfigEncrypted (line 77) | async toggleConfigEncrypted () {
method getSecretLabel (line 87) | getSecretLabel (secret: VaultSecret) {
method showSecret (line 101) | showSecret (secret: VaultSecret) {
method removeSecret (line 111) | removeSecret (secret: VaultSecret) {
method replaceFileContent (line 119) | async replaceFileContent (secret: VaultFileSecret) {
method renameFile (line 131) | async renameFile (secret: VaultFileSecret) {
method exportFile (line 152) | async exportFile (secret: VaultFileSecret) {
FILE: tabby-settings/src/components/windowSettingsTab.component.ts
class WindowSettingsTabComponent (line 23) | class WindowSettingsTabComponent extends BaseComponent {
method constructor (line 30) | constructor (
method saveConfiguration (line 54) | saveConfiguration (requireRestart?: boolean) {
FILE: tabby-settings/src/config.ts
class SettingsConfigProvider (line 4) | class SettingsConfigProvider extends ConfigProvider {
FILE: tabby-settings/src/hotkeys.ts
class SettingsHotkeyProvider (line 7) | class SettingsHotkeyProvider extends HotkeyProvider {
method constructor (line 15) | constructor (
method provide (line 20) | async provide (): Promise<HotkeyDescription[]> {
FILE: tabby-settings/src/index.ts
class SettingsModule (line 68) | class SettingsModule {
method constructor (line 69) | constructor (
FILE: tabby-settings/src/services/configSync.service.ts
type User (line 6) | interface User {
type Config (line 10) | interface Config {
constant OPTIONAL_CONFIG_PARTS (line 19) | const OPTIONAL_CONFIG_PARTS = ['hotkeys', 'appearance', 'vault']
class ConfigSyncService (line 22) | class ConfigSyncService {
method constructor (line 26) | constructor (
method isAvailable (line 43) | isAvailable (): boolean {
method isEnabled (line 47) | isEnabled (): boolean {
method getConfigs (line 54) | async getConfigs (): Promise<Config[]> {
method getConfig (line 58) | async getConfig (id: number): Promise<Config> {
method updateConfig (line 62) | async updateConfig (id: number, data: Partial<Config>): Promise<Config> {
method getUser (line 66) | async getUser (): Promise<any> {
method createNewConfig (line 70) | async createNewConfig (name: string): Promise<Config> {
method deleteConfig (line 78) | async deleteConfig (id: number): Promise<any> {
method setConfig (line 82) | setConfig (config: Config): void {
method upload (line 88) | async upload (): Promise<void> {
method download (line 113) | async download (): Promise<void> {
method delete (line 140) | async delete (config: Config): Promise<void> {
method readConfigDataForSync (line 150) | private async readConfigDataForSync (): Promise<any> {
method writeConfigDataFromSync (line 156) | private async writeConfigDataFromSync (data: any) {
method request (line 162) | private async request (method: 'GET'|'POST'|'PATCH'|'DELETE', url: str...
method autoSync (line 185) | private async autoSync () {
FILE: tabby-settings/src/settings.ts
class HotkeySettingsTabProvider (line 12) | class HotkeySettingsTabProvider extends SettingsTabProvider {
method constructor (line 17) | constructor (private translate: TranslateService) { super() }
method getComponentType (line 19) | getComponentType (): any {
class WindowSettingsTabProvider (line 27) | class WindowSettingsTabProvider extends SettingsTabProvider {
method constructor (line 32) | constructor (private translate: TranslateService) { super() }
method getComponentType (line 34) | getComponentType (): any {
class VaultSettingsTabProvider (line 42) | class VaultSettingsTabProvider extends SettingsTabProvider {
method getComponentType (line 47) | getComponentType (): any {
class ProfilesSettingsTabProvider (line 55) | class ProfilesSettingsTabProvider extends SettingsTabProvider {
method constructor (line 61) | constructor (private translate: TranslateService) { super() }
method getComponentType (line 63) | getComponentType (): any {
class ConfigSyncSettingsTabProvider (line 70) | class ConfigSyncSettingsTabProvider extends SettingsTabProvider {
method constructor (line 75) | constructor (private translate: TranslateService) { super() }
method getComponentType (line 77) | getComponentType (): any {
FILE: tabby-ssh/src/api/interfaces.ts
type SSHAlgorithmType (line 3) | enum SSHAlgorithmType {
type SSHProfile (line 12) | interface SSHProfile extends ConnectableTerminalProfile {
type SSHProfileOptions (line 16) | interface SSHProfileOptions extends LoginScriptsOptions {
type PortForwardType (line 42) | enum PortForwardType {
type ForwardedPortConfig (line 48) | interface ForwardedPortConfig {
FILE: tabby-ssh/src/components/hostKeyPromptModal.component.ts
class HostKeyPromptModalComponent (line 10) | class HostKeyPromptModalComponent {
method constructor (line 17) | constructor (
method ngOnInit (line 22) | ngOnInit () {
method accept (line 31) | accept () {
method acceptAndSave (line 35) | async acceptAndSave () {
method cancel (line 40) | cancel () {
FILE: tabby-ssh/src/components/keyboardInteractiveAuthPanel.component.ts
class KeyboardInteractiveAuthComponent (line 12) | class KeyboardInteractiveAuthComponent {
method constructor (line 20) | constructor (private passwordStorage: PasswordStorageService) {}
method isPassword (line 22) | isPassword (): boolean {
method previous (line 26) | previous (): void {
method next (line 33) | next (): void {
FILE: tabby-ssh/src/components/sftpCreateDirectoryModal.component.ts
class SFTPCreateDirectoryModalComponent (line 9) | class SFTPCreateDirectoryModalComponent extends BaseComponent {
method constructor (line 12) | constructor (
method create (line 18) | create (): void {
method cancel (line 22) | cancel (): void {
FILE: tabby-ssh/src/components/sftpDeleteModal.component.ts
class SFTPDeleteModalComponent (line 10) | class SFTPDeleteModalComponent extends BaseComponent {
method constructor (line 16) | constructor (
method ngOnInit (line 22) | async ngOnInit (): Promise<void> {
method cancel (line 28) | cancel (): void {
method run (line 33) | async run (file: SFTPFile): Promise<void> {
FILE: tabby-ssh/src/components/sftpPanel.component.ts
type PathSegment (line 11) | interface PathSegment {
class SFTPPanelComponent (line 21) | class SFTPPanelComponent {
method constructor (line 35) | constructor (
method ngOnInit (line 44) | async ngOnInit (): Promise<void> {
method navigate (line 55) | async navigate (newPath: string, fallbackOnError = true): Promise<void> {
method getFileType (line 92) | getFileType (fileExtension: string): string {
method getIcon (line 131) | getIcon (item: SFTPFile): string {
method goUp (line 153) | goUp (): void {
method open (line 157) | async open (item: SFTPFile): Promise<void> {
method downloadItem (line 173) | async downloadItem (item: SFTPFile): Promise<void> {
method openCreateDirectoryModal (line 193) | async openCreateDirectoryModal (): Promise<void> {
method upload (line 206) | async upload (): Promise<void> {
method uploadFolder (line 211) | async uploadFolder (): Promise<void> {
method uploadOneFolder (line 216) | async uploadOneFolder (transfer: DirectoryUpload, accumPath = ''): Pro...
method uploadOne (line 235) | async uploadOne (transfer: FileUpload): Promise<void> {
method download (line 243) | async download (itemPath: string, mode: number, size: number): Promise...
method downloadFolder (line 251) | async downloadFolder (folder: SFTPFile): Promise<void> {
method calculateFolderSizeAndUpdate (line 278) | private async calculateFolderSizeAndUpdate (folder: SFTPFile, transfer...
method downloadFolderRecursive (line 292) | private async downloadFolderRecursive (folder: SFTPFile, transfer: Dir...
method getModeString (line 313) | getModeString (item: SFTPFile): string {
method buildContextMenu (line 329) | async buildContextMenu (item: SFTPFile): Promise<MenuItemOptions[]> {
method showContextMenu (line 338) | async showContextMenu (item: SFTPFile, event: MouseEvent): Promise<voi...
method shouldShowCWDTip (line 343) | get shouldShowCWDTip (): boolean {
method dismissCWDTip (line 347) | dismissCWDTip (): void {
method editPath (line 351) | editPath (): void {
method confirmPath (line 355) | confirmPath (): void {
method close (line 363) | close (): void {
method clearFilter (line 367) | clearFilter (): void {
method onFilterChange (line 373) | onFilterChange (): void {
method updateFilteredList (line 377) | private updateFilteredList (): void {
FILE: tabby-ssh/src/components/sshPortForwardingConfig.component.ts
class SSHPortForwardingConfigComponent (line 10) | class SSHPortForwardingConfigComponent {
method constructor (line 17) | constructor (
method reset (line 22) | reset () {
method addForward (line 33) | async addForward () {
method remove (line 42) | remove (fw: ForwardedPortConfig) {
FILE: tabby-ssh/src/components/sshPortForwardingModal.component.ts
class SSHPortForwardingModalComponent (line 11) | class SSHPortForwardingModalComponent {
method onForwardAdded (line 14) | onForwardAdded (fw: ForwardedPortConfig) {
method onForwardRemoved (line 20) | onForwardRemoved (fw: ForwardedPortConfig) {
FILE: tabby-ssh/src/components/sshProfileSettings.component.ts
class SSHProfileSettingsComponent (line 18) | class SSHProfileSettingsComponent implements ProfileSettingsComponent<SS...
method constructor (line 30) | constructor (
method ngOnInit (line 38) | async ngOnInit () {
method getJumpHostLabel (line 68) | getJumpHostLabel (p: PartialProfile<SSHProfile>) {
method setPassword (line 72) | async setPassword () {
method clearSavedPassword (line 85) | clearSavedPassword () {
method addPrivateKey (line 90) | async addPrivateKey () {
method removePrivateKey (line 100) | removePrivateKey (path: string) {
method save (line 104) | save () {
method onForwardAdded (line 130) | onForwardAdded (fw: ForwardedPortConfig) {
method onForwardRemoved (line 134) | onForwardRemoved (fw: ForwardedPortConfig) {
method getConnectionDropdownTitle (line 138) | getConnectionDropdownTitle () {
FILE: tabby-ssh/src/components/sshSettingsTab.component.ts
class SSHSettingsTabComponent (line 9) | class SSHSettingsTabComponent {
method constructor (line 15) | constructor (
FILE: tabby-ssh/src/components/sshTab.component.ts
class SSHTabComponent (line 25) | class SSHTabComponent extends ConnectableTerminalTabComponent<SSHProfile> {
method constructor (line 34) | constructor (
method ngOnInit (line 47) | ngOnInit (): void {
method setupOneSession (line 73) | async setupOneSession (injector: Injector, profile: SSHProfile, multip...
method onSessionDestroyed (line 149) | protected onSessionDestroyed (): void {
method initializeSessionMaybeMultiplex (line 158) | private async initializeSessionMaybeMultiplex (multiplex = true): Prom...
method initializeSession (line 174) | async initializeSession (): Promise<void> {
method showPortForwarding (line 189) | showPortForwarding (): void {
method canClose (line 194) | async canClose (): Promise<boolean> {
method openSFTP (line 215) | async openSFTP (): Promise<void> {
method onClick (line 223) | onClick (): void {
method isSessionExplicitlyTerminated (line 227) | protected isSessionExplicitlyTerminated (): boolean {
FILE: tabby-ssh/src/config.ts
class SSHConfigProvider (line 4) | class SSHConfigProvider extends ConfigProvider {
FILE: tabby-ssh/src/hotkeys.ts
class SSHHotkeyProvider (line 6) | class SSHHotkeyProvider extends HotkeyProvider {
method constructor (line 18) | constructor (private translate: TranslateService) { super() }
method provide (line 20) | async provide (): Promise<HotkeyDescription[]> {
FILE: tabby-ssh/src/index.ts
class SSHModule (line 65) | class SSHModule { }
FILE: tabby-ssh/src/profiles.ts
class SSHProfilesService (line 11) | class SSHProfilesService extends QuickConnectProfileProvider<SSHProfile> {
method constructor (line 51) | constructor (
method getBuiltinProfiles (line 63) | async getBuiltinProfiles (): Promise<PartialProfile<SSHProfile>[]> {
method getNewTabParameters (line 95) | async getNewTabParameters (profile: SSHProfile): Promise<NewTabParamet...
method getSuggestedName (line 102) | getSuggestedName (profile: SSHProfile): string {
method getDescription (line 106) | getDescription (profile: PartialProfile<SSHProfile>): string {
method deleteProfile (line 110) | deleteProfile (profile: SSHProfile): void {
method quickConnect (line 114) | quickConnect (query: string): PartialProfile<SSHProfile> {
method intoQuickConnectString (line 142) | intoQuickConnectString (profile: SSHProfile): string|null {
FILE: tabby-ssh/src/recoveryProvider.ts
class RecoveryProvider (line 8) | class RecoveryProvider extends TabRecoveryProvider<SSHTabComponent> {
method constructor (line 9) | constructor (private injector: Injector) { super() }
method applicableTo (line 11) | async applicableTo (recoveryToken: RecoveryToken): Promise<boolean> {
method recover (line 15) | async recover (recoveryToken: RecoveryToken): Promise<NewTabParameters...
FILE: tabby-ssh/src/services/passwordStorage.service.ts
constant VAULT_SECRET_TYPE_PASSWORD (line 6) | const VAULT_SECRET_TYPE_PASSWORD = 'ssh:password'
constant VAULT_SECRET_TYPE_PASSPHRASE (line 7) | const VAULT_SECRET_TYPE_PASSPHRASE = 'ssh:key-passphrase'
class PasswordStorageService (line 10) | class PasswordStorageService {
method constructor (line 11) | constructor (private vault: VaultService) { }
method savePassword (line 13) | async savePassword (profile: SSHProfile, password: string, username?: ...
method deletePassword (line 27) | async deletePassword (profile: SSHProfile, username?: string): Promise...
method loadPassword (line 41) | async loadPassword (profile: SSHProfile, username?: string): Promise<s...
method savePrivateKeyPassword (line 55) | async savePrivateKeyPassword (id: string, password: string): Promise<v...
method deletePrivateKeyPassword (line 65) | async deletePrivateKeyPassword (id: string): Promise<void> {
method loadPrivateKeyPassword (line 75) | async loadPrivateKeyPassword (id: string): Promise<string|null> {
method getKeytarKeyForConnection (line 85) | private getKeytarKeyForConnection (profile: SSHProfile): string {
method getKeytarKeyForPrivateKey (line 93) | private getKeytarKeyForPrivateKey (id: string): string {
method getVaultKeyForConnection (line 97) | private getVaultKeyForConnection (profile: SSHProfile, username?: stri...
method getVaultKeyForPrivateKey (line 105) | private getVaultKeyForPrivateKey (id: string) {
FILE: tabby-ssh/src/services/ssh.service.ts
class SSHService (line 11) | class SSHService {
method constructor (line 14) | private constructor (
method getWinSCPPath (line 26) | getWinSCPPath (): string|undefined {
method generateWinSCPXTunnelURI (line 30) | async generateWinSCPXTunnelURI (jumpHostProfile: SSHProfile|null): Pro...
method getWinSCPURI (line 61) | async getWinSCPURI (profile: SSHProfile, cwd?: string, username?: stri...
method convertPrivateKeyFileToPuTTYFormat (line 82) | async convertPrivateKeyFileToPuTTYFormat (profile: SSHProfile): Promis...
method launchWinSCP (line 115) | async launchWinSCP (session: SSHSession): Promise<void> {
FILE: tabby-ssh/src/services/sshKnownHosts.service.ts
type KnownHostSelector (line 4) | interface KnownHostSelector {
type KnownHost (line 10) | interface KnownHost extends KnownHostSelector {
class SSHKnownHostsService (line 15) | class SSHKnownHostsService {
method constructor (line 16) | constructor (
method getFor (line 20) | getFor (selector: KnownHostSelector): KnownHost|null {
method store (line 24) | async store (selector: KnownHostSelector, digest: string): Promise<voi...
FILE: tabby-ssh/src/services/sshMultiplexer.service.ts
class SSHMultiplexerService (line 7) | class SSHMultiplexerService {
method constructor (line 10) | constructor (
method addSession (line 14) | async addSession (session: SSHSession): Promise<void> {
method getSession (line 24) | async getSession (profile: PartialProfile<SSHProfile>): Promise<SSHSes...
method getMultiplexerKey (line 30) | private async getMultiplexerKey (profile: SSHProfile) {
FILE: tabby-ssh/src/session/forwards.ts
class ForwardedPort (line 6) | class ForwardedPort implements ForwardedPortConfig {
method startLocalListener (line 16) | async startLocalListener (callback: (accept: () => Socket, reject: () ...
method stopLocalListener (line 52) | stopLocalListener (): void {
method toString (line 56) | toString (): string {
FILE: tabby-ssh/src/session/sftp.ts
type SFTPFile (line 8) | interface SFTPFile {
class SFTPFileHandle (line 18) | class SFTPFileHandle {
method constructor (line 21) | constructor (
method read (line 25) | async read (): Promise<Uint8Array> {
method write (line 32) | async write (chunk: Uint8Array): Promise<void> {
method close (line 39) | async close (): Promise<void> {
class SFTPSession (line 45) | class SFTPSession {
method closed$ (line 46) | get closed$ (): Observable<void> { return this.closed }
method constructor (line 50) | constructor (private sftp: russh.SFTP, injector: Injector) {
method readdir (line 58) | async readdir (p: string): Promise<SFTPFile[]> {
method readlink (line 66) | readlink (p: string): Promise<string> {
method stat (line 71) | async stat (p: string): Promise<SFTPFile> {
method open (line 85) | async open (p: string, mode: number): Promise<SFTPFileHandle> {
method rmdir (line 91) | async rmdir (p: string): Promise<void> {
method mkdir (line 95) | async mkdir (p: string): Promise<void> {
method rename (line 99) | async rename (oldPath: string, newPath: string): Promise<void> {
method unlink (line 104) | async unlink (p: string): Promise<void> {
method chmod (line 108) | async chmod (p: string, mode: string|number): Promise<void> {
method upload (line 113) | async upload (path: string, transfer: FileUpload): Promise<void> {
method download (line 136) | async download (path: string, transfer: FileDownload): Promise<void> {
method _makeFile (line 155) | private _makeFile (p: string, entry: russh.SFTPDirectoryEntry): SFTPFi...
FILE: tabby-ssh/src/session/shell.ts
class SSHShellSession (line 11) | class SSHShellSession extends BaseSession {
method serviceMessage$ (line 13) | get serviceMessage$ (): Observable<string> { return this.serviceMessage }
method constructor (line 17) | constructor (
method start (line 30) | async start (): Promise<void> {
method emitServiceMessage (line 68) | emitServiceMessage (msg: string): void {
method resize (line 73) | resize (columns: number, rows: number): void {
method write (line 82) | write (data: Buffer): void {
method kill (line 88) | kill (_signal?: string): void {
method destroy (line 92) | async destroy (): Promise<void> {
method getChildProcesses (line 101) | async getChildProcesses (): Promise<any[]> {
method gracefullyKillProcess (line 105) | async gracefullyKillProcess (): Promise<void> {
method supportsWorkingDirectory (line 109) | supportsWorkingDirectory (): boolean {
method getWorkingDirectory (line 113) | async getWorkingDirectory (): Promise<string|null> {
FILE: tabby-ssh/src/session/ssh.ts
constant WINDOWS_OPENSSH_AGENT_PIPE (line 21) | const WINDOWS_OPENSSH_AGENT_PIPE = '\\\\.\\pipe\\openssh-ssh-agent'
type Prompt (line 23) | interface Prompt {
type AuthMethod (line 28) | type AuthMethod = {
function sshAuthTypeForMethod (line 53) | function sshAuthTypeForMethod (m: AuthMethod): string {
class KeyboardInteractivePrompt (line 65) | class KeyboardInteractivePrompt {
method constructor (line 75) | constructor (
method isAPasswordPrompt (line 83) | isAPasswordPrompt (index: number): boolean {
method respond (line 87) | respond (): void {
method reject (line 91) | reject (): void {
class SSHSession (line 96) | class SSHSession {
method serviceMessage$ (line 103) | get serviceMessage$ (): Observable<string> { return this.serviceMessage }
method keyboardInteractivePrompt$ (line 104) | get keyboardInteractivePrompt$ (): Observable<KeyboardInteractivePromp...
method willDestroy$ (line 105) | get willDestroy$ (): Observable<void> { return this.willDestroy }
method constructor (line 130) | constructor (
method addPublicKeyAuthMethod (line 153) | private addPublicKeyAuthMethod (name: string, contents: Buffer) {
method init (line 161) | async init (): Promise<void> {
method populateStoredPasswordsForResolvedUsername (line 264) | private async populateStoredPasswordsForResolvedUsername (): Promise<v...
method getAgentConnectionSpec (line 296) | private async getAgentConnectionSpec (): Promise<russh.AgentConnection...
method openSFTP (line 340) | async openSFTP (): Promise<SFTPSession> {
method start (line 350) | async start (): Promise<void> {
method verifyHostKey (line 555) | private async verifyHostKey (key: russh.SshPublicKey): Promise<boolean> {
method emitServiceMessage (line 579) | emitServiceMessage (msg: string): void {
method emitKeyboardInteractivePrompt (line 584) | emitKeyboardInteractivePrompt (prompt: KeyboardInteractivePrompt): void {
method handleAuth (line 595) | async handleAuth (): Promise<russh.AuthenticatedSSHClient|null> {
method _handleAuth (line 612) | private async _handleAuth (): Promise<russh.AuthenticatedSSHClient|nul...
method addPortForward (line 758) | async addPortForward (fw: ForwardedPort): Promise<void> {
method removePortForward (line 804) | async removePortForward (fw: ForwardedPort): Promise<void> {
method destroy (line 819) | async destroy (): Promise<void> {
method openShellChannel (line 827) | async openShellChannel (options: { x11: boolean }): Promise<russh.Chan...
method setupSocketChannelEvents (line 853) | private setupSocketChannelEvents (channel: russh.Channel, socket: Sock...
method loadPrivateKey (line 904) | async loadPrivateKey (name: string, privateKeyContents: Buffer): Promi...
method loadPrivateKeyWithPassphraseMaybe (line 909) | async loadPrivateKeyWithPassphraseMaybe (privateKey: string): Promise<...
method ref (line 954) | ref (): void {
method unref (line 958) | unref (): void {
FILE: tabby-ssh/src/session/x11.ts
class X11Socket (line 4) | class X11Socket {
method resolveDisplaySpec (line 8) | static resolveDisplaySpec (spec?: string|null): SocketConnectOpts {
method connect (line 40) | connect (spec: string): Promise<Socket> {
method destroy (line 54) | destroy (): void {
FILE: tabby-ssh/src/settings.ts
class SSHSettingsTabProvider (line 8) | class SSHSettingsTabProvider extends SettingsTabProvider {
method getComponentType (line 13) | getComponentType (): any {
FILE: tabby-ssh/src/sftpContextMenu.ts
class CommonSFTPContextMenu (line 12) | class CommonSFTPContextMenu extends SFTPContextMenuItemProvider {
method constructor (line 15) | constructor (
method getItems (line 24) | async getItems (item: SFTPFile, panel: SFTPPanelComponent): Promise<Me...
method deleteItem (line 71) | async deleteItem (item: SFTPFile, session: SFTPSession): Promise<void> {
FILE: tabby-ssh/src/tabContextMenu.ts
class SFTPContextMenu (line 9) | class SFTPContextMenu extends TabContextMenuItemProvider {
method constructor (line 12) | constructor (
method getItems (line 20) | async getItems (tab: BaseTabComponent): Promise<MenuItemOptions[]> {
FILE: tabby-telnet/src/components/telnetProfileSettings.component.ts
class TelnetProfileSettingsComponent (line 12) | class TelnetProfileSettingsComponent implements ProfileSettingsComponent...
FILE: tabby-telnet/src/components/telnetTab.component.ts
class TelnetTabComponent (line 16) | class TelnetTabComponent extends ConnectableTerminalTabComponent<TelnetP...
method constructor (line 21) | constructor (
method ngOnInit (line 28) | ngOnInit (): void {
method onSessionDestroyed (line 38) | protected onSessionDestroyed (): void {
method initializeSession (line 47) | async initializeSession (): Promise<void> {
method canClose (line 74) | async canClose (): Promise<boolean> {
method isSessionExplicitlyTerminated (line 92) | protected isSessionExplicitlyTerminated (): boolean {
FILE: tabby-telnet/src/config.ts
class TelnetConfigProvider (line 4) | class TelnetConfigProvider extends ConfigProvider {
FILE: tabby-telnet/src/hotkeys.ts
class TelnetHotkeyProvider (line 6) | class TelnetHotkeyProvider extends HotkeyProvider {
method constructor (line 14) | constructor (private translate: TranslateService) { super() }
method provide (line 16) | async provide (): Promise<HotkeyDescription[]> {
FILE: tabby-telnet/src/index.ts
class TelnetModule (line 41) | class TelnetModule { }
FILE: tabby-telnet/src/profiles.ts
class TelnetProfilesService (line 8) | class TelnetProfilesService extends QuickConnectProfileProvider<TelnetPr...
method constructor (line 27) | constructor (private translate: TranslateService) { super() }
method getBuiltinProfiles (line 29) | async getBuiltinProfiles (): Promise<PartialProfile<TelnetProfile>[]> {
method getNewTabParameters (line 62) | async getNewTabParameters (profile: TelnetProfile): Promise<NewTabPara...
method getSuggestedName (line 69) | getSuggestedName (profile: TelnetProfile): string|null {
method getDescription (line 73) | getDescription (profile: TelnetProfile): string {
method quickConnect (line 77) | quickConnect (query: string): PartialProfile<TelnetProfile> {
method intoQuickConnectString (line 100) | intoQuickConnectString (profile: TelnetProfile): string | null {
FILE: tabby-telnet/src/recoveryProvider.ts
class RecoveryProvider (line 8) | class RecoveryProvider extends TabRecoveryProvider<TelnetTabComponent> {
method constructor (line 9) | constructor (private injector: Injector) { super() }
method applicableTo (line 11) | async applicableTo (recoveryToken: RecoveryToken): Promise<boolean> {
method recover (line 15) | async recover (recoveryToken: RecoveryToken): Promise<NewTabParameters...
FILE: tabby-telnet/src/session.ts
type TelnetProfile (line 11) | interface TelnetProfile extends ConnectableTerminalProfile {
type TelnetProfileOptions (line 15) | interface TelnetProfileOptions extends StreamProcessingOptions, LoginScr...
type TelnetCommands (line 21) | enum TelnetCommands {
type TelnetOptions (line 33) | enum TelnetOptions {
class UnescapeFFMiddleware (line 46) | class UnescapeFFMiddleware extends SessionMiddleware {
method feedFromSession (line 47) | feedFromSession (data: Buffer): void {
class TelnetSession (line 61) | class TelnetSession extends BaseSession {
method serviceMessage$ (line 62) | get serviceMessage$ (): Observable<string> { return this.serviceMessage }
method constructor (line 73) | constructor (
method start (line 84) | async start (): Promise<void> {
method requestOption (line 109) | requestOption (cmd: TelnetCommands, option: TelnetOptions): void {
method emitServiceMessage (line 114) | emitServiceMessage (msg: string): void {
method onData (line 119) | onData (data: Buffer): void {
method emitTelnet (line 133) | emitTelnet (command: TelnetCommands, option: TelnetOptions): void {
method emitTelnetSuboption (line 138) | emitTelnetSuboption (option: TelnetOptions, value: Buffer): void {
method processTelnetProtocol (line 150) | processTelnetProtocol (data: Buffer): Buffer {
method resize (line 245) | resize (w: number, h: number): void {
method emitSize (line 255) | private emitSize () {
method write (line 266) | write (data: Buffer): void {
method kill (line 270) | kill (_signal?: string): void {
method destroy (line 274) | async destroy (): Promise<void> {
method getChildProcesses (line 281) | async getChildProcesses (): Promise<any[]> {
method gracefullyKillProcess (line 285) | async gracefullyKillProcess (): Promise<void> {
method supportsWorkingDirectory (line 289) | supportsWorkingDirectory (): boolean {
method getWorkingDirectory (line 293) | async getWorkingDirectory (): Promise<string|null> {
FILE: tabby-terminal/src/api/baseTerminalTab.component.ts
constant INACTIVE_TAB_UNLOAD_DELAY (line 19) | const INACTIVE_TAB_UNLOAD_DELAY = 1000 * 30
constant OSC_FOCUS_IN (line 20) | const OSC_FOCUS_IN = Buffer.from('\x1b[I')
constant OSC_FOCUS_OUT (line 21) | const OSC_FOCUS_OUT = Buffer.from('\x1b[O')
class BaseTerminalTabComponent (line 27) | class BaseTerminalTabComponent<P extends BaseTerminalProfile> extends Ba...
method input$ (line 165) | get input$ (): Observable<Buffer> {
method output$ (line 172) | get output$ (): Observable<string> { return this.output }
method binaryOutput$ (line 173) | get binaryOutput$ (): Observable<Buffer> { return this.binaryOutput }
method resize$ (line 175) | get resize$ (): Observable<ResizeEvent> {
method alternateScreenActive$ (line 182) | get alternateScreenActive$ (): Observable<boolean> {
method frontendReady$ (line 189) | get frontendReady$ (): Observable<void> { return this.frontendReady }
method sessionChanged$ (line 191) | get sessionChanged$ (): Observable<BaseSession|null> { return this.ses...
method constructor (line 193) | constructor (protected injector: Injector) {
method ngOnInit (line 340) | ngOnInit (): void {
method onFrontendReady (line 461) | protected onFrontendReady (): void {
method buildContextMenu (line 478) | async buildContextMenu (): Promise<MenuItemOptions[]> {
method sendInput (line 491) | sendInput (data: string|Buffer): void {
method write (line 504) | async write (data: string): Promise<void> {
method writeRaw (line 510) | protected async writeRaw (data: string): Promise<void> {
method paste (line 530) | async paste (): Promise<void> {
method configure (line 581) | configure (): void {
method zoomIn (line 587) | zoomIn (): void {
method zoomOut (line 592) | zoomOut (): void {
method resetZoom (line 597) | resetZoom (): void {
method copyCurrentPath (line 602) | async copyCurrentPath (): Promise<void> {
method ngOnDestroy (line 616) | ngOnDestroy (): void {
method destroy (line 621) | async destroy (): Promise<void> {
method detachTermContainerHandlers (line 644) | protected detachTermContainerHandlers (): void {
method handleRightMouseDown (line 650) | protected async handleRightMouseDown (event: MouseEvent): Promise<void> {
method handleRightMouseUp (line 659) | protected async handleRightMouseUp (event: MouseEvent): Promise<void> {
method attachTermContainerHandlers (line 682) | protected attachTermContainerHandlers (): void {
method setSession (line 763) | setSession (session: BaseSession|null, destroyOnSessionClose = false):...
method showToolbar (line 778) | showToolbar (): void {
method hideToolbar (line 783) | hideToolbar (): void {
method togglePinToolbar (line 787) | togglePinToolbar (): void {
method hasTitleInset (line 792) | get hasTitleInset (): boolean {
method attachSessionHandler (line 796) | protected attachSessionHandler <T> (observable: Observable<T>, handler...
method attachSessionHandlers (line 800) | protected attachSessionHandlers (destroyOnSessionClose = false): void {
method onSessionClosed (line 831) | protected onSessionClosed (destroyOnSessionClose = false): void {
method shouldTabBeDestroyedOnSessionClose (line 840) | protected shouldTabBeDestroyedOnSessionClose (): boolean {
method onSessionDestroyed (line 848) | protected onSessionDestroyed (): void {
method detachSessionHandlers (line 852) | protected detachSessionHandlers (): void {
method startSpinner (line 856) | protected startSpinner (text?: string): void {
method stopSpinner (line 870) | protected stopSpinner (): void {
method withSpinnerPaused (line 878) | protected async withSpinnerPaused (work: () => any): Promise<void> {
method forEachFocusedTerminalPane (line 895) | protected forEachFocusedTerminalPane (cb: (tab: BaseTerminalTabCompone...
method isSessionExplicitlyTerminated (line 910) | protected isSessionExplicitlyTerminated (): boolean {
FILE: tabby-terminal/src/api/connectableTerminalTab.component.ts
method constructor (line 21) | constructor (protected injector: Injector) {
method ngOnInit (line 42) | ngOnInit (): void {
method onFrontendReady (line 48) | protected onFrontendReady (): void {
method initializeSession (line 59) | async initializeSession (): Promise<void> {
method onSessionDestroyed (line 67) | protected onSessionDestroyed (): void {
method offerReconnection (line 83) | offerReconnection (): void {
method shouldTabBeDestroyedOnSessionClose (line 98) | protected shouldTabBeDestroyedOnSessionClose (): boolean {
method getRecoveryToken (line 105) | async getRecoveryToken (options?: GetRecoveryTokenOptions): Promise<Reco...
method disconnect (line 113) | async disconnect (): Promise<void> {
method reconnect (line 118) | async reconnect (): Promise<void> {
method clearServiceMessagesOnConnect (line 125) | private clearServiceMessagesOnConnect (): void {
FILE: tabby-terminal/src/api/decorator.ts
method attach (line 13) | attach (terminal: BaseTerminalTabComponent<any>): void { } // eslint-dis...
method detach (line 19) | detach (terminal: BaseTerminalTabComponent<any>): void {
method subscribeUntilDetached (line 29) | protected subscribeUntilDetached (terminal: BaseTerminalTabComponent<any...
FILE: tabby-terminal/src/api/interfaces.ts
type ResizeEvent (line 3) | interface ResizeEvent {
type TerminalColorScheme (line 8) | interface TerminalColorScheme {
type BaseTerminalProfile (line 19) | interface BaseTerminalProfile extends Profile {
type ConnectableTerminalProfile (line 23) | interface ConnectableTerminalProfile extends BaseTerminalProfile, Connec...
FILE: tabby-terminal/src/api/middleware.ts
class SessionMiddleware (line 4) | class SessionMiddleware {
method outputToSession$ (line 5) | get outputToSession$ (): Observable<Buffer> { return this.outputToSess...
method outputToTerminal$ (line 6) | get outputToTerminal$ (): Observable<Buffer> { return this.outputToTer...
method feedFromSession (line 11) | feedFromSession (data: Buffer): void {
method feedFromTerminal (line 15) | feedFromTerminal (data: Buffer): void {
method close (line 19) | close (): void {
class SessionMiddlewareStack (line 25) | class SessionMiddlewareStack extends SessionMiddleware {
method constructor (line 29) | constructor () {
method push (line 34) | push (middleware: SessionMiddleware): void {
method unshift (line 39) | unshift (middleware: SessionMiddleware): void {
method remove (line 44) | remove (middleware: SessionMiddleware): void {
method replace (line 49) | replace (middleware: SessionMiddleware, newMiddleware: SessionMiddlewa...
method feedFromSession (line 60) | feedFromSession (data: Buffer): void {
method feedFromTerminal (line 64) | feedFromTerminal (data: Buffer): void {
method close (line 68) | close (): void {
method relink (line 76) | private relink () {
FILE: tabby-terminal/src/cli.ts
class TerminalCLIHandler (line 7) | class TerminalCLIHandler extends CLIHandler {
method constructor (line 11) | constructor (
method handle (line 18) | async handle (event: CLIEvent): Promise<boolean> {
method handlePaste (line 33) | private handlePaste (text: string) {
FILE: tabby-terminal/src/colorSchemes.ts
class DefaultColorSchemes (line 6) | class DefaultColorSchemes extends TerminalColorSchemeProvider {
method getSchemes (line 61) | async getSchemes (): Promise<TerminalColorScheme[]> {
FILE: tabby-terminal/src/components/appearanceSettingsTab.component.ts
class AppearanceSettingsTabComponent (line 13) | class AppearanceSettingsTabComponent {
method constructor (line 16) | constructor (
method ngOnInit (line 22) | async ngOnInit () {
method getPreviewFontFamily (line 35) | getPreviewFontFamily () {
method saveConfiguration (line 40) | saveConfiguration (requireRestart?: boolean) {
method fixFontSize (line 47) | fixFontSize () {
FILE: tabby-terminal/src/components/colorPicker.component.ts
class ColorPickerComponent (line 9) | class ColorPickerComponent {
FILE: tabby-terminal/src/components/colorSchemePreview.component.ts
class ColorSchemePreviewComponent (line 12) | class ColorSchemePreviewComponent extends BaseComponent {
method constructor (line 16) | constructor (
method getPreviewFontFamily (line 26) | getPreviewFontFamily (): string {
FILE: tabby-terminal/src/components/colorSchemeSelector.component.ts
class ColorSchemeSelectorComponent (line 24) | class ColorSchemeSelectorComponent {
method constructor (line 33) | constructor (
method ngOnInit (line 39) | async ngOnInit () {
method selectScheme (line 48) | selectScheme (scheme: TerminalColorScheme|undefined) {
FILE: tabby-terminal/src/components/colorSchemeSettingsForMode.component.ts
class ColorSchemeSettingsForModeComponent (line 19) | class ColorSchemeSettingsForModeComponent {
method constructor (line 34) | constructor (
method ngOnInit (line 42) | async ngOnInit () {
method ngOnChanges (line 51) | ngOnChanges () {
method selectScheme (line 55) | selectScheme (scheme: TerminalColorScheme) {
method update (line 62) | update () {
method editScheme (line 69) | editScheme () {
method saveScheme (line 73) | saveScheme () {
method cancelEditing (line 82) | cancelEditing () {
method deleteScheme (line 86) | async deleteScheme (scheme: TerminalColorScheme) {
method getCurrentSchemeName (line 106) | getCurrentSchemeName () {
method findMatchingScheme (line 110) | findMatchingScheme (scheme: TerminalColorScheme, schemes: TerminalColo...
method colorsTrackBy (line 114) | colorsTrackBy (index) {
FILE: tabby-terminal/src/components/colorSchemeSettingsTab.component.ts
class ColorSchemeSettingsTabComponent (line 8) | class ColorSchemeSettingsTabComponent {
method constructor (line 11) | constructor (
FILE: tabby-terminal/src/components/inputProcessingSettings.component.ts
class InputProcessingSettingsComponent (line 11) | class InputProcessingSettingsComponent {
method getBackspaceModeName (line 33) | getBackspaceModeName (key) {
method setBackspaceMode (line 37) | setBackspaceMode (mode) {
FILE: tabby-terminal/src/components/loginScriptsSettings.component.ts
class LoginScriptsSettingsComponent (line 12) | class LoginScriptsSettingsComponent {
method constructor (line 16) | constructor (
method ngOnInit (line 21) | ngOnInit () {
method deleteScript (line 25) | async deleteScript (script: LoginScript) {
method addScript (line 43) | addScript () {
method save (line 47) | save () {
FILE: tabby-terminal/src/components/searchPanel.component.ts
class SearchPanelComponent (line 11) | class SearchPanelComponent {
method constructor (line 33) | constructor (
method onQueryChange (line 43) | onQueryChange (): void {
method findNext (line 48) | findNext (incremental = false): void {
method findPrevious (line 58) | findPrevious (incremental = false): void {
method saveSearchOptions (line 68) | saveSearchOptions (): void {
method ngOnDestroy (line 76) | ngOnDestroy (): void {
FILE: tabby-terminal/src/components/streamProcessingSettings.component.ts
class StreamProcessingSettingsComponent (line 11) | class StreamProcessingSettingsComponent {
method getInputModeName (line 60) | getInputModeName (key) {
method getOutputModeName (line 64) | getOutputModeName (key) {
method setInputMode (line 68) | setInputMode (mode) {
method setOutputMode (line 72) | setOutputMode (mode) {
FILE: tabby-terminal/src/components/terminalSettingsTab.component.ts
class TerminalSettingsTabComponent (line 8) | class TerminalSettingsTabComponent {
method constructor (line 15) | constructor (
method openWSLVolumeMixer (line 21) | openWSLVolumeMixer (): void {
FILE: tabby-terminal/src/components/terminalToolbar.component.ts
class TerminalToolbarComponent (line 12) | class TerminalToolbarComponent {
method constructor (line 16) | constructor (
method onTabDragStart (line 20) | onTabDragStart (): void {
method onTabDragEnd (line 24) | onTabDragEnd (): void {
method shouldShowDragHandle (line 31) | get shouldShowDragHandle (): boolean {
method onMouseEnter (line 35) | onMouseEnter () {
method onMouseLeave (line 39) | onMouseLeave () {
FILE: tabby-terminal/src/config.ts
class TerminalConfigProvider (line 5) | class TerminalConfigProvider extends ConfigProvider {
FILE: tabby-terminal/src/features/debug.ts
class DebugDecorator (line 8) | class DebugDecorator extends TerminalDecorator {
method constructor (line 9) | constructor (
method attach (line 15) | attach (terminal: BaseTerminalTabComponent<any>): void {
method loadFile (line 67) | private async loadFile (): Promise<string|null> {
method saveFile (line 77) | private async saveFile (content: string, name: string) {
method doSaveState (line 86) | private doSaveState (terminal: BaseTerminalTabComponent<any>) {
method doCopyState (line 90) | private async doCopyState (terminal: BaseTerminalTabComponent<any>) {
method doLoadState (line 95) | private async doLoadState (terminal: BaseTerminalTabComponent<any>) {
method doPasteState (line 102) | private async doPasteState (terminal: BaseTerminalTabComponent<any>) {
method doSaveOutput (line 112) | private doSaveOutput (buffer: string) {
method doCopyOutput (line 116) | private async doCopyOutput (buffer: string) {
method doLoadOutput (line 121) | private async doLoadOutput (terminal: BaseTerminalTabComponent<any>) {
method doPasteOutput (line 128) | private async doPasteOutput (terminal: BaseTerminalTabComponent<any>) {
FILE: tabby-terminal/src/features/zmodem.ts
constant SPACER (line 10) | const SPACER = ' '
class ZModemMiddleware (line 12) | class ZModemMiddleware extends SessionMiddleware {
method constructor (line 19) | constructor (
method feedFromSession (line 51) | feedFromSession (data: Buffer): void {
method process (line 75) | private async process (detection): Promise<void> {
method receiveFile (line 116) | private async receiveFile (xfer, zsession) {
method sendFile (line 168) | private async sendFile (zsession, transfer: FileUpload, filesRemaining...
method showMessage (line 221) | private showMessage (msg: string, overwrite = false) {
class ZModemDecorator (line 231) | class ZModemDecorator extends TerminalDecorator {
method constructor (line 232) | constructor (
method attach (line 240) | attach (terminal: BaseTerminalTabComponent<any>): void {
method attachToSession (line 249) | private attachToSession (terminal: BaseTerminalTabComponent<any>) {
FILE: tabby-terminal/src/frontends/frontend.ts
type SearchOptions (line 5) | interface SearchOptions {
type SearchState (line 12) | interface SearchState {
method ready$ (line 34) | get ready$ (): Observable<void> { return this.ready }
method title$ (line 35) | get title$ (): Observable<string> { return this.title }
method alternateScreenActive$ (line 36) | get alternateScreenActive$ (): Observable<boolean> { return this.alterna...
method mouseEvent$ (line 37) | get mouseEvent$ (): Observable<MouseEvent> { return this.mouseEvent }
method bell$ (line 38) | get bell$ (): Observable<void> { return this.bell }
method contentUpdated$ (line 39) | get contentUpdated$ (): Observable<void> { return this.contentUpdated }
method input$ (line 40) | get input$ (): Observable<Buffer> { return this.input }
method resize$ (line 41) | get resize$ (): Observable<ResizeEvent> { return this.resize }
method dragOver$ (line 42) | get dragOver$ (): Observable<DragEvent> { return this.dragOver }
method drop$ (line 43) | get drop$ (): Observable<DragEvent> { return this.drop }
method destroyed$ (line 44) | get destroyed$ (): Observable<void> { return this.destroyed }
method constructor (line 46) | constructor (protected injector: Injector) { }
method destroy (line 48) | destroy (): void {
method detach (line 68) | detach (host: HTMLElement): void { } // eslint-disable-line
FILE: tabby-terminal/src/frontends/xtermFrontend.ts
constant COLOR_NAMES (line 20) | const COLOR_NAMES = [
class FlowControl (line 25) | class FlowControl {
method constructor (line 34) | constructor (private xterm: Terminal) { }
method write (line 36) | async write (data: string) {
class XTermFrontend (line 62) | class XTermFrontend extends Frontend {
method constructor (line 94) | constructor (injector: Injector) {
method attach (line 245) | async attach (host: HTMLElement, profile: BaseTerminalProfile): Promis...
method detach (line 309) | detach (_host: HTMLElement): void {
method destroy (line 315) | destroy (): void {
method getSelection (line 322) | getSelection (): string {
method copySelection (line 326) | copySelection (): void {
method selectAll (line 343) | selectAll (): void {
method clearSelection (line 347) | clearSelection (): void {
method focus (line 351) | focus (): void {
method write (line 355) | async write (data: string): Promise<void> {
method clear (line 359) | clear (): void {
method visualBell (line 363) | visualBell (): void {
method scrollToTop (line 372) | scrollToTop (): void {
method scrollPages (line 376) | scrollPages (pages: number): void {
method scrollLines (line 380) | scrollLines (amount: number): void {
method scrollToBottom (line 384) | scrollToBottom (): void {
method configureColors (line 388) | private configureColors (scheme: TerminalColorScheme | null): void {
method configure (line 417) | configure (profile: BaseTerminalProfile): void {
method setZoom (line 465) | setZoom (zoom: number): void {
method getSearchOptions (line 471) | private getSearchOptions (searchOptions?: SearchOptions): ISearchOptio...
method wrapSearchResult (line 483) | private wrapSearchResult (result: boolean): SearchState {
method findNext (line 490) | findNext (term: string, searchOptions?: SearchOptions): SearchState {
method findPrevious (line 499) | findPrevious (term: string, searchOptions?: SearchOptions): SearchState {
method cancelSearch (line 508) | cancelSearch (): void {
method saveState (line 513) | saveState (): any {
method restoreState (line 521) | restoreState (state: string): void {
method supportsBracketedPaste (line 525) | supportsBracketedPaste (): boolean {
method isAlternateScreenActive (line 529) | isAlternateScreenActive (): boolean {
method setFontSize (line 533) | private setFontSize () {
method getSelectionAsHTML (line 541) | private getSelectionAsHTML (): string {
class XTermWebGLFrontend (line 547) | class XTermWebGLFrontend extends XTermFrontend {
FILE: tabby-terminal/src/helpers.ts
function getTerminalBackgroundColor (line 4) | function getTerminalBackgroundColor (
FILE: tabby-terminal/src/hotkeys.ts
class TerminalHotkeyProvider (line 6) | class TerminalHotkeyProvider extends HotkeyProvider {
method constructor (line 118) | constructor (private translate: TranslateService) { super() }
method provide (line 120) | async provide (): Promise<HotkeyDescription[]> {
FILE: tabby-terminal/src/index.ts
class TerminalModule (line 92) | class TerminalModule { } // eslint-disable-line @typescript-eslint/no-ex...
FILE: tabby-terminal/src/middleware/inputProcessing.ts
type InputProcessingOptions (line 3) | interface InputProcessingOptions {
class InputProcessor (line 7) | class InputProcessor extends SessionMiddleware {
method constructor (line 8) | constructor (
method feedFromTerminal (line 14) | feedFromTerminal (data: Buffer): void {
FILE: tabby-terminal/src/middleware/loginScriptProcessing.ts
type LoginScript (line 5) | interface LoginScript {
type LoginScriptsOptions (line 12) | interface LoginScriptsOptions {
class LoginScriptProcessor (line 16) | class LoginScriptProcessor extends SessionMiddleware {
method constructor (line 30) | constructor (
method feedFromSession (line 44) | feedFromSession (data: Buffer): void {
method executeUnconditionalScripts (line 76) | executeUnconditionalScripts (): void {
method unescape (line 88) | unescape (line: string): string {
FILE: tabby-terminal/src/middleware/oscProcessing.ts
class OSCProcessor (line 8) | class OSCProcessor extends SessionMiddleware {
method cwdReported$ (line 9) | get cwdReported$ (): Observable<string> { return this.cwdReported }
method feedFromSession (line 13) | feedFromSession (data: Buffer): void {
method close (line 53) | close (): void {
FILE: tabby-terminal/src/middleware/streamProcessing.ts
type InputMode (line 10) | type InputMode = null | 'local-echo' | 'readline' | 'readline-hex'
type OutputMode (line 11) | type OutputMode = null | 'hex'
type NewlineMode (line 12) | type NewlineMode = null | 'cr' | 'lf' | 'crlf' | 'implicit_cr' | 'implic...
type StreamProcessingOptions (line 14) | interface StreamProcessingOptions {
class TerminalStreamProcessor (line 21) | class TerminalStreamProcessor extends SessionMiddleware {
method constructor (line 29) | constructor (private options: StreamProcessingOptions) {
method start (line 43) | start (): void {
method feedFromSession (line 57) | feedFromSession (data: Buffer): void {
method feedFromTerminal (line 84) | feedFromTerminal (data: Buffer): void {
method resize (line 95) | resize (): void {
method close (line 101) | close (): void {
method onTerminalInput (line 106) | private onTerminalInput (data: Buffer) {
method onOutputSettled (line 121) | private onOutputSettled () {
method resetInputPrompt (line 127) | private resetInputPrompt () {
method replaceNewlines (line 133) | private replaceNewlines (data: Buffer, mode?: NewlineMode): Buffer {
FILE: tabby-terminal/src/middleware/utf8Splitter.ts
class UTF8SplitterMiddleware (line 8) | class UTF8SplitterMiddleware extends SessionMiddleware {
method feedFromSession (line 11) | feedFromSession (data: Buffer): void {
method close (line 15) | close (): void {
FILE: tabby-terminal/src/services/multifocus.service.ts
class MultifocusService (line 7) | class MultifocusService {
method constructor (line 12) | constructor (
method start (line 35) | start (currentTab: BaseTerminalTabComponent<any>, tabs: BaseTerminalTa...
method cancel (line 56) | cancel (): void {
method focusAllTabs (line 72) | focusAllTabs (): void {
method focusAllPanes (line 98) | focusAllPanes (): void {
FILE: tabby-terminal/src/session.ts
method output$ (line 24) | get output$ (): Observable<string> { return this.output }
method binaryOutput$ (line 25) | get binaryOutput$ (): Observable<Buffer> { return this.binaryOutput }
method closed$ (line 26) | get closed$ (): Observable<void> { return this.closed }
method destroyed$ (line 27) | get destroyed$ (): Observable<void> { return this.destroyed }
method constructor (line 29) | constructor (protected logger: Logger) {
method feedFromTerminal (line 47) | feedFromTerminal (data: Buffer): void {
method emitOutput (line 51) | protected emitOutput (data: Buffer): void {
method releaseInitialDataBuffer (line 55) | releaseInitialDataBuffer (): void {
method setLoginScriptsOptions (line 62) | setLoginScriptsOptions (options: LoginScriptsOptions): void {
method destroy (line 72) | async destroy (): Promise<void> {
FILE: tabby-terminal/src/settings.ts
class AppearanceSettingsTabProvider (line 11) | class AppearanceSettingsTabProvider extends SettingsTabProvider {
method constructor (line 17) | constructor (private translate: TranslateService) { super() }
method getComponentType (line 19) | getComponentType (): any {
class ColorSchemeSettingsTabProvider (line 26) | class ColorSchemeSettingsTabProvider extends SettingsTabProvider {
method constructor (line 31) | constructor (private translate: TranslateService) { super() }
method getComponentType (line 33) | getComponentType (): any {
class TerminalSettingsTabProvider (line 40) | class TerminalSettingsTabProvider extends SettingsTabProvider {
method constructor (line 46) | constructor (private translate: TranslateService) { super() }
method getComponentType (line 48) | getComponentType (): any {
FILE: tabby-terminal/src/tabContextMenu.ts
class CopyPasteContextMenu (line 13) | class CopyPasteContextMenu extends TabContextMenuItemProvider {
method constructor (line 16) | constructor (
method getItems (line 23) | async getItems (tab: BaseTabComponent, tabHeader?: boolean): Promise<M...
class MiscContextMenu (line 50) | class MiscContextMenu extends TabContextMenuItemProvider {
method constructor (line 53) | constructor (
method getItems (line 58) | async getItems (tab: BaseTabComponent): Promise<MenuItemOptions[]> {
class ReconnectContextMenu (line 94) | class ReconnectContextMenu extends TabContextMenuItemProvider {
method constructor (line 97) | constructor (
method getItems (line 102) | async getItems (tab: BaseTabComponent): Promise<MenuItemOptions[]> {
class LegacyContextMenu (line 132) | class LegacyContextMenu extends TabContextMenuItemProvider {
method constructor (line 135) | constructor (
method getItems (line 141) | async getItems (tab: BaseTabComponent): Promise<MenuItemOptions[]> {
class SaveAsProfileContextMenu (line 159) | class SaveAsProfileContextMenu extends TabContextMenuItemProvider {
method constructor (line 160) | constructor (
method getItems (line 169) | async getItems (tab: BaseTabComponent): Promise<MenuItemOptions[]> {
FILE: tabby-web-demo/data/v86_all.js
function b (line 6) | function b(){return this.replace(/[\s\xa0]+$/,"")}
function ScreenAdapter (line 12) | function ScreenAdapter(a,b){function c(w){w=w.toString(16);return"#"+Arr...
function Virtio9p (line 24) | function Virtio9p(a,b,c){this.fs=a;this.bus=c;this.configspace_tagname=[...
function IO (line 52) | function IO(a){this.ports=[];this.cpu=a;for(var b=0;65536>b;b++)this.por...
function k (line 58) | function k(){return c.call(this)|d.call(this)<<8}
function g (line 58) | function g(){return e.call(this)|f.call(this)<<8}
function l (line 58) | function l(){return c.call(this)|d.call(this)<<8|e.call(this)<<16|f.call...
function k (line 59) | function k(m){c.call(this,m&255);d.call(this,m>>8&255)}
function g (line 59) | function g(m){e.call(this,m&255);f.call(this,m>>8&255)}
function l (line 59) | function l(m){c.call(this,m&255);d.call(this,m>>8&255);e.call(this,m>>16...
function v86 (line 68) | function v86(a,b){this.stopped=this.running=!1;this.cpu=new CPU(a,b);thi...
function h (line 73) | function h(a,b){a=a?a.toString(16):"";return"0x"+v86util.pad0(a.toUpperC...
function SyncBuffer (line 74) | function SyncBuffer(a){dbg_assert(a instanceof ArrayBuffer);this.buffer=...
function ByteQueue (line 78) | function ByteQueue(a){var b=new Uint8Array(a),c,d;dbg_assert(0===(a&a-1)...
function FloatQueue (line 78) | function FloatQueue(a){this.size=a;this.data=new Float32Array(a);this.le...
function CircularQueue (line 80) | function CircularQueue(a){this.data=[];this.index=0;this.size=a}
function dump_file (line 81) | function dump_file(a,b){a instanceof Array||(a=[a]);a=new Blob(a);downlo...
function download (line 82) | function download(a,b){var c=document.createElement("a");c.download=b;c....
function hex_dump (line 83) | function hex_dump(a,b){var c=[];b=b||a.byteLength;for(var d,e,f=0;f<b>>4...
function IDEDevice (line 84) | function IDEDevice(a,b,c,d,e,f){this.master=new IDEInterface(this,a,b,d,...
function IDEInterface (line 101) | function IDEInterface(a,b,c,d,e,f,k){this.device=a;this.bus=k;this.nr=e;...
function PCI (line 157) | function PCI(a){this.pci_addr=new Uint8Array(4);this.pci_value=new Uint8...
function FloppyController (line 174) | function FloppyController(a,b,c){this.io=a.io;this.cpu=a;this.dma=a.devi...
function DMA (line 191) | function DMA(a){this.cpu=a;this.channel_page=new Uint8Array(8);this.chan...
function PIT (line 211) | function PIT(a,b){this.cpu=a;this.bus=b;this.counter_start_time=new Floa...
function VGAScreen (line 223) | function VGAScreen(a,b,c){this.bus=b;this.vga_memory_size=c;this.cursor_...
function PS2 (line 305) | function PS2(a,b){this.cpu=a;this.bus=b;this.use_mouse=this.enable_mouse...
function PIC (line 328) | function PIC(a,b){this.irq_value=this.irr=this.isr=this.irq_map=this.irq...
function RTC (line 343) | function RTC(a){this.cpu=a;this.cmos_index=0;this.cmos_data=new Uint8Arr...
function UART (line 353) | function UART(a,b,c){this.bus=c;this.cpu=a;this.ints=1<<UART_IIR_THRI;th...
function HPET (line 364) | function HPET(a){function b(){return e?(Date.now()-f)*HPET_FREQ_MS+k|0:k...
function ACPI (line 368) | function ACPI(a){this.cpu=a;var b=a.io;a.devices.pci.register_device({pc...
function APIC (line 375) | function APIC(a){this.cpu=a;this.timer_divider=this.apic_id=0;this.timer...
function IOAPIC (line 396) | function IOAPIC(a){this.cpu=a;this.ioredtbl_config=new Int32Array(IOAPIC...
function StateLoadError (line 406) | function StateLoadError(a){this.message=a}
function save_object (line 407) | function save_object(a,b){if("object"!==typeof a||null===a)return dbg_as...
function restore_buffers (line 408) | function restore_buffers(a,b){if("object"!==typeof a||null===a)return db...
function b (line 411) | function b(v,q){const p=v.length;if(p<STATE_INFO_BLOCK_START)throw new S...
function c (line 412) | function c(v){v=(new TextDecoder).decode(v);return JSON.parse(v)}
function Ne2k (line 417) | function Ne2k(a,b,c){this.cpu=a;this.pci=a.devices.pci;this.preserve_mac...
function SB16 (line 445) | function SB16(a,b){this.cpu=a;this.bus=b;this.write_buffer=new ByteQueue...
function register_dsp_command (line 470) | function register_dsp_command(a,b,c){c||(c=SB16.prototype.dsp_default_ha...
function any_first_digit (line 471) | function any_first_digit(a){for(var b=[],c=0;16>c;c++)b.push(a+c);return b}
function register_mixer_read (line 486) | function register_mixer_read(a,b){b||(b=SB16.prototype.mixer_default_rea...
function register_mixer_write (line 486) | function register_mixer_write(a,b){b||(b=SB16.prototype.mixer_default_wr...
function register_mixer_legacy (line 487) | function register_mixer_legacy(a,b,c){MIXER_REGISTER_IS_LEGACY[a]=1;MIXE...
function register_mixer_volume (line 488) | function register_mixer_volume(a,b,c){MIXER_READ_HANDLERS[a]=SB16.protot...
function register_fm_write (line 494) | function register_fm_write(a,b){b||(b=SB16.prototype.fm_default_write);f...
function between (line 494) | function between(a,b){for(var c=[];a<=b;a++)c.push(a);return c}
function get_fm_operator (line 495) | function get_fm_operator(a,b){return 18*a+SB_FM_OPERATORS_BY_OFFSET[b]}
function audio_normalize (line 504) | function audio_normalize(a,b,c){return audio_clip(a/b+c,-1,1)}
function audio_clip (line 504) | function audio_clip(a,b,c){return(a<b)*b+(a>c)*c+(b<=a&&a<=c)*a}
function VirtIO (line 506) | function VirtIO(a,b){this.cpu=a;this.pci=a.devices.pci;this.device_id=b....
function VirtQueue (line 533) | function VirtQueue(a,b,c){this.cpu=a;this.virtio=b;this.size_supported=t...
function VirtQueueBufferChain (line 545) | function VirtQueueBufferChain(a,b){this.cpu=a.cpu;this.virtio=a.virtio;t...
function BusConnector (line 550) | function BusConnector(){this.listeners={};this.pair=void 0}
function do_the_log (line 551) | function do_the_log(a){LOG_TO_FILE?log_data.push(a,"\n"):console.log(a)}
function dbg_trace (line 553) | function dbg_trace(a){DEBUG&&dbg_log(Error().stack,a)}
function dbg_assert (line 553) | function dbg_assert(a,b,c){DEBUG&&(a||dbg_assert_failed(b))}
function dbg_assert_failed (line 553) | function dbg_assert_failed(a){debugger;console.trace();if(a)throw"Assert...
function CPU (line 554) | function CPU(a,b){this.wm=b;this.wasm_patch();this.create_jit_imports();...
function f (line 583) | function f(l){return new Uint8Array((new Int32Array([l])).buffer)}
function k (line 583) | function k(l){return l>>8|l<<8&65280}
function g (line 583) | function g(l){return l<<24|l<<8&16711680|l>>8&65280|l>>>24}
function a (line 627) | function a(){DEBUG&&(g.running||g.cycle(),d(),Date.now(),g.running=!1,f())}
function b (line 627) | function b(q){if(DEBUG){for(var p=g.protected_mode[0]?"prot":"real",u=g....
function c (line 628) | function c(){for(var q={eax:reg_eax,ecx:reg_ecx,edx:reg_edx,ebx:reg_ebx,...
function d (line 629) | function d(){if(DEBUG){var q=c();dbg_log(q[0],LOG_CPU);dbg_log(q[1],LOG_...
function e (line 629) | function e(){if(DEBUG){l.step_mode=!0;var q,p="";l.trace_all&&l.all_ops?...
function f (line 630) | function f(){DEBUG&&l.show(e())}
function k (line 630) | function k(q,p){if(DEBUG){if(!(q&1))return!1;var u=128===(q&128);return{...
function q (line 631) | function q(u){10===u?(dbg_log(p,LOG_BIOS),p=""):p+=String.fromCharCode(u)}
function q (line 634) | function q(p,u){for(var t=0;t<u;t+=8,p+=8){var x=g.read16(p+2)|g.read8(p...
function create_struct (line 643) | function create_struct(a){return a.map(function(b){var c=Object.keys(b);...
function read_elf (line 644) | function read_elf(a){a=new DataView(a);let [b,c]=read_struct(a,Header);c...
function read_struct (line 647) | function read_struct(a,b){let c={},d=0;for(let e of b)b=e.get.call(a,d,!...
function read_structs (line 647) | function read_structs(a,b,c){let d=[],e=0;for(var f=0;f<c;f++){let [k,g]...
function view_slice (line 647) | function view_slice(a,b,c){return new DataView(a.buffer,a.byteOffset+b,c)}
function load_kernel (line 650) | function load_kernel(a,b,c,d){dbg_log("Trying to load kernel of size "+b...
function make_linux_boot_rom (line 655) | function make_linux_boot_rom(a,b){const c=new Uint8Array(256);(new Uint1...
function KeyboardAdapter (line 656) | function KeyboardAdapter(a){function b(q){!q.altKey&&g[56]&&f(56,!1);ret...
function MouseAdapter (line 663) | function MouseAdapter(a,b){function c(t){if(!u.enabled||!u.emu_enabled)r...
function SpeakerAdapter (line 668) | function SpeakerAdapter(a){if("undefined"!==typeof window)if(window.Audi...
function SpeakerMixer (line 670) | function SpeakerMixer(a,b){function c(d){return function(e){d.gain.setVa...
function SpeakerMixerSource (line 678) | function SpeakerMixerSource(a,b,c,d){this.audio_context=a;this.connected...
function PCSpeaker (line 682) | function PCSpeaker(a,b,c){this.node_oscillator=b.createOscillator();this...
function SpeakerWorkletDAC (line 684) | function SpeakerWorkletDAC(a,b,c){this.bus=a;this.audio_context=b;this.e...
function SpeakerBufferSourceDAC (line 695) | function SpeakerBufferSourceDAC(a,b,c){this.bus=a;this.audio_context=b;t...
function SpeakerDACDebugger (line 700) | function SpeakerDACDebugger(a,b){this.audio_context=a;this.node_source=b...
function SerialAdapter (line 703) | function SerialAdapter(a,b){function c(g){k.bus&&k.enabled&&(k.send_char...
function SerialRecordingAdapter (line 706) | function SerialRecordingAdapter(a){this.text="";a.register("serial0-outp...
function SerialAdapterXtermJS (line 707) | function SerialAdapterXtermJS(a,b){this.element=a;if(window.Terminal){va...
function NetworkAdapter (line 707) | function NetworkAdapter(a,b){this.bus=b;this.socket=void 0;this.send_que...
function a (line 711) | function a(g,l){var m=new XMLHttpRequest;m.open(l.method||"get",g,!0);m....
function b (line 712) | function b(g,l){let m=require("fs");l.range?(dbg_assert(!l.as_json),m.op...
function c (line 713) | function c(g,l){this.filename=g;this.block_size=256;this.byteLength=l;th...
function d (line 713) | function d(g,l){const m=g.match(/(.*)(\..*)/);m?(this.basename=m[1],this...
function e (line 713) | function e(g){this.file=g;this.byteLength=g.size;
function f (line 714) | function f(g){this.file=g;this.byteLength=g.size;this.block_size=256;thi...
function V86Starter (line 725) | function V86Starter(a){this.cpu_is_running=!1;const b=Bus.create();this....
function c (line 731) | function c(q,p){switch(q){case "hda":f.hda=this.disk_images.hda=p;break;...
function d (line 732) | function d(q,p){if(p)if(p.get&&p.set&&p.load)k.push({name:q,loadable:p})...
function e (line 733) | function e(){function q(){this.serial_adapter&&
function FileExistsError (line 757) | function FileExistsError(a){this.message=a||"File already exists"}
function FileNotFoundError (line 757) | function FileNotFoundError(a){this.message=a||"File not found"}
function DummyScreenAdapter (line 759) | function DummyScreenAdapter(a){var b,c,d,e,f,k,g;this.bus=a;a.register("...
function FileStorageInterface (line 767) | function FileStorageInterface(){}
function MemoryFileStorage (line 767) | function MemoryFileStorage(){this.filedata=new Map}
function ServerFileStorageWrapper (line 768) | function ServerFileStorageWrapper(a,b){dbg_assert(b,"ServerMemoryFileSto...
function FS (line 771) | function FS(a,b){this.inodes=[];this.events=[];this.storage=a;this.qidco...
function Inode (line 781) | function Inode(a){this.direntries=new Map;this.minor=this.major=this.mti...
function FSMountInfo (line 818) | function FSMountInfo(a){this.fs=a;this.backtrack=new Map}
function FSLockRegion (line 824) | function FSLockRegion(){this.type=P9_LOCK_TYPE_UNLCK;this.start=0;this.l...
function hex8 (line 833) | function hex8(a){return h(a)}
function UTF8StreamToUnicode (line 837) | function UTF8StreamToUnicode(){this.stream=new Uint8Array(5);this.ofs=0;...
function UnicodeToUTF8Stream (line 837) | function UnicodeToUTF8Stream(a){if(128>a)return[a];if(2048>a)return[192|...
FILE: tabby-web-demo/src/buttonProvider.ts
class ButtonProvider (line 8) | class ButtonProvider extends ToolbarButtonProvider {
method constructor (line 9) | constructor (
method provide (line 18) | provide (): ToolbarButton[] {
FILE: tabby-web-demo/src/components/terminalTab.component.ts
type DemoProfile (line 6) | type DemoProfile = BaseTerminalProfile
class DemoTerminalTabComponent (line 15) | class DemoTerminalTabComponent extends BaseTerminalTabComponent<DemoProf...
method constructor (line 19) | constructor (
method ngOnInit (line 25) | ngOnInit (): void {
method onFrontendReady (line 31) | protected onFrontendReady (): void {
method initializeSession (line 36) | initializeSession (): void {
method ngOnDestroy (line 42) | ngOnDestroy (): void {
FILE: tabby-web-demo/src/index.ts
class DemoTerminalModule (line 32) | class DemoTerminalModule {
method constructor (line 33) | constructor (
FILE: tabby-web-demo/src/profiles.ts
class DemoProfilesService (line 6) | class DemoProfilesService extends ProfileProvider<Profile> {
method getBuiltinProfiles (line 11) | async getBuiltinProfiles (): Promise<PartialProfile<Profile>[]> {
method getNewTabParameters (line 23) | async getNewTabParameters (_profile: Profile): Promise<NewTabParameter...
method getDescription (line 29) | getDescription (_profile: Profile): string {
FILE: tabby-web-demo/src/session.ts
class Session (line 9) | class Session extends BaseSession {
method constructor (line 15) | constructor (
method start (line 23) | async start (): Promise<void> {
method resize (line 78) | resize (_columns: number, _rows: number): void { }
method write (line 80) | write (data: Buffer): void {
method kill (line 84) | kill (_signal?: string): void {
method emitMessage (line 87) | emitMessage (msg: string): void {
method gracefullyKillProcess (line 91) | async gracefullyKillProcess (): Promise<void> { }
method supportsWorkingDirectory (line 93) | supportsWorkingDirectory (): boolean {
method getWorkingDirectory (line 97) | async getWorkingDirectory (): Promise<string | null> {
FILE: tabby-web/src/components/messageBoxModal.component.ts
class MessageBoxModalComponent (line 9) | class MessageBoxModalComponent extends BaseComponent {
method constructor (line 12) | constructor (
method ngAfterViewInit (line 27) | ngAfterViewInit (): void {
method onButton (line 31) | onButton (index: number): void {
FILE: tabby-web/src/config.ts
class WebConfigProvider (line 4) | class WebConfigProvider extends ConfigProvider {
FILE: tabby-web/src/index.ts
class WebModule (line 31) | class WebModule { } // eslint-disable-line @typescript-eslint/no-extrane...
FILE: tabby-web/src/platform.ts
class WebPlatformService (line 15) | class WebPlatformService extends PlatformService {
method constructor (line 20) | constructor (
method readClipboard (line 38) | readClipboard (): string {
method setClipboard (line 42) | setClipboard (content: ClipboardContent): void {
method loadConfig (line 46) | async loadConfig (): Promise<string> {
method saveConfig (line 50) | async saveConfig (content: string): Promise<void> {
method getOSRelease (line 54) | getOSRelease (): string {
method openExternal (line 58) | openExternal (url: string): void {
method getAppVersion (line 62) | getAppVersion (): string {
method listFonts (line 66) | async listFonts (): Promise<string[]> {
method popupContextMenu (line 70) | popupContextMenu (menu: MenuItemOptions[], event?: MouseEvent): void {
method remapMenuItem (line 80) | private remapMenuItem (item: MenuItemOptions): ContextMenuItem {
method showMessageBox (line 93) | async showMessageBox (options: MessageBoxOptions): Promise<MessageBoxR...
method quit (line 107) | quit (): void {
method startDownload (line 111) | async startDownload (name: string, mode: number, size: number): Promis...
method startDownloadDirectory (line 117) | async startDownloadDirectory (_name: string, _estimatedSize?: number):...
method startUpload (line 121) | startUpload (options?: FileUploadOptions): Promise<FileUpload[]> {
method startUploadDirectory (line 142) | async startUploadDirectory (_paths?: string[]): Promise<DirectoryUploa...
method setErrorHandler (line 146) | setErrorHandler (handler: (_: any) => void): void {
method pickDirectory (line 150) | async pickDirectory (): Promise<string> {
class HTMLFileDownload (line 155) | class HTMLFileDownload extends FileDownload {
method constructor (line 158) | constructor (
method getName (line 166) | getName (): string {
method getMode (line 170) | getMode (): number {
method getSize (line 174) | getSize (): number {
method write (line 178) | async write (buffer: Uint8Array): Promise<void> {
method finish (line 186) | finish () {
method close (line 197) | close (): void { }
FILE: tabby-web/src/services/hostApp.service.ts
class WebHostApp (line 6) | class WebHostApp extends HostAppService {
method platform (line 7) | get platform (): Platform {
method configPlatform (line 11) | get configPlatform (): Platform {
method constructor (line 18) | constructor (
method newWindow (line 24) | newWindow (): void {
method relaunch (line 28) | relaunch (): void {
method quit (line 32) | quit (): void {
FILE: tabby-web/src/services/hostWindow.service.ts
class WebHostWindow (line 5) | class WebHostWindow extends HostWindowService {
method isFullscreen (line 6) | get isFullscreen (): boolean { return !!document.fullscreenElement }
method constructor (line 8) | constructor (
method reload (line 27) | reload (): void {
method setTitle (line 31) | setTitle (title?: string): void {
method toggleFullscreen (line 35) | toggleFullscreen (): void {
method minimize (line 43) | minimize (): void {
method isMaximized (line 47) | isMaximized (): boolean {
method toggleMaximize (line 51) | toggleMaximize (): void {
method close (line 55) | close (): void {
FILE: tabby-web/src/services/log.service.ts
class ConsoleLogService (line 5) | class ConsoleLogService {
method create (line 6) | create (name: string): Logger {
FILE: tabby-web/src/services/updater.service.ts
class NullUpdaterService (line 3) | class NullUpdaterService extends UpdaterService {
method check (line 4) | async check (): Promise<boolean> {
method update (line 9) | async update (): Promise<void> { }
FILE: web/entry.preload.ts
function webRequire (line 31) | async function webRequire (url) {
function prefetchURL (line 44) | async function prefetchURL (url) {
FILE: web/entry.ts
type BootstrapOptions (line 18) | interface BootstrapOptions {
FILE: web/polyfills.buffer.ts
constant MAX_ARGUMENTS_LENGTH (line 10) | const MAX_ARGUMENTS_LENGTH = 0x1000
function blitBuffer (line 13) | function blitBuffer (src, dst, offset, length) {
function utf8Write (line 22) | function utf8Write (string, offset, length) {
function base64Slice (line 26) | function base64Slice (start, end) {
function decodeCodePointsArray (line 34) | function decodeCodePointsArray (codePoints) {
function latin1Slice (line 53) | function latin1Slice (start, end) {
function utf8Slice (line 63) | function utf8Slice (this, start, end) {
function utf8ToBytes (line 132) | function utf8ToBytes (string, units) {
function hexSlice (line 225) | function hexSlice (start, end) {
FILE: web/polyfills.ts
class SocketProxy (line 10) | class SocketProxy extends Duplex {
method constructor (line 13) | constructor (...args: any[]) {
method connect (line 23) | connect (...args: any[]) {
method setNoDelay (line 27) | setNoDelay () { }
method setTimeout (line 29) | setTimeout () { }
method _read (line 31) | _read (_size: number): void { }
method _write (line 33) | _write (chunk: Buffer, _encoding: string, callback: (error?: Error | n...
method _destroy (line 38) | _destroy (error: Error|null, callback: (error: Error|null) => void): v...
method getHashes (line 85) | getHashes () {
method timingSafeEqual (line 88) | timingSafeEqual (a, b) {
Condensed preview — 772 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,977K chars).
[
{
"path": ".all-contributorsrc",
"chars": 37544,
"preview": "{\n \"files\": [\n \"README.md\",\n \"README.zh-CN.md\",\n \"README.ru-RU.md\",\n \"README.ko-KR.md\",\n \"README.it-IT.m"
},
{
"path": ".editorconfig",
"chars": 607,
"preview": "root = true\n\n[*]\nend_of_line = LF\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.sln]\ni"
},
{
"path": ".eslintrc.yml",
"chars": 4739,
"preview": "settings:\n import/parsers:\n '@typescript-eslint/parser': ['.ts']\n import/resolver:\n typescript:\n project:\n "
},
{
"path": ".github/FUNDING.yml",
"chars": 52,
"preview": "github: eugeny\nopen_collective: tabby\nko_fi: eugeny\n"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 815,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n<!--\n# RULES:"
},
{
"path": ".github/ISSUE_TEMPLATE/issue-report.md",
"chars": 566,
"preview": "---\nname: Issue report\nabout: Report a problem\ntitle: ''\nlabels: 'T: Bug'\nassignees: ''\n\n---\n\n<!--\n# READ CAREFULLY:\n\n* "
},
{
"path": ".github/dependabot.yml",
"chars": 1640,
"preview": "version: 2\nupdates:\n- package-ecosystem: npm\n directory: \"/\"\n schedule:\n interval: daily\n time: \"04:00\"\n open-p"
},
{
"path": ".github/stale.yml",
"chars": 708,
"preview": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 180\n# Number of days of inactivity before a"
},
{
"path": ".github/workflows/build.yml",
"chars": 13955,
"preview": "name: Package-Build\non: [push, pull_request]\njobs:\n Lint:\n runs-on: ubuntu-24.04\n\n steps:\n - name: Checkout\n "
},
{
"path": ".github/workflows/codeql-analysis.yml",
"chars": 2330,
"preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
},
{
"path": ".github/workflows/docs.yml",
"chars": 912,
"preview": "name: Docs\non: push\njobs:\n build:\n runs-on: ubuntu-latest\n if: ${{ github.actor != 'dependabot[bot]' }}\n\n step"
},
{
"path": ".github/workflows/release.yml",
"chars": 333,
"preview": "---\nname: \"tagged-release\"\n\non:\n push:\n tags:\n - \"v*\"\n\njobs:\n tagged-release:\n name: \"Tagged Release\"\n r"
},
{
"path": ".gitignore",
"chars": 391,
"preview": "app/node_modules\napp/assets/webpack\n\nnode_modules\n\nbuild/files.wxs\ndist\n*/dist\n*/typings\n*.tsbuildinfo\n\n*.xcworkspacedat"
},
{
"path": ".mergify.yml",
"chars": 435,
"preview": "pull_request_rules:\n - name: automatic merge on CI success and review\n conditions:\n - \"status-success=Windows Bui"
},
{
"path": ".pug-lintrc.js",
"chars": 20,
"preview": "module.export = {\n}\n"
},
{
"path": ".vscode/launch.json",
"chars": 1037,
"preview": "{\n \"version\": \"0.2.0\",\n \"configurations\": [\n {\n \"type\": \"node\",\n \"request\": \"launch\","
},
{
"path": ".well-known/funding-manifest-urls",
"chars": 31,
"preview": "https://null.page/funding.json\n"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3209,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "HACKING.md",
"chars": 4636,
"preview": "# Some background\n\nTabby is an Electron app, with the frontend written in Typescript with the help of Angular framework."
},
{
"path": "LICENSE",
"chars": 1083,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2017 Tabby Developers\n\nPermission is hereby granted, free of charge, to any person "
},
{
"path": "README.de-DE.md",
"chars": 58456,
"preview": "[](https://tabby.sh)\n\n<p align=\"center\">\n<a href=\"https://github.com/Eugeny/tabby/releases/latest\""
},
{
"path": "README.es-ES.md",
"chars": 58733,
"preview": "[](https://tabby.sh)\n\n\n<p align=\"center\">\n <a href=\"https://github.com/Eugeny/tabby/releases/latest"
},
{
"path": "README.id-ID.md",
"chars": 58078,
"preview": "[](https://tabby.sh)\n\n\n<p align=\"center\">\n <a href=\"https://github.com/Eugeny/tabby/releases/latest"
},
{
"path": "README.it-IT.md",
"chars": 58497,
"preview": "[](https://tabby.sh)\n\n\n<p align=\"center\">\n <a href=\"https://github.com/Eugeny/tabby/releases/latest"
},
{
"path": "README.ja-JP.md",
"chars": 56801,
"preview": "[](https://tabby.sh)\n\n\n<p align=\"center\">\n <a href=\"https://github.com/Eugeny/tabby/releases/latest"
},
{
"path": "README.ko-KR.md",
"chars": 56077,
"preview": "[](https://tabby.sh)\n\n\n<p align=\"center\">\n <a href=\"https://github.com/Eugeny/tabby/releases/latest"
},
{
"path": "README.md",
"chars": 58720,
"preview": "[](https://tabby.sh)\n\n\n<p align=\"center\">\n <a href=\"https://github.com/Eugeny/tabby/releases/latest"
},
{
"path": "README.pl-PL.md",
"chars": 55826,
"preview": "[](https://tabby.sh)\n\n\n<p align=\"center\">\n <a href=\"https://github.com/Eugeny/tabby/releases/latest"
},
{
"path": "README.pt-BR.md",
"chars": 58553,
"preview": "[](https://tabby.sh)\n\n\n<p align=\"center\">\n <a href=\"https://github.com/Eugeny/tabby/releases/latest"
},
{
"path": "README.ru-RU.md",
"chars": 58453,
"preview": "[](https://tabby.sh)\n\n\n<p align=\"center\">\n <a href=\"https://github.com/Eugeny/tabby/releases/latest"
},
{
"path": "README.zh-CN.md",
"chars": 56059,
"preview": "[](https://tabby.sh)\n\n\n<p align=\"center\">\n <a href=\"https://github.com/Eugeny/tabby/releases/latest"
},
{
"path": "app/dev-app-update.yml",
"chars": 78,
"preview": "owner: eugeny\nrepo: tabby\nprovider: github\nupdaterCacheDirName: tabby-updater\n"
},
{
"path": "app/index.pug",
"chars": 623,
"preview": "doctype html\nhtml.tabby\n head\n meta(charset='UTF-8')\n base(href='index.html')\n script.\n "
},
{
"path": "app/lib/app.ts",
"chars": 10937,
"preview": "import { app, ipcMain, Menu, Tray, shell, screen, globalShortcut, MenuItemConstructorOptions, WebContents } from 'electr"
},
{
"path": "app/lib/cli.ts",
"chars": 4283,
"preview": "import { app } from 'electron'\n\ninterface YargsOption {\n type?: 'string' | 'number' | 'boolean' | 'array'\n alias?:"
},
{
"path": "app/lib/config.ts",
"chars": 1014,
"preview": "import * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { writeFile } from 'atomica"
},
{
"path": "app/lib/index.ts",
"chars": 2620,
"preview": "import { app, ipcMain, Menu, dialog } from 'electron'\n\n// set userData Path on portable version\nimport './portable'\n\n// "
},
{
"path": "app/lib/lru.ts",
"chars": 437,
"preview": "import LRU from 'lru-cache'\nimport * as fs from 'fs'\nconst lru = new LRU({ max: 256, maxAge: 250 })\nconst origLstat = fs"
},
{
"path": "app/lib/pluginManager.ts",
"chars": 1112,
"preview": "import { promisify } from 'util'\n\n\nexport class PluginManager {\n npm: any\n npmReady?: Promise<void>\n\n async ens"
},
{
"path": "app/lib/portable.ts",
"chars": 341,
"preview": "import * as path from 'path'\nimport * as fs from 'fs'\nimport * as electron from 'electron'\n\nconst appPath = path.dirname"
},
{
"path": "app/lib/pty.ts",
"chars": 4810,
"preview": "import * as nodePTY from 'node-pty'\nimport { v4 as uuidv4 } from 'uuid'\nimport { ipcMain } from 'electron'\nimport { Appl"
},
{
"path": "app/lib/sentry.ts",
"chars": 592,
"preview": "const { init } = String(process.type) === 'main' ? require('@sentry/electron/dist/main') : require('@sentry/electron/dis"
},
{
"path": "app/lib/urlHandler.ts",
"chars": 2473,
"preview": "import { createParserConfig } from './cli'\nimport { parse as parseShellCommand } from 'shell-quote'\n\nexport function isT"
},
{
"path": "app/lib/utfSplitter.ts",
"chars": 896,
"preview": "const partials = [\n [0b110, 5, 0],\n [0b1110, 4, 1],\n [0b11110, 3, 2],\n]\n\nexport class UTF8Splitter {\n privat"
},
{
"path": "app/lib/window.ts",
"chars": 18168,
"preview": "import * as glasstron from 'glasstron'\nimport { autoUpdater } from 'electron-updater'\nimport { Subject, Observable, debo"
},
{
"path": "app/package.json",
"chars": 1925,
"preview": "{\n \"name\": \"tabby\",\n \"description\": \"A terminal for a modern age\",\n \"private\": true,\n \"repository\": \"https://github."
},
{
"path": "app/patches/@serialport+bindings-cpp+11.0.3.patch",
"chars": 13733,
"preview": "diff --git a/node_modules/@serialport/bindings-cpp/src/serialport_win.cpp b/node_modules/@serialport/bindings-cpp/src/se"
},
{
"path": "app/src/app.module.ts",
"chars": 1139,
"preview": "/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nimport { ApplicationRef, NgModule } from '@angula"
},
{
"path": "app/src/entry.preload.ts",
"chars": 381,
"preview": "import 'v8-compile-cache'\nimport '../lib/lru'\nimport 'source-sans-pro/source-sans-pro.css'\nimport 'source-code-pro/sourc"
},
{
"path": "app/src/entry.ts",
"chars": 2835,
"preview": "import 'zone.js'\nimport 'core-js/proposals/reflect-metadata'\nimport 'rxjs'\n\nimport './global.scss'\nimport './toastr.scss"
},
{
"path": "app/src/global.scss",
"chars": 3552,
"preview": "html {\n --spaciness: 1;\n}\n\nbody {\n min-height: 100vh;\n overflow: hidden;\n background: transparent !important"
},
{
"path": "app/src/pluginBlacklist.ts",
"chars": 576,
"preview": "export const PLUGIN_BLACKLIST = [\n 'terminus-shell-selector', // superseded by profiles\n 'terminus-scrollbar', // "
},
{
"path": "app/src/plugins.ts",
"chars": 9753,
"preview": "import * as fs from 'mz/fs'\nimport * as path from 'path'\nimport * as remote from '@electron/remote'\nimport { PluginInfo "
},
{
"path": "app/src/preload.scss",
"chars": 1065,
"preview": "app-root {\n background: #1D272D;\n}\n\n.preload-logo {\n -webkit-app-region: drag;\n position: fixed;\n left: 0;\n top: 0;"
},
{
"path": "app/src/toastr.scss",
"chars": 546,
"preview": "#toast-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px 0 50px;\n\n .toast {"
},
{
"path": "app/tsconfig.json",
"chars": 813,
"preview": "{\n \"compilerOptions\": {\n \"baseUrl\": \"./src\",\n \"module\": \"commonjs\",\n \"target\": \"es2015\",\n "
},
{
"path": "app/tsconfig.main.json",
"chars": 804,
"preview": "{\n \"compilerOptions\": {\n \"baseUrl\": \"./lib\",\n \"module\": \"commonjs\",\n \"target\": \"es2017\",\n "
},
{
"path": "app/webpack.config.main.mjs",
"chars": 2322,
"preview": "import * as path from 'path'\nimport wp from 'webpack'\nimport { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'\nimp"
},
{
"path": "app/webpack.config.mjs",
"chars": 2991,
"preview": "import * as fs from 'fs'\nimport * as path from 'path'\nimport wp from 'webpack'\nimport * as url from 'url'\nconst __dirnam"
},
{
"path": "build/installer.nsh",
"chars": 93,
"preview": "!macro customInit\n nsExec::Exec '\"$LOCALAPPDATA\\tabby\\Update.exe\" --uninstall -s'\n!macroend\n"
},
{
"path": "build/linux/after-install.tpl",
"chars": 156,
"preview": "#!/bin/bash\ncat > '/usr/bin/${executable}' << END\n#!/bin/sh\n'/opt/${productFilename}/${executable}' --no-sandbox \\$@\nEND"
},
{
"path": "build/mac/entitlements.plist",
"chars": 528,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "electron-builder.yml",
"chars": 3651,
"preview": "---\nappId: org.tabby\nproductName: Tabby\ncompression: normal\nnpmRebuild: false\nprotocols:\n - name: Tabby URL\n schemes"
},
{
"path": "extras/automator-workflows/Open Tabby here.workflow/Contents/Info.plist",
"chars": 765,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "extras/automator-workflows/Open Tabby here.workflow/Contents/_CodeSignature/CodeResources",
"chars": 2813,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "extras/automator-workflows/Open Tabby here.workflow/Contents/document.wflow",
"chars": 5988,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "extras/automator-workflows/Paste path into Tabby.workflow/Contents/Info.plist",
"chars": 771,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "extras/automator-workflows/Paste path into Tabby.workflow/Contents/_CodeSignature/CodeResources",
"chars": 2813,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "extras/automator-workflows/Paste path into Tabby.workflow/Contents/document.wflow",
"chars": 5998,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "extras/clink/CHANGES",
"chars": 51565,
"preview": "# Changes\n\n### Releases from [chrisant996/clink](https://github.com/chrisant996/clink) fork\n\n#### v1.7.6\n\n- Update Win8."
},
{
"path": "extras/clink/LICENSE",
"chars": 35823,
"preview": " GNU GENERAL PUBLIC LICENSE\r\n Version 3, 29 June 2007\r\n\r\n Copyright (C) 2007 Fr"
},
{
"path": "extras/clink/clink.bat",
"chars": 1574,
"preview": "@echo off\r\nrem -- Copyright (c) 2012 Martin Ridgers\r\nrem -- Portions Copyright (c) 2020-2024 Christopher Antos\r\nrem -- L"
},
{
"path": "extras/clink/clink.lua",
"chars": 247,
"preview": "-- This file is intentionally blank.\r\n--\r\n-- The old clink.lua file is no longer used, and this blank file ensures if a\r"
},
{
"path": "extras/clink/clink_inputrc_base",
"chars": 2075,
"preview": "set bell-style visible\nset completion-ignore-case on\nset completion-map-case on\nset comple"
},
{
"path": "extras/clink/default_inputrc",
"chars": 563,
"preview": "# When this file is named \"default_inputrc\" and is in the binaries\r\n# directory or profile directory, it provides enhanc"
},
{
"path": "extras/clink/default_settings",
"chars": 1463,
"preview": "# When this file is named \"default_settings\" and is in the binaries\n# directory or profile directory, it provides enhanc"
},
{
"path": "firebase.json",
"chars": 136,
"preview": "{\n \"hosting\": {\n \"public\": \"docs/api\",\n \"ignore\": [\n \"firebase.json\",\n \"**/.*\",\n \"**/node_modules/"
},
{
"path": "locale/STOP.txt",
"chars": 109,
"preview": "Do not submit pull requests for translations.\n\nTranslations are managed at https://crowdin.com/project/tabby\n"
},
{
"path": "locale/af-ZA.po",
"chars": 91491,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Crowdin"
},
{
"path": "locale/app.pot",
"chars": 77482,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\n#: tabby-local/src/components/terminalTab.component.ts:1"
},
{
"path": "locale/bg-BG.po",
"chars": 92426,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Crowdin"
},
{
"path": "locale/cs-CZ.po",
"chars": 90953,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n"
},
{
"path": "locale/da-DK.po",
"chars": 87324,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Crowdin"
},
{
"path": "locale/de-DE.po",
"chars": 92855,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Crowdin"
},
{
"path": "locale/en-GB.po",
"chars": 78072,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Crowdin"
},
{
"path": "locale/en-US.po",
"chars": 99,
"preview": "msgid \"id.port-forwarding.dynamic\"\nmsgstr \"Dynamic\"\n\nmsgid \"id.tab-width.dynamic\"\nmsgstr \"Dynamic\"\n"
},
{
"path": "locale/es-ES.po",
"chars": 93159,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Crowdin"
},
{
"path": "locale/fr-FR.po",
"chars": 94013,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\"X-Crowdin-"
},
{
"path": "locale/hr-HR.po",
"chars": 92045,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ?"
},
{
"path": "locale/id-ID.po",
"chars": 88108,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Crowdin-Projec"
},
{
"path": "locale/it-IT.po",
"chars": 93131,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Crowdin"
},
{
"path": "locale/ja-JP.po",
"chars": 84467,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Crowdin-Projec"
},
{
"path": "locale/ko-KR.po",
"chars": 84120,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Crowdin-Projec"
},
{
"path": "locale/pl-PL.po",
"chars": 91879,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 &&"
},
{
"path": "locale/pt-BR.po",
"chars": 92033,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Crowdin"
},
{
"path": "locale/pt-PT.po",
"chars": 87394,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Crowdin"
},
{
"path": "locale/ru-RU.po",
"chars": 92586,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11)"
},
{
"path": "locale/sr-SP.po",
"chars": 88416,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ?"
},
{
"path": "locale/sv-SE.po",
"chars": 91052,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Crowdin"
},
{
"path": "locale/tr-TR.po",
"chars": 91681,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\"X-Crowdin"
},
{
"path": "locale/uk-UA.po",
"chars": 92361,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11)"
},
{
"path": "locale/zh-CN.po",
"chars": 82201,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Crowdin-Projec"
},
{
"path": "locale/zh-TW.po",
"chars": 82263,
"preview": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Crowdin-Projec"
},
{
"path": "package.json",
"chars": 3907,
"preview": "{\n \"devDependencies\": {\n \"@angular/animations\": \"^15.2.6\",\n \"@angular/cdk\": \"^15.2.6\",\n \"@angular/common\": \"^1"
},
{
"path": "patches/app-builder-lib+26.0.12.patch",
"chars": 660,
"preview": "diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js\nindex d159c17..eb"
},
{
"path": "scripts/build-docs.mjs",
"chars": 312,
"preview": "#!/usr/bin/env node\nimport sh from 'shelljs'\nimport * as vars from './vars.mjs'\nimport log from 'npmlog'\n\nvars.packagesW"
},
{
"path": "scripts/build-linux.mjs",
"chars": 994,
"preview": "#!/usr/bin/env node\n/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\nimport { build as builder } from '"
},
{
"path": "scripts/build-macos.mjs",
"chars": 1422,
"preview": "#!/usr/bin/env node\n/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\nimport { build as builder } from '"
},
{
"path": "scripts/build-modules.mjs",
"chars": 593,
"preview": "#!/usr/bin/env node\nimport * as vars from './vars.mjs'\nimport log from 'npmlog'\nimport webpack from 'webpack'\nimport { p"
},
{
"path": "scripts/build-native.mjs",
"chars": 1083,
"preview": "#!/usr/bin/env node\nimport { rebuild } from '@electron/rebuild'\nimport * as path from 'path'\nimport * as vars from './va"
},
{
"path": "scripts/build-typings.mjs",
"chars": 264,
"preview": "#!/usr/bin/env node\nimport sh from 'shelljs'\nimport * as vars from './vars.mjs'\nimport log from 'npmlog'\n\nvars.builtinPl"
},
{
"path": "scripts/build-windows.mjs",
"chars": 2526,
"preview": "#!/usr/bin/env node\n/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\nimport { build as builder } from '"
},
{
"path": "scripts/generate-icon-metadata.mjs",
"chars": 539,
"preview": "#!/usr/bin/env node\nimport jsYaml from 'js-yaml'\nimport fs from 'node:fs'\nimport path from 'node:path'\n\nimport * as url "
},
{
"path": "scripts/i18n-extract.mjs",
"chars": 1632,
"preview": "#!/usr/bin/env node\nimport sh from 'shelljs'\nimport fs from 'node:fs/promises'\nimport * as vars from './vars.mjs'\nimport"
},
{
"path": "scripts/install-deps.mjs",
"chars": 957,
"preview": "#!/usr/bin/env node\nimport sh from 'shelljs'\nimport * as vars from './vars.mjs'\nimport log from 'npmlog'\n\nlog.info('patc"
},
{
"path": "scripts/prepackage-plugins.mjs",
"chars": 1148,
"preview": "#!/usr/bin/env node\nimport { rebuild } from '@electron/rebuild'\nimport sh from 'shelljs'\nimport path from 'node:path'\nim"
},
{
"path": "scripts/publish-plugins.mjs",
"chars": 394,
"preview": "#!/usr/bin/env node\nimport sh from 'shelljs'\nimport * as vars from './vars.mjs'\nimport log from 'npmlog'\nimport { execSy"
},
{
"path": "scripts/sentry-upload.mjs",
"chars": 936,
"preview": "#!/usr/bin/env node\nimport sh from 'shelljs'\nimport * as vars from './vars.mjs'\n\nconst sentryCli = process.platform === "
},
{
"path": "scripts/vars.mjs",
"chars": 2416,
"preview": "import * as path from 'path'\nimport * as fs from 'fs'\nimport * as semver from 'semver'\nimport * as childProcess from 'ch"
},
{
"path": "snap/snapcraft.yaml",
"chars": 538,
"preview": "name: tabby\nversion: '1.0.0'\nsummary: A terminal for a modern age\ndescription: |\n Tabby is a local, SSH and serial term"
},
{
"path": "tabby-auto-sudo-password/package.json",
"chars": 554,
"preview": "{\n \"name\": \"tabby-auto-sudo-password\",\n \"version\": \"1.0.231-nightly.0\",\n \"description\": \"Offers to automatically past"
},
{
"path": "tabby-auto-sudo-password/src/decorator.ts",
"chars": 3161,
"preview": "import colors from 'ansi-colors'\nimport { Injectable } from '@angular/core'\nimport { TerminalDecorator, BaseTerminalTabC"
},
{
"path": "tabby-auto-sudo-password/src/index.ts",
"chars": 473,
"preview": "/* eslint-disable @typescript-eslint/no-extraneous-class */\nimport { NgModule } from '@angular/core'\nimport { ToastrModu"
},
{
"path": "tabby-auto-sudo-password/tsconfig.json",
"chars": 125,
"preview": "{\n \"extends\": \"../tsconfig.json\",\n \"exclude\": [\"node_modules\", \"dist\"],\n \"compilerOptions\": {\n \"baseUrl\": \"src\",\n "
},
{
"path": "tabby-auto-sudo-password/tsconfig.typings.json",
"chars": 326,
"preview": "{\n \"extends\": \"../tsconfig.json\",\n \"exclude\": [\"node_modules\", \"dist\", \"typings\"],\n \"compilerOptions\": {\n \"baseUrl"
},
{
"path": "tabby-auto-sudo-password/webpack.config.mjs",
"chars": 264,
"preview": "import * as path from 'path'\nimport * as url from 'url'\nconst __dirname = url.fileURLToPath(new URL('.', import.meta.url"
},
{
"path": "tabby-community-color-schemes/.editorconfig",
"chars": 50,
"preview": "[schemes/*]\nindent_style = space\nindent_size = 15\n"
},
{
"path": "tabby-community-color-schemes/package.json",
"chars": 544,
"preview": "{\n \"name\": \"tabby-community-color-schemes\",\n \"version\": \"1.0.231-nightly.0\",\n \"description\": \"Community color schemes"
},
{
"path": "tabby-community-color-schemes/schemes/3024 Day",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #4a4543\n*.background: #f7f7f7\n*.cursorColor: #4a4543\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/3024 Night",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #a5a2a2\n*.background: #090300\n*.cursorColor: #a5a2a2\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/AdventureTime",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #f8dcc0\n*.background: #1f1d45\n*.cursorColor: #efbf38\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Afterglow",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #d0d0d0\n*.background: #212121\n*.cursorColor: #d0d0d0\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/AlienBlood",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #637d75\n*.background: #0f1610\n*.cursorColor: #73fa91\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Argonaut",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #fffaf4\n*.background: #0e1019\n*.cursorColor: #ff0018\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Arthur",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ddeedd\n*.background: #1c1c1c\n*.cursorColor: #e2bbef\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/AtelierSulphurpool",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #979db4\n*.background: #202746\n*.cursorColor: #979db4\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Atom",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #c5c8c6\n*.background: #161719\n*.cursorColor: #d0d0d0\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/AtomOneLight",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #2a2c33\n*.background: #f9f9f9\n*.cursorColor: #bbbbbb\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Base16 Default Dark",
"chars": 1218,
"preview": "! Base16 Default Dark\n! Scheme: Chris Kempson (http://chriskempson.com)\n\n#define base00 #181818\n#define base01 #282828\n#"
},
{
"path": "tabby-community-color-schemes/schemes/Batman",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #6f6f6f\n*.background: #1b1d1e\n*.cursorColor: #fcef0c\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Belafonte Day",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #45373c\n*.background: #d5ccba\n*.cursorColor: #45373c\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Belafonte Night",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #968c83\n*.background: #20111b\n*.cursorColor: #968c83\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/BirdsOfParadise",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #e0dbb7\n*.background: #2a1f1d\n*.cursorColor: #573d26\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Blazer",
"chars": 623,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #d9e6f2\n*.background: #0d1926\n*.cursorColor: #d9e6f2\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Borland",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ffff4e\n*.background: #0000a4\n*.cursorColor: #ffa560\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Bright Lights",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #b3c9d7\n*.background: #191919\n*.cursorColor: #f34b00\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Broadcast",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #e6e1dc\n*.background: #2b2b2b\n*.cursorColor: #ffffff\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Brogrammer",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #d6dbe5\n*.background: #131313\n*.cursorColor: #b9b9b9\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/C64",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #7869c4\n*.background: #40318d\n*.cursorColor: #7869c4\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/CLRS",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #262626\n*.background: #ffffff\n*.cursorColor: #6fd3fc\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Chalk",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #d2d8d9\n*.background: #2b2d2e\n*.cursorColor: #708284\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Chalkboard",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #d9e6f2\n*.background: #29262f\n*.cursorColor: #d9e6f2\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Ciapre",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #aea47a\n*.background: #191c27\n*.cursorColor: #92805b\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Cobalt Neon",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #8ff586\n*.background: #142838\n*.cursorColor: #c4206f\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Cobalt2",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ffffff\n*.background: #132738\n*.cursorColor: #f0cc09\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/CrayonPonyFish",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #68525a\n*.background: #150707\n*.cursorColor: #68525a\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Dark Pastel",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ffffff\n*.background: #000000\n*.cursorColor: #bbbbbb\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Darkside",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #bababa\n*.background: #222324\n*.cursorColor: #bbbbbb\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Desert",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ffffff\n*.background: #333333\n*.cursorColor: #00ff00\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/DimmedMonokai",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #b9bcba\n*.background: #1f1f1f\n*.cursorColor: #f83e19\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/DotGov",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ebebeb\n*.background: #262c35\n*.cursorColor: #d9002f\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Dracula",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #f8f8f2\n*.background: #1e1f29\n*.cursorColor: #bbbbbb\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Duotone Dark",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #b7a1ff\n*.background: #1f1d27\n*.cursorColor: #ff9839\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/ENCOM",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #00a595\n*.background: #000000\n*.cursorColor: #bbbbbb\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Earthsong",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #e5c7a9\n*.background: #292520\n*.cursorColor: #f6f7ec\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Elemental",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #807a74\n*.background: #22211d\n*.cursorColor: #facb80\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Elementary",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #efefef\n*.background: #181818\n*.cursorColor: #bbbbbb\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Espresso",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ffffff\n*.background: #323232\n*.cursorColor: #d6d6d6\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Espresso Libre",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #b8a898\n*.background: #2a211c\n*.cursorColor: #ffffff\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Fideloper",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #dbdae0\n*.background: #292f33\n*.cursorColor: #d4605a\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/FirefoxDev",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #7c8fa4\n*.background: #0e1011\n*.cursorColor: #708284\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Firewatch",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #9ba2b2\n*.background: #1e2027\n*.cursorColor: #f6f7ec\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/FishTank",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ecf0fe\n*.background: #232537\n*.cursorColor: #fecd5e\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Flat",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #2cc55d\n*.background: #002240\n*.cursorColor: #e5be0c\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Flatland",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #b8dbef\n*.background: #1d1f21\n*.cursorColor: #708284\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Floraverse",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #dbd1b9\n*.background: #0e0d15\n*.cursorColor: #bbbbbb\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/ForestBlue",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #e2d8cd\n*.background: #051519\n*.cursorColor: #9e9ecb\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/FrontEndDelight",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #adadad\n*.background: #1b1c1d\n*.cursorColor: #cdcdcd\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/FunForrest",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #dec165\n*.background: #251200\n*.cursorColor: #e5591c\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Galaxy",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ffffff\n*.background: #1d2837\n*.cursorColor: #bbbbbb\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Github",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #3e3e3e\n*.background: #f4f4f4\n*.cursorColor: #3f3f3f\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Glacier",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ffffff\n*.background: #0c1115\n*.cursorColor: #6c6c6c\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Grape",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #9f9fa1\n*.background: #171423\n*.cursorColor: #a288f7\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Grass",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #fff0a5\n*.background: #13773d\n*.cursorColor: #8c2800\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Gruvbox Dark",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #e6d4a3\n*.background: #1e1e1e\n*.cursorColor: #bbbbbb\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Hardcore",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #a0a0a0\n*.background: #121212\n*.cursorColor: #bbbbbb\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Harper",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #a8a49d\n*.background: #010101\n*.cursorColor: #a8a49d\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Highway",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ededed\n*.background: #222225\n*.cursorColor: #e0d9b9\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Hipster Green",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #84c138\n*.background: #100b05\n*.cursorColor: #23ff18\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Homebrew",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #00ff00\n*.background: #000000\n*.cursorColor: #23ff18\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Hurtado",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #dbdbdb\n*.background: #000000\n*.cursorColor: #bbbbbb\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Hybrid",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #b7bcba\n*.background: #161719\n*.cursorColor: #b7bcba\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/IC_Green_PPL",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #d9efd3\n*.background: #3a3d3f\n*.cursorColor: #42ff58\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/IC_Orange_PPL",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ffcb83\n*.background: #262626\n*.cursorColor: #fc531d\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/IR_Black",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #f1f1f1\n*.background: #000000\n*.cursorColor: #808080\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Iceberg",
"chars": 642,
"preview": "! Iceberg\n! https://cocopon.github.io/iceberg.vim/\n*.foreground: #c6c8d1\n*.background: #161821\n*.cursorColor: #c6c8d1\n"
},
{
"path": "tabby-community-color-schemes/schemes/Jackie Brown",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #ffcc2f\n*.background: #2c1d16\n*.cursorColor: #23ff18\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Japanesque",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #f7f6ec\n*.background: #1e1e1e\n*.cursorColor: #edcf4f\n!\n! Blac"
},
{
"path": "tabby-community-color-schemes/schemes/Jazz",
"chars": 635,
"preview": "!\n! Generated with :\n! XRDB2Xresources.py\n!\n*.foreground: #3f3f3f\n*.background: #f3f2f1\n*.cursorColor: #9acf9f\n!\n! Bla"
},
{
"path": "tabby-community-color-schemes/schemes/Jellybeans",
"chars": 634,
"preview": "!\n! Generated with :\n! XRDB2Xreources.py\n!\n*.foreground: #dedede\n*.background: #121212\n*.cursorColor: #ffa560\n!\n! Blac"
}
]
// ... and 572 more files (download for full content)
About this extraction
This page contains the full source code of the Eugeny/tabby GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 772 files (4.5 MB), approximately 1.2M tokens, and a symbol index with 2111 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.