Crisscross - Collaborative Crosswords


In 2022, one of my friends made a dedicated effort to get me hooked on crossword puzzles. We often solved puzzles together as a social activity, and I now find I particularly enjoy solving crossword puzzles with friends.

We discussed that it is not always convenient to get together physically to solve a crossword, and we listed what we consider the minimal requirements for two (or more) people to solve a crossword when they are apart.

  1. All players must be able to see the board.
  2. All players must be able to read the clues.
  3. All players must be able to chat about ideas.

With those requirements in mind, I created a collaborative crossword solver called Crisscross. It allows two or more people to work on a single crossword puzzle using web browsers. The first working prototype was finished in December 2022, and we spent several weeks refactoring and improving the program together. I would describe it as good but not quite polished, and we are quite happy with its function and use it regularly.

Quick start

Visit to start a new crossword in Crisscross. You will need to possess some example of a crossword to play, perhaps from a newspaper or book of puzzles.

I have created a short video demonstrating the basic use of Crisscross, which includes drawing the board, typing in clues, sharing a game with a friend, and working the puzzle together:

Editing the board

When you start Crisscross, the board begins in editing mode, indicated by a selected checkbox labeled "Edit board" near the bottom right of the program area. Clicking a board square while in edit mode toggles it between black and white, and the board automatically renumbers itself.

There are three things you may wish to customize right away when creating a game, the visual size of the board squares, the number of rows and columns, and the geometric symmetry of the board. All may be changed via commands that are typed into the text box immediately below the board area. Commands in Crisscross begin with a colon (:), something that is very comfortable to long time Vi users.

Pixel size of individual squares

To make the individual board squares bigger or smaller than the default 40 pixel size, you can use the :size command:

:size 35

Your preferred square size is remembered by your web browser and honored when you return to Crisscross for subsequent games. Text typed as you solve the puzzle scales appropriately to fit your preferred individual square size.

Grid layout of the board

Most crosswords are played on a 15×15 grid, but occasionally a game is played on a grid of some other size. To create a 16×16 game, you could use the command:

:board 16

If you happened to have a non-square board with 10 rows and 14 columns, you could create that via:

:board 10,14

Note: The board is cleared when you change its layout. So get the rows and columns correct before you start drawing. Changing the dimension of the board also breaks any sharing links, so set the board dimensions before you share a game (explained below).

Board symmetry

If you turn on 180 degree symmetry, then whenever you blacken a square on the top half of the board, a symmetrically opposite square on the bottom of the board will also be darkened. Most published crosswords use 180 degree symmetry, so you will probably want to turn it on with the command:

:symmetry on

Circled squares

On occasion, crosswords have selected squares that are marked with a circle. In such puzzles there will be special clues that make use of or refer to the circled squares. To toggle circled squares when drawing a new board in Crisscross, Shift-click a square. Circles are a decoration only, and they do not affect the numbering of the board.

Leaving edit mode

When you have finished drawing your game board, you will see that it matches your source crossword and that all squares are correctly numbered. You can switch the game into play mode by unselecting the "Edit board" checkbox.

Title and clues


Your crossword can be given a title with the command:

:title text


"Across" clues are typed in using a command of form :<num>a text. For example, in the quick start video, the clue for 1 across is entered via:

:1a Kon-Tiki wood

Since Crisscross knows the numbers of all clues (after you have drawn the board), it increments to the next valid clue number and prompts you automatically for the next clue. It will also decrement to the previous valid clue if you begin working from the bottom of the list.

"Down" clues are handled similarly, and the clue for 1 down in the example video is entered via:

:1d Vamp Theda

Fixing mistakes

If you make a mistake, you replace the text of a clue by typing the colon command for that clue with the corrected text.

To delete a particular clue, give the colon command for that clue without any clue text.

Sharing a game

To create a shared game, use the command:


A random gameid will be chosen for your game, and the URL at the top of your browser will be modified. You can either give the URL to your friend, or instruct them to give the appropriate :join command in their copy of Crisscross.

For example, if your game had gameid 8420d007f23663f12c5d41e9, then your friend could visit or enter the command:

:join 8420d007f23663f12c5d41e9

Tip: I like to draw a board and share my game before typing in the clues. Then I can send my friend a picture of the puzzle and a game URL, and she can type in across clues while I type in down clues. It makes the work go faster, and since we both need to become familiar with the clues, we each get a head start on half.


Everyone starts with the default nickname "User". You can change your nickname with the command:

:nick MyName


Any text entered in the command window is sent as chat to all players currently connected to your game. It is effective but rudimentary, and there is no history or editing.


When more than two people solve a puzzle together, you may wish to see which of them is making remote edits on the game board. (This is less important when solving a game with a single friend, since you always know the remote edits come from them.) You can turn on a floating nickname indicator with the command:

:nametags on

Saving and loading games

To save a game to your computer as JSON text, use the command:

:save file.json

To load a previously saved game, use the command:


Browsers don't allow you to specify an upload filename, so you have to choose the desired file from a file chooser dialog.

Tip: the sharing server does not keep the state of old games when it is restarted, so it is a good idea to save any games that you have done a significant amount of work on. I usually save a local copy of any game when I have finished drawing it and entering clues. I like to save another after the puzzle is solved (and sometimes copies along the way).


As you navigate around the board, Crisscross automatically scrolls the clue lists until the appropriate clues become visible. On some platforms (like phones with small screens) this can be a nuisance. So it is possible to turn off automatic clue scrolling.

:scroll off

Note: because of idiosyncrasies of Firefox, I find clue scrolling on that particular browser is a little worse than other browsers. I prefer to use a different browser with Crisscross, because the game experience is better.

If you would like Crisscross to warn you when you attempt to make an across or down clue with an incorrect clue number, set:

:cluecheck on

Help list

A brief list of all commands is available, via the :help command:

Valid commands:


:size n
:nick name
:title game
:<num>a across clue text
:<num>d down clue text

:board m,n
:save file.json

:join (gameid)

:cluecheck (on|off)
:nametags (on|off)
:scroll (on|off)
:symmetry (on|off)

Source code

We wrote Crisscross for ourselves, but in the interest of freedom we have chosen to release it under the GPLv3.0 free software license. Suggestions and fixes are welcome to

Our GitLab:

Return to: [Don Bindner]