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.
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.
…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…
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
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...
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.
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)?
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.
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.
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.
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!
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.
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