Version History

This changelog documents the continuous development of TWISTER, a web-based algorithm editor and powerful viewer for twisty puzzles and notation translation. Explore the timeline to see how the application, has evolved to deliver precise performance, enhanced functionality, and bug resolutions.

Contents

Advanced features: Move count (SSE, TWIZZLE), algorithm tools (rotate, mirror, expand, invert), appearance (light & dark mode), clipboard functions, documentations (application, version history, notation, metric).

0.8.3 Twister v0.8.3 beta
0.8.2 Twister v0.8.2 beta
0.8.1 Twister v0.8.1 beta

0.7.2 Twister v0.7.2 beta
0.7.1 Twister v0.7.1 beta

Extended functionality: Sticker options and options panel for player position and speed.

0.6.4 Twister v0.6.4 beta
0.6.3 Twister v0.6.3 beta
0.6.2 Twister v0.6.2 beta
0.6.1 Twister v0.6.1 beta

0.5.2 Twister v0.5.2
0.5.1 Twister v0.5.1

0.4.1 Twister v0.4.1

0.3.1 Twister v0.3.1

Proof of concept: First version with integrated 3D puzzle player and translation functions.

0.2.1 Twister v0.2.1

0.1.4 Twister v0.1.4
0.1.3 Twister v0.1.3
0.1.2 Twister v0.1.2
0.1.1 Twister v0.1.1

Twister v0.8.3 beta

Last Update: 2026-07-06

Changes:
Move listener:
• Clicks on a face of the puzzle will add Face moves to the alg textarea.
• Clicks on a face + Shift key will add Second layer moves to the alg textarea.
• Clicks on a face + Control key will add Puzzle rotations to the alg textarea.
• Optimizer added: Optimizes an algorithm when the same move was added several times.

Scroll position:
• Restores last scroll position after the page has loaded.

Algorithm tools:
• Rotation added: Rotate around U or R face.

Documentations:
• Metric notation added.
• TWISTER description added.
• TWISTER version history added.

Twister v0.8.2 beta

Last Update: 2026-04-29

Changes:
Translation:
• All remaining TWIZZLE-to-SSE functions switched to the new array-mapping variants: alg3xC_TwizzleToSseNew(), alg4xC_TwizzleToSseNew(), alg5xC_TwizzleToSseNew(), alg6xC_TwizzleToSseNew(), alg7xC_TwizzleToSseNew() are now used in all translation branches.
alg7xC_SseToTwizzleNew() is also now used for the 7xCube SSE→TWIZZLE path.
• Redundant re-computation of $alg_TWIZZLE removed: the SSE-mode branches now assign $alg_TWIZZLE = $out['alg'] instead of calling the function twice.
• Support for )2, )' and )2' (repetition and grouped-inverse modifiers) added (18.12.2025).
• Support for Conjugation [A: B] and Commutator [A, B] added (14.02.2026).
• Support for ]2, ]' and ]2' (conjugation and commutator with repetition and inverse modifier) added (16.02.2026).
• Non-slice-twist coverage now complete for all puzzles:
2xC, 3xC, 4xC, 5xC, 6xC, 7xC, 3xP, 4xP, 5xP, 3xD, 5xD.
• Various bug fixes and translation tests (22.02.2026).

Move count:
• BTM move count for TWIZZLE notation added, analogous to the existing SSE function (22.02.2026).
• New preference flag $useTwMoveCount: when true, the move count from cubing.net is used in TWIZZLE mode; when false (default), the move count from randelshofer.ch is used.
• $runExpTwLib preference flag removed (no longer needed).

Algorithm tools:
• Three new algorithm transformation functions added (22.02.2026):
Expand — expands grouped/repeated notation into a flat move sequence.
Invert — reverses the algorithm and flips all move directions.
Mirror — mirrors the algorithm along the Y-axis (swaps R and L moves).
• Algorithm tools panel added in the UI: $in['algTools'] parameter controls visibility ("Show tools" / "Hide tools"), persisted in a cookie for one year.

