Skip to content
ReShiki / guide

Capability report

Engineering notes and historical checks.

Current release packages require uv and create a local chemistry environment on first use; see installation and release signing. Earlier desktop verification records below include self-contained QA builds.

Document drawing styles now provide previewed font and bond settings, reusable style files and Undo. JACS / ACS remains the default for every new document.

The picture workflow adds asynchronous file import, macOS raster paste, embedded storage, numeric dimensions, replacement and layering with chemistry. Desktop checks cover canvas transforms, grouping, native persistence and private-pasteboard copy/paste; 225 Rust tests, 71 Python tests, formatting and strict Clippy pass. CDXML and binary clipboard exchange now preserve separate pictures alongside editable chemistry, including rotation, reflection, transparency and mixed groups. Desktop checks and an independently re-saved fixture cover external picture exchange. The standalone macOS bundle imports the fixture outside the checkout. Vector/OLE-only pictures remain unsupported.

Assessment date: 2026-09-16, with subsequent updates recorded below. Workflows were checked through the desktop app, saved documents, rendering and chemistry tests.

Several workflows remain incomplete. Version 0.2 adds everyday editing, recovery and standalone packaging. The table records the current boundary; the original desktop test record is retained below.

The feature-status inventory records supported toolbar, typography, drawing, template, chemistry and document workflows, together with their remaining limitations.

The clipboard update adds native macOS editable Copy/Paste and Copy Image with publication-size bounds. Desktop checks cover a colored 13-atom/13-bond round-trip and image paste; 135 Rust tests, 42 Python tests, formatting and strict Clippy pass. View controls add independent rulers/crosshair/grid switches and physical units.

The Style toolbar update adds searchable fonts, rich text ranges, scripts, paragraph alignment/wrapping, text color and styled drawing/CDXML export. Verified through computer use in ReShiki and through CDXML exchange, with 51 Rust tests and 15 Python tests. The earlier counts below describe historical builds.

The graphics update adds editable shapes, brackets, Bézier points, stroke/fill styling and graphic layers. That update passed 59 Rust and 18 Python tests, plus actual desktop drawing and file-exchange checks.

The selection and grouping update adds lasso and modifier selection, nested/integral groups, edge alignment, fitted frames and mixed-object CDXML groups. That update passed 68 Rust and 19 Python tests, including desktop editing and CDXML exchange.

The bond tools update adds 17 presets, selection styling, colors and double-line position, including hydrogen, dative and quadruple bond chemistry. That update passed 74 Rust and 23 Python tests. Desktop checks include externally saved CDXML, ReShiki drawing, click reversal, styling, Undo/Redo and native persistence. Partial bond depictions do not implement full tautomer/query or resonance behavior.

The chain tools update adds straight/snaking gestures, count previews, exact/maximum atom counts, attachment, retracing and independent bond constraints. Every new document restores JACS / ACS typography and drawing defaults. That update passed 83 Rust and 23 Python tests, with actual desktop chain creation, measured 14.4 pt bonds, check/save/reopen, and gesture Undo/Redo.

The template library update adds exact source anchors, custom mixed-object templates, search/favorites, collection editing/import/export, and repeated placement. That update passed 89 Rust and 23 Python tests, including native desktop persistence, grouped stamps, library replacement/undo, and attachment chemistry.

The arrow update adds eight presets, shared live/export geometry, endpoint/bend editing, full/half heads, style/dimension controls, unequal equilibrium, dipole/no-go marks and a larger explicit CDXML subset. That update passed 96 Rust and 26 Python tests, with ReShiki desktop drawing/editing/export/default-style checks and externally saved exchange fixtures. Reaction/electron-flow semantics remain unimplemented.

The scientific-symbols update adds seven orbital shapes, phase previews, 18 free symbols, positioned atom-owned marks and one/two-unpaired-electron chemistry. Native format 8 preserves these objects. That update passed 102 Rust and 30 Python tests. H-dot/H-dash stereochemistry, semantic attachment markers, gradient shading and some CDXML styles remain unsupported.

The ring and catalog update adds Chair A/B and Cyclopentadiene tools with previews, rotation, fusion and Alt connection by a bond. The library has 81 built-ins, including 20 amino acids and five nucleobases, with frozen PubChem identity checks. Check structure refreshes computed labels/properties without adding an Undo step. Current validation is 111 Rust and 32 Python tests. These are drawing projections and molecular building blocks; there is no 3D conformational solver or peptide/nucleotide assembly workflow.

The subsequent JACS / ACS default-style update adds publication dimensions, measured atom labels, inset ring double bonds and 1200 dpi PNG output. That update passed 20 Rust tests and 10 Python tests; the historical counts below describe earlier builds.

