Custom cursor shaders for ghostty & kitty terminals (trails and ripple/pulse effects)
GLSL
1,158
16 commits
updated Oct 3, 2026
| Effect | Demo |
|---|---|
| Cursor Warp (Neovide-like) | |
| Cursor Sweep | |
| Cursor Tail (Kitty-like) | |
| Ripple Cursor | |
| Sonic Boom | |
| Ripple Rectangle | |
| Customized (faded warp + ripple) |
cursor-warp, cursor-sweep, cursor-tail)[!NOTE] If you have the line cursor (default), these effects will trigger and freeze on unfocus(as cursor changes to hollow block). The solution is to add
custom-shader-animation = alwaysto your ghostty config
git clone https://github.com/sahaj-b/ghostty-cursor-shaders ~/.config/ghostty/shaders
~/.config/ghostty/config, add:custom-shader = shaders/ghostty/yourshader1.glsl
custom-shader = shaders/ghostty/yourshader2.glsl
# ...
Replace yourshader with the name of any shader file (e.g., cursor_sweep, ripple_cursor, etc.)
kitty/ folder into your kitty config:cp -r kitty/* ~/.config/kitty/shaders/
~/.config/kitty/kitty.conf, add (pick ONE trail):cursor_trail 1
custom_shaders cursor-warp
# custom_shaders cursor-sweep
# custom_shaders cursor-tail
The kitty cursor-warp ships with the customized (faded warp) values from below
ANIMATION section// in cursor_warp.glsl
const float DURATION = 0.15;
const float TRAIL_SIZE = 0.8;
const float THRESHOLD_MIN_DISTANCE = 1.0;
const float BLUR = 1.0;
const float TRAIL_THICKNESS = 1.0;
const float TRAIL_THICKNESS_X = 0.9;
const float FADE_ENABLED = 1.0;
const float FADE_EXPONENT = 5.0;
// in ripple_cursor.glsl
const float DURATION = 0.15;
const float MAX_RADIUS = 0.026;
const float RING_THICKNESS = 0.02;
const float CURSOR_WIDTH_CHANGE_THRESHOLD = 0.5;
vec4 COLOR = vec4(0.35, 0.36, 0.44, 0.8);
const float BLUR = 3.5;
const float ANIMATION_START_OFFSET = 0.01;
Inspired by Neovide cursor animations and KroneCorylus/ghostty-shader-playground
MIT
25 followers · starred Mar 2026
165 followers · starred Oct 2025
173 followers · starred Oct 2025
121 followers · starred Nov 2025
Custom cursor shaders for ghostty & kitty terminals (trails and ripple/pulse effects)
GLSL
1,158
16 commits
updated Oct 3, 2026
| Effect | Demo |
|---|---|
| Cursor Warp (Neovide-like) | |
| Cursor Sweep | |
| Cursor Tail (Kitty-like) | |
| Ripple Cursor | |
| Sonic Boom | |
| Ripple Rectangle | |
| Customized (faded warp + ripple) |
cursor-warp, cursor-sweep, cursor-tail)[!NOTE] If you have the line cursor (default), these effects will trigger and freeze on unfocus(as cursor changes to hollow block). The solution is to add
custom-shader-animation = alwaysto your ghostty config
git clone https://github.com/sahaj-b/ghostty-cursor-shaders ~/.config/ghostty/shaders
~/.config/ghostty/config, add:custom-shader = shaders/ghostty/yourshader1.glsl
custom-shader = shaders/ghostty/yourshader2.glsl
# ...
Replace yourshader with the name of any shader file (e.g., cursor_sweep, ripple_cursor, etc.)
kitty/ folder into your kitty config:cp -r kitty/* ~/.config/kitty/shaders/
~/.config/kitty/kitty.conf, add (pick ONE trail):cursor_trail 1
custom_shaders cursor-warp
# custom_shaders cursor-sweep
# custom_shaders cursor-tail
The kitty cursor-warp ships with the customized (faded warp) values from below
ANIMATION section// in cursor_warp.glsl
const float DURATION = 0.15;
const float TRAIL_SIZE = 0.8;
const float THRESHOLD_MIN_DISTANCE = 1.0;
const float BLUR = 1.0;
const float TRAIL_THICKNESS = 1.0;
const float TRAIL_THICKNESS_X = 0.9;
const float FADE_ENABLED = 1.0;
const float FADE_EXPONENT = 5.0;
// in ripple_cursor.glsl
const float DURATION = 0.15;
const float MAX_RADIUS = 0.026;
const float RING_THICKNESS = 0.02;
const float CURSOR_WIDTH_CHANGE_THRESHOLD = 0.5;
vec4 COLOR = vec4(0.35, 0.36, 0.44, 0.8);
const float BLUR = 3.5;
const float ANIMATION_START_OFFSET = 0.01;
Inspired by Neovide cursor animations and KroneCorylus/ghostty-shader-playground
MIT
25 followers · starred Mar 2026
165 followers · starred Oct 2025
173 followers · starred Oct 2025
121 followers · starred Nov 2025