Updating automatically

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.

Developer changelog →
v2026.09.08.0012 launcher 8 Sept 2026
Accounts, schedules, and a sleep reader that stops guessing


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.




Character hub


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.





Scheduler


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.





Sleeping words


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.




logout, in scripts


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.




Also in this build


  • 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.
v2026.09.07.1040 launcher 7 Sept 2026
- Names on parked clients
- 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.
v2026.09.07.0528 launcher 7 Sept 2026
- Fix to Dynasty client loading
- 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
v2026.09.05.0821 launcher 5 Sept 2026
- Fixes to multi client mouse and keyboard
- 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
v2026.09.04.2215 launcher 4 Sept 2026
Shops


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.




Reading a shop


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 with
    shopItem(151)
    ,
    shopItem("Coal")
    or
    shopSlot(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.





Prices, properly


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
-1
means the trade would not be offered at all — out of stock, or something that shop will not take.




Buying and selling


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)
    and
    shopBuy("Iron ore", 10)
    both work, and so do the price readers.





For Java scripts


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.




Notes


  • RSCFalador for now.
    shopAvailable()
    says whether this client publishes the shop, and
    shopMissing()
    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
    and
    shopPricesKnown()
    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.

Visit the forum →
hello

in General Discussion · by WinterBirch

1 reply

25 Aug 2026

Voidscape Bottable

in Announcements · by ArcaneOxbow

1 reply

25 Aug 2026

RSCDynasty Bottable

in Announcements · by ArcaneOxbow

1 reply

25 Aug 2026

Script requests

in Script Requests · by GleamingMiner

4 replies

24 Aug 2026

Welcome to the forums

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.

All servers →
DragonFire RSCFalador Voidscape

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