tool for making crossword puzzles (might become a semi-automatic crossword maker), based on Django
Python JavaScript CSS TeX Shell
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


fiëé croisée

I like making crossword puzzles. But it needs a lot of time without the right tools.

At the moment this is some kind of fill-in sheet with attached dictionary to look for matching words.

I hope it will evolve in a tool that makes creating and sharing crossword puzzles just fun.


It’s a Django application, to be run on Apache/mod_wsgi or Nginx with Django via gunicorn or FCGI.

The provided fabfile (fabric deployment) is for a Debian server and documented at

Additionally you need a that gets copied as It can contain every kind of local settings, at least the database password.


If you don’t need a public API, comment “rest_framework” in (INSTALLED_APPS) and requirements.txt.


  • public
    • find words that match a specified pattern (e.g. PY?H?N or ?YT*)
    • work in a puzzle grid (custom size 4-20 lines/rows)
    • save puzzles and retrieve them under a url code
    • load public puzzles
    • export public puzzles as ConTeXt, LaTeX (cwpuzzle) or plain text files
    • list words in dictionaries
  • active users
    • questions get automatically saved to personal dictionary
    • save puzzles as private
  • admin
    • manage words and their descriptions in several dictionaries
    • import word lists
  • api
    • optional RESTful API with djangorestframework (rest_framework)_


Cloze Query

Using the search field in the toolbar you can look up words that contain defined letters at discrete locations.

You can use _ and ? as wildcards for single letters, * and % for an undefined number of letters (including none).

E.g. if you look up _Y__O_ you get PYTHON and SYMBOL (depending on dictionaries, of course); if you look up RAM*, you get e.g. RAM, RAMBLE, RAMADAN etc. Of course you can mix wildcards at will.

All letters get uppercased, German umlauts get converted from Ä, Ö, Ü to AE, OE, UE; other international characters get de-accented. (If your language needs other conversions, please contact the developer.)

Searching works only if you activate at least one dictionary first.

Query results are limited to 100 answers.

Puzzle Grid

Here’s how to make your own crossword puzzle:

Click the “star” button to create a grid in your favourite size (12x12 is good).

You can move around in the grid with the arrow keys (tab, shift-tab, backspace, delete work also). If you write letters, the cursor will move right to the next cell; if you press shift, it will move downward. Please write slowly, otherwise the key handler swallows characters.

Write some words into the grid “by heart” - in an empty grid, you’d get thousands of possible words.

Perhaps write only one letter in the corners - that’s how I mostly start. Press ? (question mark) in any square, and after a short delay you’ll get two lists of words that match in this place horizontally and vertically.

You can click on the words in the result list to place them in the grid. The list will adapt automatically to the new situation.

To mark cells as “blockers”, press space (and again to remove the block).

To set a number as start-of-word mark, press # (number sign). The numbering works automatically. A question field is added to the horizontal and/or vertical list, it gets filled with the first solution from your selected dictionaries.

Just press # again to remove the number and the question field.


Make a wordlist

  1. use the provided wordlists for German, English and Esperanto (derived from ispell dictionaries); you can upload them directly
  2. use a dictionary from aspell:
aspell dump master > mydict.txt
  1. get some long text, e.g. from Project Gutenberg
  2. write your own
  • The wordlist file is expected in UTF-8 encoding.
  • Format is “(word)\t(description)\t(priority)\n”. Description and priority are optional (default to word and 0).
  • run on it (or several), result is wordlist.txt.

Make a dictionary

  • upload a wordlist file to your croisee installation (Wordlist Upload); that may take a while.
  • fix descriptions and priorities, if you like.



I’m planning to implement the following features in about this order:

  • enable user registration (django registration)
  • export grid and solution as text (done) / HTML / LaTeX (cwpuzzle, done) / ConTeXt (done) / PDF / InDesign markup
  • export of dictionaries
  • edit personal dictionary (or all for admins)
  • use tagging for puzzles
  • delete anonymous puzzles after e.g. 1 month
  • allow adopting of anonymous puzzles by users
  • import text files (JSON, YAML?)
  • different types of crossword grids (fat lines instead of blocked cells, uneven outline...)
  • mark letters for extra solution (competition word)
  • automate filling the grid (algorithm?)
  • set up a paid service
  • get rich
  • world domination

Bugs / Todo

  • only German keyboards work well; seems we use key codes instead of character codes
  • word numbers are rather small in Mozilla (and probably other browsers than WebKit-based)
  • admin: if adding to an existing dict, disable other fields
  • clean up redundant template/view code
  • update libraries and optimize JS code
  • still not really a reusable app (to be integrated in fiëé cérébrale)
  • still no tests!
  • add Sphinx documentation
  • add
  • bind anonymous puzzles to one session to avoid puzzles being edited by several anonymous users at the same time
  • add sample

Internal workflow (how it should work)

If you save a puzzle for the first time, a new hash code is generated from your IP address and the local datetime. The puzzle’s address is becoming something like “/puzzle/abcdef123456/”.

as anonymous user

Your saved puzzles are always public (otherwise you couldn’t access it later). Everyone can change it. Your solutions (i.e. questions for words) are only saved with the puzzle.

as logged in user

You can decide to make your puzzles public, but only you can change it. Your solutions are also saved to your personal dictionary. If you’re a staff member, your solutions can be saved to a public dictionary and you can use non-public dictionaries. You can export your personal dictionary to use it with your own croisee installation. You can claim (adopt) puzzles of anonymous users (e.g. your own, while you weren’t logged in).


GPLv3, see

Feel free to ask for different, additional licensing.

I don’t plan to release my edited dictionaries, because in them’s the most work.

Everything related to fiëé visuëlle (logo, names) is copyrighted and contained only for the sake of completeness. That means you must not use the fiëé logo, fiëé favicon or any name containing fiëé in public, except in a descriptive manner, where it is encouraged (e.g. “this is derived from / based on”).