The workspace redesign adds an original vector palette, contextual controls, inspector tabs, import drawer and tool shortcuts. That update passed 21 Rust tests and 10 Python tests, including actual-viewport fitting and preservation of manual camera movement.

The chain-growth fix adds graph-aware endpoint placement, a hover preview, and reliable attachment on short drags. It passed 27 Rust tests and 10 Python tests. The subsequent bond-click update passes 28 Rust tests and adds the single → double → triple → single cycle. See the desktop regression records below.

The 2026-09-17 selection and ring-placement update replaces the idle bond preview with clear atom/bond markers, fixes ring orientation at substituents, and adds drag attachment and rescaling. Selection handles add proportional resizing and free rotation. Current validation: 39 Rust tests and 10 Python tests.

Capability ReShiki status Evidence or limitation
Freehand atoms and bonds Implemented; desktop tested Drew ethanol from an empty canvas; 3 atoms, 2 bonds, CCO
Chain growth and branching Implemented subset; desktop tested Endpoint growth plus straight/snaking chain drags, live counts, exact/capped sizes and attachment; retracing and cancellation; no drawing auto-pan or global obstacle routing. See chain tools.
Bond constraints and JACS defaults Implemented subset; desktop tested Independent Length/Angles, Alt free drawing, 15° snapping, custom chain angle and JACS reset. New documents restore Arial 10 pt, 14.4 pt bonds and 0.6 pt lines.
Single/double/triple bonds Implemented; desktop tested With a plain bond tool, clicks on an existing bond cycle single → double → triple → single; new bonds use the selected tool’s order
Solid/hashed/hollow wedges and bold single bonds Implemented subset Visible tetrahedral stereo checked independently after cleanup and reflection; hollow-wedge drawing and reversal desktop tested
Additional bond tools and styling Implemented subset 17 presets, color and double-line position; dative/coordination, explicit-H interactions and quadruple bonds; partial depictions lack full tautomer/query semantics. See bond limits.
Wavy/aromatic bonds Implemented Wavy palette tool; aromatic ring placement and rendering
Ring placement Implemented; desktop tested 3–8 members; attached rings orient into open space and match local bond length; click/drag placement and side selection; existing isolated cycloalkanes can snap onto single bonds
Charges, isotopes and radicals Implemented subset Selection controls, attached charge/radical marks, positioned lone-pair annotations; one/two unpaired electrons with chemistry and exchange tests. See scientific symbols.
Selection and transforms Implemented; desktop tested Molecule double-click, rectangle/lasso selection, add/subtract/invert, nested/integral groups, move, erase, proportional resize/rotation handles, stereo-preserving flip, edge/center alignment, group/component distribution
Undo/redo Implemented; desktop tested Snapshot history, up to 100 changes
Pan, zoom, grid and fit Implemented Drawing/page fit, page navigation and canvas-only grid/ruler/crosshair aids
Text and reaction arrows Partial; desktop tested Rich multiline labels, font/style/color controls, scripts, paragraph layout and eight editable arrow presets; no in-canvas text caret or reaction semantics
Structure validation Implemented; desktop tested RDKit sanitization, invalid-valence error tests
2D cleanup Implemented; desktop tested Requires selection. Preview selected atoms or selected molecules with original comparison, Apply/Cancel and one-step Undo. Unselected atoms stay fixed; each molecule keeps its center/orientation.
Formula/mass/descriptors Implemented Formula, molecular/exact mass, cLogP, TPSA, HBD/HBA, rings
SMILES Implemented Import/export and copy canonical SMILES
InChI / InChIKey Partial InChI import/export in UI; key calculated by worker
MOL Implemented molecular subset Parse/export; stereo identity tests; no reactions or drawing annotations
CDXML Partial; exchange desktop tested Molecular import, basic molecule/text/arrow export; see restrictions below
Native save/open Implemented; desktop tested Versioned .reshiki JSON, complete graph and drawing objects
SVG / PDF / PNG Implemented; desktop and rendering tested Vector SVG/PDF, PNG with 1200 dpi metadata; no TIFF; native macOS print dialog available
Default drawing style JACS / ACS Black, 10 pt Arial, 14.4 pt bonds, 0.6 pt lines; shared canvas and physical export settings
Templates and named abbreviations Partial; desktop tested 81 built-ins plus custom mixed-object collections, exact source anchors, new-bond/shared-atom/fused-edge modes, previews, search/favorites and collection exchange. Common abbreviations can contract, expand and replace endpoints; specialized content remains partial. See template library.
Reaction cleanup/mapping Planned Arrows are drawing objects; no reactant/product grouping or automatic mapping
Query structures, R-groups, polymers Planned Unsupported constructs are rejected where detected
Enhanced/non-tetrahedral stereo Planned Rejected by the worker
Systematic chemical naming Planned No name-to-structure or structure-to-name engine
Spectra / NMR Planned No prediction, assignment or spectrum objects
Rich typography, curves, brackets Partial; desktop tested Rich labels, nine graphic types, editable Bézier points, graphical brackets, colors/fills/strokes; nested groups and fitted frames; no freehand pen or polymer semantics
Publication layout and printing Partial JACS / ACS default, physical page setup, multipage vector PDF and native macOS Print/Print selection; no journal-style library. Native print-to-PDF tested, physical printer output unverified
Native binary drawing format Planned No binary CDX importer/exporter
Clipboard drawing interchange Implemented native subset Native objects copy/cut/paste/duplicate; text SMILES, InChI, MOL and supported CDXML paste
Script/plugin API Planned Worker protocol exists; no stable public automation API
Accessibility Incomplete Canvas and Iced controls are not exposed as semantic macOS accessibility elements
Distribution and recovery Implemented local subset Native release workflows with local uv environments; five-second recovery snapshots and restore as a new copy. Developer ID signing is configured; notarization needs account credentials.

