A job finishes on a cluster node at 2 a.m. and drops a QVF archive into your scratch directory. To look at the HOMO you can copy Cube files down to a laptop, start a GUI, and hope it parses the dialect your program wrote. Or you can stay in the same SSH session, run one command, and the orbital appears in the terminal. The first option works, most of the time. The second works in the session that already has the data.
vibe-view is my answer to that second path. It is a standalone visualization and conversion tool for quantum chemistry results, built outside of work, on evenings and weekends. It opens QVF calculation archives and loose structure and volume files from many chemistry programs. It is MPL-2.0 licensed, needs Python 3.11 or newer, and requires no C++ compiler and no Docker.
Every picture in this post is real output from the tool, rendered from real calculation archives that my validation campaign produced. Nothing here is a mockup, and none of the data was prepared for this article. More on that below.
No producer required
The design decision the rest follows from is that vibe-view does not require the code that produced the data. vibe-qc, the engine that writes most of my archives, is one QVF producer, but you do not need it installed, or even present, to open its results. The viewer installs into its own Python environment, so it never collides with anything else on the machine. The vibe-qc engine itself is described in a preprint on ChemRxiv and is under review at the Journal of Computational Chemistry. This article is about the viewer.
The product and the shell command are vibe-view, the Python package is vibeview, and the source directory is vibe-view/.
The same scene, five surfaces
The same renderers sit behind five surfaces. The browser surface is the default for interactive work: a full 3D viewer served over HTTP, with the section list in a sidebar and charts as interactive Plotly panels. The desktop surface wraps the same session in a native Electron window.
vibe-view open job.qvf # browser
vibe-view desktop job.qvf # Electron window
vibe-view tui job.qvf # interactive terminal
vibe-view show job.qvf # one frame, then exit

The terminal mode is the one I care about most. It draws the full 3D viewer, charts, and data tables as Unicode braille characters. It needs no display server, no OpenGL, and no X forwarding, so a result can be read on the compute node where it was written. This is benzene from my validation set, PBE0/def2-TZVP, exactly as vibe-view show prints it into an SSH session:

Charts get the same treatment. This is the harmonic IR spectrum of formaldehyde, computed from a finite-difference Hessian at PBE0/def2-SVP, drawn as a stem plot with a Lorentzian envelope, in the terminal:

And this is the energy profile of a benzene geometry optimization, taken from the trajectory section of the same archive as the structure above:

vibe-view show benzene_opt.qvf -s traj0 --chart: the last 0.07 kcal/mol of a geometry optimization, plotted in braille.For figures there is a headless path. batch renders offscreen PNG galleries, capture renders any single section to PNG, and animate turns trajectories, reaction paths, and vibrations into MP4 or GIF. The same scene that draws in the browser renders to a PNG with no window open. The render_terminal function in the Python API uses the same software rasterizer and needs no OpenGL context, which is why the compute-node case works at all.
from vibeview import info, validate, capture_structure, render_terminal
print(render_terminal("job.qvf", size=(80, 24)))
In a notebook, %load_ext vibeview.jupyter followed by %vibeview calculation.qvf embeds the viewer in a cell.
What it renders
Structures render with CPK coloring in ball-and-stick, space-filling, or wireframe style. Electron density comes up as a translucent isosurface with an adjustable isovalue, and molecular orbitals render with signed lobes. This is the HOMO of the parallel-displaced benzene dimer, PBE0/def2-SVP with D3BJ dispersion, straight from vibe-view capture:

vibe-view capture dimer.qvf -s vol_mo_0.
Vibrational normal modes animate. vibe-view animate wrote this GIF of a C–H stretching mode of formaldehyde from the same Hessian archive as the IR spectrum above:

vibe-view animate -k vibration.Beyond what is pictured: band structures and densities of states draw as interactive Plotly charts with a Fermi-level reference in the browser, IR, UV-Vis, and Raman spectra draw as stem plots, compare mode overlays structures from several archives with Kabsch alignment, and geometry optimizations play back frame by frame next to their energy plot. A few deeper cuts matter to me. The wavefunction evaluator re-evaluates any orbital on demand from the stored GTO basis, so an orbital can be inspected without asking the engine for another Cube file. Bond orders come from Mayer and Wiberg analyses, QTAIM critical points and bond paths overlay on the structure, and optional chain and secondary-structure metadata turns biomolecules into cartoon renders. There is also a live job-queue cockpit that follows vibe-queue jobs by state.

Files in, files out
Import covers QVF, XYZ, CIF, Cube, PDB, Mol2, Gaussian input, GRO, and SDF/Mol. Loose files from other codes open directly, without a conversion step. Export covers XYZ, CIF, CML, JSON, OBJ, glTF, POV-Ray and Blender scenes, a standalone self-contained HTML viewer, SVG, and PDF.
The utilities I reach for most: validate runs a SHA-256 integrity check over an archive, diff compares two archives, merge and slice recombine sections, supercell replicates a periodic cell, and h-add adds hydrogens. doctor diagnoses an installation. demo writes a bundled water example that needs no input file and no vibe-qc at all, which is how I test a fresh checkout before anything else.
Where these pictures come from
Every archive shown here is a by-product of the validation campaign behind the vibe-qc release paper. The benzene structure and its optimization profile are one archive from the molecular validation set. The formaldehyde Hessian comes from my input library, a growing collection of curated calculations that also feeds the ASCENT benchmark database. The benzene dimer archive carries the density, two orbital volumes, and a QTAIM topology in 7 megabytes. The point of showing campaign data instead of polished demo files is that this is what the viewer actually gets fed every day, at every basis-set quality, including the ugly ones. The desktop screenshots are the one exception: they show a fresh water RHF/6-31G* run made while writing this post, because a water HOMO is the clearest possible picture of signed lobes.
Honesty requires saying what did not make it into this post. My periodic test archives are minimal-basis, all-electron calculations, and their band structures render with core levels dominating the energy axis, which makes correct but useless screenshots. And while preparing this article I noticed that the terminal UV-Vis chart labels its axis in nanometers while plotting excitation energies in electron volts. The data in the archive is right, the label is wrong, and the bug is now filed. Writing a blog post turned out to be one more validation pass.
What is not done yet
I want the limits stated before you install, not after you hit them.
The private package index at vibe-qc.com is planned but not published, so pip install vibeview does not work yet. Installation today is from a source checkout or a linked wheel. Desktop mode requires a source checkout, and signed standalone desktop artifacts have not landed. The hosted 2.14.1 wheel predates the demo, doctor, formats, persistent import, and importer-plugin features, so a current checkout is needed for those. The vibe-qc GitLab project is still private at the time of writing. Read-only clone access is by request: email a public SSH key to mpei@vibe-qc.com.
Next I am working through the packaging checklist: the package index, the signed desktop builds, and a published wheel that matches the checkout. The terminal mode stays the centerpiece, because that is where the design proves itself: the result never has to leave the compute node for you to read it.


