v0.4.27 · What's new

Terminal
Director.

TEDI folds eight everyday dev tools into one lightweight window: terminal, SSH/SFTP, database browser, editor, AI agent, in-app browser, and Git. Built on Tauri 2. No telemetry.

tedi - interactive shell
tedi 0.4.27 - interactive demo shell
Type help to see commands, or try ask.
tedi ~
help for commands · ask to chat with AI
Eight Tools · One WindowTerminal · Splits · Tab GroupsSSH · SFTP File TransferAI Browser ControlSQL ExplorerVim Motions · Marks · RegistersWorkspaces · Persistent SessionsBYOK or Fully Localtedi CLITEDI.md Project MemoryTauri 2 · ~7–10 MBNo TelemetryKeys in KeychainApache-2.0 · Free Forever
[ 01/ 08 ]·Contributors

Built by the community

TEDI is Apache-2.0 and built in the open. Every name here helped shape it.

[ 02/ 08 ]·Features

Built for real developer workflows

Eight tools that used to be eight windows, now one, and they talk to each other.

Terminal
01

Splits, tabs, workspaces

xterm.js + WebGL terminal with native PTY and grouped tabs, in workspaces that reopen exactly where you left them.

SSH
02

Remote hosts + SFTP

russh remote terminals with an integrated SFTP explorer and saved connections.

SQL ExplorerExtension
03

Query any database

Query MySQL, PostgreSQL, and SQLite with a schema tree and inline row edits.

Editor
04

CodeMirror 6, real Vim

CodeMirror 6 with real Vim, broad language support, and inline AI autocomplete.

AI Agent
05

BYOK or fully local

Bring your own key or run fully local, with multi-agent workflows and gated tools.

AI Browser
06

Agent drives a real browser

A native webview the agent navigates, reads, types, and clicks, not just screenshots.

API ClientExtension
07

Postman-style workbench

Collections, environments, auth, scripts, and a runner, with Postman, OpenAPI, and cURL import-export.

SCM + Extensions
08

Git diff + plugins

Inline Git diff and staging, plus plugins for themes, commands, and AI tools.

[ 03/ 08 ]·Under the hood

Small, fast, and private

Native OS webview via Tauri 2, not a bundled browser. It shows.

~7–10MB
Install size
~300ms
Cold start
0
Telemetry, ever
8tools
One window
[ 04/ 08 ]·Screens

In the wild

Watch the demo, then browse real screenshots from the latest build.

00 / DemoYouTube · HD
[ 05/ 08 ]·Download

Pick your platform

Updater-signed builds on GitHub Releases.

/windowsx64

Windows 10 / 11

NSIS installer (LZMA).

Notes
  • Unsigned warning: More info → Run anyway
  • Shell priority: pwsh → powershell → cmd
  • Windows 10 / 11 (x64)
/macosUniversal

macOS 10.15+

Apple Silicon and Intel builds.

Notes
  • Ad-hoc signed, not notarized
  • Drag to /Applications, then run once:
    $ xattr -cr /Applications/TEDI.app
/linuxx86_64

Linux

Debian, Fedora, or portable AppImage.

Notes
  • Blank window? Try WEBKIT_DISABLE_DMABUF_RENDERER=1
  • AppImage needs FUSE, or --appimage-extract-and-run
  • Or install .deb / .rpm directly
[ 06/ 08 ]·Changelog

What's new

The latest two releases.

v0.4.27Latest24-08-2026

The right panel opens without blanking the workspace

  • A pinned tab keeps the sizing every other tab uses: pinning applied a compact padding rule of its own and pushed the tab towards a square, which fought the shared sizing rather than following it. It runs the same padding expression as any tab now and simply loses its label, so the chip ends up narrower because a glyph is narrower than a name, as a consequence of dropping the title rather than as a second competing decision about width. The pin sits where the title was and the close button comes back with it, since a pinned tab that cannot be closed from the strip is a worse trade than one that can be closed by accident, and the name moves to the hover, which is otherwise the only thing telling two pinned terminals apart
  • The detected dev server is offered from the pane header again, not the status bar: two doc comments still described a pane-header globe whose prop had been deleted when the offer moved down to the status bar. The globe sits on the focused pane's header beside the float button now and the status-bar pill is gone, so there is one copy instead of two with different gates, and it draws only on the focused pane so a split does not show the same globe three times. The trade is deliberate, since the pane header is not rendered at all on a Source Control, diff or extension tab, and the address is most useful next to the terminal that printed it
  • The right-panel toggle button next to Settings is gone: Ctrl+Alt+B still minimizes and restores that column, and always did so through the same handler rather than through the button, so this removes a duplicate control and not the capability
  • Opening the right pane no longer blanks the workspace: it threw a missing-layout error out of an effect, which reached the error boundary and took the whole pane stack with it. The right column renders no panel at all while it holds nothing, so the first section to arrive both mounts the panel and bumps the section count, and the effect reacting to that count then read a ref that was already set while the group had not registered a layout for that brand-new panel. Clicking the right-panel toggle with nothing docked reproduced it every time, because the empty branch opens the AI panel and that is what trips the race. All four accessors throw, not just the read, so reading safely and then acting blind crashed just the same; that lookup now lives in one file with fourteen call sites reading through it
v0.4.2624-08-2026

