SkillAgentSearch skills...

Exolve

Online interactive crossword software in JavaScript

Install / Use

/learn @viresh-ratnakar/Exolve

README

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-width
  • exolve-height
  • exolve-grid
  • exolve-title
  • exolve-setter
  • exolve-email
  • exolve-id
  • exolve-copyright
  • exolve-credits
  • exolve-preamble / exolve-prelude
  • exolve-across
  • exolve-down
  • exolve-nodir
  • exolve-reversals
  • exolve-3d
  • exolve-3d-across
  • exolve-3d-away
  • exolve-3d-down
  • exolve-explanations
  • exolve-nina
  • exolve-colour / exolve-color
  • exolve-no-rebus
  • exolve-question
  • exolve-submit
  • exolve-option
  • exolve-language
  • exolve-relabel
  • exolve-maker
  • exolve-host
  • exolve-force-hyphen-right
  • exolve-force-hyphen-below
  • exolve-force-bar-right
  • exolve-force-bar-below
  • exolve-cell-size
  • exolve-grid-spacing
  • exolve-grid-bounds
  • exolve-cell-decorator
  • exolve-postscript
  • exolve-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

View on GitHub
GitHub Stars91
CategoryDevelopment
Updated14d ago
Forks22

Languages

HTML

Security Score

100/100

Audited on Mar 14, 2026

No findings