Botting for RuneScape Classic that survives the update
Every private server re-obfuscates its client, and every bot breaks the day they do. BotWith.me re-maps the client by itself, ships a launcher that keeps itself current, hosts a marketplace of scripts, and lets you watch and steer a running bot from the web — with tokens you top up by card.
A client that re-maps itself
The mapper never reads obfuscated names. It matches on shape, structure and history, so every hook keeps its identity through a rename and the bot reads the right memory.
A self-updating launcher
Install it once. When a server ships a new build, the launcher pulls the fresh mapping and updates itself — you never re-download a thing or re-hook a patch.
A script marketplace
Buy a script and the client just fetches it — nothing to install by hand. Or publish your own and keep 70% of every sale. Text scripts and jars both welcome.
Remote control from the web
Watch a running bot live in your browser and steer it — click, type, switch scripts — without touching the machine it runs on. Only ever your own sessions.
Tokens, topped up by card
One balance runs the whole account — bot time, sleep-word decodes and marketplace scripts. Top it up by card through Stripe; your tokens appear the moment the payment clears.
One account, everywhere
The same login runs the site and the loader. Sign in once and the bot signs in with you, asks for the build it is launching, and gets a mapping made for exactly that build.
Latest updates
The newest launcher builds across every server, and what changed.
A big update. Characters now carry their own login, the scheduler has moved onto the character it belongs to, the sleep captcha reader handles both kinds the game throws at it, and scripts can log themselves out.
The Identity tab is now a character hub. Click an account and its own card opens with everything about it in one place.
- Save a username and password per character. Passwords are encrypted on your machine with a key that never leaves it. They are never sent to us, never written to a log, never in a crash report, and no script can read them.
- Every new client asks which account to use. Pick one, or pick "No account" and that client runs completely unspoofed - your own machine, your own connection, no proxy - for the accounts you play yourself.
- The login boxes stay filled. Once a client is on an account the username and password are put in, and put back. Type over them and they come straight back.
- "No spoof" hides the uid, machine and proxy fields, because none of them apply to an account you are not spoofing.
- A hand-typed login that works is saved for you. Log in by hand once and that account is in the hub afterwards.
- Every client's title bar shows the account it is linked to, and the console is now per client - click a client and you see that client's output and nothing else.
The scheduler has left Settings and moved into the character card, because a schedule belongs to a character, not to the launcher. There used to be one schedule and every client in the window obeyed it, so a day written for the account you were looking at also stopped and started the five beside it.
- The day in quarter-hours. Each column is an hour, top to bottom :00 :15 :30 :45. Left-drag from one quarter-hour to another and everything between them is picked - that is when this character may bot.
- Right-click a quarter-hour to say what runs from there on. Anything: a script on your computer, a script from the site, or any .jar or .bot file you point it at. It keeps running through every botting hour until you place another script later in the day, and then that one takes over.
- Hover a quarter-hour and it tells you what runs then.
- A "Schedule active" switch, off until you turn it on. Draw the day first and switch it on when you mean it.
- Export, import, and copy from another character. A day worked out over a week is worth keeping - save it to a file, send it to a friend, or put it on a second character without drawing it again.
- When the day is done it logs out, and it stays out - auto-login will not quietly pull it back in. It keeps asserting it until the character is actually gone rather than sending one packet and hoping.
- It only takes charge once you have run a script on that client. Opening the launcher outside your botting hours will not log you in and log you straight back out.
Two things, and the second one is the one that has been biting people.
It reads both kinds now. The classic word, and the newer arithmetic ones - a sum on a black background. The reader works out which kind arrived on its own; there is nothing to choose.
And it will not type a stale word. An answer is now tied to the exact sleep image it was read from, so a word from a previous picture can never be typed for a new one. If a fresh image arrives while an answer is in flight, the old answer is thrown away, the new picture is read, and that is what gets typed. Duplicate images are recognised as duplicates rather than answered twice, and a word that cannot be read is re-probed instead of guessed at.
New command in the text engine. It sends the game's own logout packet rather than clicking the button, so it works from anywhere without opening a tab first.
logout() wait until not loggedIn() timeout 10000 else { print("still in - in combat?") }
The server has the final say. It refuses while you are in combat or have just been, and it says nothing when it refuses - so check loggedIn() afterwards rather than trusting the answer.
- Closing a client closes that client. When it was the only one open it used to close the whole launcher.
- The client now loads while you are choosing an account, rather than after.
- A client losing its window while shutting down no longer crashes itself on the way out.
- Toast system to show messages sent when a client is parked
- Flash on clients not selected when someone is talking to you and nobody else is around.
- Fix voidscape 2 broken hooks
- Text engine IDE now detects what client you're focused on and runs it on that deck
- Implemented Rent a bear system where she can bot on her phone
- Fixed login screen login (There new login screen)
Rewrote the input handlers to support multi clients better now so client > 2 will not type sleep word on client 1
Scripts can now read a shop and trade with it. Everything the shop window knows is readable, and buying and selling go out as the client's own packets rather than by driving the dialog.
Open a shop and a script can see the whole of it: every slot, what is in it, how many the shop has, and what each one is worth in both directions.
on loop {
if not shopIsOpen() { return 1000 }
for row in shop() {
print(row.name, "x" + str(row.stock), "buy", row.buyPrice, "sell", row.sellPrice)
}
return 600
}- Every slot, as a handle.
shop()
hands back the filled slots in grid order, each with.slot .id .stock .buyPrice .sellPrice .priceBasis .name
. Find one directly withshopItem(151)
,shopItem("Coal")orshopSlot(2)
. - The shop's own numbers as well:
shopIsGeneralStore()
,shopCount()
,shopBuyPriceMod()
,shopSellPriceMod()
,shopPriceMultiplier()
, and which slot the window has highlighted. - A stock of 0 is a real slot the shop has run out of — still sellable to, not buyable until it restocks. In a general store your own bag is listed alongside the stock, which is how selling there works at all, and those slots sit at 0.
Classic shops do not have a price list. The price is worked out fresh from the item's value, the shop's two percentages, and how far that slot's stock has drifted from where the shop thinks it should be — so every one you buy makes the next one dearer, and every one you sell makes the next one cheaper.
Scripts get that same curve rather than an approximation of it:
# what one costs, and what ten actually cost - not ten times the first
print("each:", shopBuyPrice("Coal"))
print("ten :", shopBuyPrice("Coal", 10))So a script can decide whether a stack is worth buying before it buys any of it, and a shop-clearing bot can stop at the point the price stops being worth it. A price of
-1means the trade would not be offered at all — out of stock, or something that shop will not take.
shopBuy("Coal", 10)
shopSell("Bones", 5)
shopSellAll("Bones")
shopClose()- They wait for the result. A
false
means the trade really did not happen, not "the packet left" — the command sends and then waits for the bag to actually change, and prints why if it does not. No hand-tuned sleeps. - The window's own rules are kept. The amount is clamped to the shop's stock when buying and to what you are carrying when selling; a shop that does not list an item will not be asked to take it; and bank notes are refused anywhere but a general store, exactly as the game refuses them.
- By id or by name, everywhere —
shopBuy(151, 10)
andshopBuy("Iron ore", 10)both work, and so do the price readers.
The same thing lives at
ctx.shop():
isOpen,
all,
byId/
byName/
bySlot,
stockOf,
buyPrice/
sellPrice,
buy,
sell,
close, plus
Shop.price(...)if you want to ask what a trade would cost without making it.
- RSCFalador for now.
shopAvailable()
says whether this client publishes the shop, andshopMissing()
names anything unbound — so a script can say what is wrong instead of quietly doing nothing. - Prices need the item values the client keeps in its own cache. Where those are not published every price reads
-1
andshopPricesKnown()
is false; the stock and the trading still work. - Every command has its own card in the shop group of the command reference, and the Claude scripting skill has been updated with worked examples: reading a shop, buying a stack at a price limit, and emptying the bag into a general store.
From the forums
What the community is talking about right now.
in General Discussion · by WinterBirch
1 reply
25 Aug 2026
in Announcements · by ArcaneOxbow
1 reply
25 Aug 2026
in Announcements · by ArcaneOxbow
1 reply
25 Aug 2026
in Script Requests · by GleamingMiner
4 replies
24 Aug 2026
in Announcements · by ArcaneOxbow
1 reply
20 Aug 2026
3 servers supported
Whether you can bot there right now, and how current the mapping is.
Stop re-hooking every patch
One account for the site and the loader. Sign in once and the bot keeps itself current.
Create an account