Splash & dashboard
The splash is the first thing you see on a cold launch of Blak. It’s a 66-frame braille animation of a black hole’s accretion disc, rendered at 50×14 cells with a red-orange palette. The same animation plays on every dashboard refresh.
What you’re looking at
Section titled “What you’re looking at”- Source: extracted from the milli.nvim blackhole GIF preview, the same braille frame data milli’s
milli export -t luaproduces. - Resolution: 50 columns × 14 rows, each cell a U+2800–U+28FF braille glyph carrying 8 sub-pixels (2×4).
- Frame rate: 80 ms per frame (~12.5 fps), 66 frames per loop (~5.3 s).
- Color: per-row, per-character color spans (foreground only, transparent background). The palette runs from
#000000deep into the void to#ee8822at the disc’s brightest point.
Files:
- Renderer:
lua/blak/splash/init.lua - Frame data:
lua/blak/splash/frames/blackhole.lua(auto-generated; don’t hand-edit) - Provenance:
assets/BLACKHOLE_SOURCE.md
Configuration
Section titled “Configuration”-- ~/.config/blak/lua/blak/user.luareturn { ui = { splash = { enabled = true, -- show the splash at all animate = true, -- play frames; false renders frame 1 statically loop = true, -- loop forever; false plays once and stops }, },}Previewing without a cold launch
Section titled “Previewing without a cold launch”:BlakSplashOpens the animation in a centered, minimal float sized to the art, so your windows stay as they are. Press q or <Esc> to close it; it also closes when focus moves to another window. Useful for tuning terminal color rendering, font choice, or letting someone watch it without restarting.
How it attaches to the dashboard
Section titled “How it attaches to the dashboard”Snacks owns the dashboard buffer. Blak’s splash hooks into two Snacks events:
-- lua/blak/splash/init.luavim.api.nvim_create_autocmd("User", { pattern = { "SnacksDashboardOpened", "SnacksDashboardUpdatePost" }, callback = function() ... end,})SnacksDashboardOpened— fires once when the dashboard buffer renders. Blak finds frame 1’s anchor row and starts the timer.SnacksDashboardUpdatePost— fires whenever Snacks re-renders the dashboard (resize, action toggle). Blak re-paints so its color extmarks aren’t lost.SnacksDashboardUpdatePrepauses the animation while Snacks re-renders.
Blak also tidies the dashboard window:
- The dashboard window gets a window-local
fillcharswitheob:, so no~rows show under the splash. Other buffers in that window keep yourfillchars. - Snacks hides the statusline on the startup dashboard, which would put Neovim’s ruler in the command line.
BufEnter/WinEnterautocmds turn'ruler'off while the dashboard (or a float over it) is focused and restore your value when a regular window takes focus. :colorschemeruns:hi clear, which wipes the splash colors. AColorSchemeautocmd in theBlakSplashColorsgroup defines them again.
The animation runs on a vim.uv.new_timer(), scheduled with vim.schedule_wrap, and is torn down on BufWipeout / BufDelete.
Refreshing the frames
Section titled “Refreshing the frames”The frame file is committed verbatim from upstream milli. To refresh:
- Replace
lua/blak/splash/frames/blackhole.luawith the latest copy frommilli.nvim/lua/milli/splashes/blackhole.lua. - Don’t change anything in
lua/blak/splash/init.lua— it reads the standard milli export shape (cols,rows,delays,frames,colors).
The static validation script (scripts/validate.py) checks frame structure on every CI run: frame count, row/col dimensions, that every glyph is in the braille block, and that color spans are well-formed.
Disabling completely
Section titled “Disabling completely”return { ui = { splash = { enabled = false } },}Snacks dashboard still shows; only the animated header is removed. To disable Snacks dashboard entirely, override the Snacks spec — see the Plugins guide.