The atom-label update adds carbon/H display controls, owned atom numbering, computed R/S and E/Z indicators, manual positioning, and CDXML object-tag exchange. The runtime safety audit bans unsafe code, panic calls and unchecked collection indexing in the production Rust crates. The combined update passed 125 Rust and 36 Python tests plus strict Clippy; desktop evidence and remaining boundaries are recorded in those documents.

The selection color update adds All selected / Text / Bonds palette scopes and explicit bond counts in the selection summary. 127 Rust tests and strict Clippy checks pass. Desktop checks cover whole-molecule color, independent bond/label color, Undo/Redo, save/reopen and exported colors.

Native .reshiki is the only supported complete save format for ReShiki’s object model. Molecular formats represent the molecular graph, not page annotations or reaction arrows. CDXML import accepts a single page with molecules, supported styled text and arrow styles, including text-only drawings, supported vector curves, nested mixed-object groups and basic graphics. Graphic exchange restrictions are in graphics. Supported arrowheads, dimensions, equal equilibrium and quadratic curves are documented in arrow exchange limits. Unsupported arrow combinations, unknown drawing tags and multiple pages are rejected. It does not preserve arbitrary external formatting, attributes or unsupported chemistry; text metrics can vary between applications. A successful small-file exchange does not establish compatibility with every external document.

Query atoms, enhanced stereo groups and unsupported bond/stereo classes are rejected where RDKit exposes them. The finite test set cannot establish chemically complete support. Label typography, atom-label collision avoidance and dense drawings need more work.

  1. Opened the controlled ethanol.mol fixture in the installed editor. Selected and cleaned the molecule, ran structure checking (“No errors found.”), and verified undo cleared the edited state. Saved reference-ethanol.cdxml through its native Save As dialog.
  2. Imported that XML in ReShiki’s chemistry backend: canonical CCO, formula C2H6O.
  3. Launched the ReShiki app. Imported the ethanol example, validated it, moved the selected molecule, and cleaned its layout. Saved ui-ethanol.reshiki through the native file dialog.
  4. Started a blank ReShiki document, placed a six-membered ring, and replaced a ring vertex with oxygen.
  5. Found a fast-drag bug through computer use. Fixed event-specific cursor tracking, then drew ethanol from scratch with two connected bond drags and terminal oxygen replacement. Structure checking returned CCO, C2H6O, 46.069 g/mol.
  6. Drew a reaction arrow and placed the text oxidation. Verified Cmd+Z removed the label and Cmd+Shift+Z restored it. Saved ui-drawn-ethanol.reshiki, SVG and CDXML through the desktop export dialogs.
  7. Opened the exported CDXML in the installed editor. The molecule, label and arrow all appeared. Its structure check returned “No errors found.”
  8. Native reopening initially showed a disabled Open button for a selected valid file. Removed the extension filter and successfully reopened ui-drawn-ethanol.reshiki; all 3 atoms, 2 bonds, text and arrow reappeared. Version 0.2 testing also observed delayed button enablement without filters, so the cause is not established.
  9. Verified the unsaved-change prompt when closing a disposable test drawing, and used Discard to close it.
  10. Entered invalid pentavalent-carbon SMILES in ReShiki. Import failed with a visible error while the saved drawing stayed intact. A subsequent structure check recovered normally and the drawing saved successfully.

Fixtures are under tests/fixtures/. The reference-produced file is retained as interoperability test data. Tests use synthetic examples; no existing user research documents were edited.

