Custom Drone Racing League Simulator Server banner

Custom Drone Racing League Simulator Server

23 devlogs
92h 51m 3s

In December of 2025 the servers for Drone Racing League Simulator were shut down. This is a project to restore the online mode to Drone Racing League Simulator by reverse engineering the game’s server

This project uses AI

Small uses of AI for writing kebab case to snake case json statements
AI was used for CSS bc nobody likes CSS
Sometimes Copilot Autofix would fix security stuff and there was some inline suggestions

Demo Repository

Loading README...

Mr Milky Way

Shipped this project!

Hours: 92.85
Cookies: 🍪 3282
Multiplier: 29.46 cookies/hr

Back in December of 2025 the servers for DRL Sim (Drone Racing League Simulator) got shut down along with the company. This erased over 7 years of data like maps, leaderboard entries, and custom drones. It also made the game basically unplayable: can’t race against yourself, can’t create maps, and can’t make custom drones, can’t play with other players (ofc), and your settings don’t even save. Most of the community just thought that was it, no more DRL Sim. After all the company is gone, why would the game not be?

But I, a Clippy and a Stop Killing Games supporter, decided that I was going to do what DRL didn’t and make a way for the community to bring the game back online. I started by decompiling the game and just took a look around the code. Then I just tried to send false data to the game to “login”.

It worked and that really kicked off my confidence and I managed to basically recreate the server entirely, allowing players to play together, create maps and drones, save their settings, and save their times to a global leaderboard. I learned A LOT from decompiling and reverse engineering, to sql and hooking DLLs.

Most importantly last month I got a server up and running (https://api.drl-game.com) with currently 13 players and 150 leaderboard entries.

I do understand that you probably don’t own the game and if that’s the case please take into account that I tried to make the server patch very easily installable for the people that do own it.

Hridya

Tagged your project as well cooked!

🔥 Hridya marked your project as well cooked! As a prize for your nicely cooked project, look out for a bonus prize in the mail :)

Mr Milky Way

This was mainly bug fixing and experimentation with a little bit of map work.

I started out by making a system to create permanent API keys which was pretty nice and easy to make. I then moved onto some small bug fixes like leaderboards not showing anything. And then I tried to fix a bug where you couldn’t race bots.

In order to load player bots the game was trying to find cached bots for some reason. It downloaded these bots from A HARD CODED E3 BUCKET… so i can’t fix that yay /s

So after that I tried to add back dev users bc when I changed the player state system over the hardcoded dev users went away, so I added a page to make users devs on the admin dash. Works nice had some bugs tho where the game would just not like being in dev mode for some reason. To fix that I just removed the ability to overwrite dev mode by the player.

Then I started to try and fix some bugs with the map maker, but I think I’m just going to redo that whole backend bc it sucks sooooo bad.

Then I went and fixed the my drones section not sending back just your drones and not every drone. skull-ios it wasn’t a really notable fix but it works now yay


Demos

  • API key creation page
  • Dev users bit on Admin Users page
  • fixed leaderboard rivals
  • Fixed map editor
  • My drones pre-fix
  • My drones post-fix

Change Log

Attachment
Attachment
Attachment
Attachment
Attachment
Attachment
0
Mr Milky Way

I fixed more bugs yay

Something that has been bugging me (and you prolly saw it if you watched the video on the last devlog) is that profile pics don’t show up correctly everywhere. This is because the game has the spaghetti-est spaghetti code ever seen by man. It uses A DIFFEREN’T END POINT FOR THE PROFILE PICS INSTEAD OF JUST GETTING THEM FROM THE URL LIKE IT DOES EVERYWHERE ELSE!!! So I had to make the smallest endpoint known to man just to fix it.

I also got feedback that the DLL patch was kinda hard to install so I went in and fixed this by changing how it’s packaged and wrote more detailed/better instructions. If I get ONE MORE QUESTION on HOW TO FIND THE GAME DIRECTORY I’M GOING TO LOSE IT.


Demos

  • image of Fixed profile pic (don’t mind the tier stuff thats still a WIP)
  • Image of new install tutorial

Change log

Attachment
Attachment
0
Mr Milky Way

2 hours
2 hours is how long I spent working on creating the table for my New Fixed player state thingy. It consists of over 150 different things all of which I had to copy from a file and then figure out it’s data type so I could make the table correctly. Once I was done with that I now had to replace my old and janky system which I don’t even know how it worked…
The saving and loading states took a bit but it was smooth sailing for the next problem.
Some playtesters noted that when they changed there name, profile color, ect, it wouldn’t update on the leaderboards and thats because before I added those to the sql and didn’t call them from player state bc player state was a json object that I couldn’t query. So I fixed that and while I was at it also fixed PFPs.

