Dataview TUI dashboard
Previously
In the previous article, we broke out of Obsidian's rendering limitations by generating static HTML dashboards from cached Dataview JSON files. That worked great in a browser, but I spend most of my time in the terminal.
The whole point of using Neovim and tmux over something like Emacs (at least in my setup) is isolation: my PKM system has its own runtime and configuration, completely separate from my dev environment, and tmux acts as the bridge between them. So the natural next step was bringing those same JSON-powered dashboards into the terminal.
First Attempt: Telescope Pickers
The first approach was straightforward. I already had a custom Telescope picker that displayed markdown files by their title frontmatter instead of filenames. The next evolution was feeding it JSON directly instead of parsing frontmatter on every invocation.
The dataview_picker module does exactly this: load a JSON file, format the entries, and present them in Telescope with fuzzy search and file preview. Usage looks like:
require("dataview_picker").open("query.json", "My Notes")
This was fast. Instead of waiting for Neovim to scan and parse hundreds of markdown files, I got instant results from a single JSON read.
Second Attempt: Fake Buffers
For review-style workflows, I wanted something different: a buffer where each line represents an entry, and deleting a line removes that entry from the underlying JSON. Immediate visual feedback when triaging.
The bookmarks module creates these "fake buffers." Each line shows [status] summary, pressing Enter opens the file at the right line, and dd deletes the bookmark from both the buffer and the JSON file.
Between Telescope pickers and fake buffers, I had decent coverage. But I still needed something outside of Neovim.
The Problem: Context Switching
What if I need to check my calendar, switch the playing podcast, or look up some notes without leaving my current dev environment?
I could do all of this in Neovim. But after one too many Emacs-style traumas, I refuse to stuff every feature into my editor and pray that my playlist manager doesn't break my LSP config one day. I want my tools isolated.
The Solution: dv-tui
And so I built dv-tui: a ncurses-based TUI that displays cached Dataview query results and renders in a tmux popup window.

Map a keybind in tmux, and wherever I am, the same keys open the same queries in a popup. Fuzzy search, pick an entry, and it opens in my notes Neovim instance through a socket. No context switch. No mental overhead. See the README for the full feature list and usage.
What's Still Bad
The TUI itself is solid, but the overall system has the same fragility as the HTML dashboard:
- Fragmented tooling. Random Lua scripts, a Python TUI, JSON files in expected locations, sockets to specific Neovim instances. It's not portable.
- Obsidian dependency. The queries still run inside Obsidian. If I want to ditch Obsidian, I need to reimplement the Dataview query engine.
Down the line, I'll need either a proper "code as configuration" approach or a way to keep the syntax while dropping the Obsidian runtime entirely.
More to come.