Clipboard:
• Copy-to-clipboard buttons added to the algorithm input field, the algorithm output field, and all three link fields (TWISTER, TWIZZLE Explorer, TWIZZLE Editor). A JavaScript function toClipboard(elementId) using navigator.clipboard.writeText() handles the copy operation.
• $txt_toClipboard label variable added.

Notation documentation:
• The algorithm field label is now a clickable link pointing to the SSE notation reference page (doc/notation.php) for the current puzzle, opening in a new tab.
• $cgiNotation variable added, pointing to "notation.php".

Dark mode:
• Dark mode support added: new $in['darkMode'] parameter, persisted in a browser cookie for one year. Colour variables $textCol, $grayCol, $blueCol are set accordingly for light and dark modes.
• CSS dark mode file variable $cssFile_dark added.

Options:
• Algorithm tools panel visibility controlled by $in['algTools'], persisted in a cookie for one year (merged into "Algorithm tools" section above).

Configuration:
• Gigaminx (5xMegaminx) Super stickering texture added to $layout_supercube and $layout_options arrays.
• Archived Twisty Player version from 21.02.2026 added as local fallback URL.

Twister v0.8.1 beta

Last Update: 2025-12-29

Changes:
Translation:
• All Cube translation functions have been switched from the old preg_replace implementation to new array-mapping variants using str_replace:
alg2xC_SseToTwizzleNew(), alg2xC_TwizzleToSseNew(), alg3xC_SseToTwizzleNew(), alg4xC_TwizzleToSseNew(), alg5xC_TwizzleToSseNew(), alg6xC_TwizzleToSseNew(), alg7xC_TwizzleToSseNew().
The new functions are used for all Cube puzzle types in the translation branch. (3xC SSE->TWIZZLE uses alg3xC_SseToTwizzleNew(); others use existing functions.)
• Pyraminx (3x, 4x, 5x): Numbered layer twists N1R, N2R, T2R and the outermost numbered variants added to the translation tables.
• Megaminx (3x): Numbered layer twist 2-3R added. OLD TWIZZLE still pending.
• Gigaminx (5x): Numbered layer twists 2-5R, 3-5R, 4-5R added. OLD TWIZZLE pending.
• Support for )' and )2' (grouped inverse modifiers) added (18.12.2025).

Links:
• TWISTER link generation extended to encode the notation, stickering, anchor, and tempo parameters in the URL (when non-default values are set).
• "Link TWISTER" added as a new link option in the link-type dropdown alongside "Link TWIZZLE Explorer" and "Link TWIZZLE Editor". The new $txt_linkTwister / $hlp_linkTwister variables control its label.

Stickering:
• 4xPyraminx and 5xPyraminx: Super Pyraminx 'Pochmann' texture images added to $layout_supercube and $layout_options arrays.

Editor:
• Move metric labels extracted into variables: $txt_metricBTM ("btm"), $txt_metricLTM ("ltm"), $txt_metricF
TM ("ftm"), $txt_metricQTM ("qtm"), $txt_metricETM ("etm").
• Meta description, keywords, Open Graph title and image alt text updated.

Twister v0.7.2 beta

Last Update: 2025-08-12

Changes:
Move count:
• sse_moveCountBTM(): parentheses '(' and ')' added to the $btm_count array with weight 0, so that simple grouped algorithms like (R U)3 no longer trigger an "unknown token" error.
• sse_moveCountBTM(): grouping validation replaced: instead of unconditionally rejecting any '(' or ')', the function now uses the new areBracketsBalanced() helper to check whether parentheses are properly paired. Algorithms with balanced groups are accepted; unbalanced ones are still rejected. Additionally, ')' followed immediately by a move letter (e.g. ')R') is rejected to catch missing repetition counts.

Functions (tw-functions_v000-007-002.php):
• New helper function areBracketsBalanced($inputStr) added. It uses a stack to verify that all opening brackets '(' have a matching closing bracket ')' in the correct order. Returns "1" if balanced, "0" if not.

Twister v0.7.1 beta

Last Update: 2025-01-15

Changes:
Code:
• PHP compatibility upgrade from v7.3 to v8.4 in the functions library (tw-functions_v000-007-001.php), carried out on 04.01.2025.
• require_once() path changed from $_SERVER['DOCUMENT_ROOT'] to __DIR__ for more portable include resolution.
• Variable name $mta_keyword corrected to $mta_keywords.

