Changelog¶
All notable changes to vibe-view are documented here.
The format follows Keep a Changelog, and the project uses Semantic Versioning.
This file starts at the first public commit. Development before 9585e28
(tagged v2.15.2) took place in a private monorepo whose history was
deliberately not transferred — see the README.
Unreleased¶
[v2.18.0] - 2026-09-17 - Richardson’s Robin¶
Periodic band-structure and DOS charts now open on the states around E_F.
An all-electron archive puts its core shells hundreds or thousands of eV
below the valence region – silicon at STO-3G places its 1s at -2431 eV –
and an axis autoscaled over all of them left the bands unreadable without a
manual zoom. Pseudopotential archives, which have no core states, keep the
axis they had. The Sphinx toolchain is now a declared docs extra instead
of ten pins inlined in CI, so the site can be built from package metadata.
Setup scripts run on stock macOS Bash 3.2, and a release push no longer
repeats the gate its candidate already passed.
Added¶
An energy window for the band-structure and DOS charts. All-electron periodic archives carry core states hundreds or thousands of eV below E_F — silicon at STO-3G puts its 1s at -2431 eV — and an axis autoscaled over all of them squeezed the valence and conduction bands into a few pixels around the E_F line, so the chart could not be read without a manual drag-zoom. The bands, DOS and combined panels now open on the states grouped around E_F, with the core shells off the axis, and carry E − E_F min / E − E_F max fields and a Reset window button. A spectrum with no core states is not windowed at all, so pseudopotential archives keep the axis they had. A producer can ship its own first view with an
energy_windowhint inviewer_defaults, andrender_to_html/render_to_bytestakeenergy_window=andauto_window=Falsefor scripted figures. (#26)A
docsextra declaring the Sphinx toolchain..gitlab-ci.yml’s.docs_depspinned all of it inline, so the requirement appeared in no package metadata and the only way to render the site locally was to read the CI file and retype ten pins —docs/Makefileandscripts/build_site.shboth assumedsphinx-buildwas already onPATHand said nothing about how it got there. Four of those pins (numpy,click,pydantic,jsonschema) were already[project.dependencies], repeated only because the docs job did not install the package, and would have kept an old floor after a core pin moved. CI,CONTRIBUTING.md,README.md,AGENTS.md, the Makefile and the site builder now all namepip install -e '.[docs]', andtests/test_docs_toolchain.pykeeps the extra in step withdocs/conf.py’s extensions, with the core dependency list and with the CI job. (#19)
Fixed¶
The setup scripts no longer abort on stock macOS Bash 3.2, which rejects an empty
"${array[@]}"as an unbound variable underset -u. This madeuninstall.shfail outright on macOS. (#29)A release push no longer repeats the gate the candidate already passed.
testandqvf-conformancecarried norules:of their own, so they fell through to theworkflow:admission list and ran on every ref in it. After v2.16.2 that was visible: the candidate pipeline proved the exact commit, then fast-forwardingreleaseonto that same SHA started the identical two jobs again against an identical tree, and preparingmainneeded aci.skippush option to get out of the way of a third copy. Both jobs now name their refs — merge requests,release-candidate/*and manualwebruns — which is the delivery modeldocs/roadmap.mdalready described: work lands onmain, a candidate pipeline proves it, andreleaseonly fast-forwards.docs-buildstill runs onmainandrelease, because the site artifact and the deployment jobs need it. The matrix is a table at the top of.gitlab-ci.ymland inCONTRIBUTING.md, andtests/test_ci_rules.pyevaluates the file against it, so a job that loses its rules fails the suite instead of silently inheriting every ref again. (#22)
[v2.18.0] - 2026-09-16 - Richardson’s Robin¶
Added¶
Biomolecule residue isolation, hiding and viewport selection, with chain, secondary-structure, residue-type and B-factor colours in atom and bond views.
PDB HELIX/SHEET annotations are retained. Optional secondary-structure subtype metadata distinguishes alpha, pi and 3₁₀ helices and beta bridges in ribbons.
Optional dashed hydrogen-bond contact display using explicit hydrogens and documented geometric criteria in the input cell.
Fixed¶
Restore Re-localize with using a separately installed vibe-qc worker. A persistent backend Python setting, native capability probe and archive checks enable compatible molecular methods. Exact archived occupied orbitals are preserved; new RHF is an explicit option. Validated session overlays include localization descriptors and IAO charges, with cancellation and stale-result protection. Periodic, complex and incomplete inputs explain why localization is unavailable.
Strands have crisp edges, correctly shaded end caps and complete terminal residue assignments. Hidden ribbon spans are never connected across gaps.
QVF slicing preserves root, section and member metadata, prunes removed viewer hints, refuses dangling section references, and validates before replacing the output. (#24)
DOS energy grids retain their specified Fermi-relative values; combined bands/DOS plots subtract only the bands’ own Fermi reference, with separate axes when that reference is absent. (#25)
Scene rebuilds and file reloads preserve the light-background choice. (#27)
Headless exports do not create an unawaited reset coroutine. (#21)
Installation, quickstart and desktop tutorials now begin with exact clone commands: deploy-key SSH access to GitLab on port 26, or the GitHub mirror. README and contributor setup use the same options. (#20)
Clone, install and desktop help now use the standalone repository root; wheel staging stays inside the viewer checkout and repair URLs use its own documentation subtree. Installation pages identify the GitHub mirror and distinguish available source/CI downloads from unpublished website wheels. (#20)
Desktop builds now retain artifacts locally; operators publish feeds with separate private deployment tooling.
Changed¶
Public source is usable without private URL rewriting or omitted agent guides. Site CI settings and release coordination stay outside the product repository.
Installer launcher records use external private state with verified migration from the legacy checkout record; ordinary virtualenv locations are unchanged.
Maintenance: separate product source and private operations¶
Site-specific provisioning scripts, deployment configuration and operator records move to private operations storage. Portable product installers remain in source; private helpers are installed independently. Contributor privacy checks support an external private terms file without publishing its contents.
Maintenance¶
Use the publication repository in package/citation metadata and the desktop issue link. Strengthen contributor privacy checks and redact their diagnostics.
v2.17.1 - 2026-09-15 - Lorensen’s Loon¶
Correctness fixes for complex and periodic molecular orbitals and browser scene replacement. Inherits v2.17.0’s codename.
Fixed¶
Escape closes the command palette and returns focus to its launching control during presentation mode, as it does in the normal viewer.
Scene rebuilds retain the previous VTK objects until the replacement is sent, preventing reused object identifiers from freezing the browser or desktop viewport after periodic replication or section changes.
QVF complex split-axis orbital coefficients decode without dropping the imaginary component. The orbital panel offers real, imaginary and magnitude surfaces. Explicit Gamma-point orbitals in 3D cells include lattice-image tails and preserve skew cells; unsupported Bloch cases report why.
Periodic/complex re-localization now explains the molecular worker’s limit before probing vibe-qc. Single-k-point blocks cannot be mistaken for a full periodic density or its derived fields.
v2.17.0 - 2026-09-13 - Lorensen’s Loon¶
TREXIO geometry and molecular orbitals can now be opened directly, bringing another wavefunction format into the viewer’s isosurface workflow. QVF remains the native archive format. Periodic and complex orbital rendering and correlated CI/RDM visualization are outside this release’s scope.
Added¶
TREXIO import through the optional
[trexio]extra (included in[all]): HDF5 files and text-backend directories open directly or convert to QVF. Geometry, cells and real molecular Gaussian s/p/d/f orbitals retain their units, normalization, AO ordering and available spin/energy/occupation metadata. Browser uploads accept HDF5; directory scans treat text datasets as one input. Unsupported wavefunctions produce explicit errors.Packaging checks now guard the viewer’s own distribution metadata, CLI entry point, and core/browser dependency split without requiring a sibling checkout. (#23)
A roadmap aligned with the release series,
docs/roadmap.md. It records what each tag shipped, including the parity work already in v2.15.2, and records correctness follow-ups, scope for each registered codename, and the tracks no single minor owns. The Avogadro parity roadmap is frozen as the record of pre-split work, andROADMAP_V2.mdpoints at the new page.
Changed¶
Agent guides now describe the standalone viewer’s development and release workflow, replacing inherited monorepo guidance and stale code references.
v2.16.2 - 2026-09-12 - Sayle’s Starling¶
A test and documentation patch. Inherits v2.16.0’s codename; viewer runtime behavior is unchanged from v2.16.1.
Fixed¶
Missing-RDKit tests now force the absent-dependency branch even when RDKit is installed, and check the installation hint without depending on the checkout directory’s name.
The patch-release checklist now includes the Electron package version and both lockfile versions, matching the full release procedure.
Changed¶
Contributor guidance explains how to exercise missing optional dependencies in every environment and distinguish safe dependency gates from tests that hide when their dependency is installed.
The product handover records current release evidence and the differences between local tests and the release gate, including editable-install and release-tooling checks.
v2.16.1 - 2026-09-10 - Sayle’s Starling¶
A one-fix patch. Inherits v2.16.0’s codename, as every patch does.
Fixed¶
A stubbed
vibeqcinsys.modulescrashed the browser viewer instead of disabling container submission._vibeqc_importable()calledimportlib.util.find_spec("vibeqc")unguarded, andfind_specis not total: it raisesValueErrorfor asys.modulesentry whose__spec__isNone— which is exactly what a baretypes.ModuleType("vibeqc")is — and propagates whatever a meta-path finder raises. Becausecreate_appcalls the probe twice, any stub in the process took app construction down withvibeqc.__spec__ is Nonerather than degrading to “no container submission”. The probe now answers the question the submit path actually asks — willfrom vibeqc import ...work — and treats a refusing finder as “not available”. Found by the vibe-qc release chat while independently measuring the producer/consumer contract. (#18)
v2.16.0 - 2026-09-09 - Sayle’s Starling¶
The release the codename was chosen for: vibe-view as a product you can adopt on its own. The documentation site gains its whole content — the product manual, real viewer figures, a visual identity — and the release series gains its artwork. Roger Sayle’s RasMol (1992) was the first molecular viewer a scientist could simply install and run, without the program that produced the data.
Added¶
Real viewer figures throughout the manual: the landing page and quickstart show the standalone demo, and capabilities show structure, orbitals, density, bands/DOS, spectra, vibrations and QTAIM. Browser and terminal captures are regenerated from this checkout; captions identify illustrative panel data. Capture tools now resolve the standalone tree and validate sanitized showcase inputs. (#20)
The full seven-image codename series, with both light-studio and dark cinematic treatments. Lorensen’s Loon, Richardson’s Robin, Phong’s Pheasant, Levoy’s Lemur and Levinthal’s Lynx illustrate the five future names approved and registered separately in
eb20af1; registration does not announce a release date. (#20)A visual identity for the documentation: theme-specific SVG wordmarks, an orbital-eye favicon and a social card, hand-authored to match the vibe-qc family. Link previews use the 1200 × 630 card. (#20)
Five more release codenames, approved by the maintainer and registered in
RELEASE_CODENAMES: v2.17.0 Lorensen’s Loon (marching cubes, VTK), v2.18.0 Richardson’s Robin (the ribbon diagram), v2.19.0 Phong’s Pheasant (the reflection model), v2.20.0 Levoy’s Lemur (direct volume rendering) and v3.0.0 Levinthal’s Lynx (the first interactive molecular graphics system). Registering a name resolves that version whenever it is cut; it schedules nothing. (#13)Release artwork for Roothaan’s Roadrunner and Sayle’s Starling, in the shared 1672 × 941 light-studio treatment, embedded in the codename catalogue. Starling is numbered 02 in vibe-view’s own series. (#20)
The manual. The documentation site had eight user pages and pointed at vibe-qc’s documentation for everything else, where the viewer’s user guide still lived, written for the monorepo layout. It now carries the whole product manual: a panel-by-panel tour, the browser viewer and its editor, terminal mode with its key map and figures, the desktop app and its setup screen, headless figures, exports and the capture and animation APIs, input formats with the importer-plugin contract, biomolecules, and jobs and live results (the vq Job Manager, QVF containers, live reload and streaming checkpoints). The CLI, Python SDK and troubleshooting pages were extended to match, and
vibe-view examplespoints at the site instead of a monorepo path. Every claim was checked against the code at the time of writing; the strict Sphinx build stays at zero warnings.A
releaseextra declaringbuildandtwine. They were pinned inline in.gitlab-ci.ymland nowhere else, soscripts/build_release_artifacts.pyhad a build requirement that appeared in no package metadata: a developer followingCONTRIBUTING.mdinto a[test]venv hit a missing tool nothing declared. The script’s tool list is now the module-levelRELEASE_BUILD_TOOLS, the extra is asserted to match it in both directions, and its missing-tool error points atpip install -e '.[release]'instead of a barepip install build twine. CI installs.[test,release]. (#9)
Fixed¶
Spectrum controls leave room for the chart. Their rows no longer grow to fill the results panel and push the plot axis outside the visible frame. Found during real documentation captures. (#20)
Selecting QTAIM now renders its critical points, bond paths and scalar table. The sidebar dispatch omitted this kind even though auto-open supported it; clicking its row previously left an empty panel. QTAIM overlays are removed when switching to another section. Found while recapturing the manual. (#20)
vibeview[viewer]resolved to a broken dependency set the day trame 4.0.0 was published. The extra pinnedtrame>=3.6with no upper bound, while every release of trame-vtk and trame-vuetify requirestrame-client<4; pip therefore took trame 4.0.0 and backtracked the other two to trame-vtk 2.8.13 and trame-vuetify 2.7.2, the last releases without that requirement. The first carries the VTK 9.7 unhashable-array serializer the split audit had already worked around (#6), the second renders boolean props differently, andtest_ambient_occlusion_is_server_side_onlyand the presentation-mode template test went red on a pipeline whose only change was documentation. The extra now readstrame>=3.6,<4,trame-vtk>=2.11.4(the first release that collects arrays into a list) andtrame-vuetify>=3.2. Lift the bound once both publish trame-4 releases.
The next minor is v2.16.0 Sayle’s Starling — see docs/codenames.md for the
pool and the policy.
v2.15.3 - 2026-09-09 - Roothaan’s Roadrunner¶
First gated tag of the split-out repository. v2.15.2 sits on the seed
commit, from before this repository had CI, so no pipeline ever ran at that
SHA and the fleet’s release report rejects it as a pin. This tag is proved by
a release-candidate/* pipeline and publishes the documentation site.
Fixed¶
The QVF schema drift guard now fails, instead of skipping forever.
tests/test_qvf_schema_identity.pycompared the vendored schema against a path inside the pre-split monorepo. In that layout the viewer’s file was that path (a symlink), so the test hashed a symlink against its own target; afterwards the path could not resolve and the test skipped. Both vendored schemas are now pinned by sha256 inscripts/check_qvf_conformance.pyand checked offline, in every lane. (#1)src/vibeview/schema_v2.jsonwas governed by nothing at all. Theqvf-conformancejob compared only the v1 schema, so a corrupted v2 — whichvibeview.qvfvalidatesqvf_version: 2manifests against — passed green. It is pinned now, and the job compares a normative v2 as soon as theqvfrepository publishes the frozen artifact its registry says is retained. (#1)Three tests could not run in any environment. The panel-only hot-reload regression guarded on an archive that is gitignored inside vibe-qc too; a website test asserted on vibe-qc’s
build_site.shthrough a path that never resolved. Rebuilt on the synthesizedshowcase_qvffixture and removed respectively, plus three defensive skips over this suite’s own fixtures turned into assertions. Local skips: 41 -> 34. (#3)vibe-view[queue]named a distribution that does not exist. The extra requiredvibe-queue, which is the monorepo directory name; vibe-queue ships asvq.pip install vibeview[queue]therefore failed to resolve even with a vibe-queue checkout installed. (#5)All seven lazy
from vq.*sites now tell the user how to install the extra. The queue-overview strip previously swallowedImportErrorin a bareexcept Exceptionand went blank, indistinguishable from a dead daemon, andvibe-view from-vqprintedpip install -e vibe-queue/— a monorepo-relative path. (#5)vibe-view doctorreports thequeuecapability. It was the only declared extra with no capability row. Its remediation for the desktop app also pointed at./vibe-view/scripts/install.sh, the pre-split path. (#5)test_ambient_occlusion_is_server_side_onlyfailed on VTK 9.7 withTypeError: unhashable type: 'VTKAOSArray_vtkFloatArray'. It serialized through VTK’s bundledrender_window_serializer, whoseextractRequiredFieldscollects arrays in aset(); VTK 9.7 gavevtkDataArrayan__eq__without a__hash__. The viewer was never affected —VtkLocalViewserializes through trame-vtk, which already collects into a list — so the test now uses the path the client actually gets. (#6)[project.urls]pointedRepositoryandIssuesatthe archived monorepo, the frozen archive with no open issues. (#5)README install instructions cloned the monorepo and ran
./vibe-view/scripts/install.sh; every lifecycle path, the../docs/...cross-repo links and the License link were monorepo-shaped.
Added¶
A documentation site. Sphinx + furo, shaped like vibe-qc’s so the two read as one project, published at https://vibe-qc.com/vibe-view/docs/.
docs/had no generator and no entry point; a user who installed the viewer had the README and nothing else. Install, quickstart, capabilities, CLI, Python SDK, the QVF format, the[queue]extra and troubleshooting are written for a user; the audits, design notes and the Avogadro-parity roadmap moved behindinternal.md, which says they are not user documentation. Nothing was renamed, so every citation from the root ledgers still resolves. (#11)docs-buildanddocs-deployCI.docs-buildrenders the site on every ref that makes a pipeline;docs-deployrsyncs it,--delete-after, into the dedicated documentation subtree and nothing wider. External deployment configuration pins the independently verified host keys. Two guards project 34 does not have: one names an emptyDEPLOY_SSH_KEY_B64and the protected-ref rule behind it (the failure that broke vibe-qc’s firstdocs-deploywitherror in libcrypto), one rejects a key that decoded to something that is not a key. (#12)The README has a Documentation section, and every placeholder link in it now points at a real page instead of vibe-qc’s homepage — the QVF format, the quickstart, the queue guide and the terminal-mode guide were all
https://vibe-qc.com.[project.urls] Documentationpointed there too. (#11)A
releasebranch and a written release procedure. Project 35 had onlymainand no documented cut.releasenow exists atv2.15.2— the fast-forward base — and is protected;docs/release_process.mdcovers the branch model, the coupled version-bump edits, therelease-candidate/*pipeline that must be green before a tag is spent, tagger identity, and what a deploy may and may not touch. (#14)A release codename catalogue,
vibeview.codenames. Version to name, with patch releases inheriting the parent minor and PEP-440 dev/rc suffixes stripped — the same contract vibe-qc’sRELEASE_CODENAMEShas.tests/test_release_codenames.pyholds every surface to it. (#13)v2.16.0 is Sayle’s Starling, the first name from vibe-view’s own codename pool — visualization, computer graphics and crystallographic imaging — approved by the maintainer on 2026-09-09 and registered ahead of the cut so the artwork brief could be written against it. Roger Sayle’s RasMol (1992) was the first molecular viewer a scientist could simply install and run, free, without the program that produced the data; that is what this release is.
docs/codenames.mdcarries the pool and the policy, the private operations repository preserves the artwork brief. (#13)VIBEVIEW_REQUIRE_QVF_CORPUS=1in the CItestjob: in a lane that clones the QVF conformance corpus on purpose, a missing corpus is now an error rather than a skip.tests/test_qvf_corpus_guard.pycovers the guard. (#3)tests/_qvf_corpus.pyreplaces two duplicated copies of the corpus probe and also finds the per-chat clone layout, so the corpus tests run on a developer machine and not only in CI. (#3)tests/test_queue_extra.py— the[queue]metadata, that all seven vq import sites still catchImportError, and that the remediation names both halves of the install. (#5).githooks/pre-commitrefuses staged additions containing absolute home paths or the maintainer’s employer name, withtests/test_no_maintainer_paths.pyas the always-running half. Enable it withgit config --local core.hooksPath .githooks.CONTRIBUTING.md,SECURITY.mdand thisCHANGELOG.md;CITATION.cffgainedrepository-code.
Changed¶
The release codename is resolved, not pasted. It was hardcoded in four surfaces —
__init__.py’s version comment,vibe-view --version, the browser About box and the Electron About box — with a fifth copy asserted in the test suite, and nothing coupling them. All four now read the catalogue.vibe-view desktopputs the codename in the launcher handshake config, so evenelectron/main.jsreports what Python says; itsFALLBACK_CODENAMEcovers a double-click launch and is the only literal left, pinned to the catalogue by test. The## [2.15.2]header carries the codename too. (#13)A real
.gitignore. 100 of 373 tracked files were build output — including a stale full copy of the package underbuild/lib/vibeview/— andscripts/build.shdeletes exactly those directories, so the repository’s own build removed 92 tracked files. Untracked, not deleted; 373 -> 273. (#2)
2.15.2 - 2026-09-08 - Roothaan’s Roadrunner¶
First public commit (9585e28), split out of the private vibe-qc monorepo
along with vibe-qc, vibe-queue, qvf and vibe-qc-agentic-loop. The QVF manifest
schemas, previously symlinks into the producer’s tree, became vendored data
files so the built wheel is self-contained.