{"id":49756673,"url":"https://github.com/ron537/dplex","last_synced_at":"2026-06-16T08:00:31.550Z","repository":{"id":356172407,"uuid":"1206033282","full_name":"Ron537/DPlex","owner":"Ron537","description":"Terminal multiplexer for AI-assisted development — manage Copilot CLI, Claude Code, and regular shells across projects in one window.","archived":false,"fork":false,"pushed_at":"2026-05-29T19:43:44.000Z","size":5113,"stargazers_count":14,"open_issues_count":22,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-05-29T21:12:59.744Z","etag":null,"topics":["ai-tools","claude","claude-code","copilot","copilot-cli","developer","developer-multiplexer","developer-tools","electron","productivity","productivity-tool","react","terminal","terminal-multiplexer","typescript","worktrees","xterm"],"latest_commit_sha":null,"homepage":"https://ron537.github.io/DPlex/","language":"TypeScript","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/Ron537.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-09T14:07:10.000Z","updated_at":"2026-05-29T19:39:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Ron537/DPlex","commit_stats":null,"previous_names":["ron537/dplex"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/Ron537/DPlex","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ron537%2FDPlex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ron537%2FDPlex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ron537%2FDPlex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ron537%2FDPlex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ron537","download_url":"https://codeload.github.com/Ron537/DPlex/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ron537%2FDPlex/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34396429,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"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":["ai-tools","claude","claude-code","copilot","copilot-cli","developer","developer-multiplexer","developer-tools","electron","productivity","productivity-tool","react","terminal","terminal-multiplexer","typescript","worktrees","xterm"],"created_at":"2026-05-10T22:11:08.855Z","updated_at":"2026-06-16T08:00:31.516Z","avatar_url":"https://github.com/Ron537.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# DPlex\n\n**A desktop workspace for the AI CLI sessions you run every day.**\n\nDPlex **discovers** every **Copilot CLI** / **Claude Code** session you've ever started, lets you **resume** any of them in one click, and **auto-restores every open session tab** the next time you open the app — splits, order, working directory, and resume command preserved. On top of that: the multiplexer essentials — split panes, tabs, projects, worktrees, and a built-in VSCode-style Source Control view.\n\n[![Tests](https://github.com/Ron537/DPlex/actions/workflows/tests.yml/badge.svg)](https://github.com/Ron537/DPlex/actions/workflows/tests.yml)\n[![CodeQL](https://github.com/Ron537/DPlex/actions/workflows/codeql.yml/badge.svg)](https://github.com/Ron537/DPlex/actions/workflows/codeql.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE)\n[![Latest release](https://img.shields.io/github/v/release/Ron537/DPlex?include_prereleases\u0026sort=semver)](https://github.com/Ron537/DPlex/releases)\n[![Downloads](https://img.shields.io/github/downloads/Ron537/DPlex/total)](https://github.com/Ron537/DPlex/releases)\n[![Issues](https://img.shields.io/github/issues/Ron537/DPlex)](https://github.com/Ron537/DPlex/issues)\n[![Discussions](https://img.shields.io/github/discussions/Ron537/DPlex)](https://github.com/Ron537/DPlex/discussions)\n\n\n[Quick install](#quick-install) · [Features](#features) · [Screenshots](#screenshots) · [How DPlex compares](#how-dplex-compares) · [Architecture](./docs/architecture.md) · [Add a provider](./docs/providers.md) · [Privacy](./PRIVACY.md) · [Contributing](./CONTRIBUTING.md)\n\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./docs/assets/demo.gif\" alt=\"DPlex demo: switching between Projects and Source Control, then opening the Sessions panel, resuming a past AI session in one click, and chatting with the resumed Copilot session\" width=\"900\" /\u003e\n\u003c/p\u003e\n\n\u003e **🚧 Pre-1.0.** DPlex is functional and used daily by its author, but\n\u003e APIs, settings layout, and on-disk formats may shift between minor\n\u003e versions while we feel out the right shape. Please pin your version\n\u003e and read the [CHANGELOG](./CHANGELOG.md) before upgrading.\n\n---\n\n## Why DPlex?\n\nWhen working with AI CLI tools across multiple projects, you end up with a mess of terminal windows — a Copilot session here, a Claude session there, plus regular shells scattered everywhere, and not a single one of them survives a reboot. DPlex gives you one home for all of it, with **AI session management as the headline feature**:\n\n- **🗂️ Discover every past session.** DPlex reads each provider's data directory and surfaces every Copilot CLI / Claude Code session you've ever started — searchable by name, ID, summary, or workspace.\n- **▶️ Resume in one click.** Click any past session and it opens in a new tab with the correct resume command and original CWD. No copy-pasting session IDs from `~/.copilot/...`.\n- **⏹️ Close active sessions from the sidebar.** Stop running AI sessions without hunting for their terminal — closing a tab fully terminates the underlying process.\n- **🗑️ Delete from disk.** Remove a session's stored data when you're done, with confirmation.\n- **♻️ Auto-restore session tabs across restarts.** Quit the app, reopen it tomorrow — every AI session tab snaps back exactly where it was, with the right resume command, CWD, splits, and tab order preserved.\n- **One window** for everything: split panes, tabs, and an activity bar (Projects · Sessions · Source Control).\n- **Project-aware workflow** — group sessions by project, start a new AI session in any folder with one click.\n- **Worktree-friendly** — first-class Git worktree support so concurrent feature work doesn't pollute your main checkout.\n- **Built-in Source Control** — VSCode-style changes view scoped to whichever project (or worktree) you pick.\n- **No telemetry. No analytics.** Read [PRIVACY.md](./PRIVACY.md) — it's a one-page promise, backed by `grep`-able source.\n\n## Quick install\n\n\u003e **Note:** DPlex binaries are currently **unsigned** while we wait on\n\u003e Apple Developer / Windows code-signing certificates. The app is open\n\u003e source and the build is fully reproducible from source — see\n\u003e [Verify the build](#verify-the-build) below.\n\n### macOS\n\n```bash\n# Apple Silicon\ncurl -L https://github.com/Ron537/DPlex/releases/latest/download/DPlex-arm64.dmg -o DPlex.dmg\n# Intel\ncurl -L https://github.com/Ron537/DPlex/releases/latest/download/DPlex-x64.dmg -o DPlex.dmg\n\n# Open the DMG, drag DPlex to /Applications, then on first launch:\nxattr -dr com.apple.quarantine /Applications/DPlex.app\nopen /Applications/DPlex.app\n```\n\nThe `xattr` line removes the macOS quarantine flag once you've inspected\nthe build — equivalent to right-clicking the app and choosing **Open**,\nbut cleaner from the terminal.\n\n### Windows\n\nDownload `DPlex-Setup.exe` from the [Releases page](https://github.com/Ron537/DPlex/releases/latest)\nand run it. SmartScreen will warn you about the unsigned installer —\nclick **More info → Run anyway** after verifying the file's SHA-256\nmatches the value published on the release page.\n\n```powershell\nInvoke-WebRequest -Uri https://github.com/Ron537/DPlex/releases/latest/download/DPlex-Setup.exe -OutFile DPlex-Setup.exe\n.\\DPlex-Setup.exe\n```\n\n### Linux\n\n```bash\n# AppImage (any distro)\ncurl -L https://github.com/Ron537/DPlex/releases/latest/download/DPlex.AppImage -o DPlex.AppImage\nchmod +x DPlex.AppImage\n./DPlex.AppImage\n\n# Debian / Ubuntu\ncurl -LO https://github.com/Ron537/DPlex/releases/latest/download/DPlex-amd64.deb\nsudo dpkg -i DPlex-amd64.deb\n```\n\n### Run from source\n\nRequires **Node.js 18+** (we develop on 22 LTS) and Git.\n\n```bash\ngit clone https://github.com/Ron537/DPlex.git\ncd DPlex\nnpm install\nnpm run dev\n```\n\n### Build for distribution\n\n```bash\nnpm run build:mac     # macOS .dmg + .zip (arm64 + x64)\nnpm run build:win     # Windows .exe installer\nnpm run build:linux   # Linux .AppImage + .deb + .snap\n```\n\n### Verify the build\n\nEvery release is built from a tagged commit by GitHub Actions. To\nreproduce locally:\n\n```bash\ngit checkout v0.9.0          # or whichever release you want\nnpm ci --ignore-scripts\nnpm run build\n# Compare the SHA-256 of your local build with the release's published checksums.\n```\n\nCI logs and SBOMs are attached to every release.\n\n## Screenshots\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" width=\"50%\"\u003e\n      \u003ca href=\"./docs/assets/01-hero-projects.png\"\u003e\u003cimg src=\"./docs/assets/01-hero-projects.png\" alt=\"Projects view with worktrees and a running AI session\" /\u003e\u003c/a\u003e\n      \u003cbr\u003e\u003csub\u003e\u003cb\u003eProjects view.\u003c/b\u003e Pinned projects + worktrees + nested AI sessions, one click away.\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" width=\"50%\"\u003e\n      \u003ca href=\"./docs/assets/02-sessions-panel.png\"\u003e\u003cimg src=\"./docs/assets/02-sessions-panel.png\" alt=\"Sessions panel with active and historical AI sessions\" /\u003e\u003c/a\u003e\n      \u003cbr\u003e\u003csub\u003e\u003cb\u003eSessions panel.\u003c/b\u003e Every Copilot CLI / Claude Code session you've ever started, searchable. Click to resume, right-click to delete from disk.\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"./docs/assets/03-source-control.png\"\u003e\u003cimg src=\"./docs/assets/03-source-control.png\" alt=\"Source Control panel showing git changes\" /\u003e\u003c/a\u003e\n      \u003cbr\u003e\u003csub\u003e\u003cb\u003eSource Control.\u003c/b\u003e VSCode-style changes for the selected project — pick any worktree from the dropdown.\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"./docs/assets/06-project-picker.png\"\u003e\u003cimg src=\"./docs/assets/06-project-picker.png\" alt=\"Project picker dropdown listing every project and worktree\" /\u003e\u003c/a\u003e\n      \u003cbr\u003e\u003csub\u003e\u003cb\u003eProject picker.\u003c/b\u003e Switch the Source Control view to any project or worktree without leaving Git.\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"./docs/assets/07-split-screen.png\"\u003e\u003cimg src=\"./docs/assets/07-split-screen.png\" alt=\"Split panes — three terminals visible at once\" /\u003e\u003c/a\u003e\n      \u003cbr\u003e\u003csub\u003e\u003cb\u003eSplits \u0026 tabs.\u003c/b\u003e Horizontal + vertical splits with multiple AI sessions running side-by-side.\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"./docs/assets/08-worktrees-settings.png\"\u003e\u003cimg src=\"./docs/assets/08-worktrees-settings.png\" alt=\"Worktree creation defaults in Settings\" /\u003e\u003c/a\u003e\n      \u003cbr\u003e\u003csub\u003e\u003cb\u003eWorktree defaults.\u003c/b\u003e Location pattern, env files, post-create scripts — set once, reused everywhere.\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"./docs/assets/04-settings-notifications.png\"\u003e\u003cimg src=\"./docs/assets/04-settings-notifications.png\" alt=\"Notification settings with per-event toggles\" /\u003e\u003c/a\u003e\n      \u003cbr\u003e\u003csub\u003e\u003cb\u003eNotification controls.\u003c/b\u003e Per-event toggles, Do Not Disturb, focus-aware suppression.\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"./docs/assets/05-light-theme.png\"\u003e\u003cimg src=\"./docs/assets/05-light-theme.png\" alt=\"Same projects view in light theme\" /\u003e\u003c/a\u003e\n      \u003cbr\u003e\u003csub\u003e\u003cb\u003eLight themes too.\u003c/b\u003e GitHub Light, Solarized Light, Quiet Light — terminal palette and UI stay in sync.\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Features\n\n### AI session management\n\n\u003e The headline feature. DPlex gives you full lifecycle control over the\n\u003e Copilot CLI / Claude Code sessions you actually work with daily.\n\n- **🗂️ Past-session list.** Every session you've ever started, surfaced\n  in the **Sessions** activity-bar panel — searchable by name, ID,\n  summary, or workspace, grouped by recency or by project.\n- **▶️ One-click resume.** Click any past session to reopen it in a new\n  tab with the correct resume command and original CWD pre-filled. The\n  re-spawned PTY is matched back to its provider session ID so the\n  active-session indicator lights up automatically once the AI tool\n  writes its lock file.\n- **🟢 Live active-session indicators.** Active sessions are detected\n  via provider lock files (`inuse.\u003cPID\u003e.lock` for Copilot, pidfiles for\n  Claude) with PID liveness checks, so the sidebar always reflects what\n  is actually running.\n- **⏹️ Close active sessions from the sidebar.** Stop a running AI\n  session without finding its terminal — closing the tab fully\n  terminates the underlying process.\n- **🗑️ Delete sessions from disk.** Remove a session's stored history\n  when you're done with it (with confirmation).\n- **🧠 Prompt-history viewer.** Browse and search the prompts you've\n  sent in any past session — useful for re-running, copy-pasting, or\n  remembering what you asked yesterday.\n- **📌 Recent sessions per project.** Each expanded project (and\n  worktree) lists its last few idle sessions inline, so you can resume\n  them without leaving the projects panel.\n- **🧩 Provider-agnostic.** Same start / resume / close / delete flow\n  whether the underlying tool is Copilot CLI, Claude Code, or one you\n  add yourself — see [docs/providers.md](./docs/providers.md).\n\n### Workspace persistence (auto-restore on restart)\n\n\u003e **Close the app today, open it tomorrow — every AI session tab is\n\u003e back exactly where you left it.** This is the feature DPlex was built\n\u003e around.\n\n- **Every AI session tab is restored.** Tabs are serialized to\n  `sessions.json` in the Electron `userData` directory on every natural\n  lifecycle event and synchronously on quit, so a SIGTERM doesn't lose\n  state.\n- **Splits and tab order survive too.** Horizontal/vertical splits, tab\n  order within each pane, the active group, and the active tab are all\n  rebuilt on launch.\n- **Resume command + CWD preserved.** Each restored tab is recreated\n  with its original resume command and working directory. A short retry\n  loop re-resolves the underlying provider session ID once the AI tool\n  writes its lock file, so active-session indicators light up\n  automatically.\n- **History is independent of workspace state.** Even after a hard kill\n  (SIGKILL/OOM) the session *history* is untouched — every previous\n  session is still discoverable and resumable from the Sessions panel.\n\n### Activity bar — Projects · Sessions · Source Control\n\n- **VSCode-style activity bar** on the far left. One click jumps between projects, sessions, and git changes.\n- **Click the active item to collapse the panel** for maximum editor space.\n- **Settings gear** at the bottom of the activity bar for quick access.\n\n### Multi-provider AI sessions\n\n- **Provider-agnostic architecture.** Built-in support for **GitHub Copilot CLI** and **Anthropic Claude Code** out of the box.\n- **One interface for all providers.** Same start / resume / close flow regardless of the underlying tool.\n- **Pluggable.** Add a provider by implementing one TypeScript interface — see [docs/providers.md](./docs/providers.md). PRs welcome.\n- **Auto-detection.** Sessions remember which provider they belong to so resume commands are always correct.\n\n### Terminal multiplexer\n\n- **Split panes** — horizontal and vertical splits with resizable dividers.\n- **Tabbed interface** — multiple terminals per pane, drag tabs between panes.\n- **Tab reordering** — drag and drop within and across groups.\n- **Drag a tab onto another pane's edge** to create a new split right there — handy for putting a freshly-resumed AI session next to the one you already had open.\n- **Shell selector** — pick from auto-detected system shells (bash, zsh, fish, PowerShell, etc.) when opening a new terminal.\n\n### Project management\n\n- **Project sidebar** with active session indicators and Git branch badge.\n- **One-click AI sessions** in any project directory.\n- **Pinned projects** float to the top, with an \"All projects\" section below.\n- **Drag-and-drop reordering** for projects.\n- **Quick actions** — open terminal, copy path, remove project from the right-click menu.\n- **Git worktrees** — create, manage, remove worktrees per project, with worktree-specific session lists. Worktrees are first-class projects in the sidebar.\n\n### Source Control\n\n- **Project-scoped changes view** — file list for whichever project (or worktree) you've selected.\n- **Header dropdown** to switch projects without leaving Git.\n- **Single-click preview** + **double-click promotes to a permanent diff tab** (VSCode behavior).\n- **Live updates** via filesystem watchers — changes appear as you save.\n\n### Attention inbox\n\n- **Notification bell** — aggregated inbox surfaces sessions that need you, with an unread badge in the title bar.\n- **Event kinds** — separate signals for *waiting for approval*, *waiting for input*, and *finished*.\n- **Auto-dismiss on focus** — events clear when you focus the relevant tab.\n- **Configurable cooldown** — tune how often a session can re-notify to avoid noise.\n- **Jump-to-session** — click any inbox entry to activate its tab.\n\n### Theming\n\n12 built-in themes with matched terminal and UI colors:\n\n- **Dark** — DPlex, Dark, Midnight, Dracula, Monokai, Nord, Solarized Dark, GitHub Dark.\n- **Light** — DPlex Light, GitHub Light, Solarized Light, Quiet Light.\n\n### Keyboard shortcuts\n\n| Shortcut | Action                       |\n| -------- | ---------------------------- |\n| `⌘T`     | New terminal                 |\n| `⌘W`     | Close terminal               |\n| `⌘B`     | Toggle sidebar               |\n| `⌘,`     | Open settings                |\n| `⌘\\`     | Split horizontal             |\n| `⌘⇧\\`    | Split vertical               |\n| `⌘⇧G`    | Toggle Source Control view   |\n| `⌘F`     | Focus side-panel search      |\n| `⌘1-9`   | Switch to tab N              |\n\n(`⌘` = `Ctrl` on Linux/Windows.)\n\n## How DPlex compares\n\nThere are great tools in adjacent niches. DPlex isn't trying to replace any of them — it's optimizing for one specific workflow: **running multiple AI CLI sessions across multiple projects without losing your place.**\n\n| Tool                       | Niche                                  | Where it differs from DPlex                                                                            |\n| -------------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------ |\n| **tmux** / **Zellij**      | Terminal multiplexer, server-side      | Powerful but generic; no AI-tool awareness, no project sidebar, no session discovery.                  |\n| **Warp**                   | AI-augmented terminal                  | Beautiful, but the AI is *theirs*, not the CLI tool you already use. Closed source.                    |\n| **iTerm2** / **WezTerm**   | Best-in-class terminal emulators       | More polished as terminals; no orchestration of external AI sessions.                                  |\n| **VS Code terminal panel** | Embedded terminals in the IDE          | Fine for ad-hoc shells; not designed for managing many concurrent AI sessions across many repos.       |\n| **Wave Terminal**          | AI-focused terminal                    | Adjacent vision; broader scope, more opinionated UI. DPlex is narrower and Electron-portable today.    |\n| **Zed / Cursor**           | AI-native editors                      | They embed the AI in the editor; DPlex orchestrates the AI you already use from the terminal.          |\n\nIf your goal is \"I want to start a Claude session in repo A today, a Copilot session in repo B tomorrow, find yesterday's sessions whenever I need them, resume any of them in one click, and reopen the app next week with every tab right where I left it\" — that's DPlex.\n\n## FAQ / Troubleshooting\n\n**My AI tool isn't being detected.**\nCheck that the binary is on the same `$PATH` your default shell sees. DPlex spawns its PTYs via your login shell, so anything missing from `~/.zprofile` or `~/.bashrc` won't be found.\n\n**An AI session shows as inactive even though it's running.**\nDPlex detects active sessions via the tool's lock files (`inuse.\u003cPID\u003e.lock` for Copilot, pidfiles for Claude). If the tool's lock format changed in an upstream release, please open an issue with your version + OS — usually a one-line fix in the provider.\n\n**My session tabs didn't restore after a crash.**\nWorkspace state is saved on graceful quit and during natural lifecycle events; a hard kill (SIGKILL, OOM) can lose unsaved tabs. The session *history* is unaffected — your past sessions are still discoverable from the Sessions list.\n\n**The app won't open on macOS — \"DPlex is damaged\" or \"from an unidentified developer.\"**\nUntil proper notarization lands, run:\n\n```bash\nxattr -dr com.apple.quarantine /Applications/DPlex.app\n```\n\n…or right-click the app and choose **Open**. macOS remembers your choice after the first launch.\n\n**The Windows installer is flagged by SmartScreen.**\nUntil code signing lands: click **More info → Run anyway** after verifying the SHA-256 matches the release page. The installer is unmodified from CI.\n\n**I want feature X / I'd like a provider for tool Y.**\n[Open an issue](https://github.com/Ron537/DPlex/issues/new/choose). For new providers there's a dedicated template — see [docs/providers.md](./docs/providers.md) if you want to send a PR.\n\n## Architecture\n\nDPlex uses `electron-vite` with three process targets — main (Node), preload (IPC bridge), and renderer (React).\n\nFor the deep dive — security posture, state stores, terminal lifecycle, IPC pattern, and provider system — see [**docs/architecture.md**](./docs/architecture.md).\n\n## Tech stack\n\n| Layer       | Technology                                                                  |\n| ----------- | --------------------------------------------------------------------------- |\n| Framework   | Electron 39                                                                 |\n| Build       | electron-vite + Vite 7                                                      |\n| Frontend    | React 19, TypeScript 5.9                                                    |\n| Styling     | Tailwind CSS v4                                                             |\n| State       | Zustand 5                                                                   |\n| Terminal    | xterm.js 6 (with WebGL, fit, web-links addons)                              |\n| PTY         | node-pty                                                                    |\n| Icons       | lucide-react                                                                |\n| Packaging   | electron-builder + electron-updater                                         |\n| Tests       | Vitest (unit) + Playwright (e2e + monkey)                                   |\n\n## Contributing\n\nContributions are very welcome. Read [**CONTRIBUTING.md**](./CONTRIBUTING.md) for the dev setup, conventions, and PR checklist.\n\nThe fastest way to expand DPlex's reach is **implementing a new provider** — see [docs/providers.md](./docs/providers.md). Bug reports with reproduction steps are equally valuable.\n\nLooking for something to start with? Browse [issues labelled `good first issue`](https://github.com/Ron537/DPlex/labels/good%20first%20issue).\n\n## Privacy \u0026 security\n\n- **No telemetry, ever.** Read [PRIVACY.md](./PRIVACY.md) — it's auditable.\n- Report security issues privately per [SECURITY.md](./SECURITY.md).\n\n## License\n\nDPlex is open source under the [MIT License](./LICENSE).\n\n---\n\n\u003cdiv align=\"center\"\u003e\n  \u003csub\u003eBuilt with ❤️ by developers who got tired of having 14 terminal windows open.\u003c/sub\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fron537%2Fdplex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fron537%2Fdplex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fron537%2Fdplex/lists"}