Roon Log Watcher & Memory Display

What started as a beer idea and a simple tail -f command escalated rather quickly into a small hackathon. We asked ourselves a simple question: How much operational insight can actually be extracted from the Roon Server logs?

The result is now the: Roon Log Watcher – Memory Monitor

A lightweight real-time monitoring and diagnostics web app for Roon Server environments. The application is built on top of the Node.js framework and runs entirely as a local browser-based web application. No database, no cloud backend, no Electron dependency required for normal operation. Originally created and optimized for macOS + Roon Nucleus/ROCK SMB mounts (/Volumes/Data), but Linux environments may work as well.

Main Features:

  • Real-time live monitoring of Roon Server logs

  • Browser-based monitoring dashboard

  • Runtime-only monitoring (no historic log imports)

  • Live memory visualization: Physical Memory, Managed Memory, Unmanaged Memory, Virtual Memory, Plausibility Check

  • Intelligent Diagnosis Engine: automatic incident detection, root-cause hints, health impact assessment, incident grouping and correlation.

  • Roon Health Status scoring (still in early beta)

  • Event / Incident timeline

  • Live log output directly inside the web UI

  • Detection of: RAAT disconnects, Audio device issues, Streaming/cache anomalies, Database-related warnings, GC pauses, Memory growth anomalies, Compact dark-mode dashboard UI

  • Export into CSV / JSON export

  • Configurable alerts

One important design principle: The app intentionally ignores historic log content and only evaluates events and metrics collected after startup. The idea is near real-time operational observability rather than postmortem analysis.

Interestingly, many seemingly “critical” log entries turned out to be perfectly normal Roon runtime behavior. A large part of the project therefore evolved into building plausibility logic and reducing false-positive incident detection. The current version (v7.1) already works surprisingly well as a lightweight operational monitoring tool for Roon.

Requirements:

  • Node.js (LTS)

  • npm

  • Access to the Roon log directories

Node.js download:
https://nodejs.org/en/download

Installation:

npm install

Start:

npm run start:all-memory

Dashboard:

http://localhost:17666

This is still a hobby project without warranty or official support, but maybe interesting for some fellow log nerds here. Link to Github

2 Likes

…and the hack goes further. New sections added: Playback Sessions, Zone/Endpoint Monitoring, Playback Performance Monitoring and Incident Lifecycle Monitoring. It’s all there in the logs…

1 Like

New Feature added: Memory Increase Correlation. Every ‘significant’ memory consumption increase is now detected and displaied in the plot. The purple info box gives an indication (based on log data) what cased the increase

1 Like

Hello @Stefan_Mauron ,
I tried your application on Linux. I didn’t get any errors, but nothing is displayed on the dashboard.
I’m available to provide more details, dp.

tail -F started: RoonServer/RoonServer_log.txt
tail streams added: 1
tail -F streams active: 3
Runtime-only memory monitoring: existing log content is ignored.
Memory points detected since watcher start: 0

Ready. To test, trigger Play/Pause, skip a track, or switch zones in Roon.
Show all new log lines with 1 second polling: npm run start:all-fast
Show memory chart window: npm run start:memory
Or directly: node app.js --all --interval 1 --memory-window
Diagnostics: npm run diagnose
Stop: CTRL+C

Memory chart window: http://localhost:17666
Memory data endpoint: http://localhost:17666/api/memory
Memory health endpoint: http://localhost:17666/health
[watcher] running. active tail streams: 3, memory points: 0, waiting for new log lines...
[watcher] running. active tail streams: 3, memory points: 0, waiting for new log lines...
[watcher] running. active tail streams: 3, memory points: 0, waiting for new log lines...
[watcher] running. active tail streams: 3, memory points: 0, waiting for new log lines...

Hi

let us see, if we we can bring it to life on Linux as well. There is a new (more robust) version 8.9 reday to download on Github. Make sure the data directory of your roon server is mounted and the roon server process is running, else, no log entries will be made and hence, nothing to observe in the app. Report back, what the terminal output report.

Rgds, Stefan

1 Like

Thanks for this. I have wanted something like this since I started using Roon in 2017. The ‘real-time only’ is a bit of an issue though. Only the other day playback stopped for no apparent reason and unless I had this permanently running somewhere it wouldn’t be of any use finding out why? Could it be developed to analyse older log entries (Roon keeps 20 sequential log files last time I looked but this may no longer be the case)?

Hi

this is still under investigation. Why? Live logs (RoonServer_log.txt) are written immediately and reflect the real event timeline. Archived diagnostic logs / rotated snapshots are generated later from the live logs and may lag behind. Their file timestamp is therefore not reliable for sequencing events. Visually this causes: timeline jumps backwards or duplicated event windows which leads to misleading causality and incorrect correlation graphs/spikes.

