Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 75 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,77 @@ and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.ht

## [Unreleased]

## [0.4.1] - 2026-07-16

Bug-fix and hardening release from a full repository audit. No new features and
no breaking changes — it fixes correctness bugs across orbital isosurfaces,
Molden export, the XYZ parser, NMR references, PES scans, and IR intensities,
plus a range of edge-case, packaging, and hygiene issues found by reading the
codebase end to end.

### Added

- Single-atom molecules (e.g. a lone He or Ne atom) are now accepted as XYZ input
and run end to end — atomic calculations are legitimate targets.

### Changed

- **Python 3.9 is now covered by CI.** The minimum supported version was
previously claimed but untested; adding it surfaced and fixed real
geometry-optimization and frequency failures on the older ASE that resolves for
Python 3.9.
- **Faster `quantui` CLI startup** — the command-line tool no longer imports the
full notebook/GUI stack (ipywidgets, IPython, the app module) just to tail a
log.
- **No more logging hijack** — importing `quantui` no longer reconfigures the
root logger, so it won't override or duplicate logging in a host application or
notebook.
- **Faster time estimates over long sessions** — the performance log is cached and
re-read only when it changes, instead of being fully parsed on every UI update.

### Fixed

- **Orbital isosurfaces for charged and open-shell molecules** — the isosurface
viewer previously errored for every odd-electron system (radicals, and ions
such as H₃O⁺, NH₄⁺, OH⁻); charge and spin are now carried through to the cube
generator.
- **Molden export from frequency calculations** — the exported geometry was
inflated (Bohr coordinates read as Ångström) and internally inconsistent, so it
rendered wrong in Avogadro/IQmol; frequency geometries are now stored and
written in the correct units. This also fixes history replay of frequency
orbital isosurfaces.
- **Export Script and method notes for `wB97X-D`** — "Export Script" failed with
a "method not supported" error and the educational notes silently disappeared
for `wB97X-D`; mixed-case method names are now matched correctly.
- **2D structure images from XYZ input** — this path never worked (it always
returned nothing) and now renders.
- **XYZ files with a blank or comment (`#`) title line** no longer silently drop
the first atom — a very common file layout was losing an atom with only a
warning.
- **NMR reference provenance** — chemical shifts no longer silently fall back to
the B3LYP/6-31G\* TMS constants for other method/basis combinations; the
reference that was actually applied is now recorded, and the lookup is
case-insensitive.
- **IR intensities for open-shell / UHF-singlet frequency runs** no longer abort
the whole IR-intensity step.
- **PES scans** — a failed scan point no longer records a bogus geometry frame or
poisons the energy/barrier statistics with NaN, and angle/dihedral scans work
with current ASE releases.
- **UHF calculations** now report a dipole moment and Mulliken charges (these were
silently skipped).
- **Clearer errors for unsupported input** — elements outside the supported H–Kr
range, and post-Hartree–Fock methods (MP2 / CCSD / CCSD(T)) requested for
calculation types that don't support them, now fail with an explicit message
instead of a misleading one or an uninformative crash.
- **Windows exports** no longer fail when the basis-set name contains `*` (e.g.
`6-31G*`) — export filenames are sanitized.
- **Method-notes panel** renders bold text correctly instead of leaking literal
`**` markers.
- **Robustness** — the event log is no longer subject to lost entries under
concurrent writes; a thumbnail-save failure no longer aborts saving a result;
PubChem availability checks respect the configured throttle and timeout; and
results carrying NumPy scalar values now save correctly.

## [0.4.0] - 2026-06-18

Interactive-visualization and offline-readiness release. Adds molecular-orbital
Expand Down Expand Up @@ -294,6 +365,9 @@ Initial public scaffolding of the QuantUI package: `quantui` package with
`calculator.py`, basic notebook launcher, Apptainer container definition,
MIT license, and project metadata.

[Unreleased]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.2.0...HEAD
[Unreleased]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.4.1...HEAD
[0.4.1]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.4.0...v0.4.1
[0.4.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.3.0...v0.4.0
[0.3.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.2.0...v0.3.0
[0.2.0]: https://github.com/The-Schultz-Lab/QuantUI/compare/v0.1.0...v0.2.0
[0.1.0]: https://github.com/The-Schultz-Lab/QuantUI/releases/tag/v0.1.0
2 changes: 1 addition & 1 deletion apptainer/quantui.def
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ FROM: continuumio/miniconda3:latest
%labels
Maintainer "Jonathan Schultz"
Purpose "Local teaching interface for quantum chemistry calculations"
Version "0.4.0"
Version "0.4.1"

%environment
export PATH="/opt/conda/bin:${PATH}"
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "quantui"
version = "0.4.0"
version = "0.4.1"
description = "An open-source frontend for DFT and post-HF quantum chemistry with PySCF"
readme = "README.md"
requires-python = ">=3.9"
Expand Down
2 changes: 1 addition & 1 deletion quantui/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
PySCF requires Linux/macOS/WSL. Windows users should use the Apptainer container.
"""

__version__ = "0.4.0"
__version__ = "0.4.1"

import logging
from typing import Any
Expand Down
Loading