{"id":13441525,"url":"https://github.com/austinjones/tab-rs","last_synced_at":"2026-01-10T03:56:38.264Z","repository":{"id":39211713,"uuid":"287437319","full_name":"austinjones/tab-rs","owner":"austinjones","description":"The intuitive, config-driven terminal multiplexer designed for software \u0026 systems engineers","archived":false,"fork":false,"pushed_at":"2023-03-11T13:23:14.000Z","size":1048,"stargazers_count":659,"open_issues_count":64,"forks_count":29,"subscribers_count":11,"default_branch":"main","last_synced_at":"2024-10-14T04:35:56.352Z","etag":null,"topics":["multiplexer","shell","terminal"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/austinjones.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY.md","support":null,"governance":null}},"created_at":"2020-08-14T03:46:35.000Z","updated_at":"2024-09-13T17:21:54.000Z","dependencies_parsed_at":"2023-10-20T18:08:06.090Z","dependency_job_id":null,"html_url":"https://github.com/austinjones/tab-rs","commit_stats":{"total_commits":242,"total_committers":10,"mean_commits":24.2,"dds":0.4297520661157025,"last_synced_commit":"76e6a755191df9b372dc498c4c4be56861fe9c5c"},"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/austinjones%2Ftab-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/austinjones%2Ftab-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/austinjones%2Ftab-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/austinjones%2Ftab-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/austinjones","download_url":"https://codeload.github.com/austinjones/tab-rs/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221760026,"owners_count":16876338,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["multiplexer","shell","terminal"],"created_at":"2024-07-31T03:01:35.058Z","updated_at":"2026-01-10T03:56:38.233Z","avatar_url":"https://github.com/austinjones.png","language":"Rust","funding_links":[],"categories":["HarmonyOS","Rust"],"sub_categories":["Windows Manager"],"readme":"# tab\n\n**The intuitive, config-driven terminal multiplexer designed for software \u0026 systems engineers**\n\n\u003cimg align=\"right\" width=400 height=400 src=\"./readme/tab-vectr.svg\"\u003e\n\n**- Intuitive:**  Tabs are discovered and selected with a built-in fuzzy finder, or with the command  `tab \u003cname\u003e`.  Tab has *one* escape sequence, `ctrl-T`.\n\n**- Config-driven:**  `tab` provides persistent, configurable tabs with unique command history, working directories, and docstrings.\n\n**- State-agnostic:**  Tab provides a simple, consistent interface that works anywhere, in any state.\n\n**- Autocompleted:**  Tab provides an interactive fuzzy finder and dynamic autocomplete on the command line, so you can get oriented, and context switch fast.\n\n**- Fast:**  Tabs launch in 50ms, and reconnect in 10ms.  Keyboard latency (stdin to stdout) is under 5ms.\n\n# Quickstart\nQuick installation \u0026 usage instructions:\n```\n❯ brew install austinjones/taps/tab\n  OR\n❯ cargo install tab\n  THEN\n❯ tab --install all \n  # installs shell autocompletion scripts and statusline integrations\n\n❯ tab foo/     # to open a tab.\n❯ tab bar/     # to switch to another tab.  \n                 works within an active session!\n❯ echo $TAB    # to view the active tab.  \n                 put this in your promptline, \n                 or get https://starship.rs/\n❯ tab          # to open the fuzzy finder\n❯ tab -w baz   # to close a tab (or many tabs).\n❯ tab -l       # to view the tabs\n❯ ctrl-T       # to escape to the fuzzy finder\n```\n\nTab adds trailing slashes to tab names.  This improves autocomplete between tabs and subtabs (e.g. `tab/` and `tab/child/`).\n\n# Installation\nTab currently supports `MacOS` and `Linux`.  Tab supports the `bash`, `fish`, and `zsh` shells.\n\n## 1. Install the binary\n\nThe `tab` binary can be installed using Homebrew, Cargo, or from binaries.\n\n**(Homebrew)**\n```\n❯ brew install austinjones/taps/tab\n```\n\n**(Cargo)**\n```\n❯ cargo install tab\n```\n\n**(Binaries)**\n\nDownload binaries from:\n[https://github.com/austinjones/tab-rs/releases/latest](https://github.com/austinjones/tab-rs/releases/latest)\n\n**(Known Issues)**\n\nThe zsh installer fails if the `/usr/local/share/zsh/site-functions` directory is not writable (and you don't use oh-my-zsh)  See [#221](https://github.com/austinjones/tab-rs/issues/221).\n\nAfter you upgrade tab or move the tab binary, you may want to run the `tab --shutdown` command to restart the daemon.  See [#163](https://github.com/austinjones/tab-rs/issues/163).\n\nIf you get the message `tab: unsupported terminal app`, you fix it by removing the `osx` plugin from your `~/.zshrc`.  See [#156](https://github.com/austinjones/tab-rs/issues/156).\n\nInvoking `tab` with no arguments within a session causes your shell history to be cleared by fuzzy finder output.  When reconnecting to the session, it may require `\u003center\u003e` for the shell prompt to appear.  See [#262](https://github.com/austinjones/tab-rs/issues/262).\n\n## 2. Install autocompletions for your shell\nTab works best when configured with shell autocompletions.  \n\nTab has a built-in script installer which provides a detailed explanation of the changes, and prompts for your confirmation.  You should run it as your standard user account, as it manages files within your home directory.\n\n**(All)**\n\nTab can install completions for all shells \u0026 supported integration which are present on your system.\n```\n❯ tab --install all\n```\n\n**(Bash | Fish | Zsh)**\n\nTab can also install completions for a specific shell.\n```\n❯ tab --install bash\n❯ tab --install fish\n❯ tab --install zsh\n```\n\n\n## 3. Configure your statusline\n\n**(Starship)**\n\nTab integrates with the [starship](https://starship.rs/) prompt, and can auto-configure the integration:\n\n```\n❯ tab --install starship\n```\n\nYou can also put the current tab before the directory in `~/.config/starship.toml`.  This is how I've configured my own shell:\n```\nformat = \"${custom.tab}$all\"\n```\n\n**(Other)**\n\nYou can configure any other statusline tool that supports environment variables.  The current tab name is available in the `$TAB` environment var.\n\nYou can also add a handcrafted statusline snippet to your shell's rc configuration file, in\n[bash](https://github.com/austinjones/tab-rs/blob/main/tab/src/completions/bash/statusline.bash), \n[fish](https://github.com/austinjones/tab-rs/blob/main/tab/src/completions/fish/statusline.fish),\nor [zsh](https://github.com/austinjones/tab-rs/blob/main/tab/src/completions/zsh/statusline.zsh).\n\n# Navigation\nTab is designed to provide quick navigation between tabs, and persistent navigation to workspaces or repositories.  In these examples, the prefix before the `❯` is the selected tab.\n\nTo select a tab:\n```\n# opens the fuzzy finder\n❯ tab   \nfoo/ ❯\n\n# selects a tab by name\nfoo/ ❯ tab bar\nbar/ ❯\n```\n\nTo switch to another tab while within a session, and exit the session:\n```\nfoo/ ❯ tab bar\nbar/ ❯ exit\n❯ \n```\n\nTo switch to another tab while within an interactive application:\n```\nmonitor/ ❯ top\n... top output ...\n[ctrl-T]\n❯ foo\nfoo/ ❯ \n```\n\nEach workspace has it's own tab.  You can use this to quickly reset the working directory within a workspace:\n```\nrepo/ ❯ tab workspace\nworkspace/ ❯\n```\n\nTo switch to another workspace (if a workspace link has been configured in the current workspace [tab.yml](https://github.com/austinjones/tab-rs/blob/main/examples/advanced-workspace/tab.yml)):\n```\nworkspace/ ❯ tab other-workspace\nother-workspace/ ❯\n```\n\n# Configuration\nTab supports configurable sessions, which can be written in YAML.  There are a few types of configurations:\n- User configuration, which can be placed at `~/.config/tab.yml` or `$TAB_CONFIG`.  This configuration is always active, and can be used to define global tabs, or pin links to workspaces for easy access.  It can also be used to [override keybindings](https://github.com/austinjones/tab-rs/blob/main/examples/advanced-workspace/tab.yml#L65).\n- Workspace configurations, which are active within any subdirectory, and link to repositories.\n- Repository configurations, which define tab endpoints.  Your typical `tab` interaction would be switching to one of these repositories via `tab myproj/`.\n\nDetailed documentation is available in the [examples](https://github.com/austinjones/tab-rs/tree/main/examples/) directory, but here are some starter configurations:\n\n\n```\n~/.config/tab.yml or $TAB_CONFIG\n\nworkspace:\n  # this is a global tab, that is always available, and initializes in ~/tab-dir\n  - tab: global-tab\n    doc: \"my global tab doc\"\n    dir: tab-dir\n\n  # this links to a workspace config in ~/my-workspace\n  #   workspaces are only active within the workspace directory\n  #   this creates a link to that workspace, so you can always activate it with `tab my-workspace`\n  - workspace: my-workspace\n```\n\n```\n~/workspace/tab.yml\n\nworkspace:\n  - repo: my-project/\n  - tab: workspace-tab\n    doc: \"this is a top-level workspace tab\"\n  - workspace: ../other-workspace\n```\n\n```\n~/workspace/my-project/tab.yml\n\nrepo: proj\ndoc: \"my project\"\n\ntabs:\n  - tab: run\n    dir: src/\n    doc: \"runs the project server\"\n```\n\nWith these configurations, `tab -l` provides the following:\n```\n$ tab -l\nAvailable tabs:\n    global-tab/       (my global tab doc)\n    proj/             (my project)\n    proj/run/         (runs the project server)\n    workspace-tab/    (this is a top-level workspace tab)\n    other-workspace/  (workspace tab for ~/other-workspace)\n```\n\n# Security\nTab can execute commands in a terminal, so I take security seriously.  This is how I protect your machine in `tab`:\n\nThe `tab` daemon requires the following to accept any websocket connection:\n- The request must include a 128 byte auth token, stored in the file: `~/.tab/daemon-pid.yml`.  On unix operating systems, the file is assigned the permissions `600`.\n- The `Origin` header must not be present in the request.  This prevents any connection from a browser.\n- The daemon binds to `127.0.0.1`.  This should prevent any attempted connections from the local network.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faustinjones%2Ftab-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faustinjones%2Ftab-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faustinjones%2Ftab-rs/lists"}