New UI Look and Feel

We've recently completed a large overhaul of our UI, the first change since 2018. This allows native Window snapping support on Windows 10 and 11, on MacOS uses the native titlebar, and fixes inconsistent maximize behavior when using multiple displays of different scaling factors. The titlebar and tray icon has also been updated to a new pixelart version of the logo thanks to con_no_1.


Additionally I would like to apologize for how bumpy this update was. We went through several iterations of update & rollback between January 13 and 30 which you might have noticed, causing the client to switch between the old and new L&F multiple times. While we do rollbacks occasionally, applying this to the UI updates caused a lot more consternation due to the changes being so visible. Many of the issues brought to our attention were changes to behaviors that we didn't know we had or that people relied upon. We have since fixed back the behaviors of everything that we can reasonably do.

Player menu collapsing

The interface styles plugin has a new option to place player menu options into a submenu, similar to RuneScape.

player menus

There are also several smaller improvements and bug fixes, including:

  • You can now locate all your dashing clue gear that is storable in the POH treasure chest with the new treasure chest bank tag, freeing up bank space!
  • US servers now show east or west on the world hopper.
  • Time tracking now correctly tracks payment to any farmer, instead of only to ones with a single patch.
  • The Window opacity setting now works on more systems (MacOS/Linux) and also with custom chrome off.
  • The wiki plugin adds a View DPS button to the equipment screen to open the OSRS Wiki DPS calculator with your current gear.
  • Tree respawn timers now use the Jagex respawn timers.
  • The message from the NPC unaggression plugin being uncalibrated is now an infobox.
  • Camera speed can now be adjusted in the camera plugin.
  • Custom notification volume can now be adjusted under notification settings.
  • Group ironman shared storage can now be searched using the search hotkey.
  • Loot tracking for the Nightmare and Phosani's Nightmare has been fixed.
  • A bug causing KC/PB tracking of 6+ size TOA teams to record the wrong team size has been fixed.
  • The chat filter plugin has been optimized to no longer cause lag with an excessively large regex filter list.


- Adam

New commits

We had 31 contributors this update!

