Sokoban
The 1999 applet, and the game it turned back into: 115 levels, three skins, in the browser or on the desktop.
An on-line version of Sokoban, written in 1999 under the handle I used then, ReneGade/TiS, which is the name its source still signs itself with. It ran as a Java applet, so it stopped running when browsers dropped Java. In September 2026 it was written again twice: once for the desktop in modern Java, once for the browser in JavaScript. Both play the same 115 levels with the same tiles, and everything the 1999 page said is further down, as it was written.
- ←↑↓→
- move, pushing a box ahead of you
- WASD
- the same, left hand
- IJKL
- the same, as the applet had it
- U
- undo, as far back as you like
- R
- restart the level
- N
- next level
How it plays
Put every diamond on a socket. You push a box by walking into it, and only if the square behind it is free, which is the whole game: there is no pulling, so a box in a corner stays in a corner. Undo is unlimited, so the corner is not fatal. The level and the skin you leave on are remembered in your browser, and nowhere else.
The levels are grouped in the picker the way they were published: the five that came with the applet, then LOMA (Levels Of Multi Authors, collected by Aymeric du Peloux), then Sasquatch III by David W Skinner. The LOMA and Sasquatch sets get harder roughly in order; the applet's own five do not.
The levels came back broken
The applet shipped 59 levels from LOMA, converted into its own map format by SoKonvert, the utility by George Oikonomou (link no longer available) that is still downloadable at the bottom of this page. Feeding those 59 files to the rewritten parser, they all read cleanly: the box count matched the goal count in every one of them. Then a breadth-first search over the actual game rules reported 25 of them unsolvable, and most of the rest winnable in absurdly few moves (LOMA09-02 in one).
The converter turns out to drop *, the character for a box that starts already on a goal, and write plain floor instead. That removes a box and a goal at the same time, so the counts stay balanced and nothing looks wrong; 36 of the 59 levels were damaged this way. LOMA03-01 is a three-box puzzle; the copy this site served for twenty years had one box and no way to reach the goal at all.
Both rewrites therefore read the levels from levtext.txt, the collection's own text, which is what SoKonvert read too. That yields 60 correct levels, not 59: LOMA10-06 is in the source and never made it through the converter, so the site never had it. The same zip carries a second collection, Sasquatch III, converted with the same damage — 358 boxes-on-goals lost across 38 of its 49 files — and its 50 levels come from the source text as well, the fiftieth being another one the converter never emitted. With the five original maps that is 115.
The 65 small ones are proved winnable by the same search. Sasquatch III runs from 6 boxes to 152 and cannot be searched, so instead every imported level was rendered back out of the parsed model and compared to the collection's own text, character for character. What guards it from here is a count: 415 boxes start already on a goal across the catalogue, and that total is the one thing a *-dropping import cannot preserve. The desktop game asserts it in a test and the browser game's level generator refuses to write a file where it has changed.
How the browser version is built
One file of plain ES2020, no build step, no dependencies, served as a static page with nothing behind it. The board is a canvas drawn from the model on every change, and the search runs on the same thread as everything else — it can afford to, because the whole space is small: the worst board on this page takes about 5,000 arrangements and 20 milliseconds, and the page has time to put "Searching…" on screen first.
Its tile faces are copied out of the desktop game's own resources rather than by hand, which is also what keeps the two honest: the generator records a checksum per file, so a well-meant pass over the artwork would show up as a stale build rather than as a board that quietly looks different here.
On the desktop
The same game as a plain desktop application, on JDK 17 and up. The applet would not have compiled there anyway; one of its variables was named enum, which was fine in 1999 and a syntax error from Java 5 onwards. The artwork, the skins, the logo and the levels are the originals; the game rules, the rendering and the level parser were rewritten. The rules are now a model separated from the interface and covered by tests, the board repaints from that model inside paintComponent instead of poking pixels through getGraphics(), and the assets load from the classpath rather than over HTTP, so the jar runs offline.
The source is at bkarak/shokoban (external link, opens in a new tab) (spelled the way the applet spelled itself), which also keeps the original applet, untouched, under legacy/applet (external link, opens in a new tab). Build it with mvn and run java -jar target/sokoban-2.0.0.jar.
Three skins, upscaled
The deployed applet had three skins and the development directory only ever had two, so xsoko came back from this site's own repository, along with the levels. The tiles were drawn at 20×20, which is small on a modern display; they are upscaled eight times offline with EPX (Scale2x), sampling neighbours toroidally so the floor textures still repeat without a seam. Three passes leave large flat areas that PNG compresses away, so all three skins together are 108 KB.
How the browser version is built
One file of plain ES2020, no build step, no dependencies, served as a static page with nothing behind it. The board is a canvas drawn from the model on every change. Its levels and tiles are generated from the desktop game's own resources rather than copied by hand, into one 41 KB levels.json, which is also where that count of 415 is checked.
The 1999 page
Everything from here down is the original page, transcribed as it was written.
An on-line version of Sokoban, where you could check the news, play the game or even design a map.
The player's goal is to put all the diamonds in the sockets. You can move the player with the arrow keys or with i, j, k, l. To undo a move press the "UNDO MOVE" button on the screen or press the 'u' button. To load a new level just select the desired one from the combobox and click on "LOAD LEVEL". To change the skin select one from the appropriate combobox and click on "LOAD SKIN".
SoEd, the map editor
SoEd is a sokoban map editor designed for the sokoban applet. In order to run the editor you need jre 1.2.x or higher (never tested with 1.1.x, probably works). The key assignments:
1 - 7 Select type of tile to draw 9, 0 Load map, save map q, w, e, r Resize the map i, j, k, l Move the cursor SHIFT + i, j, k, l Paint the map while moving the cursor
George Oikonomou (aka Speedy) (link no longer available) implemented a utility that converts sokoban maps to sokoban maps :).
Greetz to
LEON/TiS, SKARADAV/TiS, Saiko, AlterEgo, Harkal, Giannis_gr, Kamo Chomei/TiS, Tweety, Scientist, ddemo, RoadRunneR, TSoP, Madanasta, dimZab, lover, gxen, Stoned/TiS, Jocker, Cybern0id/TiS, AssCoder, Cybernoid/TiS, EMP, elfi, avrad, darkman.
The desktop version

Downloads
- soed-0_6.zipSoEd, the map editor
- so-konvert-24-2-2003.zipmap converter by George Oikonomou
These are the original files, kept as they were published. Most are decades old and are here as a record rather than as working software.