Demos

  • FIXED PFP
  • video of the new profile system (only shows colors)
  • Big ahh sql table

Change log

  • fix /leaderboards/rivals/ (37af3d7)
  • fix leaderboard (d4cfd97)
  • create profilestatemodel and translator (no read/write) (1e0f194)
Attachment
Attachment
0
Mr Milky Way

This 3 hours was mainly spent testing random things although I did get some stuff ready for tournaments, mainly leaderboards and had to fix some bugs with them.


here is a list of bugs I fixed

  • Incorrect map showing on MP lobbies
  • people could get 2 leaderboard entries
  • couldn’t modify tournaments

And here is some stuff I tested

  • Tested new leaderboard system (added match_id to primary key)
  • Tested tournament results (still not a good idea of how this works lol)
  • Tested more on matches (rounds are still filler/test data that doesn’t save to db)

Demos

  • Results test
  • Match testing (just for qual round)
  • Bug of 2 leaderboard entries for one person

Changelog

Attachment
Attachment
Attachment
0
Mr Milky Way

I got to work creating the round creator. Currently it only works to create rounds (AND NOT MATCHES) in “DRL” mode, which lays out rounds like the following:
Starting players: Any
Players after qualifying: 24 if player count is 24 or above, 12 if between 12-23 and the number of players if less than that.
Each match has 6 players with 3 advancing to the next round until the last round in which there is only one player left, the winner.

FOR THE RECORD THIS IS ONLY ROUND DATA NO MATCHES WHICH GO INSIDE OF ROUNDS AND IS WHAT THE PLAYERS PLAY.

Demos

  • img of round layout (simulated 26 players, no matches)
  • img of round layout (simulated 15 players, no matches)

Change log

  • added createTournamentRounds (8eaf8b5)
  • Bump basic-ftp in the npm_and_yarn group across 1 directory (7d735e2)
  • more work on createTournamentRounds (e37b132)
  • Fix Tournament modifying (c44b892)
  • Merge pull request #19 from Mr-milky-way/dependabot/npm_and_yarn/npm_and_yarn-2dee6a94ba (d5b057f)
  • Bump the npm_and_yarn group across 1 directory with 2 updates (1f9e528)
  • Merge pull request #20 from Mr-milky-way/dependabot/npm_and_yarn/npm_and_yarn-a7dcac81d5 (a463765)
Attachment
Attachment
0
Mr Milky Way

MY SHORTEST DEV LOG!!
I added the ability to modify tournaments now! Very fast and easy to make just had to create one new endpoint and add some stuff to the modify page.

Demos

(Not in Prod)

  • Modified in game tournament
  • Modify Page (looks like create page lol)

Change log

  • added tournament modifications (7de6115)
Attachment
Attachment
0
Mr Milky Way

In my last devlog I got drone images working, in this one I did way more than that.
I got to work on profile pics and they now call from the steam API (if that’s ur branch) else they just use a default one. That was pretty easy so I moved on to creating tournaments I started by duplicating the modify page and started adding fields to it. That was more tedious than hard so it took some time. Then I started in on the backend and that was not fun got it working (after a while). Currently there is no backend for the modify page and tournaments only work up to the base and not rounds. It only has has the ability to show it self, and not be played if that makes more sense.

Demos

(not in prod)

  • TOURNAMENT IN GAME!! yay
  • admin panel of tournament
  • creation webpage (looks like the modify page)

Change log

  • Start work on profile pics (2405ade)
  • added work on bans (f8675ec)
  • added creation of tournaments (kinda) (a94f3ae)
  • Tournaments work up until rounds (c8c9e23)
Attachment
Attachment
Attachment
0
Mr Milky Way

This was simple (mostly) I got images working today (and fixed a typo that stopped xp from showing up) - in the most backwards way possible. I thought that it would send a request to the real URL so I made /image-cloud/{userID}/{imageID} But no it sent requests to the endpoint of /images/?????
It also sent a query of url, w, h with URL being the image it wanted and width (w) and height (h) being what it wanted. Pretty simple to make but oddly buggy.
I also created middleware to automate badTokenAuthv2™ so I don’t have it cluttering up things.

DEMOS

(in prod)

  • fixed images in community drones
  • Fixed xp

Changelog

  • Temp fix images (e44a405)
  • image fix (doesn’t fix old images) (932b882)
  • added badTokenAuthv2 middleware to end points (mostly) (6fe6d84)
  • possible fix for no xp from maps (1c17336)
  • fix some file stuff (c10dfc3)
  • Fix security stuff (9c1d520)
  • Fully fix Xp (tested) (a58f77c)
  • badTokenAuthv2 Now on leaderboards (4b7e2ec)
