Open-source project
fossfreedom/indicator-sysmonitor avatar
fossfreedom/indicator-sysmonitor

indicator-sysmonitor puts CPU temperature, memory and network speed in one panel line

Ayatana application indicator to show various system parameters - Debian and Ubuntu

785 stars107 forksPythonGPL-3.0

At a glance

What is it?
indicator-sysmonitor is an Ayatana application indicator for Debian and Ubuntu desktops that renders CPU, memory, swap, disk and network figures from a format string you type into Preferences. It is a fork with its own release cadence, and it needs a desktop that supports AppIndicators.
Who is it for?
Adopt indicator-sysmonitor if you want a single configurable line of system figures in an Ubuntu or Debian panel and you are willing to type a format string, since the format tokens are the entire configuration surface. Do not adopt it on a desktop without AppIndicator support, on a machine where nvidia-smi does not run, or if you need a rich monitoring tool with history and graphs.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 155 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A panel applet for the numbers you check every hour

Indicator-SysMonitor is an application indicator that puts a short line of system figures in the desktop panel: cpu temperature, memory, network speed, cpu usage, public IP address and internet connection status. The audience is someone running a Ubuntu or Debian desktop who glances at the panel rather than opening a monitoring window, and who wants the numbers in one place rather than spread across top, htop and a browser tab.

The project is a fork. The README records that it was forked from the original author Alex Eftimie at version 0.4.3, and the current fork maintainer is fossfreedom. That history matters for expectations: the changelog reads like a long list of small fixes to sensors, panel integrations and packaging, which is what a desktop indicator tends to become.

The implementation is Python, and the repository layout shows a split between the indicator itself in indicator_sysmonitor/, shared code in sysmonitor_common/, a separate budgie/ directory for the Budgie applet, data/ for shipped assets, and meson.build plus meson_options.txt for the build. The licence is GPL-3.0, the default branch is master, and the repository is not archived, with the last push on 2026-05-21.

The format string is the whole configuration

There is no dashboard here. Output is defined by a template you type yourself, reached by clicking the indicator, selecting Preferences, then Advanced, then filling the Customize output text entry. Each position in the template is a token that the indicator substitutes with a live sensor value.

The token set covers the common cases: cpu for usage, cputemp for processor temperature, mem for memory, swap, fs for filesystem usage, net for network speed, netcomp for a compact net speed, totalnet for the total, and publiccountryiso for the country code of the public IP. GPU sensors exist too, with nvgpu, nvgputemp and amdgpu for the two vendors. The fs token takes a mount point argument written with slashes, which is how the same template line can point at the root filesystem or at another mount.

Because the layout is a template, the same indicator can show a minimal line of four fields or a wide row that mixes CPU, two GPUs, memory and swap with custom separators. That flexibility is the feature, and it is also the sharp edge: a template that names a sensor your machine does not have simply leaves that field blank or shows nothing useful, with no error message telling you which token was wrong.

Building from source with meson, and the apt packages around it

The quick setup in the README starts with the desktop side of the dependency, because the indicator needs an AppIndicator implementation to draw itself:

bash
sudo apt install python3-psutil gir1.2-ayatanaappindicator3-0.1

On a system using the older Ubuntu appindicator libraries the package name differs, and the README gives gir1.2-appindicator3-0.1 for that case. The Python side of the dependency is psutil, which is what lets the indicator read CPU, memory and network figures rather than shelling out for each value.

After the libraries are in place, the source build is a short sequence:

bash
git clone https://github.com/fossfreedom/indicator-sysmonitor.git
cd indicator-sysmonitor
mkdir build
cd build
meson --prefix=/usr
sudo meson install
nohup indicator-sysmonitor &

You should end up with an indicator-sysmonitor process running and a new entry in the desktop's application list. The same README also documents a plain make based path for AppIndicator desktops, which installs python3-psutil, curl, git and the appindicator library and then runs sudo make install, and a matching sudo make uninstall to remove it again.

There is a packaged route as well, using the project PPA:

bash
sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor
sudo apt-get update
sudo apt-get install indicator-sysmonitor

That is the shortest path for an Ubuntu user who does not want a toolchain.

Budgie takes a different route: replace the panel and add an applet

Budgie is not just another AppIndicator host in this project. It gets its own install target and a panel replacement:

bash
sudo make installbudgie
budgie-panel --replace &

The second command is the part that surprises people. Budgie does not load the panel configuration of other sessions the same way, so the indicator is delivered as a Budgie applet named Panel Sys Monitor, and the README says to add it afterwards with Raven. The budgie-panel --replace command swaps in the panel process that carries the new applet.

That is a heavier integration than the plain applet route and it touches your running desktop session, so it is worth doing on a machine you can log out of easily. The indicator is also usable on other desktops, and the README states that it works with Unity, Xubuntu, GNOME Shell together with an app-indicator extension, and any other desktop environment that supports AppIndicators.

The dependency on that extension is the real constraint. On GNOME Shell the indicator only appears if an AppIndicator extension is installed and enabled, which the quick setup section acknowledges by listing GNOME, MATE, XFCE and Budgie as the supported desktop interfaces.

GPU sensors need driver plumbing that you must verify

The Nvidia and AMD sensors do not come from a library, they come from what the driver exposes on the machine. The README states that nvidia-smi should work normally, or that card0 is the Radeon GPU, and it gives two commands to check what is there:

bash
cat /sys/class/drm/card0/device/gpu_busy_percent
bash
ls /sys/class/drm/

