A modern, intelligent terminal for macOS, Linux and Windows with autocomplete superpowers.
Features • Installation • Shell Setup • Development • Shortcuts • Contributing
FigyTerm is a fully local desktop terminal built with Tauri 2, React, and Rust. It brings IDE-level autocomplete to your command line — context-aware suggestions for git, docker, pnpm, npm, uv, and more — all running natively with zero network dependency.
Inspired by Fig (now part of AWS), FigyTerm is an open-source alternative that keeps your terminal experience fast, private, and extensible.
- Intelligent Autocomplete — Context-aware suggestions for commands, subcommands, options, and file paths
- Spec-based Engine — Compatible with Fig's spec format for community-driven command completions
- Split Panes — Up to 4 resizable terminal panes per tab (Cmd+D / Cmd+Shift+D)
- Multiple Tabs — Browser-style tab bar with drag-to-reorder and rename support
- Embedded Browser — In-app browser modal with tabs, address bar, and back/forward/reload (
⌘⇧B); uses a native child webview so real sites load (not an iframe). On Linux it's positioned through agtk::Fixedof our own, since Tauri can't place child webviews on GTK (tauri#10420) - Command History Search — Fuzzy-search past commands with picture-in-picture mode (
⌘R) - System Monitor — Live CPU and memory charts in a draggable modal (
⌘⇧M) - Terminal Search — Find text in the active pane (
⌘F) - Command Palette — Every action the app has, searchable, each spelled for the platform you're on (
⌘⇧P) - Oh My Zsh Integration — Real-time theme switching with full prompt rendering
- Dark & Light Mode — Beautifully themed UI that adapts to your preference (
⌘⇧L) - Recent Directory Ordering — Frequently visited folders appear first in suggestions
- Clickable URLs — Links in terminal output open in your default browser
- Native Performance — Rust PTY backend with zero-latency input
macOS (Apple Silicon and Intel), Linux (x86_64) and Windows (x64) — see the installation guide for the full details.
You only install once: FigyTerm updates itself from then on. The exceptions are the
packages meant to be managed by something else — a Linux .deb/.rpm and the Windows
.msi — which stay with whatever installed them.
curl -fsSL https://raw.githubusercontent.com/code4mk/figyterm/main/install.sh | shOne line, no security dialog, no xattr step. It detects your Mac's architecture,
downloads the right build, and installs to /Applications.
Read the script first — you should read anything you pipe to a shell. It
touches a temp directory and FigyTerm.app, nothing else.
-
Download the build for your Mac from Releases:
aarch64for Apple Silicon,x64for Intel -
Open the
.dmgand drag FigyTerm into Applications -
Clear the quarantine flag macOS added during the download:
xattr -cr /Applications/FigyTerm.app
-
Launch FigyTerm
Step 3 isn't optional — skip it and macOS says "FigyTerm is damaged and can't be opened", which sounds alarming but only means the app is unsigned.
If macOS still blocks it, open System Settings → Privacy & Security, scroll down, and click Open Anyway. (On macOS 15 and later this is the only way through — Apple removed the old right-click → Open shortcut.)
curl -fsSL https://raw.githubusercontent.com/code4mk/figyterm/main/install-linux.sh | shInstalls the AppImage to ~/.local/bin with a desktop entry.
Read the script first.
Or take a package from Releases:
sudo apt install ./FigyTerm_*_amd64.deb, sudo dnf install ./FigyTerm-*.x86_64.rpm.
No Gatekeeper, no quarantine, no xattr — none of that exists here.
The AppImage is the build that updates itself; a distro package is your package
manager's to update. If the window comes up blank on Nvidia or older Mesa drivers, start
it with WEBKIT_DISABLE_DMABUF_RENDERER=1.
Download FigyTerm_*_x64-setup.exe from Releases
and run it. It installs for the current user, needs no administrator rights, and updates
itself from then on.
Windows shows "Windows protected your PC" the first time, because the installer
isn't code-signed — click More info, then Run anyway. There's no equivalent of
the macOS curl trick here: reputation accrues per binary as downloads accumulate.
An .msi is also published for Group Policy or Intune deployment. It doesn't
self-update, on purpose — a managed install stays managed.
Why does Option 1 skip that step?
FigyTerm isn't code-signed with an Apple Developer ID (it costs $99/year), so macOS quarantines it on download and refuses to open it until the flag is cleared.
Quarantine is applied by the downloading application — browsers set it, curl
doesn't. The script isn't bypassing a security check; it just isn't a browser, so the
flag is never set in the first place. xattr -cr reaches the same end state after
the fact.
Either way it's a one-time thing: the built-in updater also downloads over HTTP rather than through a browser, so updates are never quarantined.
Keychain access popup: macOS may ask to allow FigyTerm to access your keychain (for SSH keys, credentials, etc.). Click Always Allow or Allow to proceed. If you accidentally deny it, go to Keychain Access > login and update the access control for the relevant entry.
git clone https://github.com/code4mk/figyterm.git
cd figyterm
npm install
npm run tauri buildThe built .app and .dmg will be in src-tauri/target/release/bundle/macos/.
| Requirement | Version |
|---|---|
| Node.js | 18+ |
| Rust | 1.86+ |
| Tauri CLI | 2.x |
| Xcode Command Line Tools (macOS) | xcode-select --install |
| WebKitGTK dev packages (Linux) | see INSTALLATION.md |
| MSVC build tools + WebView2 (Windows) | Visual Studio 2022 C++ workload |
FigyTerm runs your normal login shell — it uses the $SHELL environment variable (same as Terminal.app). You do not need to install anything extra for basic use.
For the best experience (themes, prompts, plugins, and recent-folder ordering from history), we recommend zsh with Oh My Zsh.
| Shell | Required? | Notes |
|---|---|---|
| zsh | No (recommended) | Default on macOS since Catalina (/bin/zsh). FigyTerm launches whatever $SHELL points to. |
| bash / fish | Supported | Works out of the box if $SHELL is set to them. |
| Oh My Zsh | No (recommended) | Enables theme switching in Settings and rich prompt rendering. Without it, the terminal still works — you just won't see Oh My Zsh themes in Settings. |
To confirm your shell:
echo $SHELL
# Expected on modern macOS: /bin/zshIf you want to switch the default shell to zsh:
chsh -s /bin/zshRestart FigyTerm (or open a new tab) after changing shells.
Oh My Zsh is not required, but it unlocks FigyTerm's theme picker (Settings → Theme) and matches how most developers configure their macOS terminal.
Install Oh My Zsh:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"After install:
- Restart FigyTerm or open a new tab
- Open Settings → Theme to browse and switch Oh My Zsh themes live
- Custom themes can be placed in
~/.oh-my-zsh/custom/themes/
Already using Oh My Zsh in Terminal.app? FigyTerm reads the same
~/.zshrcand~/.oh-my-zshconfig — no extra setup needed.
Not using Oh My Zsh? FigyTerm still works. Autocomplete, split panes, tabs, and path suggestions are independent of Oh My Zsh.
| macOS | Linux / Windows | Action |
|---|---|---|
⌘ T |
Ctrl+Shift+T |
New tab |
⌘ ⇧ T |
Ctrl+Alt+T |
New tab (same directory as active tab) |
⌘ ⇧ W |
Ctrl+Shift+W |
Close active pane |
⌘ D |
Ctrl+Shift+D |
Split pane horizontally |
⌘ ⇧ D |
Ctrl+Alt+D |
Split pane vertically |
⌘ K |
Ctrl+Shift+K |
Clear terminal |
⌘ F |
Ctrl+Shift+F |
Find in terminal |
⌘ R |
Ctrl+Shift+R |
Search command history |
⌘ C |
Ctrl+Shift+C |
Copy selection |
⌘ V |
Ctrl+Shift+V |
Paste |
⌘ ⇧ B |
Ctrl+Shift+B |
Open browser |
⌘ ⇧ M |
Ctrl+Shift+M |
System monitor |
⌘ ⇧ L |
Ctrl+Shift+L |
Toggle light/dark theme |
⌘ ⇧ P |
Ctrl+Shift+P |
Command palette |
⌘ , |
Ctrl+, |
Settings |
⌘ 1-9 |
Ctrl+1-9 |
Switch to tab N |
⌘ ⇧ [ |
Ctrl+Shift+[ |
Previous tab |
⌘ ⇧ ] |
Ctrl+Shift+] |
Next tab |
Tab |
Tab |
Accept autocomplete suggestion |
↑ ↓ |
↑ ↓ |
Navigate suggestions |
Esc |
Esc |
Dismiss suggestions |
Shell-native shortcuts (Ctrl+C, Ctrl+D, Ctrl+Z, Ctrl+L, Ctrl+R) pass through
directly. That's why the second column uses Ctrl+Shift rather than plain Ctrl, the
same as GNOME Terminal, Konsole and Windows Terminal: a bare Ctrl+letter belongs to the shell, and an
app shortcut that took it would break the terminal it's wrapped around. The two chords
that would collide (Ctrl+Shift+T and Ctrl+Shift+D are already taken) fall back to
Ctrl+Alt.
FigyTerm ships with built-in specs for popular tools:
| Command | Coverage |
|---|---|
git |
Subcommands, branches, options |
docker |
Commands, containers, images, options |
docker compose |
Services, commands, options |
npm |
Scripts, packages, options |
pnpm |
Scripts, workspaces, options |
yarn |
Scripts, packages, options |
uv |
Scripts from pyproject.toml, options |
cd |
Directories with recent-first ordering |
Adding a new spec is straightforward — see the Spec Authoring Guide.
┌─────────────────────────────────────────────┐
│ React + TypeScript (UI Layer) │
│ ├── xterm.js (terminal rendering) │
│ ├── Autocomplete engine (spec-based) │
│ ├── Split panes (react-resizable-panels) │
│ ├── Browser modal (native child webview) │
│ └── Settings & theme management │
├─────────────────────────────────────────────┤
│ Tauri IPC (commands + events) │
├─────────────────────────────────────────────┤
│ Rust (Native Layer) │
│ ├── PTY session management │
│ ├── Path completion (filesystem) │
│ ├── Shell command execution │
│ ├── Browser webviews (multi-webview) │
│ └── Window management │
└─────────────────────────────────────────────┘
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite, Tailwind CSS |
| Terminal | xterm.js, FitAddon, WebLinksAddon |
| Desktop | Tauri 2.x |
| Native | Rust |
| PTY | portable-pty |
| State | Zustand |
| UI Components | Headless UI, Lucide Icons |
| Panels | react-resizable-panels |
# Install dependencies
npm install
# Start dev mode (hot-reload frontend + Rust rebuild)
npm run tauri dev
# Type check
npx tsc --noEmit
# Production build
npm run tauri buildfigyterm/
├── src/ # Frontend (React + TypeScript)
│ ├── components/
│ │ ├── AppShell/ # Main layout, tab & pane management
│ │ ├── Browser/ # Embedded browser modal
│ │ ├── Terminal/ # Terminal, TabBar, HistorySearch, SystemMonitor
│ │ └── Settings/ # Settings modal (tabbed)
│ ├── services/ # Autocomplete, browser IPC, spec registry
│ ├── specs/ # Command completion specs (git, docker, etc.)
│ ├── stores/ # Zustand stores (settings, theme)
│ └── types/ # TypeScript definitions (figy, terminal)
├── src-tauri/ # Backend (Rust)
│ └── src/
│ ├── commands/ # Tauri IPC handlers
│ │ ├── terminal.rs # PTY session create/write/resize/close
│ │ ├── browser.rs # Child webview lifecycle & navigation
│ │ ├── autocomplete.rs # Path completions & shell history
│ │ ├── system.rs # CPU/memory stats
│ │ └── shell_exec.rs # Shell command execution
│ └── lib.rs # App entry point
├── docs/ # Documentation
│ ├── CONTRIBUTING.md # Contribution guidelines
│ └── SPECS.md # Spec authoring guide
├── public/ # Static assets (logo, icons)
└── package.json
- Real PTY sessions with persistent shell
- Multi-tab support with rename
- Intelligent autocomplete (spec-based)
- Split panes (up to 4 per tab)
- Oh My Zsh theme management
- Dark/Light mode
- Recent directory ordering
- Clickable URLs
- Command history search (
⌘R) - Terminal search (
⌘F) - System monitor (
⌘⇧M) - Embedded browser with tabs (
⌘⇧B) - Plugin system for custom specs
- AI-powered command suggestions (local models)
- Snippet management
- Session restore on relaunch
We welcome contributions! Please read our Contributing Guide to get started.