Attachment
Attachment
0
Mr Milky Way

My devlogs are getting shorter yay!

I didn’t do too much this time, I added a map pools page, which still needs to have some small changes to it. It doesn’t work with the hard coded maps as of right now. It’s going to be used to allow for some variety in my new tournament system as one of the devs said they couldn’t just have it auto create tournaments for them. Currently the backend is mostly done for that page.

I also added a page to create/modify tournaments, ALTHOUGH it’s not quite done (like the map pools) it also has very minimal backend implementation. It looks kinda nice tho and is going to be far better than hard coding tournaments lol.

DEMOS

(Not in prod)

  • Tournaments modify page
  • Map Pools
Attachment
Attachment
0
Mr Milky Way

Another long devlog :heavysob:
I got good news though, I got in contact with one of the old devs of the game. The manager of the tournaments and the main map creator for main years! He gave me a lot of insight into how the old servers worked. Just before he got back to me I tried to make filler data for the tournaments so I could just join a match, I spent a very long time trying and debugging and trying and debugging to get it to work and I just couldn’t figure it out. Until I realized that there was a typo on my side using state instead of status. It only took FOREVER TO FIND THIS :heavysob:
After getting that to work I started by making a sql table create command and just after is when the dev got back to me. We talked for a while about dev mode, track creation, but most importantly tournaments.
He said that tournaments were not done automatically and that he had to manually schedule them using a web portal, this web portal could also find cheaters and do lots of other stuff. So I spent some time creating a nice little dashboard web page (and had AI do the css bc nobody likes that). I also created stuff on the backend so I can login into it and other random people can’t just send requests to reload the server. So far I have a login page, main dashboard, tournament dashboard, admin settings, and server settings. It’s not ready for prod tho

Demos