SFTP moves files · extensions get a typed API

  • The SSH file tree can now move files, not just open them: it could read and write a remote file but had no way to get one across the boundary, so putting a build on a host meant leaving the app. Uploads and downloads stream in both directions, folders included, and dragging a row onto another remote folder is a move on the server rather than a round trip through this machine. A permissions dialog edits the mode, recursively when you ask it to. Four SFTP behaviours had to be worked around and each is now pinned by a check, among them a default attribute set that is not empty but carries a 0o777 mode, so a chmod built from it truncates the file and chowns it to root, and a directory listing that reports lstat, which is why a symlink to a directory arrived as a plain link and the tree refused to expand it
  • Extensions have a typed API and a toolkit to build against it: an author coded against a surface with no types anywhere, so a misspelled member surfaced as a TypeError inside an async click handler, which is an unhandled rejection nobody sees unless DevTools happens to be open. A standalone, import-free tedi.d.ts is that surface, so plain JavaScript gets completion and real diagnostics with nothing installed. tedi ext create scaffolds a working extension around it, tedi ext types refreshes it, and tedi ext validate is the pre-publish check for the mistakes that are otherwise invisible at runtime, like a keybinding aimed at a command id that does not exist. Both the types and the manifest schema are embedded in the binary, which is the whole design: authors have the tedi binary rather than the repo, so what they code against comes from the host they are testing on and cannot go stale against it
  • The commands extensions call most now resolve to a real shape: the generic invoke returned unknown, and while a TypeScript extension can name the type at the call site, plain JavaScript cannot, so every property read off a result was an error and the only escape was a cast asserting a shape nobody had checked against Rust. Naming those shapes once took seven of the nine bundled extensions from type errors to zero. The list is deliberately short and covers only what the fleet actually calls, since a shape written from memory would be a type that lies, which is worse than unknown
  • Saving an extension reloads it, with no window reload: edit the bundle or the manifest and the running extension restarts itself, so adding a command, a panel or a permission takes effect on save. A changed file has to settle before it is imported, because a bundler writes its output in chunks and a poll that catches a half-written module fails activation for code the author wrote correctly. Activation timing is recorded per extension now as well, and an activate slower than half a second says so, since attributing a slow launch to an extension previously meant bisecting
  • Tabs and workspaces can be pinned from the right-click menu: a pinned tab sorts to the front of the strip and shrinks to an icon chip the way a browser does, so the handful of things always open stop competing for width with whatever is being worked on, and workspaces pin the same way and rise to the top of the panel. Pinning is a property of the tab rather than of a pane, which is what keeps a split group unambiguous, since the strip draws one chip per pane but the unit that can be reordered is the tab, so right-clicking any pane of a split offers Pin Group and the marker draws once for the group
  • An extension reload ran twice in the window that started it: an emit self-delivers in Tauri 2, so the announcement telling the other webview to resync came back to the sender, which then repeated the whole deactivate-and-activate cycle on top of the one it had just performed. At once per install that was invisible; it stops being invisible now that saving a file can trigger it
  • Three statements in the extension author guide were wrong, two of them inverted: it claimed the manifest schema is strict and that an unknown top-level key fails the parse, when the opposite is true and deliberate, because a key the frontend rejects and Rust accepts produces an install that reports success and then vanishes from Settings with no way to uninstall it, which has shipped once already. It also described the background-spawn call as returning an object to destructure a pid out of, when it returns a bare handle, and counted the hard-denied commands as four when there have been nine for some time
[ 07/ 08 ]·Extensions

Official extensions

First-party extensions for TEDI. Versioned independently of the core app.

Proven primitives, nothing exotic

Rust for the backend, Tauri 2 for the shell, React 19 + xterm.js + CodeMirror for the surface. Just fast.

Frontend
React 19
TypeScript
xterm.js (WebGL)
CodeMirror 6
Backend
Rust
Tauri 2
portable-pty · russh
OS Keychain
License
Apache-2.0
Origin
Fork of Terax v0.5.9
[ 08/ 08 ]·FAQ

Frequently asked questions

TEDI, the Terminal Director, folds eight everyday dev tools (a terminal with workspaces, SSH/SFTP, a database browser, a code editor, an AI agent, an in-app browser, an API client, and Git) into one lightweight window built on Tauri 2.

Because the terminal is where the work is directed from: TEDI puts your shells, remote hosts, editor, database, Git, and AI agents on one stage and lets you cue them from a single window instead of alt-tabbing between apps.

The installed app is roughly 7–10 MB and cold-starts in about 300 ms, because it uses the OS webview via Tauri 2 rather than bundling a full Chromium runtime.

Windows 10/11 (x64), macOS 10.15+ (Apple Silicon and Intel), and Linux (Debian/Ubuntu .deb, Fedora/RHEL .rpm, and a portable AppImage).

No. There is zero telemetry, and no key or secret ever leaves your machine for a remote server. Where they are kept locally depends on the platform: the Keychain on macOS, a DPAPI-encrypted file on Windows, and a 0600 file on Linux, which is not encrypted because a portable install cannot assume a Secret Service daemon is running.

You can bring your own key across ten providers (OpenAI, Anthropic, Google, xAI, Cerebras, Groq, DeepSeek, SumoPod, LM Studio, and any OpenAI-compatible server), or run fully local and keyless against Ollama, llama.cpp, or vLLM. Plan mode, skills, MCP, sub-agents, and approval-gated tools work either way.

Yes. TEDI is licensed under Apache-2.0 and free forever. Issues, PRs, and ideas are welcome on GitHub.

No extension ships inside the binary: all nine first-party ones (SQL Explorer, the API Client, AI usage meters, beautify, remote access, RTK bridge, screenshots, a second folder tree, and Discord Rich Presence) install at runtime from a .zip or a GitHub release, and are versioned independently of the core app. Every install shows the permissions, risk tier, and AI tools it contributes before you accept, and that review is an install-time decision rather than a sandbox: an extension runs with the app's own privileges, so install only what you trust.

Ship

Open it up.

Open source under Apache-2.0. Issues, PRs, and ideas welcome.