vmux
AppsvmuxMac

CRT effects

Scanlines, vignette, bloom, and the rest of the CRT pipeline on macOS.

What CRT effects are

CRT effects are a stack of optional post-processing passes that make the terminal look like a vintage cathode-ray tube monitor. They include scanlines, screen curvature, chromatic aberration, vignette darkening, bloom around bright text, an interlace pattern, static noise, and a phosphor decay trail behind moving text. Some users love them as a daily aesthetic; others enable them only for screenshots and demos.

vmux on visionOS uses a Metal post-processing pipeline (with a SwiftUI overlay for scanlines, vignette, and noise) that is described in detail in CRT Effects. This page is the macOS-specific guide.

Status on macOS

The CRT pipeline is currently paused on vmuxMac. The Mac terminal is rendered by the embedded Ghostty engine, which uses native drawing. The vmux CRT pipeline lives on the Metal renderer, which is currently bypassed on Mac. The toggles still appear in a few places (the Terminal menu, the command palette, and the CRT settings tab) for parity with the rest of the family, and your settings still persist, but they have no visible effect today.

If you want CRT-style visuals on a Mac right now, the practical options are:

  1. Use vmux on visionOS and open the terminal in immersive mode — the spatial CRT effect is the most polished.
  2. Apply a system-wide shader effect with a tool like the Quartz Composer / shader filters available on macOS. These work outside vmuxMac.
  3. Wait for a future vmuxMac update that routes drawing back through the Metal pipeline. We track the work with the rest of the family.

What the toggles do today

ControlWhereEffect on Mac today
Cmd+Shift+RKeyboardToggles the stored "CRT enabled" flag. No visible change.
Toggle CRT EffectCommand palette and Terminal menuSame as above.
CRT tabSettingsShows a single disabled toggle and a note explaining the pause.
set-crt / crtvshSame as the keyboard shortcut.

When the macOS Metal pipeline is restored, the existing settings will start having an effect immediately — there is nothing for you to redo.

What you would tune (when re-enabled)

For reference and for users moving between vmuxMac and vmux on visionOS, the full set of CRT controls is below. These are the same controls you would use on Vision Pro — once Mac drawing returns to the Metal pipeline, the same sliders will apply on Mac.

SettingRangeWhat it does
CRT EffectOff / OnMaster enable. Everything below is gated on this.
Scanlines0% – 100%Horizontal scanline intensity. 70% is a common starting point.
Vignette0% – 100%Corner and edge darkening.
Flicker0% – 100%Subtle brightness flicker.
Noise0% – 100%Static grain overlay.
Tint0% – 100%Phosphor color tint (green, amber, etc.)
Barrel0% – 100%Barrel distortion / screen curvature.
Chromatic0% – 100%Chromatic aberration (color fringing at edges).
InterlaceOff / OnAlternating scanline interlace.
Bloom0% – 100%Glow intensity around bright text.
Bloom Threshold0% – 100%Minimum brightness for bloom to appear.
Bloom Radius0% – 100%Spread of the bloom.
Phosphor Decay0% – 100%Persistence trail on moving text.
Shadow Mask0% – 100%Subpixel shadow mask pattern.

When the pipeline returns, these presets are reasonable starting points based on what works on visionOS:

Subtle (everyday use)

SettingValue
Scanlines30%
Vignette30%
Bloom10%
Chromatic20%
Everything elseOff

Classic green phosphor

SettingValue
Scanlines70%
Vignette50%
Tint80%
Bloom30%
Phosphor Decay30%
Barrel20%

High-impact retro

SettingValue
Scanlines80%
Vignette70%
Bloom60%
Chromatic70%
Barrel50%
InterlaceOn
Phosphor Decay40%

These are not enforced by the app — adjust to taste.

Performance

When the pipeline is active (on visionOS today, on Mac in the future), CRT post-processing adds GPU work proportional to the window size. The Metal renderer keeps the cost low: the CRT compute shader runs once per frame on the rendered terminal texture and is skipped entirely when the master toggle is off.

The most expensive single setting is bloom, because it requires multiple downsample / upsample passes. If you ever notice frame-rate drops on a very large window, bloom is the first knob to lower.

Why split the pipeline at all

For users who care: vmux on visionOS uses two layers of effect rendering. The Metal pipeline owns bloom, chromatic aberration, barrel distortion, phosphor decay, and degauss. A SwiftUI Canvas overlay handles scanlines, vignette, tint, noise, shadow mask, and flicker. Both are wired together by the same setting, so toggling CRT Effect drives them both at once.

The split exists because some effects are easier to express as a compute shader (bloom, distortion) and others are nearly free as a Canvas overlay (scanlines, vignette). When Mac returns to the Metal pipeline, the same split will apply.

Where to go next