kittygif

Convert a level between the .kitty container and the indexed-GIF tile-map dialect — in your browser, with the real Python package running under Pyodide. Same code as the command line, same id table, same report.

the repository and the command-line tool · credits and links

Convert a level

Drop a .gif or .kitty here

…or click to choose a file. The direction is detected from the file itself.

🔒 Your file never leaves your browser. The conversion runs in this page — there is no server to upload to.

loading the converter…

Sample levels

Four levels built by samples/generate.py in the repository, each proven completable by replaying a solution tape in the engine and requiring its own win flag. Drop one into the converter above to see it go the other way.

Author a level in the official editor, play it in the compilation

The web version of Robot Wants Kitty has a full level editor. Levels it makes can be converted here into the GIF dialect the compilation reads, which means a level authored in the official editor can be played in the compilation.

Measured, not imagined. Every step below was carried out once, in a browser, on 2026-08-31, and only the steps that worked are written down. The level that came out is tests/data/webeditor-v16.kitty in the repository, and the two console snippets are the ones that ran, verbatim.

1 · Author the level

  1. Open robotwantskitty.com/web and pick a control scheme when it asks.
  2. From the title screen go to MAKER MALL → MY LEVELS → CREATE NEW LEVEL, type a name, OK.
    Signing in is only needed to publish a level. Creating and saving one works while the bar still says “touch here to sign in”.
  3. In the editor, open the layout palette (the blocks icon on the right rail), choose a tile, and click cells to place it. The brush icon paints surfaces; the robot and the kitty are already on the grid and can be dragged.
  4. Leave the editor with “BACK TO LEVELS”.
    This is the step that writes the file. Reloading the page from inside the editor loses the level — the storage key does not exist until you leave.

2 · Get the .kitty out of the browser

The web build keeps its files in the page's own IndexedDB, so the export is a snippet in the developer console (F12 → Console; some browsers make you type allow pasting once). First, list what is there:

indexedDB.open("/RAPTISOFT_SANDBOX", 21).onsuccess = (e) => {
  e.target.result.transaction(["FILE_DATA"], "readonly")
    .objectStore("FILE_DATA").getAllKeys().onsuccess = (ev) =>
      console.log(ev.target.result.filter(k => k.includes("EXTRALEVELS64")));
};

Your levels appear as /RAPTISOFT_SANDBOX/RWK/EXTRALEVELS64/<name>.kitty.

Then download one — put your level's name in the first line:

indexedDB.open("/RAPTISOFT_SANDBOX", 21).onsuccess = (e) => {
  const name = "KITTYGIF DEMO";
  const key = "/RAPTISOFT_SANDBOX/RWK/EXTRALEVELS64/" + name + ".kitty";
  const store = e.target.result
    .transaction(["FILE_DATA"], "readonly").objectStore("FILE_DATA");
  store.get(key).onsuccess = (ev) => {
    if (!ev.target.result) { console.log("no such level:", key); return; }
    const a = document.createElement("a");
    a.href = URL.createObjectURL(new Blob([new Uint8Array(ev.target.result.contents)]));
    a.download = name + ".kitty";
    a.click();
  };
};

The IndexedDB route was documented first by MrMasterplan's rwklevelfiles (a Tiled extension for these files, GPLv3), whose console recipe reads a level out as base64. The snippets above are the same idea, adjusted to hand you the file directly.

3 · Convert it

Drop the downloaded .kitty into the converter at the top of this page. The editor writes container version 16; this tool reads it and produces the level gif. Read the report: anything the gif dialect cannot express is listed there, and if the solvability warning appears, a route may have changed.

4 · Put it in the game

  1. In the download step, pick a slot. The compilation loads a custom level only as an overwrite of one of its own level files, under exactly that filename.
  2. Find that file in the installed game — the RWK level gifs live under Images/RWK/ in the game folder.
  3. Back the original up, then replace it with your download. Verifying the game's files through your store puts the original back if you lose it.
  4. Start the game and choose that level.

Your level does not have to be the same size as the one it replaces — the game reads each level file's own dimensions. (Measured: a 200×95 level loaded in a slot whose original is 90×37.)

Credits and links

Robot Wants Kitty and its web level editor are by Raptisoft (Rob Raptis) — robotwantskitty.com. The web build's Maker Mall editor is where the .kitty files come from.

Robot Wants It All, the compilation whose level files use the GIF dialect, is by Hamumu Software (Mike Hommel) — on Steam.

This is an unaffiliated fan tool. Those names are used only to say which file formats it reads and writes. No game code, art, or level file is distributed here or in the repository — the converter ships a table of measured facts and nothing else, and files you drop above are read in your own browser.

kittygif is MIT-licensed and lives at github.com/PeerInfinity/kittygif. Its code was written by AI (Claude), directed and reviewed by PeerInfinity.