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.
converted
The report
Every cell is accounted for in one of three classes. A conversion is never refused for an unmappable tile — it is emitted, and said so here.
Download
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
- Open robotwantskitty.com/web and pick a control scheme when it asks.
- 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”.
- 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.
- 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
- 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.
- Find that file in the installed game — the RWK level gifs live under
Images/RWK/in the game folder. - 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.
- 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.