VCode home

Logs and troubleshooting

Agents: claude, codex, opencode · On: desktop

Every unit logs to the journal. Three commands cover almost everything, and there are four rules that explain most of the confusing failures.

Why you would use it

The app came back wrong after an update, a tab will not open, or the phone is showing a version you replaced an hour ago.

How to use it

journalctl --user -u v-code -f
journalctl --user -u v-code-tunnel -f
journalctl --user -u v-code-voice -f

bash install.sh status                       # all installed units, token redacted
curl -s localhost:3445/health                # ok, authRequired, voice, threads
systemctl --user restart v-code   # from a terminal only

What you see

Boot lines from server.js:

Refusals, one line then exit 1:

Running lines: error <status> <METHOD> <path> for anything that failed, with long path segments masked, and parked <thread-id> after N min idle when the memory reaper stops a tab.

Options and settings

Rule Why
Never restart v-code from inside a VCode thread The restart kills the agent turn that issued the command. Run it from a terminal or over ssh
Restart after any merge that adds a <script src> Static files serve from the repo directory, so disk serves the new index.html while the running process still 404s the new route
Bump VERSION in public/sw.js with any change to the shell Installed phones serve the cached shell until the version changes, restart or not. The bump shows the update button (#update-ready) in the top bar — see update-to-a-new-build
bash install.sh update does the first two for you It restarts every active unit at the end

The shell, for the VERSION rule, is public/index.html, public/styles.css, the public/*.js scripts, lib/derive.js and lib/tab-order.js.

Limits and known gaps