{"id":13739552,"url":"https://github.com/tmux-python/libtmux","last_synced_at":"2026-04-19T20:04:34.628Z","repository":{"id":37318938,"uuid":"59409425","full_name":"tmux-python/libtmux","owner":"tmux-python","description":"⚙️ Python API / wrapper for tmux","archived":false,"fork":false,"pushed_at":"2026-04-18T13:43:56.000Z","size":5766,"stargazers_count":1162,"open_issues_count":107,"forks_count":117,"subscribers_count":15,"default_branch":"master","last_synced_at":"2026-04-18T15:33:09.637Z","etag":null,"topics":["api","cli","library","python","python-3","terminal","tmux"],"latest_commit_sha":null,"homepage":"https://libtmux.git-pull.com","language":"Python","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/tmux-python.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES","contributing":".github/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2016-05-22T11:46:12.000Z","updated_at":"2026-04-18T13:44:00.000Z","dependencies_parsed_at":"2026-03-08T03:00:43.856Z","dependency_job_id":"4497d10f-c7ed-472a-b045-1fbf8628d665","html_url":"https://github.com/tmux-python/libtmux","commit_stats":{"total_commits":1770,"total_committers":40,"mean_commits":44.25,"dds":0.1022598870056497,"last_synced_commit":"765e2f553962b7d1da5ea0c7066a3ad63d10b269"},"previous_names":[],"tags_count":155,"template":false,"template_full_name":null,"purl":"pkg:github/tmux-python/libtmux","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmux-python%2Flibtmux","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmux-python%2Flibtmux/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmux-python%2Flibtmux/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmux-python%2Flibtmux/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tmux-python","download_url":"https://codeload.github.com/tmux-python/libtmux/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmux-python%2Flibtmux/sbom","scorecard":{"id":890332,"data":{"date":"2025-08-11","repo":{"name":"github.com/tmux-python/libtmux","commit":"295c2f2dfd9447286c77ba28fdbf4a38dfc0359a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.2,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/docs.yml:1","Warn: no topLevel permission defined: .github/workflows/tests.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/tmux-python/libtmux/docs.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docs.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/tmux-python/libtmux/docs.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docs.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/tmux-python/libtmux/docs.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docs.yml:63: update your workflow using https://app.stepsecurity.io/secureworkflow/tmux-python/libtmux/docs.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docs.yml:76: update your workflow using https://app.stepsecurity.io/secureworkflow/tmux-python/libtmux/docs.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/tmux-python/libtmux/tests.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tests.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/tmux-python/libtmux/tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/tmux-python/libtmux/tests.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tests.yml:86: update your workflow using https://app.stepsecurity.io/secureworkflow/tmux-python/libtmux/tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:100: update your workflow using https://app.stepsecurity.io/secureworkflow/tmux-python/libtmux/tests.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tests.yml:103: update your workflow using https://app.stepsecurity.io/secureworkflow/tmux-python/libtmux/tests.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tests.yml:119: update your workflow using https://app.stepsecurity.io/secureworkflow/tmux-python/libtmux/tests.yml/master?enable=pin","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   8 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/tests.yml:90"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}}]},"last_synced_at":"2025-08-24T11:33:31.325Z","repository_id":37318938,"created_at":"2025-08-24T11:33:31.326Z","updated_at":"2025-08-24T11:33:31.326Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32020706,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["api","cli","library","python","python-3","terminal","tmux"],"created_at":"2024-08-03T04:00:35.155Z","updated_at":"2026-04-19T20:04:34.622Z","avatar_url":"https://github.com/tmux-python.png","language":"Python","readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003e⚙️ libtmux\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eDrive tmux from Python: typed, object-oriented control over servers, sessions, windows, and panes.\u003c/strong\u003e\u003c/p\u003e\n  \u003cp\u003e\n    \u003ca href=\"https://libtmux.git-pull.com/\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/tmux-python/libtmux/master/docs/_static/img/libtmux.svg\" alt=\"libtmux logo\" height=\"120\"\u003e\u003c/a\u003e\n  \u003c/p\u003e\n  \u003cp\u003e\n    \u003ca href=\"https://pypi.org/project/libtmux/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/v/libtmux.svg\" alt=\"PyPI version\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://libtmux.git-pull.com/\"\u003e\u003cimg src=\"https://github.com/tmux-python/libtmux/workflows/docs/badge.svg\" alt=\"Docs status\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/tmux-python/libtmux/actions\"\u003e\u003cimg src=\"https://github.com/tmux-python/libtmux/workflows/tests/badge.svg\" alt=\"Tests status\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://codecov.io/gh/tmux-python/libtmux\"\u003e\u003cimg src=\"https://codecov.io/gh/tmux-python/libtmux/branch/master/graph/badge.svg\" alt=\"Coverage\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/tmux-python/libtmux/blob/master/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/tmux-python/libtmux.svg\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n## 🐍 What is libtmux?\n\nlibtmux is a typed Python API over [tmux], the terminal multiplexer. Stop shelling out and parsing `tmux ls`. Instead, interact with real Python objects: `Server`, `Session`, `Window`, and `Pane`. The same API powers [tmuxp], so it stays battle-tested in real-world workflows.\n\n### ✨ Features\n\n- Typed, object-oriented control of tmux state\n- Query and [traverse](https://libtmux.git-pull.com/topics/traversal/) live sessions, windows, and panes\n- Raw escape hatch via `.cmd(...)` on any object\n- Works with multiple tmux sockets and servers\n- [Context managers](https://libtmux.git-pull.com/topics/context_managers/) for automatic cleanup\n- [pytest plugin](https://libtmux.git-pull.com/api/pytest-plugin/) for isolated tmux fixtures\n- Proven in production via tmuxp and other tooling\n\n## Requirements \u0026 support\n\n- tmux: \u003e= 3.2a\n- Python: \u003e= 3.10 (CPython and PyPy)\n\nMaintenance-only backports (no new fixes):\n\n- Python 2.x: [`v0.8.x`](https://github.com/tmux-python/libtmux/tree/v0.8.x)\n- tmux 1.8-3.1c: [`v0.48.x`](https://github.com/tmux-python/libtmux/tree/v0.48.x)\n\n## 📦 Installation\n\nStable release:\n\n```console\n$ pip install libtmux\n```\n\nWith pipx:\n\n```console\n$ pipx install libtmux\n```\n\nWith uv / uvx:\n\n```console\n$ uv add libtmux\n```\n\n```console\n$ uvx --from \"libtmux\" python\n```\n\nFrom the main branch (bleeding edge):\n\n```console\n$ pip install 'git+https://github.com/tmux-python/libtmux.git'\n```\n\nTip: libtmux is pre-1.0. Pin a range in projects to avoid surprises:\n\nrequirements.txt:\n\n```ini\nlibtmux==0.50.*\n```\n\npyproject.toml:\n\n```toml\nlibtmux = \"0.50.*\"\n```\n\n## 🚀 Quickstart\n\n### Open a tmux session\n\nFirst, start a tmux session to connect to:\n\n```console\n$ tmux new-session -s foo -n bar\n```\n\n### Pilot your tmux session via Python\n\nUse [ptpython], [ipython], etc. for a nice REPL with autocompletions:\n\n```console\n$ pip install --user ptpython\n```\n\n```console\n$ ptpython\n```\n\nConnect to a live tmux session:\n\n```python\n\u003e\u003e\u003e import libtmux\n\u003e\u003e\u003e svr = libtmux.Server()\n\u003e\u003e\u003e svr\nServer(socket_path=/tmp/tmux-.../default)\n```\n\n**Tip:** You can also use [tmuxp]'s [`tmuxp shell`] to drop straight into your\ncurrent tmux server / session / window / pane.\n\n[ptpython]: https://github.com/prompt-toolkit/ptpython\n[ipython]: https://ipython.org/\n[`tmuxp shell`]: https://tmuxp.git-pull.com/cli/shell/\n\n### Run any tmux command\n\nEvery object has a `.cmd()` escape hatch that honors socket name and path:\n\n```python\n\u003e\u003e\u003e server = Server(socket_name='libtmux_doctest')\n\u003e\u003e\u003e server.cmd('display-message', 'hello world')\n\u003clibtmux...\u003e\n```\n\nCreate a new session:\n\n```python\n\u003e\u003e\u003e server.cmd('new-session', '-d', '-P', '-F#{session_id}').stdout[0]\n'$...'\n```\n\n### List and filter sessions\n\n[**Learn more about Filtering**](https://libtmux.git-pull.com/topics/filtering/)\n\n```python\n\u003e\u003e\u003e server.sessions\n[Session($... ...), ...]\n```\n\nFilter by attribute:\n\n```python\n\u003e\u003e\u003e server.sessions.filter(history_limit='2000')\n[Session($... ...), ...]\n```\n\nDirect lookup:\n\n```python\n\u003e\u003e\u003e server.sessions.get(session_id=session.session_id)\nSession($... ...)\n```\n\n### Control sessions and windows\n\n[**Learn more about Workspace Setup**](https://libtmux.git-pull.com/topics/workspace_setup/)\n\n```python\n\u003e\u003e\u003e session.rename_session('my-session')\nSession($... my-session)\n```\n\nCreate new window in the background (don't switch to it):\n\n```python\n\u003e\u003e\u003e bg_window = session.new_window(attach=False, window_name=\"bg-work\")\n\u003e\u003e\u003e bg_window\nWindow(@... ...:bg-work, Session($... ...))\n\n\u003e\u003e\u003e session.windows.filter(window_name__startswith=\"bg\")\n[Window(@... ...:bg-work, Session($... ...))]\n\n\u003e\u003e\u003e session.windows.get(window_name__startswith=\"bg\")\nWindow(@... ...:bg-work, Session($... ...))\n\n\u003e\u003e\u003e bg_window.kill()\n```\n\n### Split windows and send keys\n\n[**Learn more about Pane Interaction**](https://libtmux.git-pull.com/topics/pane_interaction/)\n\n```python\n\u003e\u003e\u003e pane = window.split(attach=False)\n\u003e\u003e\u003e pane\nPane(%... Window(@... ...:..., Session($... ...)))\n```\n\nType inside the pane (send keystrokes):\n\n```python\n\u003e\u003e\u003e pane.send_keys('echo hello')\n\u003e\u003e\u003e pane.send_keys('echo hey', enter=False)\n\u003e\u003e\u003e pane.enter()\nPane(%... ...)\n```\n\n### Capture pane output\n\n```python\n\u003e\u003e\u003e pane.clear()\nPane(%... ...)\n\u003e\u003e\u003e pane.send_keys(\"echo 'hello world'\", enter=True)\n\u003e\u003e\u003e pane.cmd('capture-pane', '-p').stdout  # doctest: +SKIP\n[\"$ echo 'hello world'\", 'hello world', '$']\n```\n\n### Traverse the hierarchy\n\n[**Learn more about Traversal**](https://libtmux.git-pull.com/topics/traversal/)\n\nNavigate from pane up to window to session:\n\n```python\n\u003e\u003e\u003e pane.window\nWindow(@... ...:..., Session($... ...))\n\u003e\u003e\u003e pane.window.session\nSession($... ...)\n```\n\n## Core concepts\n\n| libtmux object | tmux concept                | Notes                          |\n|----------------|-----------------------------|--------------------------------|\n| [`Server`](https://libtmux.git-pull.com/api/libtmux.server/) | tmux server / socket | Entry point; owns sessions |\n| [`Session`](https://libtmux.git-pull.com/api/libtmux.session/) | tmux session (`$0`, `$1`,...) | Owns windows |\n| [`Window`](https://libtmux.git-pull.com/api/libtmux.window/) | tmux window (`@1`, `@2`,...) | Owns panes |\n| [`Pane`](https://libtmux.git-pull.com/api/libtmux.pane/) | tmux pane (`%1`, `%2`,...) | Where commands run |\n\nAlso available: [`Options`](https://libtmux.git-pull.com/api/libtmux.options/) and [`Hooks`](https://libtmux.git-pull.com/api/libtmux.hooks/) abstractions for tmux configuration.\n\nCollections are live and queryable:\n\n```python\nserver = libtmux.Server()\nsession = server.sessions.get(session_name=\"demo\")\napi_windows = session.windows.filter(window_name__startswith=\"api\")\npane = session.active_window.active_pane\npane.send_keys(\"echo 'hello from libtmux'\", enter=True)\n```\n\n## tmux vs libtmux vs tmuxp\n\n| Tool    | Layer                      | Typical use case                                   |\n|---------|----------------------------|----------------------------------------------------|\n| tmux    | CLI / terminal multiplexer | Everyday terminal usage, manual control            |\n| libtmux | Python API over tmux       | Programmatic control, automation, testing          |\n| tmuxp   | App on top of libtmux      | Declarative tmux workspaces from YAML / TOML       |\n\n## Testing \u0026 fixtures\n\n[**Learn more about the pytest plugin**](https://libtmux.git-pull.com/api/pytest-plugin/)\n\nWriting a tool that interacts with tmux? Use our fixtures to keep your tests clean and isolated.\n\n```python\ndef test_my_tmux_tool(session):\n    # session is a real tmux session in an isolated server\n    window = session.new_window(window_name=\"test\")\n    pane = window.active_pane\n    pane.send_keys(\"echo 'hello from test'\", enter=True)\n\n    assert window.window_name == \"test\"\n    # Fixtures handle cleanup automatically\n```\n\n- Fresh tmux server/session/window/pane fixtures per test\n- Temporary HOME and tmux config fixtures keep indices stable\n- `TestServer` helper spins up multiple isolated tmux servers\n\n## When you might not need libtmux\n\n- Layouts are static and live entirely in tmux config files\n- You do not need to introspect or control running tmux from other tools\n- Python is unavailable where tmux is running\n\n## Project links\n\n**Topics:**\n[Traversal](https://libtmux.git-pull.com/topics/traversal/) ·\n[Filtering](https://libtmux.git-pull.com/topics/filtering/) ·\n[Pane Interaction](https://libtmux.git-pull.com/topics/pane_interaction/) ·\n[Workspace Setup](https://libtmux.git-pull.com/topics/workspace_setup/) ·\n[Automation Patterns](https://libtmux.git-pull.com/topics/automation_patterns/) ·\n[Context Managers](https://libtmux.git-pull.com/topics/context_managers/) ·\n[Options \u0026 Hooks](https://libtmux.git-pull.com/topics/options_and_hooks/)\n\n**Reference:**\n[Docs][docs] ·\n[API][api] ·\n[pytest plugin](https://libtmux.git-pull.com/api/pytest-plugin/) ·\n[Architecture][architecture] ·\n[Changelog][history] ·\n[Migration][migration]\n\n**Project:**\n[Issues][issues] ·\n[Coverage][coverage] ·\n[Releases][releases] ·\n[License][license] ·\n[Support][support]\n\n**[The Tao of tmux][tao]** — deep-dive book on tmux fundamentals\n\n## Contributing \u0026 support\n\nContributions are welcome. Please open an issue or PR if you find a bug or want to improve the API or docs. If libtmux helps you ship, consider sponsoring development via [support].\n\n[docs]: https://libtmux.git-pull.com\n[api]: https://libtmux.git-pull.com/api/\n[architecture]: https://libtmux.git-pull.com/topics/architecture/\n[history]: https://libtmux.git-pull.com/history/\n[migration]: https://libtmux.git-pull.com/migration/\n[issues]: https://github.com/tmux-python/libtmux/issues\n[coverage]: https://codecov.io/gh/tmux-python/libtmux\n[releases]: https://pypi.org/project/libtmux/\n[license]: https://github.com/tmux-python/libtmux/blob/master/LICENSE\n[support]: https://tony.sh/support.html\n[tao]: https://leanpub.com/the-tao-of-tmux\n[tmuxp]: https://tmuxp.git-pull.com\n[tmux]: https://github.com/tmux/tmux\n","funding_links":[],"categories":["Python","\u003ca name=\"tools\"\u003e\u003c/a\u003eTools and session management"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmux-python%2Flibtmux","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftmux-python%2Flibtmux","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmux-python%2Flibtmux/lists"}