nyan.nvim: a statusline that became a minimap

It started as a joke. I wanted Nyan Cat in my Neovim statusline — the iconic pop-tart feline trailing a rainbow as I scrolled through code. The kind of thing you build on a Sunday and never tell anyone about.

It didn't stay a joke. Somewhere along the way it turned into the most useful thing on my statusline.

The accidental good idea

The original mechanic was simple: the rainbow trail grows as you scroll deeper into a file, so the trail length doubles as a scroll indicator. Cute. But it got me thinking — if the statusline already knows where I am in the buffer, what else could it show me at that same proportional position?

That question produced the space theme, which is now the default renderer. Instead of a cat, you get a compact minimap of the current buffer:

[ · │ · ✕ · ▷ · · · ✕ · · │ · · · · · ]

Annotated diagram of the nyan.nvim space-theme minimap: a dark bar where dots are file lines, crosses mark LSP errors and warnings at their proportional position, vertical bars mark git hunks (green added, blue modified), and a ship marks the cursor.

The ship is your cursor position. The markers are LSP diagnostics, placed at their proportional location in the file. The markers show where git hunks live. Colour encodes severity and change type. In a single line you get a spatial overview of your file's health — where the errors are, where you've made changes — without leaving your code or opening a sidebar.

It's the kind of ambient information I didn't know I wanted until it was there.

How it works

The diagnostic markers come straight from Neovim's built-in vim.diagnostic API, mapped from line numbers to proportional positions across the component's width. The git markers integrate with gitsigns when it's available — instant, in-memory, no shelling out — and fall back to parsing git diff directly when it isn't, so the plugin works with zero extra dependencies.

The whole thing links to your existing colourscheme's highlight groups by default. NyanDiagError links to DiagnosticError, the git markers link to the GitSigns* groups, and so on. It inherits your theme rather than fighting it.

The cat is still there

For when you want it, classic mode renders the actual animated Nyan Cat using the Kitty Graphics Protocol — real pixel art in the terminal, not ASCII approximation. This was the most interesting technical piece to build. Terminals that speak the protocol (Kitty, Ghostty, and a growing list of others) can render and animate inline images, and driving that from a statusline component meant managing frame timing and placement inside a space that was never designed for graphics.

For terminals that don't support it, there's a colourful ASCII fallback, so nobody's left with a broken statusline.

What I took from it

A few things stuck with me after building this:

The best features often start as something you build for fun. I'd never have designed a "diagnostic minimap statusline component" from a blank page — it emerged from messing about with a scroll indicator. Play is a legitimate design process.

Graceful degradation matters even for toys. The gitsigns-or-git-diff fallback and the graphics-or-ASCII fallback mean the plugin works for everyone, which is the difference between something people can actually install and something that only works on my machine.

And sometimes the silly name is worth keeping. nyan.nvim could have been "statusline-minimap.nvim" and nobody would remember it. The cat is the reason you clicked.

Source is on GitHub, MIT licensed.