(These are not from prod so some stuff will be broken :( )

  • Login page
  • Main dashboard page
  • Tournaments page
  • Admin user settings
  • Server settings
Attachment
Attachment
Attachment
Attachment
Attachment
0
Mr Milky Way

I am very sorry for the long log but it wasn’t working so I didn’t want to make a log for it. BUT WOOO, THERE HAS BEEN CHANGES. Since the last devlog I gotten a test server up and running (and patched security issues with that, I forgot to sanitize file paths). I also removed all direct calls to Ctracks and tracks making them both stored in the same db. While I was testing the server, some users (only on the steam branch) were stuck in demo mode, this was because there was a license check ONLY ON THE STEAM BRANCH. WHY. It was very easy to get around though, as it just wanted {exists: true} in base 64. There also was some tracks issues relating to how they were stored in the db - they were stored as [object] not as stringifyed json. I added docs which are not very complete but they aren’t the biggest thing right now lol. I also added a function to map the sql to json on both maps and leaderboards, AND OH MY GOODNESS WHY DID I NOT DO THAT EARILIER, IT MAKES THINGS SO MUCH EASIER. I also added all the filters for the community tracks now yay There was this odd bug which seems to be coming from the map section where your username just disappears but I haven’t fixed that yet.

I also found out more about dev mode: There is a replay recording thingy and you need aa special exe to use it AND THAT EXE IS: ffmpeg. Just renamed ffmpeg.

DEMOS

  • filters for the community tracks
  • video made with the in game dev recording
  • video made of the in game dev recording
  • image of failed license on someone else’s game
Attachment
0
Mr Milky Way

A lot happened (but bc it’s backend work I don’t have a lot to show) so i’m going to try and cover as much as I can. I had to make a new DLL system as the old one could have had some copyright issues. On the server side I added environment vars for the port and url. I also went back thru and fixed all the variable scopes (which took forever). I wasn’t checking if the token had expired before adding stuff to the db, so I also fixed that. Also fixed the file storage as it would crash due to too many inputs. I added more tracks (though all are not working) so now there are about 217 community tracks. I also reorganized the repo and removed all direct calls to Ctracks.json (community tracks).


CHANGE LOG for Custom-DRL-Server (Not full log)

Attachment
Attachment
0
Mr Milky Way

It’s been awhile

so I added a readme for Instructions of use, environment variables to it, changed all the var scopes for better security, added better auth, bunch of small bugfixes, Released custom DLL’s, added rate limiting, and closed an issue on the repo.

Lota work :3

I don’t really have anything good to show as an image bc most of it can’t be seen in game :(


CHANGE LOG

Attachment
Attachment
Attachment
Attachment
Attachment
0
Mr Milky Way

Today I fixed the replays, so now you can view them, it took a very long time because as it turns out only one of the 3 endpoints is meant to be used, as it’s the only one with relevant data, BUT IT STILL SENDS THE FILE ON ALL OF THEM AND NONE ON THE LEADERBOARD ENDPOINT

BRUH

I also fixed the leaderboards so they don’t save the wrong data to the leaderboard (They used to have an incorrect PRIMARY KEY meaning that it saved per map and not per track)

Attachment
0
Mr Milky Way

The maps now work correctly and just about every endpoint is accounted for. I also had too add the /storage/image/ endpoint. I started work on fixing the replays too, but the game has like 3 different functions to send a replay, uses them all, and sends different data to each.
BRUH

Attachment
0
Mr Milky Way

I did some work on custom community map making.
You can now create and test a track, but can’t edit or clone a track yet. you also can’t delete a track but ehh who needs that…

This took way to long, but hopefully the next bits will be shorter. (it wont there is still so much left check img 2)

Attachment
Attachment
0
Mr Milky Way

I fixed the drone collection problem, and it wasn’t because of the drone time endpoint.

The game would try to preload your drones on the boot of the game using your player ID. The problem was that the game would set the player ID as null because the login was sending back filler data. I also added the remove drone endpoint to delete your drones. I think next up is the drone time endpoint (or just the time endpoints like all of them).

Attachment
Attachment
Attachment
0
Mr Milky Way

I fixed some small problems with the rivals leaderboard and Community tracks and tried to add drones into the mix.

This works kinda well, the drones get uploaded BUT, if you close the game and reopen it it just says that the drone isn’t in your collection (even though you made it). I think it has to do with the drone time endpoint, but I need to do more looking. It doesn’t seem related to the player state but idk. Works well other than that though.

Attachment
Attachment
0
Mr Milky Way

So I figured out why the leaderboards where broken, and it was bc I was a certified idiot.

The game wanted the data in kebab-case but I SQL doesn’t like kebab-case so I was storing it in snake_case, and just retuning the raw snake_case stuff to the game. This works fine for the score, but not anything like names. I do have a little fixing up on more of the leaderboard endpoints (like the rival ones) tho.

Attachment
Attachment
0
Mr Milky Way

I fixed up some db issues with the leaderboard: the maps used to check drone name and guid and not ‘drl-official’ bool. This meant that the leaderboard would be different per drone and not different per drone class/official drones. I then fixed the real leaderboard to show the entries as the only endpoint without filler data up to this point was the leaderboard post. It went well and next up is figuring out why the names are all undefined. I think it lies in a different endpoint but idk.

Attachment
0
Mr Milky Way

After a long time I figured out the leaderboards I got the DB working for them. It was a MONSTROUS block of code but it works (smh) some of it is still filler data (like the Number 1 position bit) but it won’t override a better score and should work fine when I fixup the rest of the code to use the DB. I spent way to long trying to find out why the data being sent was null, bc as it turns out the data is in a json array and I thought it was just in json… BUT IT WORKS, YEAH!

Attachment
Attachment
Attachment
0
Mr Milky Way

After a lot of work I have decided to make this a flavortown project and as such I have a lot to write for my first Devlog. I started this project because my favorite (only) drone simulator that I own, DRLSim, had it’s server shut down. I decided to make a custom server for the game even though I have never made a server before. I started out by checking the game logs to find what requests the game was sending to the server, once I found out the name of the request I would go into the .DLL that send the request and see what it wants back (I also patched the dll with a new server URL too). First on the list was the login data, it wanted an expiration and the token it sent me back + a success boolean. Because of this I didn’t have to decode the token. Next was game and player state data which could be left null. Next was map data which had to be in base 64 and I could fill with fake data. Last was a server time call, this also had to be in base 64 and had to be the current time in iso format. After all of this I could boot into the main menu, and race on 4 out of 277 tracks. After finishing a race the game would ask for leadboard data and then softlock. Instead of fixing this right away, I re-coded all of what I had made to use express and not just a http server. Then I tried to fix the maps not loading and the game would get the map data, BUT would only download a 1kb file and so I just left that for a fix later. At this point I looked at how DRL handled the login tokens. After some digging I found that the token was in base 64 and used AES encryption. The key was easy to find but the iv looked to be hard coded, but was actually the timestamp that the game sends to the server. Now that I could read what the token says I could start to actually make a database. This allowed me to save the player state also. Next I started work on the xp system which needed that player state. I also added some filler leaderboard data. I hit the char count for the log :(

Attachment
0