Exolve
Online interactive crossword software in JavaScript
Install / Use
/learn @viresh-ratnakar/ExolveREADME
Exolve
An Easily Configurable Interactive Crossword Solver
Version: Exolve v1.69, February 25, 2026
Exolve can help you create online interactively solvable crosswords (simple ones with blocks and/or bars as well as those that are jumbles or are diagramless or are 3-D, etc.) in any language.
The file exolve.html contains all the code you need: just
make a copy and then replace the part that contains the example grid with your
own puzzle specification, starting at the exolve-begin line and ending at the
exolve-end line.
The files exolve-m.js, exolve-m.css, and
exolve-m.html (you would probably rename a copy of
this to your-puzzle-name.html and edit it), have the same content as
exolve.html, except that it is split into separate parts:
JavaScript, CSS, and HTML (including the puzzle specification), This allows the
JavaScript and CSS to be reused across multiple puzzles.
Another simple option is to just use the exolve-m-simple.html file: this is essentially a copy of exolve-m.html, but it does not require you to host the exolve-m.css and exolve-m.js files, as it links to their latest copies on a website that I maintain, hosted on GitHub.
In late 2025, I set up a free, no-strings-attached crossword hosting service called Exost. You can upload crosswords to it from its own site, or from Exolve Player, or from Exet.
Yet another option is to embed the Exolve puzzle within arbitrary web pages (like blog posts) in a "widget". See the details in the Exolve widget section.
The Exolve Player web app can be used to play crossword files in several formats (including .puz, .ipuz, and even just the clues copied from a PDF in many cases). An easy-to-remember URL for this web app is exolve.app. Exolve Player can also be used to export to Exolve, .puz, and .ipuz formats.
You can also use the file exolve-embedder.html to serve .puz and .ipuz files using Exolve. See the details in the Exolve Embedder section.
Here is an example of the puzzle specification:
exolve-begin
exolve-width: 5
exolve-height: 5
exolve-grid:
HELLO
O.A.L
WORLD
L.G.E
STEER
exolve-across:
1 Greeting (5)
4 Earth (5)
5 Guide (5)
exolve-down:
1 Emits cry (5)
2 Big (5)
3 More ancient (5)
exolve-end
The format is very simple and uses plain text (but the parsing code is also occasionally simplistic and not very forgiving, so please do go through the format documentation). The setter has the option to provide solutions (as in the example above), or to just use 0 to indicate a cell that needs to be filled (i.e., is a part of a "light," in crossword terms).
A whole suite of test-*.html files is also available in this directory. I use them to test new releases, but you can use them to see examples of usage of most Exolve features.
Controls
The basic control is to click on a cell and enter a letter in it. If a cell is a part of both an across clue and a down clue, then clicking on that cell while it is the current cell (or pressing the Enter key) will toggle the active direction (unless the shift key is also pressed with a click, in which case no directon-toggling will happen, which is useful when navigating back to the grid from some other clicked element).
The control buttons (Clear this, Clear all!, Check this, Check all!, Reveal this, and Reveal all!) work as suggested by their names ("this" refers to the currently selected light(s)). You can click on a clue to make its cells active. If the setter has not provided all solutions, then only the "Clear this/all" control buttons are shown, the "Check/Reveal" buttons do not get shown.
The "Clear this" button at first only clears letters that do not cross other fully filled lights, if there are any. If there are none (i.e., if all remaining letters in the current light also cross other fully filled lights), only then will these remaining letters get cleared.
A long click on either of "Check this" or "Reveal this" will toggle the text "this" to "cell", and the checking/revealing will then only happen on the current cell (as opposed to the whole light), for that particular activation of the button. Caveat: this does not seem to work on phones and tablets (only tested on Android devices though).
Setters can use exolve-option show-cell-level-buttons
to additionally show an extra row of buttons containing these two cell-level
buttons: "Check cell" and "Reveal cell".
If the setter has provided annotations by appending annotations at the end of some clues, then these annotations get shown when the solver clicks "Reveal all!". Clue-specific annotations get revealed/hidden with "Reveal/Clear this" buttons. In a puzzle in which solutions are not provided, the "Reveal this" button will still get shown if there are any clues for which annotations are present (these annotations may be full solutions or just notes, possibly).
If the setter has provided the location of one or more ninas (through
exolve-nina sections), then an additional button control,
Show ninas, gets shown, for the solver to see where the ninas are. The button
can be clicked again to hide the nina locations. Ninas also get shown on
clicking "Reveal all".
If the setter has asked additional questions in the puzzle (through
exolve-question sections), then input fields for these get
shown too. "Reveal/Clear all" controls buttons also include revealing/clearing
answers to these questions apart from showing/hiding annos/explanations/ninas.
If the setter has set up a submit URL (with an exolve-submit
section—the URL can be set up using a Google Form, for instance), then there is
a Submit buttion.
When the solver enters a letter in a cell, the cursor automatically jumps to the next cell for the currently active clue (the next cell can be from a different clue, when there are linked clues).
If the solver changes a cell entry from a non-blank letter to a different
non-blank letter, then that changed letter is highlighted by showing in a
different colour for a short while. This animation's
start/end colours (overwritten-start and overwritten-end)
and the duration (highlight-overwritten-seconds) can be
configured.
If the solver hits the delete key, it will erase the contents of the current cell without advancing.
The solver can press Tab/Shift-Tab to navigate to the next/previous clue. The
solver can use the arrow keys to navigate to the next/previous light cells in
the direction of the arrow. If there is no light cell anywhere further in the
direction of the arrow, but there is a light cell immediately diagonally in
that direction to one side, then the cursor moves there (this is intuitively
helpful in tiled grids created using exolve-shaped-cell).
The software tries to keep the current clue visible when scrolling, as long as the cell with the cursor is visible.
"Clear/Check/Reveal all" buttons, the "Show ninas" button, and the "Submit" button solicit additional confirmation from the solver.
Clicking on a clue in the clues table makes that clue active. If that clue was not the previously active clue, then the keyboard focus goes to the first letter of that clue, in the grid. If the clue was already active, then the focus stays with the clue, letting you select and copy parts of the clue/anno if needed.
You can click on the black background or on the puzzle title, setter, or preamble (if present) to unhighlight the current clue (for screenshotting, for example).
Extended chessboard notation
In a few cases (such as when specifying colouring or ninas or locations of some clue numbers in diagramless puzzles), you might need to specify the location of a cell in the grid. You can do that in one of the following ways:
a3 (column "a": the 1st column from the left, and row 3 from the bottom)
f11 (column "f": the 6th column from the left, and row 11 from the bottom)
The letters (a-z) must be in lower case and must precede the row number, with no intervening space.
This chessboard notation is insufficient if your grid has more than 26 columns. You can directly specify the row and the column too, like this:
c1r3 (the 1st column from the left, and row 3 from the bottom)
r11c6 (the 6th column from the left, and row 11 from the bottom)
Exolve format overview
The puzzle can contain the following "sections" between the exolve-begin line
and the exolve-end line:
exolve-widthexolve-heightexolve-gridexolve-titleexolve-setterexolve-emailexolve-idexolve-copyrightexolve-creditsexolve-preamble/exolve-preludeexolve-acrossexolve-downexolve-nodirexolve-reversalsexolve-3dexolve-3d-acrossexolve-3d-awayexolve-3d-downexolve-explanationsexolve-ninaexolve-colour/exolve-colorexolve-no-rebusexolve-questionexolve-submitexolve-optionexolve-languageexolve-relabelexolve-makerexolve-hostexolve-force-hyphen-rightexolve-force-hyphen-belowexolve-force-bar-rightexolve-force-bar-belowexolve-cell-sizeexolve-grid-spacingexolve-grid-boundsexolve-cell-decoratorexolve-postscriptexolve-shaped-cell
Each section has the section name (exolve-something), followed by a colon.
Other than the exolve-preamble/exolve-prelude, exolve-grid,
exolve-across, exolve-down, exolve-nodir,
exolve-explanations, and exolve-postscript sections, all other sections
occupy a single line (some can be repeated though). For such single-lin