Bug fixes (functions library tw-functions_v000-007-001.php):
• 5xPyraminx: CODE -> SSE [8] Face twists: all codes <801>–<808> produced incorrect output (e.g. 5U' -> T4U CU' instead of T4U' CU).

Translation:
• Non-slice-twist cases R' L' and R' L2 added to the Slice twist optimisation for 3x–7x Cubes.
• 7xCube: Numbered layer twists 2-7R through 6-7R added.

Supported puzzles:
• 4xPyraminx and 5xPyraminx added to the $twister_puzzle_param array, enabling Twister links for these puzzle variants.

Twister v0.6.4 beta

Last Update: 2024-05-17

Changes:
Move count:
• BTM move count added for SSE notation for all supported puzzles (2x–7x Cube, 3x–5x Pyraminx, 3x/5x Megaminx) via the new function sse_moveCountBTM(). This initial implementation is limited: it does not handle advanced notation features such as comments, grouping, repetition, conjugation, or commutation.
• BTM move count added for TWIZZLE notation for 3x3 Cube.
• ETM move count added for TWIZZLE notation for 2x–7x Cube (except 3x3), 3x3 Pyraminx, 3x3 and 5x5 Megaminx.
Not yet supported for 4x4 and 5x5 Pyraminx.

Editor:
• Options panel is now rendered in the page header.
• Site icons (apple-touch-icon etc.) added to the HTML head section.
• Mobile Web App meta tags added.
• Open Graph meta tags added for link previews.
• Non-numeric tempo input now falls back to the default value "2" instead of being discarded as empty.

To do:
• Replace temporary Super Megaminx texture with a more precise layout.
• Full BTM move count support for all notations and all puzzles.

Twister v0.6.3 beta

Last Update: 2024-01-07

Changes:
Configuration:
• $showOptions changed to true (options panel is now shown by default).
• Added the $forceReload preference flag (default: true): when enabled, the CSS is always loaded fresh from the server, bypassing browser cache.
• Added the $hostURL variable ("www.randelshofer.ch") to centralise the domain name; all URL variables ($url_cubing, $url_cubingExp, $url_sse, $url_twister) now reference $hostURL instead of a hard-coded string.
• $cgiYear updated to 2024.

Options panel:
• Added the $in['optionsPanel'] parameter to control panel visibility via URL (accepted values: "", "1").
• Added the $in['anchor'] parameter ("" or "end") to set the Twisty Player setup-anchor; when "end" is set, the anchor parameter is appended to the TWIZZLE Explorer link.
• Tempo handling improved: the value is now rounded to one decimal place before clamping. Non-numeric values are discarded (set to "") instead of being silently clamped to the default.
• Added the $tempo_options array with values from 0.1 to 6.0 for the tempo dropdown (default 2.0, TWIZZLE default 1.0).

3D Puzzle Player:
• Parameter 'experimental-setup-anchor' is now set from $in['anchor'].

Translation (functions library tw-functions_v000-006-003.php):
• Pyraminx (4x, 5x): bug fix for corner twists — R was incorrectly translated as U instead of R.
• Cubes (3x–5x): Non-slice-twist handling added to the Slice twist optimisation ($optSSE), preventing R' L' from producing SR''.
Fix for 6x–7x Cubes, Megaminx, and Gigaminx is still pending (To Do).
• Asymmetric Slice twists: extended to 6x–7x Cubes, Megaminx, Gigaminx (previously only 4x–5x Cubes).

Twister v0.6.2 beta

Last Update: 2023-01-08

Changes:
Links:
• The link selection has been refactored into a proper dropdown (new $in['link'] parameter). The default value depends on the current notation: TWIZZLE notation defaults to "twizzleExplorer"; SSE defaults to "sse".
Accepted values: 'twizzleExplorer', 'twizzleEditor', 'sse'.
• Link labels renamed for consistency:
– "Link TWIZZLE Explore": "Link TWIZZLE Explorer"
– "Link TWIZZLE Edit": "Link TWIZZLE Editor"
– URL comment updated from "Twizzle Explore" to "Twizzle Explorer".
• The three separate link textarea fields (SSE, TWIZZLE Explorer, TWIZZLE Editor) are now controlled by the $in['link'] parameter, showing only the selected link.
• The "Show at Twizzle Explore" button label corrected to "View at Twizzle Explorer".

Translation (functions library tw-functions_v000-006-002.php):
• Bug fixes for incorrect second-pass Slice twist translations introduced in v0.6.1
(Megaminx and Gigaminx):
– Uv' D was incorrectly producing CSU' (via CU' D → CSU').
– 3U' FR2 was incorrectly producing MSU'R2 (via MU' DR2 → MSU'R2).
– 3U' Uv2' was incorrectly producing S2U 2' (via MU' CU2'→ S2U 2').