Adam (98):
      gpu: regions: fix air altar
      status bars: fix lms check
      friendlist: fix friend list title component id
      api: add AmbientSoundEffectCreated event
      api: add ambient sound effect background ids
      widget util: add utility method for packing component ids
      loottracker: include relic selections in npc metadata
      gpu: regions: add pyramid plunder
      null check getSelectedWidget() on menu click
      prayer: move drain rate to prayer plugin
      prayer: add drain rate test
      prayer: convert drain rate to drain effect
      prayer: add ruinous powers
      xpdrop: support multiple prayer types per prayer
      xpdrop: rename package to xpdrop
      xpdrop: add ruinous powers
      rs: add js5connect error message
      clues: add treasure chest bank tag
      xp drops: fix coloring defensive casting
      clues: fix treasure chest tag test
      api: add widget createStaticChild
      api: add widget setOnScrollWheelListener
      bank tags: refactor ui to use layers
      bank tags: rebuild tag tab tab on new/import/delete
      bank tags: fix scrolling the tag tab
      bank tags: remove separators prior to computing scroll
      bank tags: remove use of dummy script null
      bank tags: fix pmd violation
      menu swapper: fix ui swapping optarget
      raids: simplify login scout check
      raids: fix scouting on raid reload
      chat filter: cache filter results
      raids: reset raid on party id change
      bank tags: move onMenuOptionClicked subscriber to TabInterface
      bank tags: remove unused import
      api: add scene tile model/paint isFlat()
      gpu: fix tile uvs
      clues: include alternatives in treasure chest tag
      gpu: flip y/z in projection
      gpu: reverse z
      api: include WidgetConfig in runtime api
      gpu: remove radius from compute shaders
      gpu: use floating point for vertex positions
      music: correctly apply ambient sound mute on startup and shutdown
      clues: use builder for cryptic clues
      clues: add npc regions for cryptic clues
      fishing: fix tracking Karambwanji
      gpu: fix cl compilation on amd gpus
      Revert "gpu: fix cl compilation on amd gpus"
      Revert "gpu: use floating point for vertex positions"
      world hopper: cleanup
      world hopper: add us east/west coast flags
      cryptic clues: fix object id initializer
      time tracking: support payment tracking of multi-patch npcs
      containable frame: remove setMaximizedBounds workaround
      ui: remove contain in screen ALWAYS
      IconTextField: fix popup suggestion list size
      config: use default font for JPasswordField
      containable frame: fix Window.setMinimumSize DPI scaling
      laf: disable text antialiasing for rs fonts
      banktags: fix tabtabs tab
      worldpoint: use signed right shift for local to world conversion
      laf: change titlepane height to 27px
      ui: remove window opacity setting
      screenshot: image capture: support insets on client frame
      update flatlaf to 3.2.5-rl2
      ui: readd contain in screen ALWAYS
      add scurrius
      hiscores: add scurrius boss icon
      devtools: cleanup location overlays
      ContainableFrame: apply insets to old rhs offset behavior
      laf: change titlepane height to 23px
      clientui: adjust for frame insets when performing display bounds check
      ui: readd window opacity setting
      use backgroundless logo for image icon
      update flatlaf to 3.2.5-rl3
      Revert "update flatlaf to 3.2.5-rl3"
      update flatlaf to 3.2.5-rl4
      api: add size x/y to ObjectComposition
      overlay: use floating point overlay priority
      replace OverlayPriority use with corresponding constants
      woodcutting: use add_overlaytimer_loc for respawn timer
      bank tags: use only dynamic components for tab layer
      Revert "api: add widget createStaticChild"
      worldmap: strip pngs
      api: add setter for ScriptEvent op
      bank: use scriptevent for shared bank search trigger
      rs: add error dialog for js5io and crash errors
      npc unaggro: remove recheckActive on LOGGED_IN
      Revert "npc unaggro: remove recheckActive on LOGGED_IN"
      npc unaggro: remove recheckActive on LOGGED_IN
      npc unaggro: change uncalibrated overlay into an infobox
      Revert "clientui: force keep window size on when snapped on windows"
      woodcutting: fix respawn overlay on rotated objects
      cache: update 220
      Revert "npc unaggro: remove recheckActive on LOGGED_IN"
      npc unaggro: check active before doing npc scans
      roof removal: fix race applying roof flags with startup

Christopher Michael Mescher (1):
      world map: Add capes of achievement teleports

David Pedersen (1):
      xp updater: add runetracker support

Emil Hansen (1):
      ground items: fix inferno despawn timer

Eric White (1):
      notifier: add flash taskbar option

