Changelog
Both products on one timeline. WARPGATE entries are the ones the app itself shows in its CHANGELOG tab; WARP0716 entries are the repository's CHANGELOG.md for the 2025-07-16 patch set. Older WARP history before this patch set stays on GitHub.
September 2026
September 4 Update
Patch update - re-WARP to apply. Two new patches, six fixes and a new
WARP.exe. Re-apply WARP to use them.Easiest route: open WARPGATE, use the WARP tab to update the patcher and this patch set, then re-apply your profile. Guides for the patches that need files from you are at warp.legacygamers.net/warp0716.
New patch: Party HP/SP Bars (Reforged) (#34)
Splits every party member's bar into an HP half and an SP half, in the party window and on the detached mini widgets, and draws the SP number beside it. You can set the HP and SP colours, with your own row separate from everyone else's so you are easy to find in a full party.
This one needs a change on your server as well: the client half alone gives you a split bar whose SP side never moves. The SHOW_PARTY_SP build flag makes rAthena send the 22-byte 0x0BAB party packet carrying sp and maxsp, and adds the @spbar command so a player can hide their own SP from the party. The patch is in the repository at examples/ShowPartySP/, and the guide walks through applying it: Party HP/SP Bars guide.
Party SP travels only to members who can see each other, which is the client's own behaviour for HP.
New patch: Add your own buttons
Adds extra buttons to the row below the HP/SP bars in the Basic Info window, past the 25 the client ships with. Each one is written as iconName = behaves like: the icon name is also the file name, so the client loads bt_<iconName>.bmp and bt_<iconName>_press.bmp from data\texture\<UI folder>\menu_icon\, and behaves like names one of the stock buttons whose action the new one performs. Guide: Custom Buttons.
Custom Jobs (Reforged): weapons and palettes (#62)
Reported by mimishi. A custom job's weapon hung in the air beside the character instead of sitting in its hand. Fixed, and the job's weapon sprite folders are now read from PCHands.lua at the moment you patch, so a new job needs a row there and nothing else.
The palette half was not a bug in the patch. PCPals is a filename prefix, while PCPaths and PCHands are folder names, so a folder named after your job means the client never finds the files. The Custom Jobs guide now names the exact folder, lists the files the client opens for your own value, and warns that a palette copied from another job keeps that job's prefix until you rename it.
Hide Buttons / Show Buttons (New UI): every button, listed (#24)
Reported by gidzdlcrz. Both patches now list every button this client has, rather than only the ones the client leaves visible. On 2025-07-16 the three the client hides by itself are Battleground, Booking and Twitter, and they are selectable in both lists now; the prompt says which are already hidden, and picking one that is already in that state simply does nothing. Choosing the same button in both patches is rejected with an error naming it, rather than silently resolving one way.
Fixed: EXP bar customization (#49)
The patched client would not start at all: a strange icon, then "This app can't run on your PC". It was writing over the executable's DOS header at offset 0, so Windows refused to load the image. Four stacked defects sat behind that one symptom and all four are fixed.
Fixed: Resize Player HP/SP bar (#52)
It never appeared in WARP's patch list, because a build-date check hid it from a 2025-07-16 client. With that lifted it still only moved the bar, because the size it searched for is written differently on this client. Both fixed: the bar measures 120x20 in game, up from 60x9.
Zoom: a 25% step, and a level you set yourself (#50)
Increase Zoom Out (to 25%) is the gentler step that was asked for, for when Max is too far out. Increase Zoom Out (custom %) takes the percentage you want over the client default and works out the distance, so 60 gives the camera 60% more range. Max was corrected as well: it used to pull back further than this client can draw, which showed black at the edges of the screen, and it now stops at the real limit.
All of them had been overwriting a constant the renderer also uses as its reference resolution, so they rescaled sprites and effects as well as moving the camera. They move the camera and nothing else now.
★ Remember to turn zoom out on in game with /zoom, or none of this shows: with the client's own setting off, the camera is capped tighter than stock.
Walk Delay (Reforged) (#39)
Sets the delay between walk-click inputs in milliseconds. The old Remove Walk Delay patch was this one with the value pinned to zero, so it is retired. Do not go below 10: below that the character stops playing its walk animation.
A new win32/WARP.exe
Select Recommended now loads profiles/community_recommended.yml, which is 37 patches that give you a working English client in one click, without answering a single question. The dead Convert Profile to Session row is gone from the menu.
Housekeeping
- Retired, declarations commented out with the reason, implementations left intact so re-enabling is uncommenting one block:
NoWalkDelay(merged into Walk Delay),CancelToLogin(unsatisfiable on this client and redundant),MsgStringsandQuestDisplay(the client reads those files anyway).SendClientFlagsis no longer recommended. docs/has left the repository. The guides live on warp.legacygamers.net, where they are rebuilt with the patch set. What used to sit underdocs/and is not a guide has moved toexamples/: the Custom Jobs example job and its annotated Lua reference, and the Party HP/SP Bars server patch.profiles/community_recommended.ymlrebuilt against the current patch set.
A title bar that says where everything is
Every tab in the title bar carries an icon now, the five steps and the CHANGELOG and FAQ tabs alike, so the row reads at a glance instead of by reading each word.
A WEBSITE button sits beside DONATE and opens warp.legacygamers.net, the new home for everything WARPGATE and WARP0716: what each one does, an FAQ for a client that will not start, one changelog covering both, and a guide for every patch that needs files from you.
DONATE moved onto the row with the rest and lost its PayPal entry, so what is left is the one link that works.
A finished install no longer reads as unfinished
Right after an install completed, the card could read Ready to install or Update available · 0 B to download and sit there for up to fifteen minutes. Nothing was wrong with the install: a status check that started during the last verify was answering for a moment the install had already left, and it landed after the finish.
WARPGATE now refuses to judge a folder while a download is still working in it, and throws away any check that comes back after things have moved on. Clicking around during a download is safe again.
The Coming soon rows for a future client are gone from the dropdowns. They will return when there is something to download.
A troubleshooting FAQ, inside the app
WARPGATE now has a FAQ tab for the six things people ask most when the game will not start: there is no game to launch in my folder, Windows or my antivirus blocked it, nothing happens when I double-click it, a message says a .dll is missing, it opens and then crashes, and everything is in Korean.
Each answer says what is going on and what to do about it, and the tab it points you to opens straight from the answer: RAGEXE, WARP or LANG, one click, no hunting.
The crash entry walks you through finding a bad patch: cut back to the recommended set we test, then add your own extras back a few at a time until the culprit shows itself.
The welcome card also opens once more after this update. It now lists all five steps, numbered the same way as the tabs, and the FAQ is one click away from it.
The WARP walkthrough is one button now
The WARP guide used to teach two routes and an answer sheet. It now teaches the one that applies to a WARP installed through WARPGATE: press Select Recommended, check the count, apply. That button ticks the community patch list and fills in every path answer at once, so WARP asks you nothing.
The two fallback pages, loading the session file or answering the questions by hand, are still there and marked for what they are: only for a WARP that came from somewhere else and asks you about eleven questions, one dialog at a time.
Two downloads at once
You can now start the full client and the Ragexe together instead of waiting for one to finish. Each tab keeps its own progress, and Pause and Cancel act on that tab only.
The same thing twice is still refused: one folder gets one copy of each download at a time, which is the guard that stops two installs writing over each other.
The last 1% no longer looks frozen
A few of you saw the client sit at 98-99% for half a minute or more with the speed still showing and "0s left". Nothing was stuck. After the last piece lands, WARPGATE checks the whole 3.6 GB archive against its signature before it puts it in place, and that check had no progress of its own to show.
It now has a phase of its own, Verifying, with a real percentage, in every skin. The rate and the time-left line also stop guessing once the download itself is done.
While looking, we found the status bar had been showing a made-up file count during downloads since the first release. It shows what it actually knows now.
A slow mirror gets benched, not waited on
If a mirror slows to a crawl mid-piece, WARPGATE now notices within about twenty seconds, sets that mirror aside for a minute and fetches the piece from another one. Before, a crawling connection could hold a piece for ten minutes before anything happened.
This also removes a limit nobody meant to set. Each 64 MB piece had ten minutes to arrive, which quietly ruled out connections under roughly 7 Mbit. There is no such ceiling now; a slow line just takes longer.
A check for the Windows runtimes before you install
The client needs two Microsoft runtimes that Windows does not ship in full, the Visual C++ runtimes and DirectX. Without them it will not start, and Windows only tells you the name of one missing .dll.
Before a client install, WARPGATE now looks for them and, if any is missing, shows a notice naming the files with links to both packages. It never stops the download: the runtimes install alongside it.
The FAQ entry for a missing .dll says the same, with the same two links.
August 2026
August 18 Update
Patch update - re-WARP to apply. Seven new patches and a Simplified Chinese translation. Re-apply WARP to use them.
New patch: Tighter Entity Click Area (#63)
The client does not let an entity's clickable box get small. It widens every one up to a minimum worked out from your window width, width / 640 x 40 pixels for actors and x 34 for map NPCs and skill units. At 1600x900 that is a 100 px box around a sprite that may be a fraction of it, so a poring standing near an NPC can swallow clicks meant for the NPC. This patch lets you shrink that floor, so small things claim only the space they occupy. Thanks to Stingor.
New patch: Restore the "View Skill Info." checkbox (#61)
Older Ragexe builds had a checkbox in the top right of the ALT+S Skill Tree, and while it was ticked, hovering a skill popped its detail window next to the cursor instead of making you right-click. The client still owns the option internally and still saves it; only the checkbox went missing. This brings it back. Thanks to Stingor.
New patch: Restore GM weapon trails (#60)
Accounts listed under <admin> in your clientinfo lose the weapon trail, the blade gleam drawn while attacking. The client writes 0 into that sprite layer for GM accounts, so the renderer drops it. Disable GM sprite does not cover this, because it only touches the two name-list functions. Thanks to Stingor.
New patch: Restore Sonic Blow and Arrow Vulcan animations (#58)
Gives Sonic Blow and Arrow Vulcan back the attacker's sprite animation. Pick either or both when you apply it. Gravity never deleted the animations, only the routing that chose them: the client still plays it for Chain Crush Combo, and this sends the selected skills back down that same path. Sound and effects were never affected. Thanks to Stingor.
New patch: Mark pet chatter in chat (#55)
Pet chatter arrives with no sender and the ordinary message type, so a pet named after a player reads exactly like that player talking. This tags every automated pet line with a marker of your choosing, default pet, with a choice of brackets. Thanks to Stingor.
New patch: No bogus "not your guildsman" whisper warning (#54)
Stops the "This character is not your guildsman" and "This name is not registered in your Friend List" lines the client prints on incoming whispers. They exist to flag impostors who swap a capital I for a lowercase l, which is a real problem, but the comparison is far too loose and fires on ordinary names that merely resemble a friend's. Thanks to Stingor.
New patch: Shared head palettes for Doram (#53)
The existing shared head palette patches skip the Doram races entirely, so a Doram still needs one palette file per hairstyle and per gender while everyone else needs one. This applies the same shared naming to Doram. The files stay in the Doram race folder on purpose: Doram sprites do not share the human palette indexing, and pointing them at the human files leaves the character mostly black. Thanks to Stingor.
Simplified Chinese translation (#56)
WARP's own interface is now available in Simplified Chinese. Thanks to jj163494, building on xvn5002036's Traditional Chinese work.
The Ragexe stops asking to install
Since the delivery changed on 28 July, the RAGEXE tab has been showing Update available every single time, and installing never made it stop. The July note said it would ask once. It should have, and this is the fix that finally makes that true.
WARPGATE was recording the Ragexe as installed in one place and looking for it in another, so it never found its own work and started over each time. Nothing was wrong with the file you downloaded; it just fetched it again for no reason.
If you have installed it at least once, the tab will simply read Up to date from now on. Nothing to re-download and nothing to click.
The same mix-up made Verify report a healthy Ragexe as damaged. That is fixed too.
The world keeps turning when the live view is down
The Realm interface shows the live game world behind the window. When that view cannot be reached, WARPGATE used to fall back to a single frozen picture, and sometimes it did not even manage that: the window showed a broken image while the label still claimed the realm was live.
Now it falls back to a recorded loop of the town instead, a full day passing over the plaza, so the backdrop keeps moving even when the live view is out. It downloads once in the background and is kept on your machine.
The still picture behind it was also re-taken, so it shows the town as it looks today rather than how it looked months ago.
The realm offline marker is honest now as well. It could not previously tell the difference between a slow connection and a dead one, so it tended to keep saying live no matter what.
A guide for the WARP patcher, and it checks properly now
The WARP tab has a ? button that opens a short illustrated guide: which file to open, the easy route with the ready-made session file, and the answers to use if you pick the patches yourself. The one that catches people out is SystemEN, not System, because SystemEN is what the LANG tab installs.
Check again now really re-checks. It used to answer from a cached result for up to half an hour, so clicking it looked like it did nothing at all.
When WARP is already up to date, there is now a Reinstall option to put the files back if something in your copy got damaged. Your own edits are kept, as always.
WARPGATE also watches more of the patcher for updates than before, so a new version of the tool itself no longer slips by unannounced.
Get the Ragexe on its own
The RAGEXE tab can now be used without opening a gate first, for people who already have a client from somewhere else and only want the executable.
It asks first and explains what it is: the game program on its own, about 4 MB, and not a playable game by itself. You choose the folder it goes into, and that folder needs to be one that already holds a client.
With a gate open nothing changes: the Ragexe installs into that gate, exactly as before.
July 2026
Server select: exit works, and switching servers mid-session is fixed
On the server select screen the second button now says exit and actually exits, with the game's own confirmation. Before this it made the window vanish and left you looking at nothing, with no way back.
If your server list has more than one entry, you can now log in to one, go in-game, back out to the list and pick a different one. That last step used to fail to connect.
A missing or incomplete clientinfo.xml now tells you what is actually wrong instead of just failing to connect.
Your server list is also handled more efficiently: the client no longer scans the whole clientinfo.xml at startup to build its own copy of every server, so start-up does less work and the old 8 server limit is gone.
If you patched your own executable, WARPGATE keeps yours and will not replace it. To get these fixes, take ours from the RAGEXE tab (your copy is saved as a .bak), or re-patch starting from the new one.
July 29 Update
EXE update - grab the new Ragexe. These fixes live in the injected EXE itself, not in a WARP patch, so re-WARPing the exe you already have will not pick them up.
Get it through WARPGATE: unzip, run it, and use the RAGEXE tab. Then re-apply your patch set if you use one.
If you have already patched your own executable, WARPGATE keeps yours and will not overwrite it. Choose ours from the RAGEXE tab (your copy is saved as a
.bak), or re-patch starting from the new one.
The "exit" button on server select now actually exits (#17)
Reported by gidzdlcrz: on the service/server select screen, pressing the second button made the window vanish and left you with nothing on screen. The only way out was to close the client.
The button was renamed to "exit" in an earlier build, but only the label changed. It still performed a cancel, and cancel on that screen closes the window and then sends a message the client ignores while it is on the server list, so nothing replaces it.
It now uses the client's own exit path, which was already present and simply never shown: a confirmation dialog, and a clean shutdown if you accept. Pressing cancel on that dialog returns you to the server list with everything intact.
Multi-connection clientinfo.xml: switching servers mid-session now works
If your clientinfo.xml lists more than one <connection>, players can pick a server on the service select screen. That worked from a fresh start, but not after you had already played: log in to one server, go all the way in-game, back out to the server list, pick a different server, and the client would fail to connect.
The old code kept its own private copy of every server's address and port and looked yours up by position in that list. That copy went stale once you had been in-game, and it could also drift out of step with the on-screen list if any <connection> was missing an <address>. It was capped at 8 servers, silently.
It now reads the address and port the client itself resolved for the connection you picked, so there is nothing of ours to go stale, no cap, and no way for the list positions to disagree. Verified against two live servers: pick the second or third entry after a full in-game session and you land on the right one.
Leaner startup, and the 8 server limit is gone
The old code scanned your entire clientinfo.xml at startup and built its own private copy of every server's address and port before the login screen even appeared. That work scaled with the length of your server list, and it was capped at 8 servers.
None of that happens now. The client reads the address and port for the server you picked, at the moment it connects. Startup does strictly less work, there is no cap on how many servers you can list, and there is no second copy of your server list to fall out of step with the file.
clientinfo.xml problems now tell you what is wrong
Previously a missing, unreadable or incomplete clientinfo.xml just produced a failed connection with no explanation. The client now names the actual problem: the file could not be opened, or it has no usable <clientinfo>/<connection>, or the server you picked has no <address>.
The Ragexe tab will ask you to install once
The game executable now arrives as a small compressed pack instead of one big raw file, so it is about 4 MB to download instead of 15.
Because the delivery changed, the RAGEXE tab shows Install one time even if you already have the executable. That is expected, not an error. It takes a few seconds and puts back the same file you already had.
If you have patched your own executable (with the WARP0716 patcher, for example), WARPGATE now keeps your version and tells you it kept it, instead of overwriting it. You can still choose to take ours, and your copy is saved as a .bak.
Downloads could stop working until you restarted
If you opened the LANG tab and it was already up to date, every download afterwards would quietly refuse: Download or Install would flash and then do nothing, on the client, the English patch and the Ragexe alike. Restarting WARPGATE cleared it, but nothing on screen told you that, so it looked like the button was simply broken.
WARPGATE runs one download at a time and it was failing to release that slot when a language check had nothing to do. It now releases it on every path, so this cannot happen again.
If you have hit this, no files were harmed and nothing was left half-installed. It only ever refused to start new work.
Run as many clients as you want
WARPGATE now manages every client install you have, not just one. Each install is a gate with its own folder, its own updates, and its own English translation, and they all live together in the new gate hall. The GATE chip in the title bar names the one you are working on, and its dropdown switches between them instantly.
Your existing install is imported automatically as Main the first time you open this version. Nothing moves and nothing is re-downloaded. You can also hand WARPGATE a client folder you already have with Add existing folder, and it takes over updating that folder in place.
The CLIENT, LANG and RAGEXE tabs now follow the gate you are in, so what you are looking at always belongs to that one install. Each gate card shows its client build, which English era it has, and whether an update is waiting.
Reset WARPGATE no longer touches your files. It forgets your gates and your settings only; your clients stay on disk and you can add them back whenever you like. Deleting files is now a deliberate action on a single gate, with its own confirmation.
Get updates early with the beta channel
Settings now has an update channel. Stay on Stable, or switch to Beta to get new WARPGATE builds before they reach everyone. It asks before it switches, and you can move back to Stable exactly the same way.
Only the launcher differs between the two channels. Client, translation and Ragexe files are identical on both, so trying a beta build never changes what lands in your game folder. If there is no beta build published, WARPGATE quietly stays on Stable.
A tougher install, and a long list of repairs
If a client download was interrupted while data.grf was being updated, the install could get stuck for good: it reported itself up to date while the file was still incomplete, and nothing would repair it. That is fixed, and an install already stuck in that state now heals itself on the next check.
Switching your English era used to leave files behind from the era you came from. Those leftovers are now removed, which also clears a class of crash at client load caused by old files overriding the new ones.
The first-launch guide is rewritten around gates as 4 steps, and it no longer flashes up and closes itself. The version number moved to the bottom right, where a narrow window can no longer hide it, and the close button now stays reachable on small screens and at higher display scaling.
Also fixed: the donate links opened a folder instead of your browser, the progress sweep could paint outside its bar, pressing Pause could miss your click, a brand new gate could claim an English update it did not have, and the WARP tab could report the patcher as missing when it was installed.
July 20 Update
Patch update - re-WARP to apply. Adds one new patch for Skill Tree performance; re-apply WARP to use it.
New patch: Reduce expensive UI rendering (#45)
The ALT+S Skill Tree rebuilds its entire icon grid every single frame, even when nothing on it has changed. This patch skips that rebuild unless something actually changed: tab, hover, scroll, skill points, window size, or the client's own dirty flag.
Measured on a test client with the Skill Tree open, comparing both states on one running process: the stock client repainted on every frame and sat around 90% CPU, while the gated version repainted zero times across 256 consecutive idle frames and dropped under 1%.
Thanks to YlenXWalker and Stingor.
Idle repaint interval. The repaint being skipped is also what draws the character preview in the corner of the window, and that preview's animation is driven by a timer. Skipping every frame therefore leaves it frozen while the window sits idle. When you apply the patch it now asks for a minimum repaint interval:
- Off - cheapest, the preview stops animating while idle
- 200 / 400 / 600 / 800 ms - preview keeps animating
Default is 600 ms. The preview sprite only advances about every 600 ms, so repainting faster than that redraws the same frame for no benefit, and longer intervals cost less.
Cleaner language switching, and a smoother finish
Switching between Renewal and Pre-Renewal English is now clean. Installing one replaces the other (only one English set can be active at a time), and it asks first so nothing changes by surprise. Files you actually edited are still kept and backed up to .bak, and switching no longer pops a false "we kept your edits" list for files you never touched.
The LANG tab is tidier too: Check again now shows that it's checking, only your installed era is tagged Current (not both), and Reset now fully removes both translation sets, including any leftover files from an era you switched away from.
And a download fix: if a mirror stalled near the end, the client could sit at 98-99% for a while before finishing. It now fails over to a healthy mirror within seconds, so installs finish smoothly.
Pre-Renewal English, and your edits stay yours
The LANG tab now lets you pick your era: Renewal or Pre-Renewal English. Choose from the dropdown and install; the Pre-Renewal set is kept up to date automatically, the same as Renewal, and both are Ed25519-signed and verified across all five mirrors.
If you install or update a translation onto a client you have customized, WARPGATE now keeps your edited files on the very first install too, not just on later updates. It shows you exactly which files it kept and lets you take the new versions instead, with your copy saved as a .bak. Nothing in your data folder is ever silently overwritten.
July 15 Update
Patch update - re-WARP to apply. This adds four community patches and fixes the mob/boss bar resize crash; re-apply WARP with the updated patches to use them.
Resize Mob & Boss Bars no longer crash (#22)
The ResizeNormalBar, ResizeMiniBossBar, and ResizeBossBar patches now work on the 2025-07-16 client. This was actually two separate bugs stacked on top of each other:
1. Patcher crash when enabling more than one. Each Resize\*Bar patch reopened the shared MobHP code tag, so applying a second one re-ran the tag setup and crashed the WARP patcher (access violation, 0xC0000005). Fixed with a guard: the shared hook is built once and each bar only writes its own width/height.
2. Client crash on mob-bar render. The patcher crash was hiding a second problem. WARP's automatic mob-bar hook detection mis-reads the 07-16 client and builds a malformed hook, which crashed the *client* the moment a monster HP bar was drawn (for example, clicking a mob). The hook location itself was correct; only the auto-generated code was wrong. Replaced with a hardcoded, verified 07-16 hook that reads the monster type from the correct field.
Confirmed in-game: Boss, Mini-boss, and Normal bars each render at their configured size with no crash.
Thanks to Gardosen for reporting it, and to themidgargospel for the extra detail in the thread.
New patch: HatEffect world-depth occlusion (#43)
Makes hat effects behave like special effects: they are now correctly occluded by buildings, walls, and other world geometry instead of drawing on top of everything. Thanks to YlenXWalker.
New patch: Dual weapon and off-hand sprites (#42)
Adds an option to render dual-wield and off-hand weapons with their original weapon sprites. Thanks to YlenXWalker.
New patch: Custom client codepage (#37)
A QJS-only patch that forces the client's text codepage, so text renders correctly regardless of the OS locale. Thanks to YlenXWalker.
Chat background patches split, plus Bigger Inventory (#35)
The main chat-background patch was split out and detached/whisper chat-background patches were added, which also fixes a red/blue color swap in the old opacity patch (the color value was being read as BGR). Also adds a BiggerInventoryWindow patch. Thanks to Stingor.
English translation, kept up to date
The new LANG tab adds the community English translation (llchrisll's ROenglishRE) to your client. Point it at your client folder and install; when a new version is published, WARPGATE downloads and applies it automatically, separate from the client.
It arrives as an Ed25519-signed overlay, verified across all five mirrors. If you have edited a translation file yourself, an update keeps your version by default, and you can choose to take the new one instead, with your copy saved as a .bak.
Because the translation now updates on its own, the client no longer bundles it.
A leaner client
The English translation has moved out of the client and into its own LANG tab, so client updates no longer re-ship it.
If you already have the client, this is a small update, around 1 MB: the large base files and the data.grf are unchanged and are not re-downloaded. Your current translation stays in place, and the LANG tab takes over keeping it updated.
New installs get the lean client, then add English from the LANG tab.
A third look: the Realm
Alongside Cosmic and Minimal there is now a Realm interface, and it is the new default: the live Prontera world, powered by the Æsir Engine, plays behind a dark-glass panel while you download. Open Settings to switch looks.
If the realm is offline it shows a still night view instead, and the tag reads realm offline so you always know what you are seeing.
Get the WARP patcher, right here
The new WARP tab in the title bar installs and updates the WARP0716 patcher straight from GitHub. Pick a folder, install, and WARPGATE keeps it current.
It shows the version you have next to the latest one and updates in place. Your Settings.yml, custom profiles, and any files you added are kept. When a new version lands the tab flags it, and you can skip one you do not want.
A WARP2026 build for the 2026 client is listed as coming soon. The window is also a little larger so the title bar has room to breathe.
Pick your build by date
WARPGATE now lets you choose which client or ragexe build to install, listed by date. Use the Client and Ragexe dropdowns in the title bar to switch between builds.
Each build shows its status at a glance: the one you have, an update when there is one, or a build that is coming soon.
Two new builds are on the way: a 2026-01-07 client and a 2026-01-07 ragexe. They show now, marked Coming soon, and become installable once released.
New: a minimal interface
WARPGATE now has two looks. The default cosmic interface stays, and there is a new minimal option: a calm, plain download view for anyone who prefers less motion and more focus.
Open Settings and choose your interface, Cosmic or Minimal. Minimal comes in dark or light, and your choice is remembered.
Both show the same live download, verified across all five mirrors.
Mirrors live
Signed release manifests are now live on all five mirrors: Dallas, New York, Chicago, Amsterdam, and Los Angeles.
Every download is verified against an Ed25519-signed manifest, so tampered or corrupted files are rejected before install, no matter which mirror they came from.
2025-07-16 client, initial release
The full 2025-07-16 client is now available: 4.07 GB with 6,518 files. This is the base client that future delta updates will build from.
The data.grf download is split into 55 verified segments across all five mirrors. If the install is interrupted, it can safely resume. Damaged files are repaired in 64 MB chunks.
Your clientinfo.xml, DATA.INI, AI folder, skins, and any GRFs you add are kept untouched. Updates will never overwrite them.
Ragexe 2025-07-16
The 2025-07-16 Ragexe is now available.
If you already have the data files, you can apply your own WARP patch set to it.
May 2026
May 15 Update
Binary patch - re-WARP required. Unlike the May 6 / Apr 21 hotfixes, this one changes the
CustomJobspatch itself, not just Lua data. You must re-apply the WARP patch with the updatedCustomJobs.qjsfor it to take effect - dropping new Lua files alone will not enable it.
Custom jobs can now use the Doram race
Custom jobs intended to render as Doram (e.g. a job pointing PCPaths at "summoner") were always drawn with the Human body - Doram body sprites loaded human heads, offsets, scale, and nameplate positions were wrong. (GitHub #27)
Cause: the client decides Human vs Doram by calling an internal is_doram_job_id check that is hardcoded to the stock Summoner / Mystic Summoner IDs only. Custom job IDs are never in that set, so they always took the Human sprite path - and the same check gates ~40 other behaviors (item offsets, sprite scale, shadow position, nameplate Y-offset, the item layer renderer, character select/create, the styling shop, skill-effect positioning).
Fixed with a new CustomJobs Phase 13 patch that hooks the tail of that check and consults a Lua table, PCRace. Set an entry and the job follows the Doram code paths the stock Summoner uses. Define it in any JobInfo Lua file (e.g. PCIds.lua or a new PCRace.lua):
`` PCRace = PCRace or {} PCRace[PCIds.MY_DORAM_NOVICE] = "doram" ``
Any non-nil value enables it; "doram" reads well and reserves room for future race values. Stock Summoner / Mystic Summoner are unaffected - the original check still runs first and short-circuits for them, so there is zero behavior change for non-custom jobs.
Doram custom-job body sprites go in the Doram folder, not the Human one: data/sprite/도람족/몸통/… (CP949 µµ¶÷Á·\¸öÅë\…) instead of 인간족/몸통/. Everything else (.act, costume_1/, IMF, palette, icon) follows the same rules as a normal custom job.
Thanks to pepeuprog for reporting it.
Custom Jobs guide - new "Doram Race" section
Online guide gained a Doram Race subsection under Step 2 documenting the PCRace API and the Doram sprite paths.
To install
Re-apply the WARP patch using the updated CustomJobs.qjs from this repo, then add your PCRace entries to a JobInfo Lua file. Because this is a binary change, the Lua-only install path used by the May 6 / Apr 21 hotfixes does not apply here - you must re-WARP.
May 6 Hotfix
Lua-only - no re-WARP needed. Drop the new
PCFuncs.luaandPCIds.lua(and optionallyPCNames.lua) intodata/luafiles514/lua files/JobInfo/, overwriting existing. Lua data files are loaded at runtime, not baked into the exe.
Mounted classes - Job name no longer shows "Poring"
Players on a peco / dragon / mado / wolf / gryphon mount were seeing "Poring" as their class in the BasicInfo window, character select, and party UI - Lord Knight, Paladin, Rune Knight, Royal Guard, Mechanic, Ranger, Dragon Knight, and other 4th-class jobs all affected.
Cause: the stock client uses *2 mounted variant IDs (e.g. LORD_KNIGHT 4008 → LORD_KNIGHT2 4014) for the actor's effective class while mounted, and the GRF-loaded job name table only populates the base IDs. When the client looked up PCNames[4014], the entry was missing and the lookup fell through to a hardcoded "Poring" fallback.
Fixed by adding a second auto-populate pass in PCFuncs.lua that copies each base class name onto its mounted variant(s). The mapping was extracted from the client's mounted-job lookup function (CMode::GetJobClassID at 0x00d5b580) - covers all stock peco mounts, Rune Knight's five dragon colors, Mechanic's mado gear, Royal Guard's gryphon, Ranger's wolf, and the 4th-class mount IDs. User overrides in PCNames still win - the pass only fills entries that are currently nil.
Stock job constants now usable as PCIds.NAME
Previously, only your custom job IDs were defined in PCIds.lua - stock constants like PCIds.LORD_KNIGHT2, PCIds.PALADIN2, PCIds.WARLOCK, etc. evaluated to nil. Writing PCNames[PCIds.LORD_KNIGHT2] = "Holy Knight" was a silent no-op; you had to use the raw numeric ID (PCNames[4014] = "Holy Knight") instead.
The shipped PCIds.lua now includes a do…end block at the top that pre-defines ~170 stock constants (NOVICE through 4th-class jobs and their mounts) before your custom IDs are added. After this, both forms work:
`` PCNames[PCIds.LORD_KNIGHT2] = "Holy Knight" -- by name PCNames[4014] = "Holy Knight" -- by raw ID (same thing) ``
Aliases are included for both rAthena naming (LORD_KNIGHT2, RUNE_KNIGHT_T) and legacy WARP naming (LORD_MOUNT, RUNE_KNIGHT_H) - pick whichever convention you prefer. Add your custom IDs after the ADD CUSTOM JOBS BELOW marker line.
The previous comment "Stock job IDs are loaded from GRF" was a misconception - the GRF only loads stock *names* (via PCJobNameTable), not the Lua-side constant table. Header comments updated to match reality.
JOB_SKILL_TIER now actually applies to custom job chains
Multi-tier custom job chains (Base → 2nd → 3rd) declared via JOB_SKILL_TIER in PCIds.lua were silently collapsing onto a single skill-tree tab. The InitSkillTreeView wrapper that reads JOB_SKILL_TIER at runtime had been missing from the WARP Inputs/ source - never committed back from a deployed environment. Now included in PCFuncs.lua as the canonical source.
PCNames.lua header refreshed (optional)
The shipped PCNames.lua header now shows both PCNames[PCIds.X] and PCNames[4014] examples for renaming stock jobs. Cosmetic only - your existing PCNames.lua keeps working as-is. Skip this file unless you want the updated examples.
Custom Jobs guide - significant additions
Online guide updated with new sections:
- Stock PCIds auto-populate callout under PCIds.lua, plus PCNames examples now show both
PCIds.Xand raw-ID forms side-by-side - Gender-specific names -
PCNames_M/PCNames_Ffor male/female overrides (the stock Bard/Dancer convention) - Multi-language names -
LT_<N>per-language sub-tables; works on every lookup table, not just PCNames - Inheritance Tables -
PCNameInheritTbl/PCPathInheritTbl/ etc. for tier-style fallback chains, with the matchingMapPC*resolver functions JT_vsJOB_naming-convention callout (skillinfozJOBID.JT_NAMEvs server-sideJOB_NAME)- Mount Support rewritten - stock mounts work automatically (no PCIds setup needed), custom mount riding IDs need their own entries across all five lookup tables (PCPaths / PCNames / PCPals / PCHands / PCImfs)
- Step 1 warning expanded to mention the Phase 5 4345 floor and the
convert_job_to_trans_or_babysprite-mangling path
To install
Replace data/luafiles514/lua files/JobInfo/PCFuncs.lua and PCIds.lua (and optionally PCNames.lua) in your client's data folder with the new copies. No re-WARP, no exe changes - Lua files are runtime-loaded.
April 2026
Apr 21 Update
Rune System Paths - Arbitrary Length Within Slot Capacity
The upstream rune-path patches enforced an exact byte-length match against the original System\Rune\… defaults. That made it impossible to use paths like SystemEN\Rune\itemDecom.lub (27 chars where the original is 25), which is needed for consistency with Chris's ROenglishRE translation layout.
The 07-16 client loads each rune file via an inlined MOVUPS+MOVQ+MOV(byte|dword) copy sequence with a hardcoded byte count, a hardcoded std::string::size_ immediate, and a hardcoded null-terminator offset - all set to the original path's length. The strict check existed to stop replacements that would truncate (too long) or read past the end (too short).
Our fork extends the patch logic to handle all three cases without changing the injection:
- Shorter replacements - allocate a fresh buffer, write the new path, null-pad out to the original length, then point the MOV source operands at the padded buffer. The client still copies the full original byte count, but the C-string terminates at the first null so file loading picks up the shorter path correctly.
std::string::size_stays at the original length - harmless for file APIs that usec_str(). - Longer replacements on byte-copy sites (
itemDecom,rune_info) - flipMOV byte → MOV dwordat the two opcode bytes (0x8A → 0x8Band0x88 → 0x89, both same instruction size so no shifting), then bump the length immediate and null-terminator offset to the new length. Extends the copy chain from 25 to up to 28 bytes, supporting original+1 through original+3. - runesystemid already uses
MOV dwordin stock; capped at the original length. - runeSystem_table uses two
MOVUPScopying a fixed 32 bytes; capped at the original length.
Verified same instruction offsets on both 07-16 and 06-04 - the VC compiler produces identical sequences.
CustomClientInfo - Works on 07-16 (Injected Pipeline)
The stock CustomClientInfo patch searched for the clientinfo.xml literal as a single string. The 07-16 client doesn't store it that way - the injected clientinfo loader composes the filename on the stack at runtime via four MOV [ESP+N], imm32 instructions. Result: the patch was always hidden on injected exes.
Added a detection path that recognizes the 4-MOV signature (C7 04 24 63 6C 69 65 C7 44 24 04 6E 74 69 6E C7 44 24 08 66 6F 2E 78 C7 44 24 0C 6D 6C 00 00). When found, the patch prompts for a new filename (≤15 chars - the on-stack buffer is 16 bytes including the null terminator) and rewrites the four dword immediates in place. The validator accepts either the injected layout OR a stock ClInfoAddr > 0.
To test: select Customize ClientInfo file in the WARP UI, type a new name (e.g. lgro.xml), drop your renamed XML at <client>\data\<newname>.xml.
Translations EN - Rune Tablet Label
Added the "Rune of %s" TranslateClient entry (Korean bytes 25 73 C0 C7 20 B7 E9 20 C1 B6 B0 A2 → Rune of %s). Used by the Rune Tablet encyclopedia entries (e.g. "Rune of Night Market Bebe").
March 2026
Mar 29 Update
Allow 65k Hair Styles - Fixed
Fixed a bug where the first ~12 hair styles displayed the wrong sprite when Allow65kHairs was enabled. The 07-16 client has a remapped hair name table internally, and the original patch bypassed it. The fix preserves the table for standard styles and uses dynamic number conversion for custom styles beyond 42.
- Works correctly on the character creation screen, character select, and in-game
- Works independently of Custom Jobs, and both can be enabled together
- Includes an open-source mid-headgear hook replacing the old encrypted one
IncreaseHairsLimithas been removed (superseded)
PreviewInTrader - Cashshop Crash Fix (#20)
Opening an old-style cashshop NPC caused an instant crash when PreviewInTrader was enabled. The patch tried to access a window object that doesn't exist for cashshop windows. Fixed with a null pointer check.
Mar 26 Update
InsensitiveStorageSearch - Fixed (#16)
Case-insensitive storage search wasn't working on the 07-16 client. The patch was matching the wrong function internally. Fixed with an updated pattern for the 07-16 compiler.
Custom Jobs - Ground Skill Crash Fix
Using ground-based skills (like Storm Gust) on mobs caused a crash when Custom Jobs was enabled. Fixed - the sprite name lookup now uses a safer code path with validation. All standard and custom jobs work correctly.
Cancel-Exit on Service Select
The server select screen is now fully functional. Previously the cancel button did nothing - now it shows a "Are you sure you want to quit?" dialog and exits the client. The cancel button also automatically changes to say "exit" when on this screen. No extra files needed - the exit button graphics already exist in the GRF.
Multi-Connection clientinfo.xml - Fixed
Servers with multiple entries in clientinfo.xml now work correctly. Previously all connections went to the first entry's IP regardless of which server the player selected. Now each server entry's address and port are stored separately, and the client connects to the right one based on the player's selection.
Combined with the cancel-exit fix above, you can now list multiple servers and players will see the server select screen, pick their server, and connect to the correct one.
DisableEquipAttrButton - Fixed (#12)
Hides the equipment attribute button in the equipment window. The original patch didn't work on the 07-16 client. Fixed by NOPing the AddChild call that adds the button.
Removed Patches
The following patches have been removed - they don't apply to the 07-16 client:
- TranslateTaekwon - Not needed,
TranslateClient+ Lua handles translations instead - IncreaseHairsLimit - Replaced by Allow65kHairs
- NoSerialDisplay - Not compatible with the 07-16 client
- SelectLoginBG - Not compatible with the 07-16 client
- RestoreAutoFollow - Only applies to Zero clients
Mar 19 Update
Enable Official Custom Fonts (Reforged) - Full Rewrite
The original EnableEotFonts patch didn't work on modern Windows because Microsoft removed support for the embedded font format (.eot) that the RO client uses. The patch appeared to apply but fonts never actually loaded.
This rewrite takes a completely different approach - it loads .ttf fonts directly through the standard Windows font API, the same way the client already loads its SCDream fonts.
- How it works - When the client starts up, the patch loads all
.ttffiles fromSystem\Font\before any UI renders. It also fixes the font name references in the binary soCreateFontcalls match the.ttffilenames - Font file management - On apply, WARP prompts for your client folder, copies the included
.ttffonts toSystem\Font\, and optionally deletes the old.eotfiles - Custom fonts - You can replace any
.ttfinSystem\Font\with your own font (same filename).@font 1-9uses whatever.ttfis there - it's client-side only, no one else sees your fonts - FixFontsCharset - Auto-enables
FixFontsCharsetwhich had a crash bug in the original version (now fixed)
Pre-converted .ttf files for all 13 fonts are included in Inputs/Fonts/.
Renamed: EnableEotFonts → EnableCustomFonts
FixFontsCharset - Crash Fix
The original version of this patch had a bug that corrupted an internal pointer, causing random crashes when rendering text. Fixed by using a different register for the charset lookup.
Mar 18 Update
Custom Jobs (Reforged) - Major Update
The Custom Jobs patch has been significantly expanded - all built from scratch for the 07-16 client. This update adds baby class support, multi-tier skill trees, mount integration, and much more.
What's new for server owners:
- Baby class support - Baby variants of custom jobs now render at 75% size, just like official baby classes. Add your baby job IDs to
Shrink_Mapin PCIds.lua - Multi-tier skill trees - Create job chains like Novice → 2nd Class → 3rd Class with proper tab merging. The first tab automatically combines Novice + base class skills (same behavior as Night Watch). Configure tiers in PCIds.lua via
JOB_SKILL_TIER - Mount support - Custom jobs can use the Boarding Halter (item 12622). Define mount sprite IDs in
PCMountsandHalter_Tablein PCIds.lua - Minimal Lua files - Your Lua files only need custom job entries. Stock job data loads automatically from the GRF. All files use
Table = Table or {}guards for safe additive loading - Error display - When Lua files fail to load, you now get clear error messages. Choose between Silent, Log File, or Popup mode via the WARP patch options
- Working example - The
example/folder and WARP Inputs include a complete EXAMPLE_JOB (ID 4435) with a baby variant (ID 4436), ready to copy into your client
Technical details:
- All Lua lookups use direct Lua C API calls at runtime, bypassing a broken internal function in the 07-16 client
- Palette and head sprite tables expanded to support up to 10,000 custom job classes
- Costume_1 sprite files are required for custom jobs (client crashes without them after ~1 minute)
- Patch renamed to "Enable Custom Jobs (Reforged)"
Guide: See the [Custom Jobs Guide](docs/CustomJobs/CUSTOM_JOBS_GUIDE.html) or online version for full setup instructions with examples.
IncreaseHairsLimit (64K Hair Patch) - Compatibility Fix
- The hair limit patch now works alongside Custom Jobs without crashing
- Previously both patches conflicted with each other, causing a crash on startup
- Note: This patch was later replaced by
Allow65kHairsin the Mar 26 update
Mar 13 Update
Custom Jobs - Initial Release
- Full rewrite of the Custom Jobs patch for the 07-16 client
- Job names, sprite paths, palettes, head sprites, and display names all driven by Lua files
- Supports up to 10,000 custom job classes
- Custom job sprites render correctly in character select, creation, and in-game
- Example sprite, IMF, and icon files included in
examples/CustomJobs/data/
New Dark Theme - WARP0716
- New icons, recommend stamps, and editor font
- Original themes available as "Classic" and "Classic_Dark" in the style dropdown
Mar 12 Update
RagHash.dat Crash Fix
- Stale or leftover
RagHash.datin the client folder no longer crashes the client - The NoGGuard patch now handles this automatically - no more need to manually delete the file
GRFsFromIni Crash Fix
- Invalid or nonexistent GRF entries in
DATA.INIno longer crash the client - The patch now checks if each GRF file exists before trying to load it
Mar 11 Update
CustomIcon - Fixed
- Custom icons now work with any size and bit depth, including 256x256 PNG icons
- The original version only accepted tiny 32x32 icons
- All icon display contexts (Explorer, taskbar, window title) show the custom icon
Mar 10 Update
CustomJobs - Complete for 07-16
- All job tables now driven by Lua files (
PCIds,PCPaths,PCImfs,PCHands,PCPals,PCNames,PCFuncs) - add custom jobs without any additional binary patching
Dead Code Cleanup
- Removed unused code and 20 dead patch definitions that weren't applicable to 07-16
Upstream Merge (hiphop9/Warp2025)
- Merged 5 commits from Mar 7-10
Patch Descriptions Rewritten
- All patch YAML files rewritten with clear, user-friendly descriptions
- Every patch now explains what it does, why you'd want it, and any requirements or conflicts
Known Conflict: NoPassEncr vs UseSSOLogin
- Don't enable both
UseSSOLoginandNoPassEncrin the same profile - they conflict. The WARP GUI handles this automatically, but if you're using YAML profiles, only list one or the other
Patch Fixes (15 total, 0 errors remaining)
15 patches were fixed to work with the 07-16 client's compiler differences (VS2022/VC14.29). Each patch had byte patterns or memory offsets that didn't match the 07-16 binary:
- CallKoreaClientInfo, NoEarthQuake, NoEquipWinTitle, CustomShields, CustomCharCreateId, IgnoreEntryQueueErr, MoveUpItemCount, CustomFriendsLimit, AllowSkillSpam, CustomMissingLauncherMsg, LowCamAngle / MediumCamAngle / HighCamAngle, HideBuildInfo
Removed Patches (already baked into the EXE)
- NoLoginOTP - OTP login flow is already patched in the EXE before WARP
- EnableDnsSupport - Server addressing via clientinfo.xml is already handled in the EXE
- HidePacketsFromPEEK - 07-16 natively handles this, no patch needed
Removed Patches (not applicable to 07-16)
- NoFilenameCheck - Gravity removed the filename check entirely in 07-16
- CustomFriendsLimit - The friends list UI was redesigned in 07-16, nothing to patch
- NoGNJoyLaunch - GNJoy launch URLs are already zeroed in the EXE
Patches that auto-skip on 07-16
- CustomJobs - FIXED in later updates (see above)
- CustomSlotHLColor - Not fixable. 07-16 uses a different system for slot highlight colors
Verified Working
All of the following patches have been tested and confirmed working on the 2025-07-16 client:
NoWavyScreen, EnableWho, EnableShowName, MediumCamAngle, UseOldLogin, UseSSOLogin, AlwaysAscii, CallKoreaClientInfo, PlainTextDesc, LoadKrExtSettings, HideBuildInfo, FixArrowsCharset, TranslateClient, NoGGuard, MsgStrings, QuestDisplay, CustomItemInfoLub, CustomAchieveLub, CustomTownInfoLub, CustomTipboxLub, CustomMapInfoLub, CustomOngQuestInfoLub, CustomRcmdQuestInfoLub, CustomspopupLub, CustomQuestQualiLub, IncrMapQuality, DataFolderFirst, GRFsFromIni, EnableSysMenu, No1and1Arg, RestoreIcon, NoNagle, SendClientFlags, NoLoginEncr, OpenToServiceSelect, GuildBrackets, FixChatAt, NoHourly, NoHelpMsg, FixSkillbarReset, NoGravityAds, NoGravityLogo, FixLatestNCWin, DisConnToLogin, CustomInventoryLimit, CustomInventoryExpandingLimit, NoCharnameLimit, NoUsernameLimit, NoPasswordLimit, NoEquipWinTitle, NoEarthQuake, CustomEncKeys, Zoom (25%/50%/75%/Max)
User-Friendly Improvements
- This build of WARP only accepts the 2025-07-16 client EXE
- Title bar changed to "WARP for 2025-07-16" so it's clear which client this targets
- "Loaded Date" label renamed to "Client Date" for clarity
- Patch descriptions rewritten - Tooltips now explain what each patch actually does in plain language
- Recommend flags reviewed - Commonly needed patches are marked as recommended so new users get a good default set
- CustomPath.qjs - When selecting a Custom*Lub patch, the input now defaults to the original path but shows the recommended
SystemEN/path for llchrisll Translation Project users - Translations_EN.yml cleaned from 157 to 16 working entries
- AddLuaOverrides link updated to llchrisll's current documentation URL