Twister v0.6.1 beta

Last Update: 2023-01-04

Changes:
Configuration:
• Added the $showOptions preference flag (default: false) to control whether the options panel is shown.
• Version label now carries the "beta" suffix: "0.6.1 beta".
• $cgiYear updated to 2023.
• The "Requires" section added to the file header, noting the Twisty Player dependency (cubing.net).

3D Puzzle Player:
• Added the $twizzle_puzzle_descr array, mapping puzzle keys to Twizzle Explorer geometry description strings (used for the 'puzzle' URL parameter).
• 4x4 and 5x5 Pyraminx: switched from parameter 'puzzle' to 'experimental-puzzle-description' to correctly render these puzzle variants.
• Stickering support added for all supported puzzle variants via the new $layout_supercube, $desc_supercube, and $layout_options arrays:
– Cubes (3x3 to 6x6): "Super Cube 'Pochmann'" texture images.
– Cube 7x7: "Super Cube 'Pochmann'" texture image.
– Megaminx (3x3): "Super Megaminx 'Pochmann'" texture (temporary layout; a more precise texture is noted as a To Do item).
The Twisty Player 'experimental-stickering' parameter now uses these textures when the "Super" layout option is selected.

Links:
• The single "Link TWIZZLE" field has been split into two separate fields:
– "Link TWIZZLE Explore": points to alpha.twizzle.net/explore/
– "Link TWIZZLE Edit": points to alpha.twizzle.net/edit/
Two new URL variables added: $url_twizzleExpl and $url_twizzleEdit.

