Open a folder and start working. Duckweed keeps real shells, coding agents, Git context, diffs, tabs, and panes in one place across Windows, macOS, and Linux. There is no Duckweed account to create, no cloud workspace to set up, and nothing to sync before your first command.
Launch several coding agents side by side in the same window. Duckweed gives each one a dedicated interface for conversations, tool calls, plans, permissions, and file changes, without taking away the terminal when you need it.
Windows x64 · macOS universal · Linux x64 · signed in-app updates
Download · Screenshots · What it does · Agent usage · Shortcuts · Build from source · Contributing
These images were captured from the running app with built-in demo content. No accounts, credentials, personal paths, or private project data are shown.
Vibe-coding sessions get messy fast. One agent is implementing a change, another shell is running tests, logs are moving in a third pane, and the Git diff is somewhere behind all of them.
Duckweed is the terminal workspace I wanted for that kind of work. It has the freedom of a tiling layout, but it still behaves like a regular terminal. Open your project, arrange the panes once, and let each agent or command have its own space. Multiple panes can show Duckweed's custom agent interface at the same time, so separate agents can work in parallel without being spread across separate application windows.
Duckweed does not host your repository or wrap your coding tools in another service. It runs the shells and CLIs already installed on your computer. Layouts and settings are saved locally, and agent usage is calculated from the local session files those tools already keep.
- Download the latest stable release.
- Open the folder for the project you are working on.
- Press
Ctrl+Shift+DorCtrl+Shift+Eto make a second pane. - Keep a normal shell in one pane, launch your coding agent in another, and run tests in a third when you need it.
- Use
Ctrl+Shift+Gto review the uncommitted diff before you commit.
Duckweed does not install coding agents, create provider accounts, or provide API credentials. Install and sign in to the CLIs you already use first, then confirm each one works in a regular terminal. The quick start has platform notes and a first-workspace walkthrough.
Duckweed is a good fit when you want several local shells or agent interfaces visible at once. If you only need one fast terminal, or already have a layout you love in tmux, Ghostty, or WezTerm, keep using that.
Download the latest stable release
This is the normal install and the recommended choice. The link is permanent: GitHub always sends it to the newest stable Duckweed release.
Download the newest Windows beta installer
Beta builds ship earlier and may be rough around the edges. They follow their own update channel, so a beta install receives beta updates and a stable install only receives stable ones. Install the other build manually whenever you want to switch channels. The beta download URL stays the same while the file behind it is replaced on every beta release. macOS and Linux beta packages are attached to each versioned beta release.
The Windows installer is per-user. It does not ask for administrator access, and later updates can be installed from the version chip in the status bar or from Check for updates in the command palette.
Windows SmartScreen may warn on the first install because the installer is not yet code-signed. Duckweed's built-in updater still verifies every update with the project's update signature.
If the first launch does not go smoothly, start with troubleshooting. For a reproducible bug, the bug-report form asks for the small amount of platform and shell information that makes a fix possible.
Official releases include:
| Platform | Package | Update behavior |
|---|---|---|
| Windows x64 | NSIS .exe |
In-app updater |
| macOS Intel and Apple Silicon | Universal .dmg |
In-app updater |
| Linux x64 | .AppImage |
In-app updater |
| Debian and Ubuntu x64 | .deb |
In-app updater with an authentication prompt |
On macOS, open the DMG and move Duckweed to Applications. Until the optional Apple Developer ID and notarization credentials are configured for releases, Gatekeeper may require right-clicking Duckweed and choosing Open on first launch.
On Linux, make the AppImage executable before its first launch:
chmod +x Duckweed_*.AppImageThe AppImage updates itself in place. The deb package uses the system package installer for updates, so Linux asks for authentication before applying one.
Windows Explorer folder actions and the taskbar completion badge remain Windows-only. Their settings stay hidden on macOS and Linux.
Duckweed runs shells and coding-agent CLIs that are already installed on your computer. Before launching an agent in Duckweed, install its CLI, sign in or configure its provider credentials, and confirm that its command works in a regular terminal. Duckweed does not provide agent accounts, subscriptions, or API credentials.
- Real terminal sessions. Every pane owns a PTY-backed shell: ConPTY on
Windows and
openptyon Linux and macOS. - Layouts that keep up. Split, resize, swap, drag, or zoom panes without killing the process or losing its scrollback.
- Project context at a glance. The current project, Git branch, changed-file count, line totals, shell, tab, and pane count stay visible.
- Diff review inside the workspace. Open the complete uncommitted diff from
the status bar or press
Ctrl+Shift+G. - A useful command palette. Projects, shells, tabs, panes, settings, and
updates are available through
Ctrl+Shift+P. - First-class coding agent interfaces. Launch Claude Code, Codex, Cursor Agent, Grok, or OpenCode in a pane and Duckweed can replace the terminal UI with a native conversation, tool, plan, permission, and diff timeline. Run several of these interfaces side by side in the same window.
- Search and readable output. Search terminal scrollback and optionally highlight paths, URLs, flags, hashes, diffs, warnings, and errors.
- Shell discovery. Duckweed finds PowerShell,
cmd, Git Bash, WSL, Nushell, Bash, Zsh, and Fish when they are installed. - Workspace tools. A dockable panel (
Ctrl+Shift+X) with a project file browser, saved pane layouts, reusable prompt templates, a persistent per-tab checklist, session statistics, a listening-port list with copy, forward, and close actions, and a power watch that sleeps or shuts down the machine after all panes finish. Prompt templates can be searched, copied, or dragged into any terminal or agent composer. - Explorer integration. Per-user context-menu entries open a folder in a new Duckweed tab or window straight from Windows Explorer, without administrator rights. Both entries can be toggled in the settings.
- Completion signals. Finished agent turns and commands can play a completion sound, highlight the pane, and outline the taskbar icon so you notice from another window. Tabs also show when an agent is still working in the background.
- Local persistence. Pane arrangements come back after a restart without pretending the old processes are still alive.
When the custom agent UI is enabled, launching claude, codex, agent,
grok, or opencode opens a focused interface inside the current pane. The
installed CLI still runs locally and keeps its own authentication and provider
configuration.
Each pane owns its agent session. Split the workspace and launch another agent to keep multiple custom interfaces visible and working at once, all within the same Duckweed window. You can mix agent interfaces and regular shells in any layout.
The interface presents streamed responses, reasoning, tool calls, file changes, plans, permission requests, token usage, and session history in a consistent timeline while preserving each provider's identity. When Claude Code stops to ask you something, the question arrives as a card you can answer by clicking a choice, by pressing its number, or by writing an answer of your own. The composer supports slash commands, workspace file mentions, queued follow-ups, and image attachments where the provider accepts them. Model and reasoning controls appear when the agent protocol exposes those choices.
In Codex sessions, delegated subagents appear as a live fleet above the conversation. Open one to inspect its status, prompt, child conversation, tool activity, plan, output, and file changes. When the child thread accepts input, you can send it a follow-up or redirect it without leaving the parent session.
Supported custom interfaces currently include:
- Claude Code and compatible Claudex launches
- Codex CLI
- Cursor Agent
- Grok CLI
- OpenCode
The longer list in Agent usage includes tools whose local transcripts Duckweed can measure even when they do not have a custom agent interface. Usage scanning support does not imply custom-interface support.
Turn off Custom Agent UI from the command palette whenever you prefer to use an agent's original terminal interface.
Open Settings → Usage to compare token use and estimated cost over the last 7, 14, 30, or 90 days. Duckweed groups the numbers by day, model, and agent, and keeps exact values available in a table.
Current local-session support includes:
- Claude Code, Codex CLI, Gemini CLI, OpenCode, and Grok CLI
- Factory Droid, Kilo Code, Kimi CLI, Antigravity CLI, and Pi Coding Agent
The scanner reads the transcripts these tools already store on your machine. It does not upload their contents. The first scan builds a local index; later scans only revisit files that changed and resume append-only JSONL logs from their last complete line.
Cost figures are estimates based on published per-token prices unless a provider records an actual cost in the transcript. Unknown models still appear with their tokens counted and their cost marked as unpriced.
Quota cards use provider information only when it is available locally. Claude can query the official usage endpoint with Claude Code's existing OAuth session; Codex and Grok use the latest quota snapshots saved by their CLIs. Duckweed does not invent limits for agents that do not expose them.
Projects, layouts, settings, agent sessions, and usage indexes stay on your computer. Duckweed does not upload repository contents or agent transcripts. Provider CLIs may still contact their own services, and Claude quota cards can query Claude's official usage endpoint with the local Claude Code session.
The Ports tool's Share publicly action creates a temporary HTTPS address through an outbound SSH tunnel when OpenSSH is installed. Duckweed falls back to Cloudflare Quick Tunnels or ngrok when needed. Anyone with that address can reach the selected local HTTP server over the internet. Public links are intended for development and testing, not production. Duckweed shows the link only after an end-to-end readiness check reaches its local proxy. It stops the tunnel when you stop sharing, close the owning process, or exit the app.
| Shortcut | Action |
|---|---|
Ctrl+Shift+D / Ctrl+Shift+E |
Split right / down |
Ctrl+Shift+W |
Close the focused pane |
Ctrl+Shift+Z |
Zoom the focused pane |
Ctrl+Shift+B |
Equalize all panes |
Alt+Arrow keys |
Move focus between panes |
Ctrl+Shift+[ / ] |
Focus the previous / next pane |
Ctrl+Shift+T / Ctrl+Shift+Q |
New tab / close tab |
Ctrl+Tab / Ctrl+Shift+Tab |
Cycle tabs |
Ctrl+1 … Ctrl+9 |
Go to tab N |
Ctrl+Shift+O |
Open a project |
Ctrl+Shift+P |
Open the command palette |
Ctrl+Shift+G |
Review uncommitted changes |
Ctrl+Shift+X |
Toggle the workspace tools panel |
Ctrl+Shift+F |
Search terminal output |
Ctrl+Shift+K |
Clear the focused pane |
Ctrl+Shift+H |
Toggle output highlighting |
Ctrl+= / Ctrl+- / Ctrl+0 |
Increase / decrease / reset font size |
F11 |
Toggle fullscreen |
Right-click copies a selection. With no selection, it pastes from the clipboard.
You will need Bun, Rust, and the Tauri 2 prerequisites for your operating system. Duckweed's locked Rust crates require Rust 1.88 or newer.
git clone https://github.com/MusicMaster4/Duckweed.git
cd Duckweed
bun install
bun run appbun run app starts Tauri without watching the Rust backend. During backend
development, use bun run app:watch to rebuild when Rust files change.
Build the native installer or application bundle with:
bun run app:buildDuckweed has a React and TypeScript interface backed by Rust through Tauri 2. Terminal instances live outside the React render tree, so rearranging a pane does not recreate its process or scrollback.
src/
├── components/ workspace UI, agent interfaces, settings, palette, search,
│ diffs, tools panel, updates
├── hooks/ drag-and-drop behavior, Git change polling, update checks
└── lib/ layouts, terminal registry, agent adapters, persistence,
IPC, highlighting
src-tauri/src/
├── main.rs Tauri commands and IPC
├── pty.rs one PTY session per pane
├── shells.rs installed-shell discovery
├── project.rs project and Git branch detection
├── git.rs diff and change collection
├── launch.rs coding agent launch detection
├── agent_proc.rs agent process supervision
├── agent_sessions.rs agent session storage
├── agent_activity.rs agent turn and activity tracking
├── ports.rs listening-port discovery and forwarding
├── watch.rs / power.rs power watch and sleep or shutdown actions
├── process_tree.rs pane process inspection
├── fs.rs project file browsing
├── shell_integration.rs Windows Explorer context-menu entries
└── usage/ local agent transcript and quota readers
The PTY stream is transported as base64 and decoded incrementally, which keeps split UTF-8 characters intact during large bursts of output.
bun run typecheck
bun test
cd src-tauri && cargo checkGitHub CI runs the TypeScript check, Bun test suite, and cargo check on Linux,
macOS, and Windows. Native release packaging is also performed on the matching
operating system before a release can be published.
Release builds come from two branches: main publishes stable releases and
testing publishes beta releases. The full versioning, signing, and updater
setup is documented in docs/releases.md.
Duckweed is an active project. Projects, tabs, panes, real shells, custom coding agent interfaces, search, Git diffs, local usage analytics, workspace tools (files, saved layouts, prompt templates, checklists, statistics, ports, power watch), completion signals, Explorer integration, updates, and layout persistence are implemented.
Command blocks group commands submitted through Duckweed's composer and raw PowerShell input. Duckweed's OSC 133 shell integration preserves edited command text, command boundaries, exit status, and duration for block navigation, copy, and re-run.
Issues, ideas, and pull requests are welcome. For bug reports, please include the operating system, shell, reproduction steps, and relevant terminal output.
Most contributions branch from testing and open a pull request back into
testing. A successful code merge publishes a beta for validation. Maintainers
later promote tested changes from testing to main, which publishes the
stable release.
Read CONTRIBUTING.md for development setup, required checks, branch conventions, pull request expectations, and the complete release flow.
Duckweed is source-available under the Duckweed Source-Available License 1.0. You may use, study, modify, fork, and share the source for free. Selling Duckweed, charging for access to it, or offering it as a paid service is not permitted.
This is not an open-source license as defined by the Open Source Initiative. Future Duckweed releases may use revised terms; a release you already received remains under the license that accompanied it.