# tenmol > A fork of PyMOL that keeps the C++/Python engine and replaces the Qt front-end with a React web app. ## Docs - [tenmol](https://10play-session-status-checl.mintlify.site/index.md): A fork of PyMOL that keeps the C++/Python engine and replaces the Qt front-end with a React web app. - [Architecture](https://10play-session-status-checl.mintlify.site/architecture.md): How tenmol works. This describes the system as built; where a detail lives in one file, that file is named instead of restated. - [Building the engine, and the toolchain](https://10play-session-status-checl.mintlify.site/build-and-tooling.md): Two halves. The first is how the PyMOL engine in packages/engine/ compiles — upstream's build, which this fork inherits unchanged and which is the part that… - [TypeScript console & cmd API](https://10play-session-status-checl.mintlify.site/typescript-console.md): tenmol runs frontend scripts in JavaScript instead of PyMOL's Python. The console is a client-side JS REPL with the cmd API in scope — the same PyMOL scripts, just in JavaScript. - [Engine backlog](https://10play-session-status-checl.mintlify.site/engine-backlog.md) - [Parity dashboard](https://10play-session-status-checl.mintlify.site/parity-dashboard.md) - [@tenmol/protocol](https://10play-session-status-checl.mintlify.site/packages/protocol.md): The wire contract between the browser and the Python bridge. Pure types, constants and pure functions: zero runtime dependencies, no I/O, importable from… - [@tenmol/client](https://10play-session-status-checl.mintlify.site/packages/client.md): The browser side of the transport: one WebSocket to the PyMOL bridge, request/response correlation, topic events, binary frame decoding, and a Proxy-based… - [@tenmol/stores](https://10play-session-status-checl.mintlify.site/packages/stores.md): Client state for the PyMOL web client. ~2,950 lines of plain TypeScript, one dependency (@tenmol/protocol, types only), no framework and no state library. - [@tenmol/viewport](https://10play-session-status-checl.mintlify.site/packages/viewport.md): The 3-D viewport: the canvases, both render modes, input forwarding, client-side picking, and the compositor that decides which renderer owns which rep.… - [tenmol-bridge](https://10play-session-status-checl.mintlify.site/packages/bridge.md): The PyMOL side of the tenmol web client. One process, one PyMOL engine, one thread that owns the offscreen OpenGL context and the engine and the draw pump… - [@tenmol/web](https://10play-session-status-checl.mintlify.site/packages/web.md): The PyMOL front-end: a React app that owns the window and nothing else. The renderer is @tenmol/viewport, the transport is @tenmol/client, the wire types… - [End-to-end suite](https://10play-session-status-checl.mintlify.site/packages/e2e.md): 21 specs against a real PyMOL bridge, a real vite dev server and a real headless Chromium. Nothing is mocked: structures load through cmd.load, the frames… - [The Qt application shell](https://10play-session-status-checl.mintlify.site/qt-main-window.md): Read-only survey of PyMOL's Qt main window: layout, menu bar, command line, feedback area, quick buttons, dialogs, startup and shutdown. Every claim is… - [Internal GUI (the panels PyMOL draws inside the viewport)](https://10play-session-status-checl.mintlify.site/internal-gui.md): Scope: everything PyMOL draws itself inside the OpenGL viewport as 2D 'Blocks' — the right-hand object panel ('names list'), its A/S/H/L/C/M popup menus… - [Input: mouse and keyboard](https://10play-session-status-checl.mintlify.site/input-mouse-keyboard.md): Map of PyMOL's input path, from the Qt widget down to SceneDrag. Every claim is anchored to a path:line in packages/engine/, which is unmodified upstream.… - [The cmd API, and the RPC contract over it](https://10play-session-status-checl.mintlify.site/cmd-api-rpc.md): Map of PyMOL's cmd surface: what it contains, how command strings are parsed, how feedback escapes, what the two bundled RPC servers do, and what the C++… - [Geometry extraction](https://10play-session-status-checl.mintlify.site/geometry-extraction.md): Can PyMOL's *already-computed* render geometry be pulled out of the C++ backend and shipped to a browser, so the browser draws it instead of recomputing… - [Settings and colors](https://10play-session-status-checl.mintlify.site/settings-colors.md): Map of PyMOL's setting table, its change-notification machinery, and the colour/ramp system. Every claim is anchored to a file:line in packages/engine/… - [Movies, Scenes, States/Frames, Sequence Viewer](https://10play-session-status-checl.mintlify.site/movies-scenes-states.md): Map of four coupled PyMOL subsystems. The engine (packages/engine/, C++ + Python cmd) is unmodified upstream and is reached over the Python bridge. Every… - [Dialogs: volume, properties, scenes, shortcuts, settings, text editor](https://10play-session-status-checl.mintlify.site/dialogs-volume-properties-scenes.md): Scope: packages/engine/modules/pmg_qt/volume.py, packages/engine/modules/pmg_qt/properties_dialog.py, packages/engine/modules/pmg_qt/scene_bin_gui.py… - [The molecular builder](https://10play-session-status-checl.mintlify.site/builder.md): The Builder dock widget and the molecular editor state machine behind it, read out of packages/engine/, which is unmodified upstream. - [Wizards — the PyMOL wizard surface](https://10play-session-status-checl.mintlify.site/wizards.md): Map of PyMOL's wizard machinery. Scope: packages/engine/modules/pymol/wizard/ (every file), packages/engine/modules/pymol/wizarding.py… - [File I/O](https://10play-session-status-checl.mintlify.site/file-io.md): Everything the desktop PyMOL GUI does with the filesystem and the network: open/load, format-specific import dialogs, save/export, sessions (.pse/.psw)… - [Spike 00 — Build PyMOL from this tree so import pymol works (macOS arm64)](https://10play-session-status-checl.mintlify.site/spikes/build.md): Status: SUCCESS. PyMOL 3.2.0a0 builds and imports on darwin 24.6.0 / arm64, headless, with no Qt, no PySide, no GLUT, no display, and with MMTF/BCIF support… - [Spike 02 — Headless feedback capture](https://10play-session-status-checl.mintlify.site/spikes/feedback.md): > ## STATUS — re-verified on 2026-08-02: STILL TRUE, IN FULL > > This is the spike that has aged best. §1's two rules are implemented verbatim in >… - [Spike 06 — The C++ geometry accessor (_cmd.web_get_rep_geometry)](https://10play-session-status-checl.mintlify.site/spikes/geometry-accessor.md): Status: IMPLEMENTED AND VERIFIED. Plan code-ownership.md §4 tasks 1 and 2 are done. The product owner moved Mode G onto the critical path; this is the C++… - [Spike 04 — Picking (BLOCKER resolution)](https://10play-session-status-checl.mintlify.site/spikes/picking.md): Status: RESOLVED. Recommendation: backend-authoritative picking on a headless CGL + FBO OpenGL context. - [Spike 05 — State change detection for the web-client bridge](https://10play-session-status-checl.mintlify.site/spikes/state-events.md): > ## STATUS — re-read against the tree on 2026-08-02 > > §1–§7 are the design the bridge shipped and they still describe it. The two-channel split of > §5… - [Spike 07 — Cross-platform offscreen GL (Linux EGL, Windows WGL)](https://10play-session-status-checl.mintlify.site/spikes/cross-platform-gl.md) - [Spike 08 — Native (C++) wave 2: change counters, pick data, missing instances](https://10play-session-status-checl.mintlify.site/spikes/native-changes.md): Status: IMPLEMENTED AND VERIFIED. Plan code-ownership.md §4 Task 6 (ReprVersion), §4 Task 3 (pick data) and the instance half of defect D6 are done. - [API reference](https://10play-session-status-checl.mintlify.site/api-reference/index.md): The generated cmd.* command surface, settings, and colors. - [Commands](https://10play-session-status-checl.mintlify.site/api-reference/commands.md): All 424 cmd.* commands with parameters and defaults. - [Unsafe commands](https://10play-session-status-checl.mintlify.site/api-reference/unsafe-commands.md): Commands that execute arbitrary text or end the session. - [Settings](https://10play-session-status-checl.mintlify.site/api-reference/settings.md): The 779 setting names for set/get. - [Colors](https://10play-session-status-checl.mintlify.site/api-reference/colors.md): The 178 named colors.