Translation (functions library tw-functions_v000-006-001.php):
• Slice twists: Two-Pass optimisation added for Megaminx and Gigaminx.
• Gigaminx: Bug fix for Mid-Layer Twists (3B, 3U, 3D).
• Cubes (3x–7x): Slice twist bug fix preventing R' L' from being incorrectly translated as SR''.
• Megaminx / Gigaminx: Slice twist bug fix preventing U' D' from being incorrectly translated as SU''.
• Asymmetric Slice twists added for 4x Cube; partial additions for 5x Cube.
• Additional Void Twists added for Gigaminx.
• Known issue: Gigaminx TWIZZLE-to-SSE second-pass translation produces incorrect results for certain combinations (e.g. 3U' FR2, 3U' Uv2').

Twister v0.5.2

Last Update: 2022-08-05

Changes:
Code:
• All PHP comments and variable descriptions have been translated from German to English throughout the main index file and the functions library.
Array section comments changed from double-slash style to block comment style.

3D Puzzle Player:
• Three new Twisty Player parameters added to the <twisty-player> element:
– tempo-scale="1": sets the default animation speed (range 0.1–6).
– camera-distance="6": sets the default camera distance from the puzzle.
– experimental-drag-input="auto": enables drag-to-rotate interaction by default.

Translation (functions library tw-functions_v000-005-002.php):
• SSE to TWIZZLE: complete code revision for 2xC–7xC, Megaminx (3xD), and Gigaminx (5xD). Alternative move tokens added for all those puzzles.
• TWIZZLE to SSE: complete code revision for 2xC–7xC, Megaminx (3xD), and Gigaminx (5xD). Alternative move tokens added. Slice twist optimisation added for all cube and dodecahedron variants.
• Pyraminx (3xP–5xP): revision and alternative move tokens are pending (noted as To Do in the functions file).
• Note: the TWIZZLE notation does not support 1R/1L/1F/1B/1U/1D tokens; these map to R/L/F/B/U/D (outer face moves) in the translation.

Twister v0.5.1

Last Update: February 2022

Changes:
Terminology:
• The move category previously called 'Verge twists' has been renamed to 'Void twists' throughout the entire codebase. This affects all comment labels in the translation functions for 4xC, 5xC, 6xC, 7xC, and 5xD (Gigaminx) in the functions library (tw-functions_v000-005-001.php).
All occurrences of "Verge" in section headings such as 'SSE -> CODE: [4] Verge twists', 'CODE -> TWIZZLE: [4] Verge twists', etc. have been replaced with "Void twists" to reflect the correct SSE term.
No changes were made to the actual move mappings or translation logic.

Twister v0.4.1

Last Update: January 2022

Changes:
Configuration:
• Added the $useJavaPlayer preference flag. When true, the SSE link points to the legacy Java Applet Player; when false (default), the link points to Twister itself, which uses the Twisty Player instead.
• $cgiYear updated to 2022.
• Added $url_twister variable for the Twister base URL (randelshofer.ch).

Supported puzzles:
• Added the $twister_puzzle_param array, mapping puzzle keys to Twister URL parameters. This is used when generating SSE links that target Twister rather than the Java Applet Player.
• $sse_puzzle_param renamed/clarified in comments to indicate it is specific to the legacy Java Applet Player.

Links:
• TWIZZLE link generation: The link is now only built when $alg_TWIZZLE is non-empty, avoiding a link to an empty algorithm.
• SSE link generation refactored into two branches controlled by $useJavaPlayer:
– Java Applet Player path: converts the SSE algorithm via alg_SseToSseLink() and builds a legacy http:// URL to the Java Applet Player.
– Twister path (default): converts the SSE algorithm via the new function
alg_SseToTwisterLink() and builds an https:// URL to Twister itself, encoding puzzle type and algorithm as URL parameters.

3D Puzzle Player:
• Twisty Player parameter handling extended: puzzle type and algorithm are now assigned in dedicated sections. For Pyraminx puzzles, additional parameter logic is applied. The control panel visibility adapts to algorithm length (algorithms longer than 200 characters or more than 4 lines suppress it).

Twister v0.3.1

Last Update: October 2021

Changes:
Configuration:
• Added the $runLatestTwLib preference flag. When true (default), the Twisty Player is loaded from the cubing.net CDN; when false, a locally hosted version from randelshofer.ch is used as a fallback. This makes the application resilient against upstream CDN changes.
• Added the $runExpTwLib preference flag to optionally load the experimental Twisty Player from experiments.cubing.net instead of the stable release. Reserved for testing purposes; the experimental code path is currently stubbed out.
• Added $url_cubingExp as a second URL variable for the experimental Twisty Player CDN.

Translation:
• Megaminx (3x3) and Gigaminx (5x5): When TWIZZLE input is selected, the algorithm is no longer passed through unchanged. It is now converted via the new functions alg3xD_OldTwizzleToTwizzle() and alg5xD_OldTwizzleToTwizzle(), which migrate algorithms written in the older Twizzle notation to the current Twizzle notation before further processing.

Twister v0.2.1

Last Update: January 2021

Changes:
3D Puzzle Player:
• The cubing.net Twisty Player (cubing.js) has been integrated as an embedded 3D visualisation component. The 'twisty-player' web component is now rendered on the page and receives the current puzzle type and algorithm as parameters.
• A new $url_cubing variable holds the CDN URL for the Twisty Player JavaScript module.
The module is loaded as a deferred ES module.

Configuration:
• $cgiYear added to support dynamic copyright year output.
• Default puzzle changed from a required empty field to '3xCube' (3x3 Rubik's Cube),
so the page renders a valid puzzle even without an explicit URL parameter.

Editor:
• Action buttons added: Clear (resets the algorithm field) and Update (resubmits the form), and a Show button that opens the current algorithm in TWIZZLE Explorer.
• Copyright notices added to the page footer for both TWISTER and TWIZZLE (cubing.net).

Twister v0.1.4

Last Update: December 2020

Changes:
Code organisation:
• All translation and utility functions have been extracted from this file into the dedicated include file scripts/tw-functions_v000-001-004.php, which is loaded via require_once() at the top of the script. This separates business logic from presentation and makes both files easier to maintain independently.

Configuration:
• Added the $compactView preference flag (default: true) to control whether the interface is rendered in compact or full display mode.
• Puzzle identifiers changed from numeric keys (1, 2, 3 ...) to descriptive string keys (e.g. '3xCube', '3xPyraminx', '3xMegaminx') throughout all arrays.
• URL variables reorganised: $tw_homepage renamed to $url_twizzle; a new $url_sse variable added for the SSE player link base URL.

Supported puzzles:
• Cube family added: 2x2 Pocket Cube, 3x3 Rubik's Cube, 4x4 Revenge Cube, 5x5 Professor Cube, 6x6 V-Cube 6, 7x7 V-Cube 7.
• Megaminx (3x3) and Gigaminx (5x5) are now active (no longer commented out).
• A new $sse_puzzle_param array maps puzzle keys to their SSE player parameter names.

Editor:
• Two new read-only link fields added to the output area:
– TWIZZLE link: shows the Twizzle Explorer URL for the current puzzle and algorithm.
– SSE link: shows the SSE player URL; displayed only when a valid SSE puzzle parameter exists for the selected puzzle.

Twister v0.1.3

Last Update: December 2020

Changes:
Editor:
• Notation selector: the option label 'SiGN' has been renamed to 'Twizzle' to better reflect the notation convention used for the output field.
The corresponding display string $txt_notationSiGN and field label $txt_algSiGN have been updated accordingly ('Notation Twizzle', 'Algorithm Twizzle').

Translation:
• Pyraminx (3x3, 4x4, 5x5): SiGN-to-SSE translation is now fully implemented.
The placeholder stubs from v0.1.2 have been replaced with calls to the alg3xP_SiGNToSSE(), alg4xP_SiGNToSSE(), and alg5xP_SiGNToSSE() functions.
• Megaminx (3x3): Translation scaffolded in both directions (SSE↔SiGN) via the new functions alg3xD_SSEToSiGN() and alg3xD_SiGNToSSE().
Face twists and puzzle rotations are mapped; mid-layer and numbered-layer translations are not yet implemented.
• Megaminx (5x5 Gigaminx): Translation scaffolded in both directions (SSE↔SiGN) via the new functions alg5xD_SSEToSiGN() and alg5xD_SiGNToSSE().
Face twists, tier twists, numbered-layer twists, and puzzle rotations are mapped; wide-layer translation is not yet implemented.

Supported puzzles:
• Pyraminx (3x3, 4x4, 5x5): translation in both directions now functional.
• Megaminx (3x3) and Gigaminx (5x5): added as puzzle options (IDs 4 and 5); translation partially implemented.

Twister v0.1.2

Last Update: December 2020

Changes:
Editor:
• Added a Notation selector dropdown (SSE / SiGN).
Changing the notation resubmits the form and relabels the algorithm input field accordingly.
• The algorithm input field has been renamed from algSSE to alg to reflect that it now accepts input in either notation.
• The algorithm output field has been renamed from algSiGN to algOUT.
Its label and content now adapt dynamically to the selected notation direction.

Translation:
• The translation logic now branches on the selected notation:
SSE mode: translates the input from SSE to SiGN (output field shows SiGN).
SiGN mode: passes the SiGN input through unchanged (SSE output not yet implemented).
• Added the $notation array to map notation keys to display labels ('SSE', 'SiGN').

Twister v0.1.1

Last Update: December 2020

First release:
General:
• Twister is a port of a Perl script of the same name.
It translates algorithms of various puzzle models from SiGN to SSE notation.

Translation:
• SSE to SiGN: Added for Pyraminx (3x3, 4x4, 5x5).

Supported puzzles:
• Pyraminx: 3x3 Pyraminx, 4x4 Master Pyraminx, 5x5 Professor Pyraminx.

Copyright © 2020-2026 randelshofer.ch.
All rights reserved.