Terminal Display
GPU renderer, CRT effects, glass background, cursor styles, and visual options.
The renderer
vmuxPhone draws the terminal with the same GPU-accelerated renderer used by vmux on Apple Vision Pro. Every cell, the cursor, the selection, and the border are rendered in a single Metal draw call against a glyph atlas built from your selected font. The renderer is pull-based — when nothing changes on screen, it does no GPU work, which keeps the iPhone cool and saves battery on long-running shells.
You do not need to configure anything for the renderer to work. It selects the right pixel scale automatically and rebuilds the glyph atlas when you change font, weight, or size. The same engine handles emoji, Nerd Font icons, and Unicode box-drawing.
Glass background
The terminal sits on a translucent layer that blurs whatever is behind it. The default is the iOS ultraThinMaterial glass; on iOS 26 and later, the round terminal toolbar buttons additionally use the system Liquid Glass effect.
Glass is controlled from the Appearance sheet, which opens from the round menu button at the top-right of the terminal. The relevant settings are:
| Setting | Effect |
|---|---|
| Glass Background | Master toggle. When off, the terminal uses a solid theme background. |
| Glass Variant | Regular is the standard frosted look. Clear is more transparent and lets more of the camera or system wallpaper through. |
| Background Opacity | A slider between 0 (fully transparent) and 1 (solid). Default is 0.42. |
Camera passthrough — when enabled — replaces the glass with a live blurred view of the rear camera, useful when you want a productivity-style overlay on top of the world. Tap Appearance → Camera Passthrough to toggle it. iOS will ask for camera permission the first time.
CRT effects
vmuxPhone ships the same CRT post-processing pipeline as the visionOS app, applied as a SwiftUI overlay across the terminal surface. The CRT settings live in Appearance → CRT Effect. Turning the master toggle off skips the entire pass and costs nothing.
| Slider | What it does |
|---|---|
| Scanlines | Horizontal scanline intensity. |
| Vignette | Corner darkening. |
| Flicker | Brightness flicker over time. |
| Noise | Static grain overlay. |
| Tint | Green phosphor color cast. |
| Barrel | Screen curvature distortion. |
| Chromatic | Per-channel offset for color fringing. |
| Interlace | Alternating-row interlace pattern. |
| Bloom | Glow around bright text. |
| Bloom Threshold | Minimum brightness before bloom kicks in. |
| Bloom Radius | How far bloom spreads. |
| Phosphor Decay | Trail length on moving text. |
| Shadow Mask | Subpixel shadow mask pattern. |
CRT looks best on darker themes. Pair it with Phosphor Green or a Solarized Dark theme for the classic green-screen aesthetic.
A note on the iOS pipeline: the unified Metal CRT path (the one used in some earlier builds) is currently disabled across all targets because the offscreen snapshot landed at a fraction of the drawable size on real hardware. The overlay path is the active one and looks nearly identical, with a small CPU cost on top of the normal Metal terminal renderer. The visual sliders behave the same as on visionOS.
Cursor styles
The cursor is part of the renderer, not a SwiftUI view. It scales with font size and rebuilds when you change theme. Cursor style and blink are configured in Appearance or with the corresponding vsh commands:
| Setting | Values |
|---|---|
| Cursor Style | Block, Hollow Block, Underline, Bar |
| Blink Cursor | On / Off |
When you connect to a host, vmuxPhone starts every session with Blinking Block. Programs that want a different cursor (like vim's insert mode bar) override the style for the duration of their session and restore it on exit, exactly like a desktop terminal.
Background opacity and dim/bright
You have three independent dials for visual brightness:
- Background Opacity — how transparent the terminal background is. Setting this to 0 with Camera Passthrough on gives you the classic see-through monitor look.
- Glass Variant — how strongly the glass material blurs the layer below.
- Theme — a dark theme renders less light overall than a light theme. See Themes and fonts for picking one.
There is no separate bright/dim mode toggle on iPhone. Lowering theme contrast or switching themes is the right pattern.
Character and line spacing
Fine-tuning the grid:
| Setting | Range | Default |
|---|---|---|
| Character Spacing | 0.80 – 1.50 multiplier | 1.00 |
| Line Spacing | 0.80 – 2.00 multiplier | 1.00 |
These multiply the natural advance of the chosen font. Increase line spacing if you find the rows too close together; decrease character spacing if the font pushes glyphs apart too much for your taste.
Top fade and safe area
The top of the terminal fades into the theme background to avoid a hard cut against the iPhone status bar. When Camera Passthrough is on, the fade is replaced with a fully transparent strip so the camera shows through edge to edge. The renderer accounts for the iOS safe area insets automatically.
Image import
You can drag an image from Photos or Files onto the terminal. vmuxPhone uploads each picked image to the remote host via SFTP and then pastes the resulting paths into the running shell. While the upload is in progress, a translucent panel sits over the terminal showing Importing N image(s) and per-file progress. If the connection drops mid-upload, vmuxPhone tells you that the images uploaded but the paste was suppressed, and prints the remote paths into the alert so you can paste them yourself later.
This works only when the active session is connected. Drag-and-drop on a disconnected session shows Connect to a host before importing images.
Visual feedback
Bright UI feedback — Face ID approvals, bell flashes, and reconnect spinners — is part of the renderer’s visual haptic system. It does not affect the terminal text or the scrollback buffer.
Related
- Themes and fonts — picking a theme and importing Nerd Fonts.
- Settings reference (visionOS) — the master settings reference; the iPhone names match.
- Keyboard and input — keyboard layout and gestures.