Felanbird (11):
      achievement diary: update fremennik astral rune task (#17221)
      idle notifier: add cow milking animation id
      idle notifier: add dairy churn animation ids
      clues: add fairy ring to mudskipper point emote step
      achievement diary: add new kourend task
      achievement diary: remove kourend favour
      clues: update lizardman canyon hot-cold step
      idle notifier: add specimen cleaning animation ids
      world map: add AKR fairy ring
      worldmap: fix Kourend teleport level
      achievement diary: update various tasks

Geordan Neukum (1):
      clues: recognize (l)(t) variant of dragon defender

JZomDev (1):
      ui: don't apply opacity in safe mode

Jason O'Neill (1):
      npc aggro area: ignore unattackable NPCs

Jordan Atwood (8):
      loot tracker: Fix TOB chest interface id
      loot tracker: Fix interface id in tests
      loot tracker: Track unsired loot
      slayer: Fix initial amount when task changes
      clues: Fix Lovada cryptic clue text
      clientui: Support Linux WM layout
      clues: Add Wizards' tower region to Wizards' tower clue
      timers: Track god wars altar cooldown via varbit

Joshua Kuan (1):
      clues: fix single item fulfilledBy check

Louis Hong (1):
      notifier: add custom notification volume control

Lukas Hönig (2):
      achievement diary: add 30 Constr. req. to crane repair task
      woodcutting: fix division by zero computing hourly rate

Macweese (3):
      clues: fix comment grammar
      clues: add felling axes
      clues: add trailblazer tools

Max Weber (31):
      api: add Animation::restartMode accessors
      runepouch: skip empty slots in grid view
      api: expose drawFrustum & drawWidgetText
      fairyring: add vinery fairy ring
      kourendlibrary: remove dark manuscripts
      runelite-client: use FlatLaf
      devtools: add swing inspector
      clientui: optimize for FlatLaf
      config: optimize for FlatLaf
      clientui: apply client size config correctly
      clientui: use sidebar pref width as min width
      clientui: add 4px border in custom chrome mode
      clientui: do not try to shift the frame in screen when not changing size
      clientui: do not show custom chrome border when maximized
      clientui: do not include insets in game size config
      clientui: correctly apply suction when expanding via min size change
      ContainableFrame: fix dpi scaled minimum size hack
      ContainableFrame: restore old rhs offset behavior
      ContainableFrame: set suction when shifted by native containment
      ContainableFrame: use hungarian to prevent window / content coord misuse
      clientui: listen for sidebar hotkeys when the client is not focused
      clientui: give client focus when closing or hiding the sidebar
      clientui: synchronously update the root pane's size
      rl-client: remove ItemVariationMappingTest
      ContainableFrame: remove non-native containedInScreen==ALWAYS code
      ContainableFrame: always contain & suction when snapped on windows
      clientui: force keep window size on when snapped on windows
      clientui: save game size instead of window size when keeping game size
      clientui: remember last restored bounds when starting maximized
      skillcalculator: remove checkbox panel background
      config: remove unused JCheckBox::setBackground

PhraZier (1):
      bank: support group storage with search hotkey

PortAGuy (1):
      party: tie ping duration to system time

Rasmus Karlsson (2):
      clues: reword Varrock Apothecary cryptic clue solution
      clues: clarify Burthorpe Games Room emote clue location

Robin (1):
      update wise old man API endpoints

Ron Young (1):
      overlay manager: revalidate overlays on profile change

Yenof (1):
      clues: Add Team Cape 0/X/I to emote clue steps (#17273)

YvesW (5):
      prayer: disable reordering on shutdown
      idle notifier: add crystal felling axe (inactive) animation
      wintertodt: add crystal felling axe (inactive) animation
      woodcutting: add crystal felling axe (inactive) animation
      chat commands: fix theatre of blood: entry mode Previously the branch was unreachable: the label contained uppercase symbols while the selector is lowercase-only (boss.toLowerCase())

geheur (3):
      clues: fix hotcold class initialization
      bank tags: only close chatbox interface when clicking bank ops
      prayer: reorder prayers on profile change

iProdigy (1):
      chat commands: fix off-by-one team size for out-of-order toa pb

ldahleen54 (1):
      config: allow using tab key for hotkeys

pkhermouch (1):
      cryptic clues: update Sinclair Mansion solution

sam (1):
      Trailblazer league reloaded rune pouch up to 6 runes.

smol-tako (2):
      item identification: add Forgotten brew and Blighted super restore
      chat history: fix Copy to clipboard for friend dms

sonnypb (1):
      timers: add Spellbook Swap timer

testing-ongithub (8):
      worldmap: fix Lovakengj mine cart location
      worldmap: add new minecart locations
      worldmap: rename minecarts to match in-game list
      worldmap: fix DIP fairy ring location
      worldmap: add ALR fairy ring
      worldmap: alphabetize fairy rings
      worldmap: use Zanaris fairy code rather than location
      worldmap: comment fairy rings that don't exist on the world map

timleafy (1):
      worldmap: add mining guild west amethyst