0.1.0 Pre-1.0, developed in the open

The AI Terminal That
Stays on Your Mac.

Warp-style command blocks and a multi-step AI agent, without the bulk. Local models run in-process with Metal acceleration — no Ollama, no daemon to babysit. Cloud models sit behind the same interface.

  • macOS, Apple Silicon
  • Tauri 2 + Rust
  • On-device by default
  • GPL-3.0

Interface mockup of VTerminal's default theme — command blocks with exit-code badges, and the agent's approval gate showing both classification axes.

Why VTerminal

Three Positions the Other AI Terminals Don't Take.

Modern AI terminals tend to be Electron apps that phone home for every completion. VTerminal is a native Tauri app that treats your shell, your machine and your consent as the things that must not be replaced.

  1. Instead of a reimplemented shell

    Your Shell, Not a Lookalike

    A real zsh -il login shell over a PTY. vim, htop, tmux and ssh all behave exactly as they do in Terminal.app, because they are running exactly as they do in Terminal.app.

  2. Instead of cloud round trips

    On-Device by Default

    The default model is a 9B GGUF running inside the app process via llama.cpp, Metal-accelerated. Nothing leaves the machine unless you pick a cloud model — and there is no daemon to install, start or keep updated.

  3. Instead of an agent with free rein

    Nothing Runs Without You

    Every command a model writes passes an approval gate. Natural-language suggestions are inserted into your prompt, never executed. Restored tabs never reconnect on their own.

The Terminal

A Fast Terminal First. The AI Is What It Grew.

Shell integration marks every command as a block, so the app knows what you ran, where, and how it ended — which is also exactly the context the model needs.

  1. You Type a Command
  2. zsh Marks It via OSC 133
  3. Output Streams Into It
  4. The Exit Code Closes It

Real zsh, Real TTY

portable-pty spawning zsh -il, rendered by xterm.js 6 with a WebGL renderer. Full TUI support, and saved SSH hosts with one-click connect.

Command Blocks

Exit-code badges, copy the command or just its output, re-run, or attach a block to the AI as context. Positions come from live terminal markers, so they never drift.

Flow-Controlled Output

The reader thread blocks above a watermark and the UI acknowledges every 256 KB, so cat-ing a gigabyte file won't balloon memory.

Tabs, Search, Palette

Tabs with ⌘1…9, in-terminal search, persistent command history, and a ⌘K palette for actions and model switching.

SSH-Aware

Nested sessions are detected by command shape. While you're on a remote host, local paths and git branch are withheld from the model rather than quietly misreported.

Six Themes

Veviad Developer UI (default), Veviad UI, Midnight, Nord, Solarized Dark and Light — each with a matched terminal ANSI palette, not just recoloured chrome.

The AI

Six Ways In. One Keystroke Each.

The same Provider trait covers in-process llama.cpp, Anthropic, OpenAI, Mistral and any OpenAI-compatible server you run yourself — so every feature below works the same whichever you pick.

Suggest ⌘I

Describe the goal — or type # at an empty prompt — and get a command inserted into your prompt, ready to read before you press enter.

Explain & Fix

One click on a failed block streams a diagnosis of what went wrong, plus a corrected command you can inspect and run.

Ask ⌘J

A chat panel with your blocks, their output and your files as context. Resizable, and it keeps its proportion when you resize the window.

Agent Mode

Multi-step runs that propose commands, execute them in your visible terminal, and read the real output before deciding what to do next.

Reasoning Effort

off → low → medium → high → max, per model, showing only the rungs a model actually accepts — because a wrong value is a 400, not a downgrade.

Images & Files

Drag, paste or pick. An optional on-device vision sidecar transcribes screenshots, so even a non-vision chat model can work with them.

Safety

How Command Execution Is Gated.

This matters more in a terminal than anywhere else, so it is worth being precise about what is enforced and what is not.

Two-Axis Classification Per-Session Permission Mode Runs in Your Visible PTY Your Edits Are Yours API Keys Never Reach the UI

Classified on Two Axes

Every proposed command is checked for whether it is read-only and whether it reaches the network — independently, since a fetch that writes no file still pulls unreviewed content into a loop that proposes shell commands. Both are shown on the card.

