You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Render molecular structures as publication-quality SVG, PNG, PDF, and animated GIF from XYZ, mol/SDF, MOL2, PDB, SMILES, CIF, cube files, quantum chemistry input or output — from the command line or from Python/Jupyter.
xyzrender turns molecular structures into clean vector SVG graphics — plus PNG, PDF, and animated GIF — ready for papers, presentations, and supporting information. It reads XYZ, mol/SDF, MOL2, PDB, SMILES, CIF, cube files, and QM input/output files from Gaussian, ORCA, NWChem, Q-Chem, Psi4, MOPAC, GAMESS, Turbomole, and periodic codes (VASP, Quantum ESPRESSO, SIESTA, ABINIT, CP2K). The SVG rendering approach is built on and inspired by xyz2svg by Ksenia Briling @briling.
Most molecular visualisation tools require manual setup: loading files into a GUI, tweaking camera angles, exporting at the right resolution and adding specific TS or NCI bonds. xyzrender skips this. One command gives you a (mostly) oriented, depth-cued structure with correct bond orders, aromatic ring rendering, automatic bond connectivity, with automatic TS / NCI bond detection. Orientation control is available through an interface to v by Ksenia Briling @briling.
What it handles out of the box:
Bond orders and aromaticity — double bonds, triple bonds, and aromatic ring notation detected automatically from geometry via xyzgraph
Transition state bonds — forming/breaking bonds rendered as dashed lines, detected automatically from imaginary frequency vibrations via graphRC
Stereochemistry labels — R/S, E/Z, axial, planar (metallocene and CIP), and helical chirality labels detected and annotated automatically via xyzgraph
Non-covalent interactions — hydrogen bonds and other weak interactions shown as dotted lines, detected automatically via xyzgraph
Bond display rules — selectively hide or add bonds using element categories (M, sbm, L, het), element pairs (M-L, Fe-het), pi-coordination (M-pi), or atom indices; haptic mode replaces pi-coordination fans with single centroid bonds
Surfaces — molecular orbitals, electron density, ESP colormapping, NCI surfaces, and vdW spheres; solid, mesh, contour, wire, and dot styles
Styling — highlight & molecule color, radius scaling (by element, category, or index), per-atom fill opacity (bond-agnostic), style regions, atom property colormaps with colorbar, and depth-of-field / depth-fog effects
Annotations — distances, angles, dihedrals, custom labels, atom indices, and 3D vector arrows (dipoles, forces, fields)
Structural overlay — RMSD-align two structures and render in contrasting colours; works across different atom counts via automatic scaffold detection. Independent style overrides (atom/bond size, stroke, opacity, per-overlay bond rules), and --no-align to skip alignment when geometries already share a frame
Conformer ensemble — overlay all frames from a multi-frame XYZ trajectory, with palette colouring and opacity control
Convex hull, hull faces & pores — semi-transparent facets over selected atoms or rings, exposed faces of molecular cages, and pore rendering
Input formats — XYZ, mol/SDF, MOL2, PDB, SMILES, CIF, cube files, and QM input/output from Gaussian, ORCA, NWChem, Q-Chem, Psi4, MOPAC, GAMESS, Turbomole, CP2K, VASP, Quantum ESPRESSO, SIESTA, and ABINIT
Crystal / periodic structures — unit cell box, ghost atoms, supercells, and crystallographic axis arrows; auto-detected from VASP POSCAR, QE pw.in, SIESTA FDF, ABINIT, CP2K, and extXYZ Lattice= headers
Multiple output formats — vector SVG (default), PNG, PDF, and GIF — all from the same command
Preconfigured but extensible. Built-in presets (default, flat, paton, skeletal, bubble, tube, mtube, btube, wire, graph) cover common use cases. Every setting — colors, radii, bond widths, gradients, fog — can be overridden via CLI flags or a custom JSON config file.
xyzrender caffeine.xyz # SVG with sensible defaults
xyzrender ts.out --ts -o figure.png # TS with dashed bonds as PNG
xyzrender caffeine.xyz --gif-rot -go movie.gif # rotation GIF for slides
fromxyzrenderimportload, render, render_gifmol=load("caffeine.xyz")
render(mol) # displays inline in Jupyterrender(mol, output="caffeine.svg") # save as SVG/PNG/PDFrender(mol, config="paton", hy=True) # all CLI flags as kwargsrender_gif(mol, gif_rot="y") # rotation GIF
For the full Python API (render options, build_config(), measure(), load() kwargs, return types), see the Python API guide or the runnable examples/examples.ipynb notebook.
The SVG rendering in xyzrender is built on and heavily inspired by xyz2svg. The CPK colour scheme, core SVG atom/bond rendering logic, fog, and overall approach originate from that project.
xyzrender uses xyzgraph and graphRC for all molecular graph construction — bond orders, aromaticity detection, NCI interactions, and TS bond detection. If you use xyzrender in published work, please cite:
@article{goodfellow2026xyzgraph,
author = {Goodfellow, A.S. and Nguyen, B.N.},
title = {Graph-Based Internal Coordinate Analysis for Transition State Characterization},
journal = {J. Chem. Theory Comput.},
year = {2026},
doi = {10.1021/acs.jctc.5c02073},
}
If this project was created with copier, you can pull in upstream template improvements:
# Run from the project root
copier update --trust
This will:
Fetch the latest version of the template
Re-ask any questions whose defaults have changed
Re-render the templated files with your existing answers
Apply the changes as a diff — your project-specific edits are preserved via a three-way merge
If there are conflicts (e.g. you modified the justfile and so did the template), copier will leave standard merge conflict markers (<<<<<<< / >>>>>>>) for you to resolve manually.
The --trust flag is required because the template defines tasks (used for git init on first copy). The tasks don't run during update, but copier requires trust for any template that declares them.
Requires that the project was originally created with copier copy, not the plain GitHub "Use this template" button.