Skip to content
A bot written in Scala 3 to stress test text-based MMORPGs (MUDs).
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


A bot written in Scala 3 to stress test text-based MMORPGs.

Join us on the MUD discord!

OSX Quickstart

  • git clone
  • run the precompiled OSX binary that was added to git repo
    • $ PORT=4000 bin/osx-noric-bot 17
    • 👉 17 bots will connect to and spam one cmd every 450ms
  • this program scales gracefully to 1000+ bots

How to support your MUD

  • PRs welcome!
  • MUD-specific support is provided by each MUD implementing LoginCmds and NextCmds for each MUD.
  • See NoricMud.scala, the cmds for the author's closed-source MUD.


noric-bot is written in Scala 3 and compiled to native using graalvm. Scala 3 has lots of new features and most aren't yet used in noric-bot.

(noric-bot uses some Java APIs in lieu of Scala libraries because the latter aren't yet available for Scala 3. It may be possible to use libraries compiled with Scala 2 within a Scala 3 codebase using libraryDependencies += ("a" %% "b" % "c").withDottyCompat(scalaVersion.value), see here.)

Are you a Scala expert? I'd greatly appreciate PRs that improve the "Scala-ness" of this project :-)

IDE support for this toolchain is provided by atom-ide-scala and Dotty's implementation of the Language Server Protocol.

Scala is my favorite language and I'm excited for Scala 3. I think Scala is the best mainstream language with a sophisticated type system. Sophisticated type systems are money in the bank. For me, from a type system perspective, going from TypeScript to Scala is like going from JavaScript to TypeScript. (I love TypeScript and write a lot of it!)

Scala 3 launches in 2020 after a new compiler was written over a five year period. The new compiler is named "Dotty".

See A Tour of Scala 3.


I'd like to improve the level of documentation/comments in the code.

Native compilation is cool. The binary starts up instantly, unlike the jvm. The current roadmap is to expand Config.scala to allow greater custom behavior without recompilation.

Compile & Run

  • install Scala brew install scala sbt lampepfl/brew/dotty
  • install graalvm and ensure native-image is on your PATH
    • 👉 you can skip this step and run non-natively with sbt run
  • compile sbt compile
  • compile to native sbt show graalvm-native-image:packageBin or the alias sbt b
  • run with bin/noric-bot which is a symlink to the binary produced by the build

Personal notes from the author to himself

noric-bot is a port of noricmud's ruby bot.rb.

On my macbook pro use alias graalvm-enable and then run sbt b.

how to run a noricmud stress test

  1. compile noricmud with sanity checks disabled
  2. run noricmud locally outside of sbt:
run packaged MUD (without sbt) on OSX without using docker
    build in sbt with
    run with
        cd target/universal && unzip noricmud-*zip && cd noricmud-*/
        JAVA_OPTS="-Xmx512m -Xms512m" bin/noricmud
  1. run bin/noric-bot <# of bots to run>

  2. or use parallel: seq 100 | parallel --ungroup -j 100 -n0 bin/noric-bot 1 > /dev/null


problem: hit limit of max open file handles

parallel: Warning: Only enough file handles to run 60 jobs in parallel.
parallel: Warning: Running 'parallel -j0 -N 60 --pipe parallel -j0' or
parallel: Warning: raising 'ulimit -n' or 'nofile' in /etc/security/limits.conf
parallel: Warning: or /proc/sys/fs/file-max may help.


You can’t perform that action at this time.