TJ's Rocket League Map Loader — a desktop app for swapping custom maps into Rocket League.
A Rocket League custom map is a cooked UE3 package that gets renamed over one of the stock free-play maps. This app does that swap while keeping a hash-verified backup of every original, so any change is reversible.
Windows only.
This is for playing on your own in freeplay. It is not for multiplayer.
Download TJRLML-Setup-<version>.exe from
the latest release
and run it. It installs to your user profile and adds Start-menu and desktop
shortcuts.
Windows SmartScreen will warn about an unrecognised publisher, because the installer is not code-signed. Click More info → Run anyway.
Open the app and go to Settings.
- Rocket League folder — usually detected automatically. If not, click
Browse and pick your install root (the folder containing
TAGame\CookedPCConsole). - Maps folder — where you keep downloaded maps. Defaults to
Documents\TJRLML Maps. - Click Save paths, then Back up stock maps. This copies every stock free-play map somewhere safe so you can always get back. Do this before installing anything.
Get one from bakkesplugins.com/maps — the main community catalogue, with training packs, dribble maps, obstacle courses and workshop conversions.
Save the download into your maps folder. .udk, .upk and .zip all work; if
it is a zip, the app finds the map inside it, so there is no need to unpack it
yourself.
Go to the Library tab. Every map in your maps folder appears as a card with its size.
- Pick which free-play map to replace from the dropdown. Underpass is the default.
- Click Install. Large maps take a few seconds.
The card gets a purple outline and a loaded in … badge once it is in place.
- Launch Rocket League.
- Go to Play → Free Play.
- Pick the arena you replaced — Underpass, if you used the default.
- Your custom map loads in its place.
On the Slots tab, click Restore next to the slot, or Restore all to stock. Do this before any online session — swapped maps load with anti-cheat on, so nothing else stops a modified file sitting in your install while you queue.
This works by renaming files inside your Rocket League install, which is not something the game expects. Backups are hash-verified and restores are checked before they run, but you are still modifying a game folder — if something goes wrong, the Epic launcher's Verify will redownload clean files.
Game updates overwrite the stock maps. When that happens the app reports the
affected slots as PATCHED; reinstall your maps and use Re-seed after game
update in Settings.
This is an unofficial, unverified tool. It is not affiliated with, endorsed by or approved by Psyonix or Epic Games, and nobody has vetted it against their terms of service.
Modifying game files is against the letter of most games' terms, and whether that gets acted on is entirely up to the publisher — not to me. If your account is actioned, restricted or banned, that is your risk to carry, not mine. The same goes for a broken install, lost files or anything else that happens to your machine.
Restore your slots before you go online. Swapped maps load with anti-cheat enabled, so nothing stops you queueing with modified game files sitting in your install. Every slot this app touches is a Rocket Labs free-play map that online playlists never load, so a swapped file should never enter a match — but anti-cheat not objecting today is not the same as this being permitted, and a patch could change it without warning. Restoring is one click. Do it.
The software is provided as-is, without warranty of any kind. See LICENSE.
| Electron 43 | Desktop shell. The only thing that ships to users. |
| TypeScript 5.9 | Whole codebase. Two tsconfigs — one for Node/Electron, one for the renderer. |
| electron-builder 26 | Packaging and the NSIS installer. |
| Vanilla HTML/CSS/JS | Renderer. No framework, no bundler, no CSS library. |
| Node built-ins | node:crypto for SHA-256, node:fs for the atomic copies, statfs for free space. |
| PowerShell | Expand-Archive for .zip maps and the native folder picker — no zip dependency needed on the only OS this targets. |
Zero runtime dependencies. package.json has no dependencies block at all;
everything above is either a devDependency or built into Node and Windows. That
keeps the install small, the supply chain short, and npm audit --omit=dev at
zero findings.
Node 20+ to build (the toolchain uses fs.promises.statfs and
readdir({ recursive: true })).
npm install
npm start # build + launch the app
npm run typecheck # both tsconfigs, no emit
npm run dist # NSIS installer into release/
npm run pack # unpacked build, no installer
.github/workflows/release.yml runs on every push to master: it typechecks,
builds the installer on a Windows runner, and publishes it to a GitHub Release
tagged v<version> from package.json, created at the pushed commit.
Bump version before pushing when you want a new release. Pushing without a
bump republishes the assets onto the existing release for that version rather
than creating a new one.
The installer is unsigned, so SmartScreen will warn about an unrecognised
publisher. Fixing that needs an Authenticode certificate — a CA cert or Azure
Trusted Signing — wired up through electron-builder's win.certificateFile or
the CSC_LINK / CSC_KEY_PASSWORD secrets.
tsconfig.json builds the Electron main process and the shared logic in src/
to CommonJS. tsconfig.renderer.json builds src/ui/renderer.ts against the
DOM lib.
src/core.ts holds every operation and returns structured data; the Electron
main process exposes it over IPC and the renderer only ever talks through the
typed bridge in electron/preload.ts. The renderer has no Node access —
contextIsolation and sandbox are on, nodeIntegration is off.