Original 0.1 checks: 10 Rust tests and 9 Python tests passed. Version 0.2 passes 17 Rust tests and 9 Python tests, including rings, transforms, recovery and PDF/PNG output. Formatting and Clippy checks pass.

Observed reference features beyond this implementation

Section titled “Observed reference features beyond this implementation”

The installed Structure menu exposed structure/reaction cleanup, label expansion/contraction, hydrogen/aromatic display toggles, multicenter/variable attachments, R-logic, reaction atom mapping and spectrum assignment. File/Edit menus exposed extensive templates and additional image, drawing and clipboard formats. These observations guided the roadmap; they are not claims that ReShiki implements those commands.

  • Placed two fused aromatic rings and checked C10H8, 10 atoms, 11 bonds.
  • Copied and pasted the selected molecule; moved, rotated, reflected and aligned the copy. Structure checking returned C20H16 for the two disconnected molecules.
  • Placed an equilibrium arrow and a multiline label, then saved tests/fixtures/ui-expanded.reshiki.
  • Started the app with a controlled interrupted-session recovery fixture. The banner offered restoration; restoring retained both molecules, the arrow style and both label lines as an unsaved new document.
  • Double-clicked an atom and verified that precisely its ten-atom connected molecule was selected.
  • Exported PDF from the actual GUI, rendered it with Poppler, and visually checked bonds, spacing, arrowheads and text. The PDF remained vector-based.
  • Saved the recovered drawing as a version 2 document and reopened it twice through the native Open dialog. Both molecules, multiline label and equilibrium arrow remained intact.
  • Exported PNG through the actual GUI, checked its 2893 × 1411 pixel dimensions and approximately 300 dpi metadata, and visually inspected a preview.
  • The standalone chemistry check succeeded from /tmp with RESHIKI_ROOT=/nonexistent. This verifies use of the bundled Python/RDKit worker without the project’s .venv.

The recovery fixture was synthetic; this was not a forced termination of a user’s document. The standalone build is approximately 233 MB on the tested Apple Silicon Mac. No ruviz files were modified; integration requirements are in ruviz-integration.md.

Reproduced through native computer use: endpoint clicks used a fixed direction, so repeated extensions appeared as one straight line and could overlap an existing bond. A short drag could also resolve its target to the source atom and make no change.

The fix chooses 120° turns from the neighboring graph, alternates along a terminal chain, and considers free angular space and nearby geometry for branches. Triple-bond and cumulative-double-bond junctions remain linear. Hover and drag previews use the same placement rules as committed bonds. Drag attachment excludes the source atom and also checks the snapped endpoint for existing atoms. Bond tools add carbon; element replacement stays in the atom tool.

In the rebuilt standalone app:

  • Started an empty document and clicked six bonds to produce seven connected carbons with a visible zigzag. Check returned CCCCCCC, C7H16.
  • Dragged an endpoint only six screenshot pixels; one full-length bond appeared, making 8 atoms and 7 bonds. Undid this extension.
  • Grew the opposite endpoint and clicked an internal vertex to branch. Check returned CCCCC(C)CCC, C9H20, with 9 atoms and 8 bonds.
  • Replaced the branch tip with O, switched back to the bond tool and extended it. The new endpoint was carbon; Check returned C9H20O.
  • Exercised Undo/Redo, restored the all-carbon example, checked it again and saved artifacts/chain-growth-check.reshiki through the native dialog. Reading the file confirmed nine carbon atoms and eight bonds. The artifact is local and ignored by Git.

All 27 Rust and 10 Python tests pass, as do formatting, Clippy and bundle signature verification. Six added regression tests cover connected-chain identity and geometry, Undo/Redo, growth from either end, branching and occupied positions, linear junctions, atom-label carryover, short pointer gestures, and attachment to existing atoms. Automatic chain placement is a local geometry heuristic; a single drag still creates one bond. Drag explicitly to choose another direction in a crowded drawing.

With any single/double/triple bond tool active, clicking the middle of an existing bond cycles its order through 1 → 2 → 3 → 1. Wedge, hash and wavy tools continue to apply their selected style. Drawing a new bond still uses the selected order, and endpoint clicks still grow the chain.

Verified in the rebuilt desktop app: created a two-carbon single bond, clicked its midpoint three times, and inspected a screenshot after each click showing double, triple and single respectively. The atom/bond counts stayed at 2/1. The user’s existing 22-atom drawing was preserved in a separate native file before restarting and reopened after testing. All 28 Rust tests, formatting and Clippy pass; the new regression covers each plain bond tool, unchanged atom positions, the complete cycle, Undo and wedge application.