VCode feature documentation
VCode drives claude, codex, opencode, cursor, devin, copilot and muse from a phone. This
folder documents every feature, one file each, grouped by area.
New here? Read these in order: run it locally, reach it from a phone, start a thread, send a message, read the transcript. Keep navigation and commands open for the keys and gestures. Before you put it on a public hostname, read permission levels: a tab at Full runs anything as your user, and anyone who can log in can put a tab at Full.
Install and security
Get it running on a machine, reach it from a phone, keep it safe.
| Feature | What it does | Status |
|---|---|---|
| Install VCode on Linux with one command | curl -fsSL https://fezu.dev/install | sh installs the newest signed release on a Linux x86_64 or ARM64 machine, starts it, and links it to your fezu.dev account. |
beta |
| Install VCode on a Mac with one command | The same curl -fsSL https://fezu.dev/install | sh, run in Terminal on an Apple silicon or Intel Mac, installs the newest signed release as a launch agent and links it to your fezu.dev account. |
beta |
| Install VCode on Windows | irm https://fezu.dev/install.ps1 | iex in PowerShell installs VCode on Windows itself: no WSL, no administrator rights, no restart. |
beta |
| The VCode desktop app | VCode in its own window on Windows, Linux and the Mac, with a tray icon, start at login and notifications; the install command puts it on any computer with a desktop, or alone with App only. | beta |
| Install it as systemd user services | bash install.sh install puts VCode on a machine as a systemd --user service, writes its env file with a fresh AUTH_TOKEN, and starts it. |
stable |
| Logs and troubleshooting | Every unit logs to the journal. | stable |
| Memory limits and parking idle tabs | The VCode unit runs inside a cgroup with a hard memory ceiling. | stable |
| Install counts | The installer reports that an install started and finished, with the OS and version and no ID; V_CODE_NO_ANALYTICS turns it off. |
stable |
| App page views | app.fezu.dev and the desktop app count each open with VCode's own analytics service, with no cookie and no ID. | stable |
| Reach it from a phone | A phone reaches a box through the app on app.fezu.dev: link the box, then log in to the app on the phone. | stable |
| Run it locally for a first try | Start VCode on your own machine with one command and open it in a browser. | stable |
| Where state lives, and how to back it up | Everything VCode remembers is plain files under one directory, VCODE_STATE. |
stable |
| The security model | Anything that can log in to VCode runs code as your user, so a login is full trust. | stable |
| The box updates itself | A box installed from a release checks for a new one every hour, installs it even while a thread is working, and rolls back if it does not come up. | beta |
| Update an installed machine | bash install.sh update pulls the new code, reinstalls dependencies, migrates the env file, re-renders the units and restarts them. |
stable |
Support
Report a problem you find in VCode.
| Feature | What it does | Status |
|---|---|---|
| VCode report | Run /vcode-report to send a private report, with up to 3 screenshots, to the VCode team; it appears under Reports on your account. |
beta |
Remote access
Link the box to a fezu.dev account, pair a phone, and use VCode from app.fezu.dev.
| Feature | What it does | Status |
|---|---|---|
| Add a workstation from fezu.dev | Copy one command from fezu.dev/account; it installs the box and links it to your account, with no email prompt and no pairing code. | beta |
| Link this box to your fezu.dev account | Link the box from your browser with v-code box link; it connects out to the VCode router. |
beta |
| Open this box from a phone or another browser | Sign in to app.fezu.dev and every box on the account opens; v-code box devices lists them, and the box can require a pairing code for new ones. |
beta |
| Keep a workstation awake | Stops a workstation from sleeping while its agents work, or always; each workstation keeps its own mode. A closed lid still sleeps. | beta |
| One set of settings for all your workstations | Workstations linked to one account share the cog's settings and your system prompt; the default folder stays on each workstation. | beta |
| See which account the app is on, and switch | Opened from fezu.dev/account while on another account, the app asks before it opens anything; the cog says which account it is on. | beta |
| Use VCode from app.fezu.dev | Log in, pick a box, check its fingerprint, pair, and work through the router. | beta |
| Work on several boxes in one app | Every paired box opens at once: one strip with a badge per box, a box pick in New thread, and a box that is off marks only its own tabs. | beta |
Threads and tabs
Start work in a folder, group tabs by project, move between tabs, rename, reorder, close and reopen.
| Feature | What it does | Status |
|---|---|---|
| The back button closes what is open | The phone's back button closes the top open layer (a sheet, a drawer, a viewer, the shell) one press at a time. | stable |
| Change keyboard shortcuts | Give any shortcut a key of your own in settings, or take its key away; your keys follow the account. | stable |
| Search settings | Type a word at the top of settings and only the groups and settings that match it stay. | stable |
| Close and reopen a tab | Closing a tab stops its agent and takes it out of the strip. The conversation stays on disk, and the resume screen brings it back. | stable |
| Navigation and commands | Every way to move around and every command VCode runs, the phone way and the desktop way side by side. | stable |
| Pin and mark tabs done | Pin a tab to the left of the strip, or move it to Done; idle, merged and folderless tabs move to Done by themselves. | beta |
| Open a tab from the composer with /new | Type /new in the composer to open another tab without leaving the composer. |
stable |
| Projects and Worktop | A project is a name and one or more folders on one computer; its tabs start in the first folder, the window shows one project at a time, and Worktop holds every tab started outside one. | beta |
| The welcome line and tip on an empty tab | A tab with nothing in it yet opens on the V mark, one short line and a tip on a VCode feature, each picked for that tab; the first message takes their place. | stable |
| Pick the folder a tab works in | The folder box in the new-thread form is a typeable list of your repos that also completes any path on the machine. | stable |
| Browse for a folder and set the default | The folder button walks the machine's folders; Set as default makes one the folder new threads start in. | stable |
| Rename a tab | Give a tab a name of your own by editing its strip label or folder line, using the Threads sheet, or typing /rename <name> in the composer. |
stable |
| Search your tabs | Type into the field at the top of the tab bar (#tab-search) to narrow it to the open tabs whose name or messages hold every word. |
stable |
| Reorder tabs | Drag a tab along the strip, or a row up and down in the drawer or the Threads sheet, to put the tabs in the order you want. | stable |
| Start a new thread | Open a new tab: pick which agent runs it and which folder it works in, then tap Start thread. | stable |
| Swipe between tabs | Swipe the transcript sideways to move to the next or previous tab, in strip order. | stable |
| See which tabs finished or are waiting on you | An orange ! on a tab whose agent stopped for you, a green tick on one that finished, and their count on the Tabs button. |
stable |
| Tap feedback | One short vibration on every tap on a control. | stable |
| Switch tabs from the strip | The row of tabs across the top (#tabstrip) is every open thread of the active project. |
stable |
| Colour a tab | /colour blue colours the selected tab's top and side edges, the shared rail beneath other tabs, its row's border in tab lists, and the composer's edge while you are in it. |
stable |
| The tab bar | Tap Tabs or pull in from the left edge of the transcript for Worktop and your projects with their tabs (#drawer); a column on the left from 1080px. |
stable |
| A tab's working folder, and moving it | Every tab is rooted in one directory, chosen when the tab is created. | stable |
| The Threads sheet | The full tab manager (#sessions), behind All threads in the new-thread card. |
stable |
Composer
Write and send: queue or steer, slash commands, model and effort, attachments.
| Feature | What it does | Status |
|---|---|---|
| Alt moves and deletes a word | With a hardware keyboard, Alt in the composer does what Ctrl does: a word at a time. | stable |
| Choose where your typing goes: Agent or Shell | Two chips at the top of the screen decide who reads what you type: the agent, through the composer, or the tab's shell, through its terminal. | stable |
| Send a photo or a file with your message | The + under the composer attaches a screenshot. |
stable |
| Clear the context with /clear | /clear starts the agent fresh in this tab. |
stable |
| Escape twice to clear the composer | Press Escape twice in a row and the composer empties. Attachments stay where they are. | stable |
| Each tab keeps its half-written message | Swipe to another tab and back and the text you were typing is still there. | stable |
| Turn on fast mode for a tab | Fast mode asks the model for faster output, at a higher cost in usage. | stable |
| Hold backspace to delete whole words | Hold backspace in the composer and after two seconds it starts taking a whole word per repeat instead of one character. | stable |
| Edit, drop or steer a queued message | A message waiting to run has three buttons on its card: steer it into the running turn, pull it back into the composer to rewrite, or drop it. | stable |
| Queue or steer while the agent works | While a turn is running you can still type. | stable |
| Send a message to the agent | You type into the box at the bottom of the screen and send it to the agent running in the open tab. | stable |
| Set how hard the agent thinks | Effort is the reasoning dial: how long the agent is willing to think before it answers. | stable |
| Ask without interrupting with /btw | /btw asks the agent a quick question about the conversation so far. The running turn goes on, and the exchange stays out of the session. |
stable |
| Mention a file with @ | Type @ in the composer to pick a file from the tab's folder; its path goes into your message. |
stable |
| The slash menu | Type / in the composer and a list appears above it: the commands VCode runs itself, and the skills the agent can load. |
stable |
| Type to start a message | With a hardware keyboard, start typing anywhere and the character goes into the composer. | stable |
| Switch the model for a tab | Each tab runs one model. | stable |
| Plan on one model, edit on another with Fusion | Fusion runs a Claude tab on two models you pick: an orchestrator that talks with you, plans and reviews, and an executor that makes each code edit. | alpha |
| Open new tabs on a default model | Tap the house beside one model in the model panel, and every tab you open starts on that agent, model and effort. | stable |
| What the CLI's own slash commands do here | A slash command typed here is not a slash command typed into the vendor's own terminal UI. | stable |
| Walk back through the prompts you sent | Press the up arrow in the composer to put the prompt you sent before back in it. | stable |
Transcript
What you read while the agent works: answers, tool output, plan, subagents, errors.
| Feature | What it does | Status |
|---|---|---|
| See what the agent is doing right now | While a turn runs, the last thing in the transcript is a live card that says what the agent is doing, how long the turn has been going, and gives you a way to stop it. | stable |
| Copy a reply, a prompt or an output | Each card has a copy button in its header, and each code block has one of its own. | stable |
| Rewind the conversation | Go back to one of the agent's replies: your later messages leave the conversation, the agent forgets them, and the first one comes back into the composer. | stable |
| Comment on selected text | Select words anywhere in the transcript, tap Comment, and write a comment on them under their card. | stable |
| When the agent stops, and retrying | A card at the end of the transcript when the agent process died, a turn logged an error, or the thread is waiting out a usage limit. | stable |
| When the box cannot save a tab | When the disk stops taking writes for long enough, VCode stops the tab's agent, says why, and holds your messages until the disk takes writes again. | stable |
| Formatted answers and coloured code | Replies render as markdown: headings, lists, tables, quotes and fenced code. | stable |
| Screenshots inside the transcript | An agent can show you a picture. | stable |
| Jump back to the latest message | Scroll up and a pill appears above the composer with a down arrow and a count of what arrived while you were away. | stable |
| Page through the transcript | PageUp and PageDown move the conversation a screen at a time, with the caret still in the composer. |
stable |
| Follow the plan strip | A band above the transcript (#planstrip) showing the agent's steps: one dot per step, the step it is on, and how many are done. |
stable |
| Track steps with the todo CLI | v-code todo is a command on every agent's PATH inside a thread. |
stable |
| Read the transcript | The middle of the screen (#thread) is the conversation: your messages, the agent's replies, its thinking, every tool it ran and every file it edited, in the order they happened. |
stable |
| Run a command from a code block | A bash code block carries a run control that sends the block to the tab's shell and runs it there. | stable |
| Choose how much of each step shows | The settings sheet sets how much of each step the agent takes shows in the transcript: thinking, tool calls, edits and system notes. | stable |
| Watch the subagents | A strip under the transcript (#subs) that appears when the agent launches subagents. |
stable |
| Terminal colour and one-tap links | Command output keeps the colours the program printed, and every URL in it becomes a link with a copy button beside it. | stable |
Files and changes
Browse the folder, read and edit files, see what a turn changed, review and comment.
| Feature | What it does | Status |
|---|---|---|
| Comment on a line of a file | Right click or hold a line in the viewer, type what is wrong with it, and send it to the agent as a message that names the file, the line and quotes it. | stable |
| Review a diff the way a pull request reads | Every file a turn or a proof changed, in one scroll: the list of files on top, then each file's hunks under a header that stays in view. | stable |
| Edit a file | Tap Edit in the viewer, change the text, and save it to disk. | beta |
| Language servers in the editor | The box's TypeScript, Python, Go and Rust servers add their suggestions and colours while you edit; a missing one installs with one tap. | beta |
| See which files changed, in the tree | The explorer marks changes the way VS Code does: a changed file's name takes a colour and a letter (M, U, A, D), a folder above it the colour and a dot, and what git ignores is grey. |
stable |
| Browse the thread's folder | A file tree of the folder the thread runs in. | stable |
| Open a file | One file from the explorer, in a sheet over the thread on a phone and in a tab of its own on a wide window; images show and videos play. | stable |
| Files as tabs in panes | On a wide window a file opens as a tab in a pane, beside its thread tabs, and drags and splits like one. | stable |
| Find and replace in a file | Search the file in the editor, step through the matches, and replace one or all. | beta |
| Find a file by name | Type part of a name into the explorer's filter and the whole folder is walked for matches. | stable |
| Make, rename and delete files | Right-click or long-press a row in the explorer for New file, New folder, Rename and Delete. | beta |
| Open or download an attachment | Files you sent with a message stay on the message. | stable |
| See the proof a turn's work is done | When the agent finishes a change to code, its last reply carries a Proof section: the screenshots it took, the checks it ran, and the full git diff of its work, one tap away. | stable |
| Review code line by line | Gather comments across several lines and several files, then send the lot as one message. | stable |
| See every change this tab made | The explorer's Changes tab lists the files this tab edited or named in a proof, under a heading per checkout; a row opens the diff sheet. | stable |
| See the files a turn changed | Every turn that edited files gets a summary: a count in the status bar for the latest turn and a footer under each turn's last reply. | stable |
| See what changed in a file | The open file is marked with what has changed since the last commit: new lines are highlighted, and lines that were taken out stand where they used to be. | stable |
Agents and sessions
claude, codex, opencode, cursor, devin, copilot and muse: differences, resume, handoff, usage limits, compaction.
| Feature | What it does | Status |
|---|---|---|
| Log in to an agent from your phone | A logged-out agent's tab offers a login in place of Retry, and the settings sheet lists each agent's login per workstation. | stable |
| Install an agent from your phone | An agent the workstation lacks reads Install <agent> in the new-thread card; one tap runs the vendor's installer there, then its login, then starts the thread. With none installed the card opens on that list. |
stable |
| Log in to Cursor from your phone | Shows a browser login link in the new-thread card when Cursor is not authenticated. | stable |
| See and fix a tab's MCP servers | /mcp on a Claude, Codex or Devin tab lists the MCP servers its agent can use; log in, reconnect, turn one off or remove it, or ask the agent to add one. |
stable |
| Permission levels and Plan first | Each tab runs at Ask, Auto or Full; at Ask the agent asks before it runs a command, and Plan first keeps it read-only until you press Build. | stable |
| Let an agent drive the app | An agent opens tabs on any of your computers, prompts them, waits for and reads them, splits panes and opens files in the app you have open. | stable |
| Run your tabs with the Agent Commander | One assistant behind the top bar's VCode icon: tell it what you want, and it starts tabs for the work, reads them and waits on them. | beta |
| Watch a pull request and wake the agent | /watch 12 in a tab: when a check fails, the branch conflicts or a reviewer asks for changes, the agent gets a message and fixes it. |
beta |
| Compact the context automatically | When a turn ends with the context over a token mark, VCode runs a compaction turn of its own before the next message goes in. | stable |
| Background and resumed subagents | An agent can launch helpers that keep working after the call that started them returns, and can pick one back up later. | stable |
| Hand a tab to another agent | Change the agent on a tab and keep the conversation: same tab, same title, same history. | stable |
| Memory headroom and parked agent processes | Every agent runs inside VCode's cgroup. | stable |
| A tab that hits its memory cap | Each tab has its own memory cap. VCode warns the tab before it gets there, says so when the agent is killed at the cap, and does not start the agent again while the tab is still full. | stable |
| Find and resume any session | The resume screen finds any session on this box by what was said in it: open tabs, closed tabs and sessions started in a terminal. Reopen or fork it. | stable |
| Update the agents automatically | Turn on a switch per agent, and VCode runs that agent's own update once an hour on that computer. | stable |
| Update the agents and VCode from a tab | /update brings the machine up to date from your phone: the agents' command-line tools, their model lists, VCode itself, and then the app you are looking at. |
stable |
| Work carries on after VCode restarts | When the VCode process goes down mid-turn, the tab does not sit frozen. | stable |
| The status bar | One line under the transcript with the facts about this tab right now: which branch, how much context, whether you are connected, and what is waiting. | stable |
| Stop a running turn | Cut the agent off mid-answer, with the Stop key in the composer or Escape. |
stable |
| The seven agents and what each one can do | A tab runs one agent: claude, codex, opencode, cursor, devin, copilot or muse. |
stable |
| Run Devin in a tab | The Devin CLI in a tab: its effort, steering, Stop, resume, adoption, fork, side questions, plan, approvals and /mcp, and what it does not do. |
stable |
| Run GitHub Copilot in a tab | The Copilot CLI in a tab: its effort, steering, Stop, resume, adoption, plan, todos, approvals and login, and what it does not do. | stable |
| Run Muse in a tab | The Muse Code CLI in a tab: its model and effort, steering, Stop, resume, adoption, fork, side questions, plan, todos, approvals and /mcp, and what it does not do. |
stable |
| Wait out a usage limit and resume automatically | When the agent's plan window is full, the tab pauses instead of failing. | stable |
| Try again by itself after a temporary model error | An overload, a server error or a dropped stream is tried again after 30 s, 1, 2 and 5 minutes. | stable |
| Read your plan usage | A row of meters above the transcript shows how much of each plan's quota you have spent, and when each window resets. | stable |
| Your own system prompt | Edit system prompt in settings opens system-prompt.md; Claude, Codex, OpenCode, Devin, Copilot and Muse get its text after VCode's own instructions when a thread starts. |
stable |
| Have agents work in worktrees | Work on in settings: Worktree tells every agent to make each change in a git worktree under worktrees/ and remove it after the merge; Main tells it nothing. |
stable |
| What VCode tells every agent | Every agent started in a tab gets the same short instruction block and the same four environment variables. | stable |
Voice dictation
Talk instead of typing: the mic, the waveform, installing the service.
| Feature | What it does | Status |
|---|---|---|
| Dictate a message | Speak into the composer instead of typing. | optional |
| Dictate, then switch tabs before the words arrive | The words belong to the tab you were on when you recorded. | optional |
| When the mic button is missing or the microphone is refused | Two different failures look alike on a phone: no mic button at all, and a mic button that cannot open the microphone. | optional |
| Install the transcription service on the box | bash install.sh voice builds a python venv, downloads a 482 MB speech model, starts v-code-voice.service on loopback, and points VCode at it. |
optional |
| Point dictation at another service, or turn it off | VCODE_STT_URL is the only coupling between VCode and whatever transcribes a clip. |
optional |
| Retry a dictation that failed | When a transcription fails, the clip you just recorded is kept in memory for five minutes. | optional |
| Read a reply aloud | The speaker on an agent's reply reads it out with your device's own voices. | stable |
| Send after dictating | A transcript can send itself after a one second wait with a Cancel. | optional |
| Stop recording when you stop talking | A recording ends by itself after a set number of seconds of quiet, so you do not have to reach back for the stop button. | optional |
| What happens to the audio you record | Every dictation goes to the VCode machine; the clip is not saved anywhere and the transcript is never written to a log. | optional |
Offline and notifications
Install on the phone, work offline, get told when a thread finishes.
| Feature | What it does | Status |
|---|---|---|
| Install it on a phone | Put VCode on your home screen so it opens in its own window, with its own icon, and keeps working when the server is out of reach. | stable |
| Live updates and reconnect | The open thread streams from the server as it happens, and so does the tab strip. | stable |
| Open the app offline | The app opens and shows your threads with no connection to the server. | stable |
| Queue a message while offline | Send a message with no connection. | stable |
| The notification when a thread finishes | With notifications on, the phone buzzes when a thread settles: the agent finished with nothing queued behind it, it crashed, it is blocked on an approval, or it is waiting out a usage limit. | stable |
| Turn on notifications | Tap the bell to have this device buzz when a thread finishes or needs you. | stable |
| Update to a new build | When the server has a newer version of the app, a button appears in the top bar, and the app reloads on its own once nothing you typed would be lost. | stable |
| Where notifications work | Which browsers can subscribe to push, which need something from you first, and where the bell is not offered at all. | stable |
Shell, machines and layout
Shell mode, the machine name, the wide layout, the icon legend.
| Feature | What it does | Status |
|---|---|---|
| Run one command with ! | Start a message with ! and it runs as a command instead of going to the agent; the card lands in the transcript. |
stable |
| Edit the command line with taps | At a prompt in Shell mode, the line you are typing behaves like a text field: tap to put the caret anywhere in it, select a word and type over it, paste. | stable |
| The screen on a phone | Two bands of controls float over the conversation: everything above it in #overhead, everything below it in #underfoot. |
stable |
| What every icon means | Most controls in the app are a drawing with no words. | stable |
| Know which machine you are on | Every tab ends its folder line with the machine it runs on. | stable |
| Send a keystroke to the shell | Keycaps for the keys a phone keyboard does not offer: Tab, Esc, ↑, ↓, ^C, ^L, ⏎ and ^D. |
stable |
| Run shell commands in the tab | Switch the tab from the agent to a terminal. | stable |
| Split the window into panes | On a wide window the conversation area splits into panes, up to six across and six down, each holding some of your open tabs and its own status line, with the composer in whichever one has the focus, and you drag a tab from one pane, or from the Tabs column, to another. | stable |
| The terminal on a wide window | On a wide window the pane's terminal button or Ctrl+` switches the pane between the agent and the tab's terminal. | stable |
| Preview a web page from your computer | A dev server or an HTML file on your computer opens as a page: a preview tab in a pane on a wide window, the phone's own browser on a phone. | beta |
| When the app talks back | A short message slides in under the top band when something happened that you cannot already see. | stable |
| The layout on a tablet or desktop | Given a wide enough window the frame fills it, the whole app is scaled up, the tab strip becomes a desktop tab bar, and the file explorer becomes a column beside the conversation. | stable |
| Zoom the window on a desktop | On a desktop the zoom control beside the bell, Ctrl+plus, Ctrl+minus and Ctrl+0 make everything in the window bigger or smaller, from 67% to 200%, kept per browser. | stable |