The second one lists the cards, and the README uses it to explain that on a system with an eGPU, card0 was the Radeon integrated GPU and card1 the external Nvidia GPU. That mapping is why a template with {nvgpu} and {amdgpu} in it needs the right cards in the right order, and why a laptop with a different enumeration can show one vendor's numbers against the other's label.

The changelog shows this area was reworked more than once: version 0.9.0 added NetSpeed Compact, Total NetSpeed and Nvidia GPU sensors, version 0.10.0 fixed AMD GPU latency and added an AMD GPU sensor, and the two bug fix releases that followed removed debugging code that stopped nvgputemp from returning a temperature and prevented a crash for users who had selected Nvidia options that do not apply to their setup. The Nvidia preview string, which needs the proprietary driver running, is offered separately in the README as a custom preview line.

Custom scripts: one line of output and an icon directive

The escape hatch is your own script. You write a script, for example in bash, make it executable with chmod +x, and the indicator runs it and displays what it prints. The contract is deliberately narrow: a script must output one line of text, and in bash that is a matter of echoing it.

One extra feature makes this more than a text field. The indicator can change the icon it displays by recognising a marker in the script output, written as USE_ICON followed by the full path to an SVG file. A script that watches something and reports a state can therefore switch the panel icon as well as the text, which is how a threshold or a mode indicator gets a different face.

The trade-off is that the script runs on the indicator's schedule and its output is trusted. A script that prints several lines, or prints nothing, leaves the field blank or breaks the one line rule, and a script that is slow will hold up the update. The README does not document a timeout, a scheduling interval or a way to see a script error, so the practical approach is to keep the script trivial and fast.

Where indicator-sysmonitor is the wrong tool

Three cases stand out. The first is a desktop without AppIndicator support. The whole integration depends on an indicator host, and on GNOME Shell that means installing an extension first. The project does not target macOS or Windows, and its quick setup is written for apt based systems, so it is not a portable choice either.

The second is when you need monitoring rather than a status line. There is no history, no graph, no alerting and no export here. The public IP and country sensors also reach out to the network, so the indicator is not purely local, and on a machine behind a proxy or with no outbound access those two fields are the ones that go empty.

The third is the release rhythm. Tagged versions are v0.11.0 from 2026-05-21, then v0.10.2 from 2024-06-04 and v0.10.1 from 2024-06-03, so roughly two years passed between the two bug fix releases and the next version. The last push was on 2026-05-21. That is fine for a small desktop applet, but it is the sort of gap where an Ubuntu release may ship a newer psutil or a new Ayatana API than the code expects.

Licence, fork lineage and what the changelog tells you

The project is licensed GPL-3.0, which matters if you plan to redistribute it or to package it for your own users: a derived package has to carry the same licence and source. The README also credits the original author and a list of contributors by pull request, and the project still points at the original Launchpad entry for the upstream version it forked from.

Reading the changelog tells you what this kind of indicator actually needs over its life. Version 0.8.0 added the cputemp sensor and the ability to use and change icons through a custom script. Version 0.8.3 reworked the fetch thread. Version 0.10.0 added Python 3.12 support, an option to display cputemp and nvgputemp in Fahrenheit, an icon for xfce, xubuntu and cinnamon desktops, and a crash guard for settings files with permission problems, along with the menu launch of mate-system-monitor when it is installed. Version 0.7.1 fixed a bug that prevented non-Ubuntu kernels from being used.

That list is a useful forecast of your own support burden. A panel indicator ages through desktop environment changes, indicator API changes and permission trouble in settings files, and this project has handled each of those in a patch release rather than in a redesign.

Editorial conclusion

Adopt indicator-sysmonitor if you want a single configurable line of system figures in an Ubuntu or Debian panel and you are willing to type a format string, since the format tokens are the entire configuration surface. Do not adopt it on a desktop without AppIndicator support, on a machine where nvidia-smi does not run, or if you need a rich monitoring tool with history and graphs. Before you install, check that your desktop can load the ayatana or appindicator library the README asks for, and read the Preferences Advanced output field together with the {cputemp}, {nvgputemp} and {fs///} tokens, because a format string that names a sensor your kernel does not expose will show nothing rather than an error.

Frequently asked questions

Which desktops does indicator-sysmonitor support?

The README states it works with Unity, Xubuntu, GNOME Shell together with an app-indicator extension, Budgie, and other desktop environments that support AppIndicators. The quick setup section names GNOME, MATE, XFCE and Budgie as supported interfaces.

How do I install indicator-sysmonitor on Ubuntu?

Add the project PPA with sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor, then run sudo apt-get update and sudo apt-get install indicator-sysmonitor. A source build with meson --prefix=/usr and sudo meson install is also documented.

Can I add my own sensor to indicator-sysmonitor?

Yes. You write a script that outputs one line of text, give it execute permission with chmod +x, and the indicator displays its output. The script can also switch the panel icon by emitting a line starting with USE_ICON followed by the full path to an SVG file.

How do I display GPU usage in indicator-sysmonitor?

Use the {nvgpu}, {nvgputemp} and {amdgpu} tokens in the output template. The README states that nvidia-smi should work normally and that card0 should be the Radeon GPU, and you can check the cards with ls /sys/class/drm/ and the busy percentage with cat /sys/class/drm/card0/device/gpu_busy_percent.

Official sources

  1. fossfreedom/indicator-sysmonitor on GitHub
  2. Issues
  3. License: GPL-3.0
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/fossfreedom-indicator-sysmonitor.svg)](https://hysenlabs.com/projects/fossfreedom-indicator-sysmonitor)

Was this useful?