Arming It Is the Authorization

The permission mode is per session, never persisted, and never inherited by a new tab. Auto-run of reads requires read-only and no network — unknown commands fail closed and cost you one click.

In Your Visible Terminal

Approved commands run in the tab you're looking at, not a hidden subprocess — so you see exactly what ran, and it runs wherever that tab is, including over ssh.

Web Access Is Withheld, Not Asked

With web access off, the model's fetch tooling is never sent in the first place, and network-shaped commands are refused before an approval card is even drawn.

Edited Means Yours

A command you rewrite before approving is treated as your own text on your own gesture, not as model output — deliberately not re-classified.

Nothing Runs at Launch

Restored sessions never replay anything. An ssh tab you had open offers Reconnect; it does not reconnect itself.

This Is a Safety Rail, Not a Sandbox

The command classifier cannot see through a script the agent wrote in an earlier step, an alias in your dotfiles, a base64-decoded one-liner, or python -c. It is documented as best-effort in the app itself and should not be relied on as a security boundary. What actually enforces "no internet" for a capable model is the withheld tool, not the string match.

Models

One Interface. On-Device, Cloud, or Your Own Server.

The catalog is a curated allowlist, so every model carries the reasoning-effort rungs it actually accepts and the RAM it actually needs — no runtime surprises, no 400s from a guessed parameter.

BRING YOUR OWN KEY

Cloud

Frontier models behind the same trait, with per-model effort mapping onto each vendor's own parameter.

  • Claude Haiku 4.5, Sonnet 5, Opus 5
  • GPT-5.6 Luna, Terra, Sol
  • Mistral Small 4, Magistral Medium, Large 3
  • Transient 429s and 5xxs retry with backoff

Keys are stored by the Rust backend and never round-trip to the UI.

ON YOUR OWN HARDWARE

Self-Hosted

Point VTerminal at any OpenAI-compatible server, press Test, and pick which of the served models to expose.

  • Ollama, LM Studio, llama.cpp server
  • vLLM, LiteLLM
  • Per-server tokens, optional
  • Raw <think> traces split out

Hosts are only contacted behind an explicit Test — never probed in the background.

ALSO ON-DEVICE

OPTIONAL

Vision Sidecar

A second local model loaded beside the chat model, purely to transcribe the images you attach.

  • PaddleOCR-VL 1.6
  • Qwen3-VL 4B / 8B
  • Decodes greedily, so a transcript is reproducible
  • Works with a cloud chat model

Transcribed text is fenced and labelled as data — a screenshot is attacker-controllable by construction.

Switching models is one keystroke from the ⌘K palette, and every reply keeps the name of the model that wrote it.

Quick Start

Build It in Three Commands.

VTerminal is source-first while it's pre-1.0. Clone it, build it, and you have the terminal plus cloud AI immediately.

OS
macOS on Apple Silicon (Intel is untested)
Node
20 or newer
Rust
pinned by rust-toolchain.toml
Xcode CLT
xcode-select --install
cmake
brew install cmake — only for the local-llm feature
  1. Clone and Install

    git clone https://github.com/Veviad/VTerminal.git
    npm install
  2. Run It

    The terminal plus cloud AI, with a fast build that skips the local inference engine entirely.

    npm run tauri dev
  3. Add On-Device Inference

    Then open Settings → Models, download Qwen3.5 9B (~5.3 GB) and press Load.

    npm run tauri dev -- --features local-llm

    The first local-llm build compiles llama.cpp and its Metal kernels — budget 10–30 minutes. Incremental builds afterwards are normal speed.

Keyboard

Hands Stay Where They Were.

  • ⌘T New tab
  • ⌘W Close tab
  • ⌘1…9 Jump to tab
  • ⌘K Command palette
  • ⌘I AI suggestion
  • ⌘J Toggle AI panel
  • ⌘F Search terminal
  • ⌘, Settings

Open Source

Built in the Open, Under GPL-3.0.

Issues and pull requests are welcome — please open an issue before starting substantial work so the approach can be agreed first. If you intend to contribute regularly, get in touch: a licensing agreement may be needed to keep future relicensing possible.