Skip to content

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.

  • Source: extracted from the milli.nvim blackhole GIF preview, the same braille frame data milli’s milli export -t lua produces.
  • 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 #000000 deep into the void to #ee8822 at the disc’s brightest point.

Files:

-- ~/.config/blak/lua/blak/user.lua
return {
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
},
},
}
:BlakSplash

Opens 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.

Snacks owns the dashboard buffer. Blak’s splash hooks into two Snacks events:

-- lua/blak/splash/init.lua
vim.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.
  • SnacksDashboardUpdatePre pauses the animation while Snacks re-renders.

Blak also tidies the dashboard window:

  • The dashboard window gets a window-local fillchars with eob: , so no ~ rows show under the splash. Other buffers in that window keep your fillchars.
  • Snacks hides the statusline on the startup dashboard, which would put Neovim’s ruler in the command line. BufEnter/WinEnter autocmds turn 'ruler' off while the dashboard (or a float over it) is focused and restore your value when a regular window takes focus.
  • :colorscheme runs :hi clear, which wipes the splash colors. A ColorScheme autocmd in the BlakSplashColors group defines them again.

The animation runs on a vim.uv.new_timer(), scheduled with vim.schedule_wrap, and is torn down on BufWipeout / BufDelete.

The frame file is committed verbatim from upstream milli. To refresh:

  1. Replace lua/blak/splash/frames/blackhole.lua with the latest copy from milli.nvim/lua/milli/splashes/blackhole.lua.
  2. 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.

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.