I’m trying to figure out how live streams and rotated snapshots should and could be merged strictly by parsed log timestamps, not by file discovery time or file modification time.

Rgds, Stefan

1 Like

HI @Stefan_Mauron I like the look of this.

However, could you include the command structure and syntax on MacOS to mount the ROCK filestore under /Volumes/Data - my Unix is a little rusty and has been RaspberryPi centric.

Example Nucleus / ROCK mount on macOS:

smb://NUCLEUS/Data

Mounted locally as:

/Volumes/Data

thanks

Hi @Stefan_Mauron ,

I think I’ve found the solution:

the « tail -F » command doesn’t work correctly with SMB1.

I’ve modified your code:

  const script = `
file="${resolved}"
tail -n 10 "$file"
prev=$(wc -l < "$file")
while true; do
    lines=$(wc -l < "$file")
    if [ "$lines" -gt "$prev" ]; then
        tail -n $((lines - prev)) "$file"
        prev=$lines
    fi
    sleep 1
done
`;
  const child = spawn('bash', ['-c', script], {
  // const child = spawn('tail', ['-n', '0', '-F', resolved], {
    stdio: ['ignore', 'pipe', 'pipe']
  });

And I think it works :slightly_smiling_face:

Yeah, thanks for the update. Meanwhile we’ve been working hard on new features including improved Linux support. Check in Github for the v8.40. Let me know, if it works for you without modification. Else I will look into it.

Hi

Since the v8.9 release, the project evolved quite a bit, but more importantly: we’ve learned yet a lot from the logs themselves. What started as a lightweight real-time log watcher slowly turns now into a near real-time runtime diagnostics and observability tool for Roon Server environments.

The latest drop v8.40 can be downloaded from Github.

Many of the newer capabilities were directly driven by patterns repeatedly seen in the logs:

  • memory drift behaviour

  • GC pressure patterns

  • RAAT reconnect storms

  • transient “Unknown zone” noise

  • playback/runtime correlations

  • stream negotiation anomalies

  • endpoint lifecycle instability

  • runtime state transitions

Instead of just showing more logs, the focus gradually shifted towards:

  • reducing diagnostic noise and increasing signal-to-noise ratio

  • correlating incidents over time

  • visualizing runtime behaviour more intelligently

  • making anomalies easier to spot at a glance

v8.40 now includes:

  • Runtime Behaviour Intelligence

  • memory drift detection

  • GC pressure derivation

  • incident lifecycle monitoring

  • RAAT reconnect correlation

  • playback/runtime event correlation

  • intelligent noise suppression

  • persistent UI settings

  • diagnostic summary exports

  • live telemetry timeline

  • runtime capability & release tracking

A lot of effort also went into making the UI feel more like a professional runtime analysis tool:

  • cleaner visual hierarchy

  • strongly differentiated diagnostics colors

  • reduced scrollbar chaos

  • local timeline rendering

  • toggleable overlays

  • compact runtime telemetry

There was also quite a bit of work around Linux compatibility and startup/runtime handling.
Hopefully the Linux support is now significantly better than it was around the v8.9 timeframe:

  • improved log discovery

  • better process/runtime detection

  • cleaner startup handling

  • improved path handling

  • more robust monitoring behaviour on headless servers

Still intentionally: no cloud, no Electron monster, no database, no AI buzzword inflation.

Just near real-time runtime diagnostics for audio nerds, stacktrace enjoyers and people who trust the timeline more than “have you tried rebooting it?”

Software made with love for audio nerds, because rebooting is not debugging!

No, sorry… I think I need to redo the edit.

Edit: @Stefan_Mauron OK with previous modification and :

"logDirectories": [ "/Volumes/Data/RAATServer/Logs", "/Volumes/Data/RoonGoer/Logs", "/Volumes/Data/RoonServer/Logs" ],

Thanks for the update. It’s now on my backlog.

Rgds, Stefan

Hi

the first Release Candidates is now available on Github. This RC is mainly a housekeeping and foundation release after the rapid evolution from v8.40.

Under the hood:
• major internal refactoring and modularization
• general codebase cleanup and reduced technical debt
• cleaned up and properly restructured the GitHub repository
• initial Linux-related improvements and cleanup work

New UI feature:
• added contextual tooltips throughout the dashboard to better explain metrics and runtime indicators directly inside the UI.

Linux support has been slightly touched in this RC, but this area still needs much deeper attention and will be addressed in more detail in upcoming releases.

The full release package can be downloaded from the GitHub repository under “Releases” on the right-hand side of the project page.

Rgds, Stefan

3 Likes

Thanks for sharing this very interesting project. Just told my Hermes agent to install it on my Roon Extension LXC on my Proxmox server. Up and running in less than 5 minutes :nerd_face:

1 Like