inxi changelog:

Page Updated: 2022-05-19
inxi version: 3.3.16

The following is the inxi changelog

Version: 3.3.16
Patch: 00
Date: 2022-05-19

A nice release, some good corner case bug and glitch fixes, along with some much
needed documentation fixes to bring inxi-values.txt up to date for changes that
have been evolving steadily. And a useful option for nvidia legacy card info.

I'm hoping that will help support people and users as nvidia open source driver
gets more usable in the future, since that will never support legacy cards, only
the current series supported by 510/515 drivers.

Also, in inxi-perl/tools, new tools and data so you can reproduce certain arcane
data assembly features like disk vendors and nvidia product ids.


1. Not known yet if you can get Wayland display drivers along with kernel gpu
drivers. In other words, is a similar use of kernel/display driver as in Xorg
found with Wayland? Hard to dig up actual answers to questions like this.

2. Similarly, unknown if it's possible to get current active xorg display 
driver, not just the list from Xorg.0.log file. No idea how to discover that,
there are cases where past use of Xorg leaves log file present, but drivers are
not used with Wayland, leading to confusing driver reports. Issues 1 and 2 are 
similar but probably have similar solutions.


1. Very subtle failure caused by odd mount point in partitions: a too loose 
regex rule designed to capture spaces in device names was running loose to the 
end of the string, where it was triggered by a number in the mount point. 

Fix was to make rule much more strict, now needs to match 3 number space in a 
row after the initial part, and then a number%

2. Bug in corner case, with Monitors, if > 2 connected monitors, and 1 disabled,
inxi was trying to test numeric position values for the disabled monitor, which
with xrandr, has no position values, thus tripping undefined pos-x and pos-y 
errors. Thanks to fourtysixandtwo for spotting this corner case.

3. Bug in wan IP, if dig failed, set_dowloader() is not set unless other 
parameters were used, which results in failing to set parameters for downloader,
which leads to screen errors spraying out. Thanks to Manjaro user exaveal for 
posting this issue, with error outputs, which helped pinpoint the cause.


1. More absurd xorg port ID variations: DP-1 kernel, DP1-1 X driver. Wny? 
Trying to add in XX-?\d+-\d+ variation, which I think will be safe, made the 
first - optional, though it's just idiotic for this amount of randomness to be
allowed to exist in the 21st century. If this reflects other discipline failures
in Xorg, it starts to get somewhat more obvious why Wayland was considered as
the only forward path, though that's just as chaotic and disorganized... but in
different ways.

2. Removed darwin distro version detection, which of course broke, and using
standard fallback for BSD made out of uname array bits. If it works, it works,
if not, who cares. This should handle issue #267 hopefully.

3. Trying for more monitor matches, now in cases where 1 monitor display ID
remained unmatched, and 1 sys kms id remains unused, assume the remaining 
nonitor ID is a match and overwrite the unmatched message for that ID. This
will cover basically all single monitor match failure cases, and many multi
monitor failures with only 1 out of x monitor ids unmatched. While guessing a 
bit, it's not a bad guess, and will slightly expand the number of matched
monitor ids. This extends the previous guess where if single monitor and 
unmatched, use it to cover > 1 monitors, with 1 unmatched.

4. LINES_MAX configuration item did not assign to right variable when -1 value.
Used non-existing $size{'output-block'} instead of correct $use{'output-block'}

5. Forgot to add pkg to --force, goes with --pkg.

6. Finally! Added in busybox shell detection, it's not of course reliable if 
they change internal light shells, but all the docs say they use ash, so now
it will show shell: ash (busybox) to make it clear. Hurray!! This means that
tinycore users will get this long awaited feature! Ok, ok, long awaited by 
probably only me, but since I package inxi for busybox, it was on my todo list.

7. Cleaned up and re-organized many disk vendor matching rules, made them easier
to read and debug, going along with Code 3, development and release.


1. New feature: in -Ga, if Nvidia card, shows last supported nvidia legacy 
series driver (like 304.xx), status, microarch. If --nvidia and EOL, shows 
last-supported: kernel: xorg: info. This should be useful for support people, 
we'll see.

-Gx shows nvidia microarchitecture, if it was found. This is based on matching
tables so will go out of date if you have non current inxi's, but that's life.

If --nvidia or --nv shortcut is used instead, triggers -Ga and shows much more 
nvidia driver data for legacy, and for EOL drivers, last supported kernel, xorg, 
and last release version. --nvidia also adds process node if available.

More important perhaps is the fact that as of May 2022, nvidia is starting the 
process of open sourcing its current latest driver (515, but Turing, Ampere 
architectures only so far), which will only support non legacy nvidia cards, 
making detection of legacy cards even more important to support people and end 
users, since that will be a common question support people will have: does my 
card support the open source driver?"

Read about the new open sourcing of the 515 nvidia module:

2. Going along with new and upgraded tools in Code 3, massive, huge, upgrade to
disk vendors, 100s of new matches, biggest upgrade ever for disk vendors. This
feature should work much better now with the new backend tools.

3. Added shortcuts: --mm for --memory-modules, --ms for --memory-short.


1. None.


1. Big update to docs/inxi-values.txt. This had gotten really out of date, with
incorrect hash and other internal data assignments, all updated to be current,
along with sample greps to make it easier to locate changes in the future as 
well. This makes this document fairly up to date and useful again for dev 
reference purposes, should such a dev ever appear, lol. Many values had not
been updated after global refactors, like switching to the %risc data for all
arm/mips/ppc platform types, and making %load, %use, %force, %fake uses more
consistent. Doing this helped expose some subtle bugs and failure cases in
inxi as well.

2. Added to -h and man -Ga Nvidia option info. Fixed some typos and glitches. 
Includes new --nvidia / --nv options for full data.


1. Changed $dl{'no-ssl-opt'} to $use{'no-ssl'} and $dl{'no-ssl'}, that was a 
confusing inconsistency.

2. Added comma separated list of --dbg numbers, since often > 1 is used. Saves
some debugging time, otherwise nothing changes.

3. Huge new public release of some back end tools in new section: 
* - disk vendors tool, with data in lists/disks*.txt
* - nvidia product id generator tool, with data in lists/nv_*

4. While doing, I noticed that the use of array ref for $vendors was
not done correctly, that's fixed now, simplifies it slightly.

-- Harald Hope - Thu, 19 May 2022 13:02:00 -0700

Version: 3.3.15
Patch: 00
Date: 2022-04-08

Bug fix, it's a bad edid data bug, rare, but when it trips, kills inxi execution 
dead right before -G/Graphics shows. Also some nice fixes and enhancements.


1. Possible case of Gnome Wayland failing to set any gnome environmental 
variables, making wayland detection not possible. This was in anonymous dataset 
inxi-proBook4540s dataset. Person never appeared in real life so can't follow up 
on it. This cascaded down to other failures in display detection, and desktop 
detection, though in theory much of the data needed was present. I expect 
similar issues may appear with kde wayland. This is/was probably a configuration 
or build error I believe, though not enough data yet.

It appears that sudo start disabled the display environmental variable 
detections, which is unfortunate, and the fallback loginctl tests do not appear
to work for unknown reasons. I've confirmed this on Fedora stock Gnome as well.


1. Forgot to test that return from get_display_manager is array ref, this 
impacts only a tiny handful of distros probably, TinyCore was one, but it is a 
fatal failure, so fixed it. Never trips in console, only on tiny linux where no 
dm is used at all. Tripped with Xvesa, seen other bug reports, but not enough
data to know for sure.

[2022-04-09 update] It turns out that basically when $DISPLAY is set, but no DM
detected, for example starting wayland sway from tty, the issue also appeared.
See Debian issue:
inxi currently has no way to detect a tty start of a wayland compositor, or of
xvesa, so this was an entire class of bug, corrected, but not actually handled.
Ideally inxi could detect a tty compositor start, though technically showing
dm: N/A is correct since there is none running, but dm: tty-start would be nicer
since it would be more informative. But do not know how to do that yet.

2. EDID errors and warnings had several bugs, errors a fatal critical bug which
made execution stop. Had forgotten to pass the $edid hash reference to the error
constructor. Also had used wrong hash key in output so would never have shown.


1. Corrected ram device indentation levels.

2. Made memory width more clear with: width: data: total: which more
accurately reflects the source data. Also in cases where no data or total 
values, only show width: N/A, not the data: total: sub items.

3. Made edid errors/warnings output to numbered list of warnings/errors instead
of using join() to made one long list. Much more consistent that way. This fixes
issue #266 - thanks SheridanOAI for finding this bug.

4. In --slots, -x wasn't loading the bus ID so it showed N/A, unnecessary data 
collection granularity, removed.

5. For Display, if no X or gpu driver, show: driver: N/A. Showed driver: gpu: 
N/A before.

6. For Display, remove filters for Xwayland tests, we always want to see 
xwayland data if it's installed. This was actually an error to not show it since 
display_server_data already had the correct tests to not redo Xorg data if found 
previously, which would be glxinfo based data. This is a partial fix also for 
Known Issue 1, at least we'll see Xwayland is present even if Wayland detections
failed for unkonwn reasons.

7. Added some ram value dmi filters, found some that had 'none' or 'unknown'.

8. Show display protocol out of display!! Also handles most common root use 
cases as well, so in most cases, if the initial protocol detections failed, this
will result in a decent attempt, though if root it is less reliable. sudo or 
regular user will be fine since looks for not tty/pts TTY type and username.

This should also help narrow down Known Issue 1 failures, though there are more
cases to be dealt with, but can only chip away since not enough data.

9. Made info: item in slots more robust, and able to handle more diverse 

10. Added alternate syntaxes for dmidecode permissions errors.


1. Added brzdm clogin mlogind xlogin display managers. Not verified. Version for
brzdm is probably like slim since brzdm is a fork of slim.

2. Added voltages to ram module report, that had been left out. Note that it's 
common for voltages to be either 'unknown' or not present at all. This is as 
close as inxi can get to handling issue #265 since there is no other source for 
the requested data type (show DDR3L, low voltage DDR3, which doesn't exist as a 
type in dmidecode).

3. Added voltages to --slots report, --slots -xx. Only shows if present.

4. Added for --slots -a for Linux, if detected, the PCI children of the bus ID 
of the slot. This is recursive, so supports as many levels as are present, 
though it would be rare for there to be more than one level of children.


1. In -m ram report, moved ram type before size/speed/voltage, that makes more 

2. Also in -m ram report, make type: the default value (was an -x options 
before), which contains the no module found messages etc, making the order:
  Device-1: DIMM 0 type: no module installed
  Device-2: DIMM 1 type: DDR4 size: 16 GiB speed: 2400 MT/s
This puts all the speed/size/voltage data together, and stops putting the no 
module found message in speed, which never made any sense.

2. In -m, changed width data to more clearly reflect the data source:
      width (bits):
        data: 64
        total: 72


1. Man page, added a TABLE OF CONTENTS section which lists all the primary 
sections. Can help since the man page has gotten so darned long and man doesn't
as far as I know support clickable internal links, sadly.

2. For -m, updated for revised output syntax and -x levels. Note that the help
and man actually had the type: as default for -m, not -mx, but for some reason,
the code had it wrong. Oops.

3. For -m, fixed some legacy output syntax in the examples.


1. Some refactors of slots, ram, as well as a bit more refactoring of edid stuff
for graphics. 

2. Added $ENV{'DISPLAY'} to debugger data collector, no idea why that was left 

-- Harald Hope - Thu, 8 April 2022 22:46:26 -0700

Version: 3.3.14
Patch: 00
Date: 2022-03-24

New version, man. Continuing development of EDID and monitor features, bug 
fixes, normal fixes. 


1. Failed to handle case for monitor positions of array type: 2-2, 3-1, 1-3, 
4-4. I'm not sure what structure those are really arranged in, but might be 
worth adding in the x+y pos values along with the row-col values.

2. For Monitors and graphics Device ports, if using non free nvidia driver and:
nvidia-drm.modeset=1 not set in grub kernel boot parameters, there will be no
/sys/class/drm data for the nvidia device, and thus no ports data, and no 
monitor data. 

3. A class of high count DP or DVI port IDs are changed by Xorg drivers to for
example: DP-6 > DP-2-3. This is very difficult to handle and will in general 
probably fail unfortunately because that level of port ID abstraction is just
reazlly hard to deal with dynamically.

4. A to-do item: add bus ID children on --slots. This will probablby be in next 


1. None outside of the various fixes.


1. In sensors, failed to pull out BAT sensor data. In most cases, this would not
lead to any issues, but it could have.

2. This one just slipped my mind, I'd meant to do it, but in Montitor-x:, the
primary ID should have been the 'real' kernel ID, not the mapped: ID, which is 
the ID when different from the kernel ID. So mapped should be the Xorg 
version when they are different from the kernel version.

3. In Graphics, monitors can show > 1 ratio, failed to set all to :, resulting
in: ratio: 3:2 or 16/10 modes:. Also fixed ParseEDID to output an array of 
ratios, which can then be processed as wanted.

4. Monitor map fixes:
* Handle case in monitors where display ID: eDP and sys ID: eDP-1, this only 
works if 1 monitor in array. There's a variety of this type of failure, when or its drivers decide to call the port ID XYZ with no number at all. All 
those possible cases are now handled, like eDP > eDP-1, VGA > VGA-1, and so on.

* Added fallback, if no match, and if only 1 monitor, just map them to eachother
if other mappings failed. Prompted by things like: s: DP-6 > d: DP-2-3; 
s: eDP-1 > d: DP-4, which are just impossible to create logic to map.

5. Removed 'ati' driver from xorg drivers list, it's simply a wrapper for r128, 
mach64, or radeon (and maybe amdgpu), and shows as failed, unloaded, or loaded, 
because of this. ati basically assigns the correct driver, that is, but is not 
itself a driver. Thanks mrmazda for spotting this issue.

6. Typo on QDI => Quantum Data.

7. Added fallback for monitor model, now using vendor code plus product code 
if nothing found for vendor nice name or model. This will show as 'model-id:'
instead of model: to help differentiate the two.

8. Added Monitor product_code to manufacturer if no model name is found.

9. get_pci_vendor was trimming at ' / ' if the product string also contained 
' / '. Fix is to ignore 1 character 'words' in the logic.

10. In Slots, failed to remove_duplicates in the slot info field, leading to 
redundant output strings. See Enhancement 3 and Code 4.

11. See Change 3, finally made -S section use full key: value pair, which makes
stuff more explicit, like:

  Host: yawn
  Kernel: 5.16.0-11.1-liquorix-amd64
    arch: x86_64
    bits: 64
    compiler: gcc
      v: 11.2.0
  Desktop: Xfce
    v: 4.16.0
    tk: Gtk
      v: 3.24.24
    info: xfce4-panel
    wm: xfwm
      v: 4.16.1
    vt: 7
      1: LightDM
        v: 1.26.0
      2: SDDM
        note: stopped
  Distro: Debian GNU/Linux bookworm/sid

12. Fix for mageia and lsb distro data, force use of os-release for mageia if
detected. That overrides the forced use of lsb release for mandrake/mandriva,
because for some reason mageia has decided to carry ALL the legacy distro files:
which is really not what this stuff is intended for, if it's an actual derived 
distro from a living base, then yes, include the base file, but all these have
the same distro id data for mageia, none for the derived distros.

Also, fixed an lsb release thing to avoid using codename if codename contains 
release number as well. Since lsb_release is totally legacy at this point, who
cares if we might miss a specific codename here and there on legacy system.


1. Added Color Characteristics to EDID parser, for some reason that had been 
left out. 

2. Added advanced EDID output option --edid, that allows for showing more 
advanced EDID data than is appropriate for most users cases. Ihcludes errors,
color characteristics chroma: (chromacity), full modes, not just min/max.

3. In --slots, added bus-ID. 

Also extended report quality, made more granular, got rid of single blob from
Type and Designation and now get more accurate and useful data. 

4. In cases with > 1 DM, check to see if one or more are stopped or disabled, =
and add (stopped) if it was detected in running service as stopped.


1. Reversed monitor ID and mapped: ID values, that was a mistake, the mapped: 
item was supposed to contain the mapped name, and the primary ID was 
supposed to be the actual real ID the kernel uses. Not a huge deal either way,
but there it is.

2. Include disabled but connected Monitors. This works around nvidia bug showing
monitors disabled when they are enabled, but also allows for showing connected 
monitors, though without as much data.

3. Made the last holdout -S > -Sa use strict full key: value pair output, like
Desktop: XFCE v: 4.14.12 and so on.


1. Added help/man for --edid info.


1. In ParseEDID: made new key: edid_error, which contains an array ref of 1 or
more edid errors. The previous version did a poor job and returned only the 
first error found, so there could have been > 1 error, and you'd never know it.

This changes check_parsed_edid to _check_parsed_edid(). and adds a utility tool
_edid_error, which grabs the message from main::message, giving better output 

This also allows for future error handling expansion quite easily.

2. In map_monitor_ids() fixed matching pattern, made more robust and explicit,
to catch things like s: eDP-1 d: eDP or eDP-1-1, both have been seen. Also added
fallback for single monitor, just map them to eachother if mapping failed.

3. get_pci_vendor() added test for using anything that is 1 character length,
to not break on 1 character length string matches.

4. Fully refactored --slots, that was originally written purely as a proof of
concept in terms of adding a new feature during the original inxi 2.9 rewrite,
and was never actually touched after that.

-- Harald Hope - Thu, 24 Mar 2022 12:01:50 -0800

Version: 3.3.13
Patch: 00
Date: 2022-02-22

Just as 3.3.10 > 3.3.11 were a huge set of CPU upgrades, including significant 
internal refactors, so too is 3.3.13 a significant Graphics upgrade, featuring 
significant upgrades to Wayland (and Xvesa/TinyX!) support, and allowing for 
much more granular output controls. The legacy -Ga showing 
Display/Screen/Monitors is now split apart, and can now work for some features 
in and out of display.

This upgrade should be of significant interest to any Wayland using distro, as
well as the tiny Xvesa based distros like TinyCore, Slitaz, and Puppy.


If you had Cpanel::JSON::XS or JSON::XS Perl modules as dependencies, you can 
remove those, inxi now can use JSON::PP, which is in Core Modules since Perl 
5.14 (unless for some reason your distro removed that module from Core Modules).

Basically inxi will simply look for whichever of the 3 is installed, and use 
that one. 


1. The free drivers for xorg like amdgpu, modesetting, alter the the internal 
kernel IDs for monitors/gfx device ports, which is somewhat bizarre since the 
ideal role of any ID is to be an identifier that always works. Due to this 
situation, inxi has to map the kernel ids to the x driver monitor IDs in order
to show the advanced monitor data, like model: mapped: and modes:. This may not
always work as expected since if the mapping fails, the data will fail to match
to the monitors. While not enough data is in to make any conclusions, hoping 
that this issue does not exist on Wayland compositors.


1. Not sure if this was a bug, but I believe RAM vendor ID matches would never
have generated results, and might have generated errors. That's corrected as 
part of Code fix 1.


1. Tiny indentation level issue, for -Ga, Monitor was not set to be a container 
for its data. This would only impact -y 1 or json and xml output cases, and would 
be subtle, but it was an oversight.

2. Small fix for monitor dimensions, failed to switch the mm dimensions for 
monitors placed in a vertical, portait mode, instead of standard landscape mode.
Now switches mm x and y if that is detected, which corrects dpi as well.

3. For Xvesa:

* Show vesa as display driver, Xvesa == vesa, dugh,lol.

* Show better Interface and Screen resolution data missing messages.

* See FIX 5 for adding in display-ID:.

* Show TinX Xvesa string for server data, not just Xvesa.

4. For Wayland, which currently has no EGL support in inxi, if no glxinfo 
present, show EGL Wayland specific Messsage: for advanced EGL data, not the 
generic glxinfo that were shown previously.

5. Display was relying on xdpyinfo or a Wayland environmental variable to set
display-ID:, now falls back always to $ENV{DISPLAY} if nothing else was found 
and that exists. I hadn't realized how much was depending on those x tools, 
which many people never had installed in the first place. This also supplies
that for Xvesa as well, which has features that need the Display-ID to use.

6. Intel family 6, model 17h, supposed to be yorkfield, was penryn, fixed.

7. Small fix for remove_duplicates, it was not case insensitive so missed things
like DELL Dell in strings.

8. Failed to detect or get Xfree86 X server version number.


1. Extensive Graphics Upgrades:

* -Gxx Devices: For some gpus / drivers, show vram total and used for -Gxx. 
amdgpu supports this, I believe it's the only one, but don't know for sure.

* -Gxx Devices: (Linux only): Show active, off (connected but disabled, like a 
closed laptop screen with attached moniitor), and empty ports on devices. Not 
tested for USB yet.

* -Gxx Devices: Show device ports (like VGA-1, DVI-I-1, HDMI-A-1), active, off 
(off is connected but disabled) and empty (linux only).

* -G Display/Screen: Removed strict dependency on xdpyinfo to show advanced xorg 
screen and display data. Now it will show most of the data if xrandr is 
available, and all if xrandr and xdpyinfo are installed. More granular error 
messages as well.

* -G Wayland Display: new type, d-rect: for > 1 monitor Wayland display layouts. 
Works roughly the same as Screen: s-res: does, except since Wayland has no 
'Screen' concept, that goes into Display. This is sort of a rough algo, 
basically it takes either the dimensions of the total of x and y resolutions, or 
the greatest x or y resolution found for any monitor, whichever is greater, and 
uses that to create the display rectangle resolution composite value.

* -G Display, Monitors: Extended display tool options from just xrandr to 
swaymsg, wlr-xrandr, weston-info, wayland-info. Still nothing on kwin_wayland or 
gnome-shell and mutter data.

*. -S, -G: compositors, full redo of list, now supported: 

asc awc cage cagebreak cardboard chameleonwm clayland comfc dwc dwl epd-wm 
fireplace feathers fenestra glass gamescope greenfield grefson hikari hopalong 
inaban japokwm kiwmi kwinft  labwc laikawm lipstick liri mahogany marina maze 
motorcar newm nucleus orbital perceptia phoc pywm qtile river rustland simulavr 
skylight sommelier sway swc swvkc tabby taiwins tinybox tinywl trinkster velox 
vimway vivarium wavy waybox way-cooler wayfire wayhouse waymonad westeros 
westford weston wio+ wio wxrc wxrd xuake

* -G Enhanced Interfaces/GL item, previously only type OpenGL forX, now has:

  * X - OpenGL, requires glxinfo , same as before.

  * Wayland - EGL, currently no tool available, stub in place. Allegedly this 
  data can be found but have no idea how or if a tool does that yet

  * Xvesa - Interface: interface type (VBE/GOP). GOP not confirmed, no data 
  samples; v:, source:, dac: (no idea what it is, show it though), controller:, 
  and ram: items. 

  This is based on TinyX/Xvesa as found in TinyCore, but should work in Slitaz
  and Puppy TinyX as well if those projects are still around.

* -G Display/Screen/Monitor data: Created structures and abstractions that allow 
for Wayland/Xorg/Xvesa data, most new features will work with any of these. Or 
Arcan, if that actually makes it, and we get data for it. We'll wait on Arcan, 

* -G Display server: For Xvesa, added type TinyX to server if detected. Added 
Xwayland, which was not handled previously. For Xwayland, if wayland running,
and if Xorg also installed, shows:

    v: 1.20.14
    with: Xwayland 
      v: 21.01
Otherwise shows:

  server: Xwayland 
    v: 21.01

* -G Compositors: fixed a long standing weak spot, if > 1 compositor detected 
running, not common, but could happen, shows all detected compositors.

  Display: x11
    server: X.Org
      v: 1.20.13
      1: Mutter
        v: 41.1
      2: xfwm
        v: 4.16.1
        loaded: modesetting
      gpu: radeon

* -G drivers: now shows if X or gpu driver, in each its own section. This makes
it more obvious what is going on:

  Display: x11
    server: X.Org
      v: 1.20.13
        loaded: modesetting
      gpu: radeon

* -Gxx Monitors: Show primary monitor with pos: primary,right. Uses either 
xrandr 'primary' value, or if no 'primary' found in an Xorg Screen, uses +0+0 
positioned monitor. Position is based on the row and column number in the 
rectangular grid of monitors when monitors per Xorg Screen are > 1. 

For most common multi-monitor layouts, text positions are used, which are in 
general more clear and easy to understand than their internal numeric 
counterparts, that is, unless the layout is too complicated, it will show left, 
or top-left, instead of 1-1, and so on.

Text mode positions are available for the following grid styles currently: 1x2, 
1x3, 1x4, 2x1, 2x2, 2x3, 3x1, 3x2, 3x3. 'top' means the top row if > 1 row, 
'bottom' means the bottom row, 'middle' is the middle row if 3 rows, 'left' is 
the first column, 'right' the last, 'center' if 3 columns, and 'center-l' (1-2), 
'center-r' (1-3) are the 2 center columns if 4 columns. 'bottom-l', 'bottom-c', 
'bottom-r'; 'middle-l', 'middle-c', 'middle-r'; 'top-left', 'top-center', 
'top-right' complete the possible values. 

If the grid of monitors is greater than the supported rows or columns, it will 
switch to numeric row-column mode, with column-row numbering starting at 1-1, 
top left.

* -Gxx Monitors: show (if detected, Linux only) monitor model, and if the 
display ID (from Xorg or Wayland) is different from the /sys monitor ID, show 
mapped: to show the /sys id.

* -Gxxx Monitors: show modes: max: XxY min: XxY, or mode: XxY (if only 1 mode 
found). Shows hz:

* -Ga Monitors: shows serial, built year, gamma, ratio, if detected.

2. Added impish 21-10 and jammy 22-04 to ubuntu id. That's for Mint base ID. Not
huge point in updating if Mint doesn't update inxi, but there it is.

3. For -Axx, -Exx, -Gxx, -Nxx, shows PCIe speed and lanes. With -a, shows max 
speed / lanes if different than current speeds/lanes. Note that for unknown 
reasons not all devices in a PCIe slot show this data.

4. -Ixx: terminals added: foot, ate

5. -Sxx: login/display managers added: emptty, greetd, qingy, tbsm. See CODE 5 
for more info on how this change was done.

6. -Sxxx: status/dock/panel bars added: i3-status-rs, luastatus, nwg-bar, 
nwg-dock, nwg-panel, rootbar, sfwbar, wapanel, waybar, yambar

7. Added a Tyan board IPMI sensor data set.

8. Added support for fruid_print for Elbrus -M Machine data. Those boards don't
have dmi tables, but do ship with Elbrus OS which has fruid_print.

9. More disk vendors! Yes, you know the drill, the world turns, and with every
turn, a flock of new vendors appears, like baby rabbits emerging from their 
warren, endlessly, a stream that is the life essence itself... or something.


1. When xdpyinfo is not installed, user will still see advanced -Ga Monitor and
Screen data as long as xrandr at least is installed. Better error messages as 
well now to explain which tool or tools missing caused the missing data.

2. -Gxx will show basic Screen and Monitors, id, mapped, pos:, model, res, dpi, 
diag; -Gxxx adds Monitor modes; --Ga adds screen/monitor size, Screen diag.

3. -ba/-v2 no longer show the full screens/monitor report, now it remains basic 
mode output, which it should have always done, unless -G is also explicitly 

4. Split apart x-server version to v:, which should always have been the case.

5. Xvesa and Wayland no longer show glxinfo messages for no glxinfo for GL data.
Now they show their own custom messages, appropriate to the case.

6. json features now test for JSON::PP, JSON::XS, or Cpanel::JSON::XS modules,
and use whichever is found. Note I did not realize JSON::PP was in core modules
as of 5.14 so that makes sense to use, and will allow inxi to start using json
data sources, which are a lot easier to parse.

7. Changed -G drivers to show subsections for X and gpu drivers, and updated 
missing driver messages to account for this change. X drivers now show the sub
sets of loaded/unloaded/failed/alternate, and gpu shows active gpu drivers,
assuming such are detected.


1. Help and man page updates for -G Display/Screen/Monitor changes. Redid -G, 
-Gx, -Gxx, -Gxxx, -Ga. Added monitor layout position feature.

2. Updated -Ga for xrandr/xdpyinfo changes.

3. Updated --recommends to more accurately show function of xdpyinfo and xrandr
for -G and -Ga.

4. Reorganized and added complete table of contents to docs/inxi-data.txt


1. Slightly optimized use of array loads on disk_vendor() and ram_vendor() based 
on how it's now done for monitor layouts, which is more efficient, use a scalar 
to hold a reference to the array, that avoids having the array ever exist in 
more than 1 place. Part of the ongoing process of avoiding extra hash and array 
copies globally. 

2. Moved to consistent undef behaviors. 
 * For lists of variables use () to undefine, changed all of the the following: 
    1. (@a,$b,$c,%d) = (undef,undef,undef,undef);
    2. (@a,$b,$c,%d) = (undef);
    3. (@a,$b,$c,%d) = undef;
   to use: (@a,$b,$c,%d) = (); This undefines all the variables in the list.
   Note that assigning undef to @a in the first example creates an array of 1 
   key, with the value undef, and (@a,@b) = (undef,undef) creates arrays of 2
   indexes, or something like that. Not what was wanted.
   Examples 2 and 3 assign undef to @a: an array of 1 index, value undef, and 
   undefine the others variables in the list. This was not the desired behavior!
 * For most scalars, arrays, and hashes, use: undef @a; undef $s; undef %h.
 * For some hash and array index values, use $h{a} = undef. These cases may want
   the key itself to exist, with the value of undef, though I believe: 
    undef $h{a};
   is synonymous, but still have to verify that. 

I did some testing, and realized that some of the undef I had used in the 
various previous ways of using undef were not actually resulting in the expected 

3. Refactored display_data_x into 3 functions, added display_data_xdpyinfo and 
display_data_xrandr, which allows for more granular handling of those 
dependencies, now inxi can show most advanced display data with only xrandr

4. Significantly improved all error handling and missing data for Wayland/Xorg.

5. Refactored get_display_manager() to better handle corner case dm file or 
directory names, and to avoid endless loops. Much cleaner now. Required because
greetd had varying file names,, or just greet-546.sock. With some 
other dm's that use similar, or unreadable directories in /run, now just doing
a glob of /run/ /var/run, /var/run/rc.d as detected and checking for the dms
in the names, then just using the dms that were found. Simpler.

6. Massively simplified and integrated compositor logic in Graphics, now using
program_values() and program_data() as appropriate, and simple matching list 
to ps_gui data to get detected compositor[s], much simpler, far more efficient 
code, less to maintain. Also fixed long-standing weak spot of exiting on first
detected compositor, now shows all detected, with version etc for each if 

7. With 6. also significantly simplified and optimized get_ps_de_data() for 
desktop data, that's the ps aux fallback case for wm desktop detections. 

8. Made $wl compositors list global to avoid having to update each section, 
that's now used in -G compositor, -S desktop/wm, and wm sections. It is set 
in ps_gui() on initial load.

7. Settled on one and only way to do multiline conditionals, now use no space, 
use same indent level as starting if/elsif etc. I've been debating this one, but
can't find any real way to handle that elegantly so I think best to just not 
try, and leave it up the code flow to show when it's wrapped condition tests.

8. Refactored previous gl_output, expanded it to handle all interface types, 
OpenGL, EGL (not currently active due to no known tool to get EGL data for 
Wayland, and Interface: VBE type data for Xvesa. This roughly completed the 
breaking apart of the centric logic for Display, Monitors, and GL data, 
and make all sections now fully agnostic to display server or protocol type. 

Should new display servers appear, it will now be far more simple to add support 
for them, since they would just plug into the existing abstraction layers.

9. Added --debug-arg to allow for passing specific custom args to the debugger.

10. Refactored display_server version, now works much better, creates lists of
server/version, and xwayland as well if found.

-- Harald Hope - Tue, 22 Feb 2022 15:30:24 -0800

Version: 3.3.12
Patch: 00
Date: 2022-01-18

Small point release with some useful fixes, some bugs corrected, small 


1. Note on KNOWN ISSUES 2 from 3.3.10, I realized that the second level 
indentation actually takes care of that hanging parent, since now it's quite 
clear that its children are indented on the following line. So that issue took 
care of itself.


1. In $bsd_type cases, specifically SunOS triggered this, where sysctl was not
present (which it always is in all other BSD types), it tripped an error due to
failure to update to revised $alerts{'sysctl'}->{'message'}, instead was using
the old method. Failed to update that in refactor of CheckTools logic. Would
impact no supported operating systems, but is a bug.

2. Corner case, a combination I never used, inxi -a, triggers error in the RAID 
logic because the mdadm test was not run, generating an undefined eq error. Only
happened when mdraid was present and used on system.

3. Tiny bug, for st+mt cpus, like alder lake,  was printing out second tpc by 
accident which made it look like it said st: 4 tpc: 2. Just a small output


1. Added some fallback 32 bit system tests, [2345]86, like i386, i686.

2. Changed shell: Unknown Shell to shell: N/A, that was a legacy use, and was
obviously redundant. N/A is more consistent with rest of output no value found
handling. Due to requirement of doing empty tests, this is set in the data, not
output, generator component.

3. Refactored partition data logic to get rid of bsd tests for df -kTP, -kT, -k.
Now tests only to see if returns data, cascades down until it gets something. 
Now will attempt to reconnect hanging lines when no -P feature available prior 
to main partition data processing. This makes it agnostic to os issues, and it
just pays attention to feature support. 

Also adds in dynamic column count instead of hard-coded, this avoids oddities
and future proofs to some degree. Now systems will adapt seamlessly if support
for -P appears, or -T, or whatever.

4. Partitions corner case, where has zram, but has no partitions, failed to show
partitions no data found message since @partitions had data in it, but nothing
for partitions output to print. Seen in TinyCore for example, but might happen 
in other ram based systems.


1. Added Slint to distro ID, and slint/slackware to system base.


1. None


1. Typo in man page fixed.

2. A few more edits and corrections on 3.3.10 changelong. That thing was written 
concurrently with the development, and thus had lingering errors when things 
were changed in midstream.


1. Added --cygwin and --android fake system type flag. Switches on $b_android/
$b_cygwin flags.

-- Harald Hope - Tue, 18 Jan 2022 14:02:54 -0800

Version: 3.3.11
Patch: 00
Date: 2021-12-16

Quick bug fix release. With as many changes as we got in 3.3.10, there were 
bound to be a handful of oversights that were not caught in testing simply 
because those hardware scenarios were not present in the tested systems.

Also minor feature enhancement for CPU scaling min/max speeds.


1. Due to the huge amount of changes, and the speed of change, while the new 
code is working as intended, it's somewhat lacking in coding elegance since a 
lot of it was hacked out very quickly, in near real time. This will get cleaned 
up and refactored to be less redundant if it does not impact execution speed, 
but is not pressing since there should be no functional difference.


1. Tiny oversight, in single case CPU model id would fail because it was using
an undefined test from previous tests, not the right test, that is. Tripped
error on Elbrus for example.

2. Typo in battery secondary type status, created undefined value error. This 
was a recently created bug.


1. PPC revision change broke Elbrus revision test for stepping. Added in more
tests to show stepping for elbrus revision.

2. Single core Elbrus in cpuinfo fallback mode failed to assign core multiplier
so L1 cache failed.

3. In cpuinfo fallback mode, Elbrus E2C3 cache data failed to appear, that data
is not per block in cpuinfo, but is the last block, so those tests had to run 
on each block, not just the first one.


1a. Show for -Ca scaling min/max speeds if different from CPU min/max speeds.

1b. If no cpuinfo_min/max_freq speeds found, and scaling_min/max_freq found, set
overall min/max to use scaling min/max instead of cpuinfo min/max.


1. None.


1. Cleaned up and proofread better 3.3.10 changelog, it had a lot of errors 
because stuff kept changing.


1. Small code optimizations.

-- Harald Hope - Tue, 16 Dec 2021 16:14:08 -0800

Version: 3.3.10
Patch: 00
Date: 2021-12-13

Huge refactor of CPU physical/core/cache logic. That was some very old logic 
with a lot of hacks and patches, but it had never been actually rewritten to 
take advantage of Perl's far more powerful and robust data structures and logic. 
This caused a continuous stream of error cases in subtle ways, or not so subtle, 
and fixes were just changing how the errors manifested.

Tnanks very much to Slackware forum people for massive help,
and also to forum members for ongoing help and data and debugging.

Note Changes 5, change of default widths in display to 80 columns, and out (aka, 
console, or ssh into remote system), 100. You can still use other widths if you 
like something wider using the configuration options shown. Also upped max 
columns wrapping line starters to own rows to 110 columns from 90, again the 
idea being to make output more readable to other users when posted in public.

I've been thinking of this change for a long time, but was hoping -y would 
register with users, but it hasn't gained enough traction, so the result is way 
too many super hard to read issue reports, forum posts, linux kernel issues, 
etc, it's honestly gotten sort of embarrassing because they make it look like 
inxi has bad output. Sidescrolling code blocks in forums in particular are 
absurdly hard to read and scan rapidly for data.

Going along with the width and indentation changes, for most main row types, if 
they wrap to a second row, they are further indented 2 columns, to make it 
easier to see what they belong to. The two levels of indentation contain more 
useful visual cues as to what belongs to what.

There was a temptation to release this as either 3.4.00 or 4.0.00 but in the 
end, I decided to follow the numbering rules, and to just roll it to 3.3.10 
since there aren't really any primary new features even though CPU was basically
rewritten in large part, and big parts of inxi were also changed, upgraded, and
enhanced. But no truly new features, just some display control items like -Y,
--indent, --indents.

I hope this refactor meets its primary goals, and that the new defaults for 
display help resolve public posting issues which have grown increasingly 
annoying for anyone trying to read those pasted in too long outputs.


1. Android seems to have CPU cache data, but does not show any 'size' item. But
it does have the other data for each cache type internally, which is odd.

2. [See KNOWN ISSUES 2 for 3.3.12 above] In some instances, the parent key:value 
pairs with '' as value, those are parents of children key:value pairs, are left 
hanging at end of line, with the children on the following line. This can look 
awkward, but in other cases, actually looks very good, it depends if it's at the 
start or end of the line.

I won't say this is not correctable, but it would be very difficult, and outside
the scope of this release, but that is something that I may look at for a future
release now that the output generator logic was reworked slightly for Change 5b.

It's tricky though, because in cases where it's the first item on the line, you 
want that behavior, but when it's last, you don't. But this may be worth 
revisiting in the future.

3. In some cases, -Y + -y1 may lead to the start of the block scrolling off the
top of the visible screen. This isn't really correctable, so if that's an issue
for you, just don't use -y1 with -Y and all the output will wrap nicely.

4. There is an unaccountable ~10-20ms delay reading cpufreq/scaling_cur_freq, 
per thread/core, which really adds up on high thread count CPUs. There is a 
workaround in inxi to use cpufreq_cur_freq if it is readable, ie, if you are 
root or use sudo, but to fallback to scaling_cur_freq if can't read cpuinfo_...

This is a drag, and really looks like a kernel bug, or a frequency driver bug.


1. 3.3.09 and 3.3.10 CPU bug fixes:
* Failed to filter out certain virtual machine CPU core speeds, and showed more
speeds than the instance actually has. Noticed this with KVM running on Xeon 
* For many cases, L2 cache, particularly for Intel, was completely wrong, it was 
showing L3 caches, or L3+L2. Failed to handle cases where L2 cache belongs to 
more than 1 core, except for using a crude hack for AMD Bulldozer microarch. 
Older Intel Core 4 core CPUs would sometimes be 1 L2 per die, and the 4 cores 
were actually 2 core duo cpu dies, with one L2 cache per die.
* Shows wrong core count for complex core complexes like those found in Intel 
Alder Lake, now shows correct count of actual cores, regardless of the MT or ST 
state of each core.
* Showed invalid L3 cache values in some legacy cpus that had no L3 cache, that
is due to a bug in the dmidecode data itself. Solution is to never use dmidecode
cache data if any other valid L1, L2, or L3 cache data found for Linux, and to
only use dmidecode data for bsds if no L1, or L2, or L3 data found. Or if forced
with --dmidecode.

2. An unfortunately long standing bug found and fixed, thanks slackware users!
cp_cpu_arch was, and has been for a while, failing to convert hex stepping to
decimal, or test if the string it gets is even a possible hex value, this 
resulted in all Intel CPUs with stepping > 9 failing to ID correctly for cpu 

3. In a related bug, hex to decimal tool used to create --admin hex/decimal 
output for family/model/stepping was also not testing if the string was an 
actual valid hex number. Case in particular, power pc with revision field 
contained a long string, which was of course not a valid hex number, and that
tripped a Perl error when it was asked to convert a non hex string to decimal.

4. Long standing bug found while doing Change 5: inxi actually never applied 
separate in/out of dispay to widths because using a legacy boolean that was not 
updated, so it was always using out of display widths.


1. Incorrectly calling PowerPC 'revision' 'stepping' for -Ca, that is now stored
as $cpu{'revision'} to avoid mixing up the logics there. For PowerPC shows as
rev: [string].

2. Microarch:
* AMD family 15, model 2 as bulldozer, actually piledriver. 
* AMD family 17, model 18, was supposed to be zen/zen+, since I can't tell those
apart, seen stepping 1 is zen+, but had incorrect match.
* Intel family 6, model 25, stepping 2 as nehalem, should have been westmere.
* Changed Penryn to Core Penryn, intel family 6, model 17
* misc other micro arch fine tunings.

3. Code fix 8, switched to global %risc for arm, mips, ppc, riscv, sparc. This
corrects many sloppy handlers, and makes all risc processing the same, and calls
device tree readers for all risc systems, not just arm or arm and mips.

4. In cases where bogomips were 0 due to false values in risc results, show N/A.

5. Removed all attempts to guess at what /proc/cpuinfo cache size: refers to,
it can literally be anything, a per core L1, a per core or cpu L2, or an L3.
So applying any math to it is just a random guess at that point. If any L1,2,3
cache data is found, don't use the cache: value at all, but that will only be
present if no /sys data was found anyway, and if cpuinfo had no specific cache
type fields, only generic cache. 

6. Added failsafe tests for stepping and model id before doing conversion to 
hex. Make sure integer!

7. Added L1 D cache, was only using I cache for BSDs. Output will show total for
L1 A + L1 D. No idea why I didn't use L1 D, makes little sense, but that's how 
it goes.

8. Made bogomips tests more granular, now only rejects low sub 50 bogomips 
values if %risc cpu type. Legacy ancient cpus like 486 could and did have 
bogomip counts below 50.

9. See Enhancement 12 as well. If OpenBSD, which has no per core data or 
physical cpu data, is running on MT capable cpu, but for security OpenBSD has 
disabled MT, will now force MT to be not shown via the hw.smt value. This 
removes a small glitch that would have bothered OpenBSD users who know that 
OpenBSD has disabled MT for security purposes.

10. Changed BSD hack to use L2 cache totals to deduce > 1 physical cpus, that 
was flat out dumb, since we can just use dmidecode type 4 to iterate physical 
cpu counts and skip the pointless logic. Thus, if dmidecode, and if > 1 
dmidecode type 4 found, and if physical cpu counts equal 1, then replace the 
found counts with the dmidecode physical cpu counts.

11. Corrected bad assumption that threads would always be 2 per core for MT 
tests. Revised logic should handle this case fine now, and show correct thread 
count per core.

12. Fixed 'parameters:' going to its own line with -Sa, that wasn't supposed to.
-S is two lines, the kernel / host stuff, and the desktop/console/distro stuff.

13. Fixed case when key: value first word plus other parts of line longer than 
max width, failed to wrap as expected.

14. Added start/end ' and " to existing start / end \s trims to main filters.


1. CPU: most Linux will now show L1 and L3 cache with -Cx without needing 
sudo/root, and it will be more accurate than ever before.

2. CPU: shows per CPU L1/L2/L3 totals, and shows actual full system physical 
processor count * L1/L2/L3 total in parentheses, like: L2: 2x 1.5 MiB (3 MiB).

3. CPU: A long standing annoyance, previously for main CPU 'Speed:' item, showed 
the fastest core speed found, now shows avg: [speed] and with -Cx, shows the 
'high:' as well if > 1 cores, and if 1 or more cores have a higher speed than 
the other(s). 

4. CPU: Handles advanced cases of new architectures, like Alder Lake with 
Performance and Efficiency cores, future Zen, and existing ARM CPUs with 2 or 
more different core sets, with different max/min frequencies. Previously a hack 
was used to handle only ARM CPUs with this type of architecture. Will show 
correct CPU core counts, which previous inxi versions would fail to do for Alder 
Lake type scenarios of 8 single threaded CPUs and 4-8 multithreaded )MT) 
perforance cores.

This should also in theory show different the different min/max speeds if they 
were detected. Those did not seem to be set correctly in Alder Lake sample data 
I saw however, P and E cores were set to the same min/max speeds. 

[Update 3.3.12: more research suggests that for now, 1 cpu physical body will 
contain one clock generator, so that is not a mistake. Future CPUs may add a 
second clock generator but that is probably very complicated to implement, which 
is why ARM complex cpus simply use two cpus, with different clock rates when 
they want to run different speeds for efficiency.]

5. Added CPU types MST (Multi+Single Thread), AMP (Asymmetric Multi Processing), 
and AMCP (Asymmetrical Multi Core Processor). This will be applied to any CPU 
that has this type of complex topology that has been dynamically detected, like 
Alder Lake or different core count or min/max speed RISC CPUs.

6. CPU: shows with -Ca for cases where different L1/L2/L3 caches found per 
physical CPU, as with Alder Lake, but also many other variants that were poorly 
or not at all handled before, how many of each cache type (L1 Data, instruction) 
were found, otherwise will show how many of each cache were found. 

7. CPU: shows with -Ca in Topology: report, for cases like Alder Lake with 
different core types in one physical CPU (type: MST AMCP), the number that are 
single threaded (st) and number that are multi-threaded (mt).

8. Basic support for rsyc-v systems, going along with code fix 8, fix 3, now 
it's easy to add this type of support.

9. Added shortcut options for --filter-label (--zl), --filter-uuid (--zu), and
andded new filter option, --filter-vulnerabilities (--zv). The latter is added
by request, a decent idea to have option to not show cpu vulnerabilities.

10. Going with fix 7, switched to a sort of pseudo L1 d/i with desc report for
any BSD with L1 I/D cache found, or elbrus cache0 (icache) / cache1 (d cache).
Elbrus should hopefully be handled by the /sys tool. Guesses on the L1 are ok,
since those are almost always per core, so it's fine. Didn't expect to enhance
any BSD cpu data this time around, but there you go!! If they have the data, 
then it will be used. Not going to go overboard though in that, quite useless
overall since usually can't see how many CPUs are present, at least not usually.

11. For -Ca, full CPU topology report if any complex topogy is detected, 
otherwise shows the same basic Info: 2x 6-core or Info: dual core as before, no 
point in wasting a line for something with no more data than the short string. 
Complex types include MT CPUs since they will have different thread counts etc, 
and will have 2 or more threads per core, which will also be listed. 

12. If smt status is defined (0/1), shows smt: enabled|disabled in Topology 
section, can be useful for systems with disabled MT, but supporting it. If no 
topology data found (OpenBSD for example), for -C shows 'smt: disabled' after 
'type:' section, and enabled if -Cxxx (since MT really already tells you that).

13. For -Ca Speed: report, added scaling: report, with childrend 'governor:'. 
Can show 1 or more active governors. Also shows scaling driver:. Shows if either 
is available.

  driver: ..
  governor: ..
These may be quite useful over time to help diagnose or debug scaling issues.

14. Output height (in lines) control: -Y [-3|-2|-1|0|1-xxx]]. This lets you 
break up any of the output into whatever number of lines you want. Also useful 
out of DISPLAY for reading -h options menu items etc.

It came tp my attention that the long standing shift+pgup/pgdown (aka 
'softscrollback) behavior had stopped working in kernel framebuffer mode, and in 
fact has been removed from the current Linux kernel, at least until it is 
rewritten to be more clean and understandable. Read more about it in these 
kernel post/commit messages:

Options for -Y are:
* -Y 0 or -Y: Set maximum block height to terminal line height.
* -Y [1-xxx]: Set maximum block line height to given integer.
* -Y -1: Print out one primary data block item at a time, with -F for example.
* -Y -2: Do not remove color codes when piped or redirected. Mostly useful for 
         piping to less -R, to preserve color codes.
* -Y -3: Restore default unlimited height if LINES_MAX configuration item used.

15. And finally, more disk vendors/vendor ids. As usual. As expected.


1. If /sys or /proc/cpuinfo speed data available: 
* For -b CPU item:
   speed: [speed MHz] min/max: [min]/[max] MHz
   speed (MHz): avg: [speed] min/max: [min]/[max]
* For -C, Speed item 
   Speed: [speed MHz] min/max: [min]/[max] MHz Cores (MHz): ...
   Speed (MHz): avg: [speed] min/max: [min]/[max] cores: ...
* For short form, shows speed/min/max but uses average speed if available.

For -b and -C, only shows one MHz in Speed line starter, which slightly shortens
the line even with the added 'avg:' item since 3 MHz are replaced with 1. 

2. Going with change 1, now the 'avg:' item shows not the fastest cpu speed 
found, which was the case before, but shows an average of all cpu speeds found.
Showing the fastest made some sense back in the days of single core, or even 
dual core CPUs, but makes little sense today with many core/threaded cpus.

With -x, it will show the high: [speed] item as well, after 'avg:'.

3. By suggestion, wrapped first Type item in Vulnerabilities to its own line,
that's a verbose --admin option after all, no need to save lines!

4. Going along with Fix 5, give up on trying to pretend we can guess at L2 
cache, now if only 'cache' data was available from cpuinfo, will just say:
cache: [cache size]
 note: check
and call it a day.

5a. Change default width to 80 columns in display, and 100 and out. Too many 
users are posting horribly wrapping inxi output in forums, issue trackers, etc, 
and it frankly makes inxi look really bad, creates awful side scrolling code 
boxes, etc. So now default widths in and out of console are 80/100 (since often 
data is generated in SSH or out of X/Wayland) for issues. 

This essentially makes -y 80/-y the default width in display, and a wrapped 100 
out. This is what I've been using for a few years now, and after seeing far too 
many side scrolling or badly wrapping inxi outputs online, I think it's probably 
time to just force 80 column widths as default and call it a day.

You can change these new defaults using configuration options (these are the 
previous options, though due to a bug, COLS_MAX_CONSOLE was never being used):

 COLS_MAX_CONSOLE=115 # in display, terminal client max width 
 COLS_MAX_NO_DISPLAY=130 # not in display, no X/Wayland running
5b. Made second and greater rows of a line indent +2 to make it more clear that 
it is a child row of its parent row. Note that because no arg short form and -I 
are special types of rows, this behavior is not used, they just print out as 
usual. This makes for more readable and easy to follow flow of output data.
6. If > 1 physical cpu detected, no longer uses single/dual/triple/quad core 
strings, rather uses: 2x 2-core. Also uses lower case -core, not -Core.

7. Only show die counts for CPU (on rare occasions > 1 found) with -xx. Not 
particularly important bit of data afterall.

8. Make L1, L3 cache data show with -Cx, not -Cxx, now that it's working well.

9. Removed CPU die for -Cxx, that's only going to show with -Ca now.

10. If -Ca, and if certain complexity conditions are met, shows a separate 
Topology line rather than the Info: 6-core type item. For -b, short, -Cx, -Cxxx
shows the Info: topology short form.

11. Bogomips always shows before flags data, whether -f or just -Cx trips flag
output. This places bogomips at end of Speed: line, after the core speeds.

12. Flags/Features now shows in the same place, under Speeds: always, whether 
-Cx shortlist, or -Cf full list. Makes more sense that way, and code is much
cleaner too.


1. Updated man/help for new CPU extra data options and output changes. 

2. Cleaned up and added sample outputs for man CPU items. 

3. Now that doas is getting into Linux distros, removed all mentions of doas as
a BSD option, and made it a general doas/sudo item. Glad to see doas making it
into linux distros, it's a good tool, much easier to configure and use than 
sudo. Good job OpenBSD guys. Note that inxi already has had full doas support 
for a while now, but this finalizes it, and makes it fully agnostic. Internally
doas is actually preferred over sudo, by the way.

4. Added documention items for INDENT (--indent), INDENTS (--indents).

5. Re-ordered help menu and man page, created new Filters and Output Controls 
sections to make stuff easier to find. In man page, also added on top a list of 
OPTIONS sections to make finding stuff easier.


1. Removed legacy /sys cpu functions: cpu_bugs_sys(); get_boost_status(); 
set_cpu_speeds_sys(). get_caches() was only a placeholder for the full featured 
cpu_sys data source, and was removed; cpu_speeds() no longer needed, integrated 
into other logic; cpu_dies_sys() removed, integrated into other logic.

This logic is now integrated into cpu_data_sys() data generator.

2. Changed the main CpuItems functions to use array/hash references, not passing 
full hashes or arrays in most cases now.

3. For machine_data_soc(), switched to CpuItem::cpuinfo_grabber() which then 
sets the global @cpuinfo and %cpuinfo_machine items, which will be used again
in Cpu if cpu data is requested. This gets rid of a full parsing of cpuinfo
just to get the machine data section, and also makes it so cpuinfo in cpu does
not need to worry about the machine data block, which is not related to the 
processor blocks anyway, that was always a hack done by the kernel guys to toss
that SOC data somewhere as far as I can tell.

4. New tools: 
* get_defined() - takes a list, and returns the first defined element of list.
* regex_range() - generate ranges from comma, space, or ranges like 2-29, or any 
combination of those, like 3,6,12-29

5. Added --force cpuinfo to bypass all /sys based cpu logic, useful for testing
to see what would have happened using old logic.

6. Added --dbg switches 39, 40, 41, for the new cpu sys data features, also made
more consistent --dbg 8 and --dbg 38 switches.

7. Added sys/cpuinfo pair debugger to support debugging complex sys/cpuinfo 

8. Got rid of $b_arm,$b_mips,$b_ppc,$b_sparc, replaced with global %risc, also
added $risc{'riscv'} type. this makes general risc type feature testing a lot 
easier since inxi can either test for %risc defined, or for a specific type of 
risc cpu. This is much cleaner, and use $risc{'id'} for print purposes, which 
got rid of a lot of tests. Also made all risc tests consistent, some were ARM 
only, or arm/mips, but were supposed to be for all risc cpus.

13. Made help menu code more or less wrap to 80 columns, or close. Ongoing to
bring to 80 columns where practical, but never at expense of clarity or logic.

10. Changed all xxx_cleaner subs to clean_xxx, all filter subs to filter_xxx, 
and row_defaults() to message().

11. Dumped redundant fallback logic in get_kernel_bits, if first getconf method 
fails, use $sys_bits, and call it good, it was repeating the 32/64 bit tests 

12. Cleaned up print_data() to allow for more fine tuned indentation for the new
2 indent levels.

-- Harald Hope - Tue, 13 Dec 2021 10:25:49 -0800

Version: 3.3.09
Patch: 01
Date: 2021-11-22

Thanks manjaro user alven for finding a bunch of corner and not so corner case 
errors, glitches, documentation oversights, etc.

This is a point release between the coming full CPU refactor and the current
set of bug fixes and issue handlings.

This release also contains the debuggers for the new CPU data logic, which are
important to get this CPU refactor stable and reliable across old/new systems,
different operating systems and platforms.

Wanted to do this intermediate releaase to get the current fixes out, which 
make inxi overall better for CPU issues, but do not handle the core requirement
to do a full refactor.



1. On release notes for 3.3.08: due to a long delay to get real debugger data 
from the person who had the issue, but finally getting it after the release of 
3.3.08, there was NO bug in ps wwaux output. Something else was creating the 
linewraps, maybe the subshell, it's basically impossible to know since we never 
got a real debugger data set, which is the only real way to get the actual same 
data inxi will see. 

Was it a subshell wrapping the output? We just can't know, nor are we likely to 
ever find out.

This highlights very well however why some issues are essentially impossible to 
ever fully resolve without the --debug 22 dataset. This bug/fix is definitely in 
that class of issues.

It's never good to accuse another program of having a bug when it doesn't, so 
sorry to ps authors, no bug or issue exists for ps in this area.


1. wiryonolau issue #259 points out that if --tty is used, default IRC filter
rule is still active and on. Because his case appears to be from an autostart 
using Bash, which then gives up to find the parent at dash, which then makes
inxi believe it's in an IRC shell client, that issue doesn't appear to be 


1. Documentation, help menu and man page showed wmctl instead of wmctrl, 
which for someone who reads the help man, leads to command --fake wmctl failing.
Thanks manjaro user alven for finding this typo.

2. For dmidecode cpu data, had global total values for cache that could result 
in wrong output values, 2x or more wrong for L1 / L3 cache on linux. Difficulty 
is preserving that data for bsd, which in general do not show phys cpu counts, 
and thus make showing totals off. Created new '-total' item for each L cache 
type, which will handle > 1 cpus, and also can be used to determine if > 1 cpus 

3. Manjaro user pointed out that hub types were wrong, this is because inxi was
using the INTERFACE ID values for hubs instead of the TYPE values. For all other
device types, INTERFACE is correct, but for hubs, we needed TYPE, so fix is to
detect INTERFACE 9/0/0 and if TYPE present for that, swap.


1. For > 1 cpu systems, with dmidecode sourced cpu cache data, can now determine 
physical cpu count based on comparing L2 and L2-total values. This means that 
when dmidecode is used on BSD for CPU data, inxi may now be able to deduce that
it is a > 1 cpu system.

2. Forgot to set $run{'filter'} to 0 for whitelist start client detection.

3. Going along with bug 3, changed 'Full speed (or root) hub' to:
Full speed or root hub, to make more clear that it's one or the other, or both.

4. For apply_filter(), added test if  just return the 


1. Going with bug 1, and fix 1, for > 1 cpu systems, will now show for all 
cache: items L1: 2x 1.5 MiB (3 MiB), same for L2 and L3. This is far less 
confusing than showing the totals without explaining what they are.

2. Going along with 1, now root is not required to show L1 and L3 -Cxx on Linux
as long as the system is reasonably new, about after 2008, and has getconf -a 
supported. That support is came in somewhere around 2.10, not sure exactly when.
Debian Etch had it, Sarge did not, Ubuntu 9.10 had it. Tinycore does not have 
getconf at all. This will probably be replaced by a more robust full cpu /sys 
data tool.

3. Added ht to default short -Cx flag list, that should show, and it's short.

4. Added --no-filter to activate -Z, --filter-override isn't consistent with
other --no-xxx options, even I forgot it. No changes, just another way to use

5. For issue #260 added pch as a new sensor output type, it's kind of a builtin
southbridge / northbridge in the CPU die, but it's not a core, and has a 
different temp. Will anyone even know what pch is? probably not, but who cares.


1. No longer showing for > 1 physical cpu systems the sum total of L1/2/3 cache
data. Now shows per cpu L1/L2/L3, and if > 1 cpu, shows for example:

cache: L1: 2x 512 KiB (1024 KiB) L2: 2x 2 MiB (4 MiB)  L3: 2x 20 MiB (40 MiB)

For single physical cpu output remains the same:

cache: L1: 576 KiB L2: 3 MiB L3: 16 MiB


1. Updated help/man for L1/L3 cache -Cxx changes.

2. Updated man and help to suggest -Z for --tty.

3. Forgot to note -v 7 adds -f, added to man/help.


* Added 'getconf -a' to debugger, that may be usable for cpu cache data, need to
gather data on that to confirm. that's regading issue #257 cache glitches.

2. Removed all * $physical_count for cache data in cpu_properties, that is now
handled by creating string with cpu count, per cpu caches, and total in parens.

3. Added in fallback failure case for the ZFS file system issue exposed by 
accident in issue #258 - will now log in debugger the error, so we can try to 
find what is going on there, impossible to reproduce until we find what zfs or 
more likely, freebsd, changed there. Could be hyper specific, some weird thing 
like a person making a zfs device name with space, impossible to guess. Note 
that since the freebsd user declined to supply any data to help resolve this 
issue, then closed it, we're back where we usually end up with FreeBSD issues, 
either a Linux user (or worse, me) willing and able to find the issue and supply 
the debugger data required shows up, OR the issue is ignored as valid but 
impossible to resolve.

RANT: Note that this also confirmed to me that in order to preserve my own 
sanity and not waste endless hours trying to get data, from now on, unless 
utterly trivial, if a FreeBSD user refuses to promptly supply the required data, 
the issue will be closed with a freebsd-closed-no-data-supplied label, which 
means, valid but not possible to solve due to user refusing to help me help 

Come on FreeBSD users!! If you want help, and inxi to support your distro, help 
me help you!! If not, then why are you even filing an issue in the first place? 
Do you expect faeries to spread magic bug / issue fixing faerie dust over inxi 
and then activate it with their little wands? This is growing tiresome to be 
honest because it's so utterly predictable. 

4. Shuffled order of sensor type detections, there was a slim chance that a non
gpu sensor type could have string intel in it, so put the gpu sensors second 
to last, before 'main'. 

5. Started refactor of cpu core/cache logic. Added feature to cpu_arch, and 
changed it to cpu_info since now it gives by vendor/family/model/stepping both
micorarch and cache/core math array returns. Also started refactor to make more
predictable, with increased comments, about what is going on in cpu_properties
to avoid breaking existing correct results.

6. Added to --debug /sys cpu data globber tool, that will help debugging the new 
/sys cpu data feature, will let me insert the file data directly into the logic.

7. Added CpuItem::cpu_data_sys() with debuggers, that will now start collecting
user cpu data whenever the debugger is run, though it's not active yet.

8. Set $Data::Dumper::SortKeys = 1; dugh, could have saved big headaches if had
found this before. Makes all keys sorted cleanly, gets rid of random hash sorts.

-- Harald Hope - Mon, 22 Nov 2021 12:45:00 -0700

Version: 3.3.08
Patch: 00
Date: 2021-10-21

Bug fix release. 2 bugs that can impact all users under the right circumstances
were detected and fixed. Thanks manjaro users there for finding and reporting 
those. No other changes.




1. Manjaro user ben81 located a critical bug in hardware raid output, this bug 
impacts ALL users of hwraid that run inxi with -xx option. Bug was a bad copy 
paste, the classic, had updated all the pci type data blocks at once, and hw 
raid unfortunately had a slightly different logic due to being part of the more 
complex RAID block of logic. Was trying to use an array, not a hash, reference.

Thanks ben81, I would never have spotted this one, and it would impact 100% of 
all inxi users with hwraid on their machine who ran inxi with -xx option.

2. Also, ps wwaux parser was spitting out an undefined index error. This is 
caused by one of two things:

* ps has an issue, and is apparently at times failing to respect ww, unlimited 
line length, and wrapping anyway. This is the likely cause.
* the user terminal for some inexpicable reason has decided to hard wrap long 
lines. This is very unlikely, but has to be considered as a possible cause. 
Since these commands run in a subshell, this is VERY unlikely.

Workaround this failure by double checking that line split item is defined, if 
not, next row. Thanks Carpenter for finding that one.










1. Added workarounds for bug 2. Corrected silly copy/paste error for bug 1.

-- Harald Hope - Thu, 21 Oct 2021 12:28:15 -0700

Version: 3.3.07
Patch: 00
Date: 2021-10-11

Some very nice issue reports have helped correct various corner case issues. 
Mint users helped find a big one with lspci.


1. Unsure how to handle Android case where inxi correctly does -r test, see bug 
3 fixes 6, but android incorrectly claims it is readable when it is not 
readable, then the reader tool can't read the file and fails with permissions 
error. This is one of those weird android errors that are pretty much impossible 
to fully work around, but we can get rid of the readline() errors when reader() 
was trying to work on a file handle that did not exist, that part was an inxi 


1. dm detection was not using case sensitive search for duplicates, leading to 
cases where dm like slim / SLiM failed to get detected and then repeated in 
output. Anonymous BSD debugger dataset exposed this issue, thanks.

2. In certain corner cases, like ARM Android, sub reader got passed a file that 
had passed the is readable -r test, but it still failed with permissions error, 
which then led reader to try to keep working with a null $fh. While in theory 
nothing non readable should be passed to reader(), that fails when the OS fails 
to actually follow correct readable rules, as in this case. Added protections in 
reader() to handle this case, now will show error, but will not try to work with 
$fh, that is how it should have been all along, but this is a very corner case. 
Exposed by an anoymous ARM debugger dataset.

Thanks Termux user for creating the debugger dataset that exposed this issue.

3. lspci parser didn't null port value each iteration, resulting in all pci 
items getting port values. Not a big deal, port is only used one place, but good
to find and correct that error.

4. Not an inxi bug, but would appear so to end users: lspsci -nnv implements a 
truncating routine and breaks the first line for each bus id. See Fix 6 and Code 
fix 3. 


1. -S and -I would show Console: tty pts/3 even though pts device is a pty, not 
a tty. The only time this happened was when connecting to a remote system using 
ssh or something like that. Local console still shows Console: tty 2 since that 
was correct, but Console: tty pts/2 was confusing since technically it's not a 
tty, it's a pty, pseudo terminal.

Now shows, when relevant: Console: tty 2 OR Console: pty pts/2.

2. Issue #252 notes that Emacs (and possibly other code/text editors with native 
embedded terminals) includes a native virtual terminal that also follows 
configuration rules from the editor to highlight trailing spaces. This created 
odd looking screen output in Emacs vt mode since inxi always sets key/value 
pairs with a white space ending as separator for next key value pair for screen 
output mode, resulting always in a trailing space on each vt screen line. Fix 
was to remove the last trailing space just prior to the print line point to 
avoid this issue.

As a general thing, I'm curious to learn if any editor other than Emacs actually 
contains its own virtual terminal that also follows the editor rules for output. 
Or if any virtual terminal has such a highlight trailing space rule, which would 
be imo so annoying it's hard to understand why a vt would implement it. Easy to 
understand why Emacs (or any editor) does it, but an editor also being a vt AND 
applying certain editor display configurations to the vt is a very specific and 
unique circumstance I'd say.

Odd, historical, but there it is, why not handle it?

3. ARM / Android case where certain files passed the read -r test, but failed 
with permission denied error. This tripped a further glitch where reader() would 
then try to work with the failed $fh, see bug 2. This was really more a fix 
than a bug, since the bug in this case was in android permissions tests, not 
inxi, but it appears to be a bug to end users, so it's handled now.

4. Another ARM/Android, there was a voltage regulator IP that contained the term 
wlan so it tripped false positive for network match. Added a new type, 
regulator, to filter out those, like codec and dummy do already.

5. For issue #254, fix for cygwin ERR-102 in partitions, add cygwin test, new 
dev type, 'windows', dev base then becomes E: or whatever. To avoid confusing D: 
for a key: with no value, added D:/ slash.

6. Mint people discovered lspci issue, lspci -nnv has a bug where it will 
truncate the output of the first line per bus ID if it's over some arbitrary 
amount, then tack on rev and other items to end of that string, which leads to 
the block: [vendorID:productID] getting truncated or removed altogether. Clearly 
an oversight, at least I hope it's an oversight on lspci's part, but have to 
work around the issue anyway since it may never get fixed, and has been around a 
long time. Bug is in lspci 3.7, 3.6.4, and probably earlier. 

Also added in a fillin tool for this rare case, lspci -n data is used to replace 
the missing values.

Note that while lspci recommends using -mmv, for machine parsing, apparently 
nobody noticed that -mmv doesn't have the same data items as -nnv, sigh.

7. Issue #255 noted that the combination of:
GoogleDrive Hogne: fuse.rclone 15728640
which is two word remote fs AND a fs type with a '.' in it would fail to trip 
the handler for that multi word remote mount name. Also failed to detect as 
remote fs, added fs specific test since the actual mount name doesn't permit
reliable detection as remote type. Testing for trailing ':' isn't safe since 
':' alone is not an invalid character in a file system name as far as I know.

Further, this exposed that the ^^ space replacements for $row[0] fs > 1 word 
name were not being reset soon enough in the logic, that's also corrected.


1. Neglected to support standard package config file override 
/etc/inxi.d/inxi.conf item. This is mainly useful for packaged inxi's who want 
to override the distro maintainer /etc/inxi.conf file. Test priority is the same 
except /etc/inxi.d/inxi.conf comes right after /etc/inxi.conf now in the test 

2. Added basic cygwin id, yes, inxi works in cygwin, apparently, with some
issues. Added cygwin os id to distro ids. 

3. Added --version info for debugger, sometimes we want to know what verion of
a tool, like lspci, in case it has a bug or something.

4. Added exfat and apfs to unmounted fs types.

5. More disk vendors!! New vendor ID matches!! Yes, yes, you've heard it all 
before, the list never ends!! The eternal chaos of existence manifested in just 
how many IDs can be generated for new and old disk vendors alike!!! 


1. No changes this release.


1. Pull request #253 corrected typos, urls, and other errors in man page, 
inxi/pinxi comments, pinxi.1/inxi.1, README.txt, and updated LICENSE.txt to 
current gnu wording.


1. Forgot to add lspci debugger fake data option, that's corrected. That's 
--fake lspci, now works, didn't before, only the bsd pci tools had fake switches 
previously, since lspci never needs debugging really, but did now to test an 
issue report.

2. Added -CYGWIN to debugger file name. Added -ANDROID if ARM and if android.

3. With Fix 6, refactored entire lspci_data block, added lspci_n_data item, 
which matches bus id of lspci -nnv when corruption occurs and replaces vendor, 
product, and if also missing, rev version. I kind of knew I'd have to do this 
fix one day, that was the same fix logic used on the BSD pci tools, which have 
similar issues with consistency in output, or lack thereof.

This refactor is long term very good because it avoids an entire class of 
possible errors, and makes pci detections far more robust.

4. Created new repo, for legacy code, inxi-legacy. Moved branch inxi-c to 
inxi-legacy/xorg-c, moved branch xiin to /xiin, moved branch inxi-legacy (binxi) 
to inxi-legacy/inxi-legacy. Those directories each contain all the files each 
branch had in it. 
This gets rid of some branches clutter, and nobody needs to see those anymore, 
but if they care, they can look at them. Note that to do this, I had to merge 
their histories, which was not that nice, but git is just really bad at this 
type of stuff, so that's how it goes.

Times like this really make me miss svn's directory based branch approach...

5. Simplified sub fs_excludes, simplified regex constructors for all function 
that use this data, made list more fault tolerate by adding global (fs)?(\d{0,2}
which means all file systems can have or not have 'fs' at end, and all can have
or not have a version number in string.

6. Exposed by issue #255, refactored slightly ordering of partition filter
logics and variable resets in the df output processing loop.

7. Added --fake partitions, to help debug odd corner cases like cygwin glitches.

-- Harald Hope - Mon, 11 Oct 2021 19:01:15 -0700

Version: 3.3.06
Patch: 00
Date: 2021-07-21

New version! Fixes!! Bug fixes! More bug fixes!! Cleanups!

Most of these were exposed by issue #251 filed by LukasNickel, then further
revealed via his debugger data set, which showed two more bugs. Well, bugs,
changed syntaxes, same difference to end users.


1. Work is ongoing to add btrfs support to -R (similar to softraid or zfs), 
basic stubs and debuggers added, but reporting tools are not as robust (and 
often require sudo/root for reasons that escape me) as I would have hoped, so 
it's slow. One of these days... Normally would not release with working stubs, 
but there were enough real issues/bugs to warrant just getting 3.3.06 out the 
door, then going on with the btrfs feature for -R. But so far I view the 
reporting tools as inadequate, unfortunately.


1. As initially discovered in issue #251 there are alternate syntaxes which had 
never been seen before for remote mounts, fuse mounts, etc. In this case, it was 
fuse.sshfs that was not removed from the Disk total:... used: leading to silly 
1000+% used percentage. Note that while technically inxi could try to be clever 
about reporting impossible percentages, so far those have led to bugs getting 
reported, then fixed, so I think it worth leaving it as is.

2. When --swap/-j is used with no other arguments, failed to show uuid or label. 
Discovered this while testing fix 2.

3. Bug which is not a bug but will appear as such to users, nvme temps were 
failing in -Dx due to a change in how those values are located in /sys. See fix 


1. Going along with Bug 1, and considering that only in 3.3.05 was the nfs4 
remote fs failure to identify/exclude, the entire section involving remote/ fuse 
etc file systems was refactored, and extended to add many more previously 
non-handled remote and fuse type file systems. Significant extension of known 
remote filesystem types, distributed file systems, overlay file systems, all to 
try to avoid having more distributed/remote/fuse file system issues. Also added 
test to support fuse. or fuseblk. type prefixes for any of these. Hopefully 
there will be fewer issues related to distributed and remote and overlay type 
file systems in the future.

2. Made all label/uuid triggers global, that is, -ol shows unmounted with 
labels, -ju shows swap with uuid, and so on. This may require a bit more tweaks 
to get exactly right, but in general, this is a purely cosmetic fix, that is, 
try not to show label/uuid for partition/mounts that probably can't have those 

3. There was a change in the way nvme /sys temperature paths were handled, an 
actually understandable, albeit as always annoying, one, because inxi actually 
had to do a sort of convoluted hack to get the nvme block devices temperatore 
paths before, now that hack is not required for newer kernels (5.12+), though 
for kernels that had the old paths (5,8, 5.9 at least, don't know when paths 
changed) left in the old method. Now tests are more granular, and inxi should 
find temperatures regardless of which method is used for nvme and sd type 

4. Another somewhat irksome random change, again, understandable since the new 
syntax is more consistent in output than the previous one, but still breaks all 
existing parsers that use the changed field names. Lsblk did NOT change the -o 
input field names, but DID change the output field names, which broke the 
internal inxi parser, and led to null lsblk data. 

Changes were - or : separators in input values are output as _ always. that is, 
MAJ:MIN becomes MAJ_MIN. Also corrected the debugger lsblk to use the same 
output fields for -P -o as the actual lsblk parser uses internally so these 
failures can be spotted more readily, as it was, it was literally only because 
someone submitted the debugger dataset, and was running lsblk 2.37, where I 
believe this behavior change happened. Solution was to just use regex patterns 
instead, [:_-], in the parser. Big fear now is that they will randomly stop 
supporting the -o input field names that contain - or : and change that too 
without any real warning or deprecation notice.


1. Going with bug and fix 1, added avfs, afs, archivemount, avfs, ceph, gfs, 
glusterfs, gmailfs, hdfs, ipfs, kosmos/kfs, lafs, mergerfs, mhddfs, moosefs, 
ocfs, openafs, orangefs, overlayfs, pvfs, s3fs, sheepdog, vmfs, and several 
others to the exclude list for disk used and show label/uuids for partitions. 

2. A smattering of disk vendors added. 


1. Going with fix 2, -l and -u no longer will trigger -P by default, now if -l 
or -u are used without -j, -o, -p, -P, an  error will explain that you must use 
one of those together with -l or -u. This was the only way to get the -l and -u 
switches to turn off/on label/uuid reports in swap, unmounted, and partitions 
consistently. Triggering -P was really a legacy behavior from when the only 
options were -p or -P, and --swap and --unmounted did not exist. I found it 
increasingly odd that unmounted would show label/uuid always but partitions only 
with -l/-u.

2. This was a pet peeve, sometimes field names just bug me (like 'Topology: did 
for CPU, now  corrected to Info:), the Drive: rotation: was one such annoyance. 
I had recycled that to indicate SSD, which was a feature request, but that was 
always a sloppy solution, and made no sense, since SSD isn't a rotation speed.

Now it reports a much more logical:

ID-1:...... type: HDD rpm: 7200 
ID-1:...... type: SSD
ID-1:...... type: N/A

This also corresponds to the intended meaning much better. The HDD type was 
always present internally if rotation speed is detected, but was not used. Now 
will also show type: N/A if reliable type detection failed, which will also be 
more consistent.


1. Brought most of inxi.changelog (this file) into a consistent state, re 
whitespaces, readability, consistent use of various header / section names. 
Ideally while I don't expect anyone to ever sit down and read this changelog, it 
will be now much easier to scan to find whatever interests you. This change goes 
along with ongoing changes in docs to in general try to be usually 80 columns 

2. inxi-resources.txt, inxi-data.txt are updated with more raid, partition, file 
system values and data to go along with bug, fix, enhancement 1.

3. Man and help updated to indicate -u and -l no longer trigger -P by default.


1. Ongoing refactors, bringing the codebase to the point that matches current 
coding styles. Removed remainder of whitespaces in conditions and for/while 
loops, for example:

if ( condition ) { 
if (condition){
if ( ( test set 1 ) && ( test set 2 ) ) {
if ((test set 1) && (test set 2)){

and so on. That dropped over 2 KiB of whitespaces. This went along with fixes 
that have been ongoing to change to this whitespace use style, but previously it 
was only being  done when that situation was hit in a local block, now it's been 
completed globally.

This continues the style refactor that has been ongoing for a while now, to 
bring inxi into a consistent state, since when it started, it was more pressing 
to get the bash/gawk mess translated to Perl than it was to get the Perl itself 
to be as good/consistent as possible, so now those issues are being slowly 
unravelled, and hopefully will set inxi on course for its next 10 years.

It was starting to get annoying, because some parts of inxi used those spaces, 
and all newer ones didn't in general. Now it's one behavior throughout the whole 
program file.

2. Refactored the entire fs exclude for disk used data, and integrated those 
values into a global tool that is used either to exclude file systems from disk 
used totals, or to not show uuid/labels for the excluded 
remote/distributed/overlay type file systems, which in general don't have uuid 
or labels.

-- Harald Hope - Wed, 21 Jul 2021 18:23:21 -0700

Version: 3.3.05
Patch: 00
Date: 2021-07-11

Many small updates, enhancements, bug fixes!!! We've been saving them up!! Here 
they are!! Don't wait!!

Thanks mr. mazda for many issue finds, and suggestions.


1. Due to unfixable rpm slowdowns, removed package counts for default output for 
rpm based systems. We were seeing delays of up to 30+ seconds just to list the 
rpm package count, which is absurd, even after the rpm optimizations inxi 
already runs. To allow rpm users to get excluded by default for rpm package list 
counts, added --pkg flag plus a short message telling them to use that flag to 
get the installed package count if they want it.

Changes like this are very unfortunate, but in 2021 for a package manager at 
times to require over 30 seconds to generate a trivial installed package list is 
just not acceptable. One of the reasons this release was delayed was this was 
not an easy decision to make, it's very rare support for a feature is removed 
for specific tools due to how badly the tools may perform. Note that whatever
higher level tool is used, like dnf, zypp, it's still the same speed, they all
appear to use the same core engine.

Basically this decision was forced since either inxi looks really bad and slow,
when it's not, or the actual cause was removed from default outputs.


1. Small bug in nfs blacklist for disk used led to nfs used being added, which
leads to silly used percents. This is corrected.

2. If ram vendor ID failed, inxi would delete the part number. Oops. This was
related to the Mushkin failures.

3. Close to a bug, though not one internally, but to users would appear as one: 
ZFS does not act as expected, zpool list did not in fact return the pool size, 
which I had always assumed to be the case, but in a very strange decision, does 
return something very close to the pool size for mirrors, but NOT for z1 or z2 
pools, then it returns the total size of the drives that make up the pool. To 
call this strange behavior would be an understatement. The fix was to modify the 
logic to use zfs list instead to get the size data. This also makes the drive 
total report far more accurate, since it lists usable space now for ZFS as was 
always intended. The cause of this was simply that I'd always had access to zfs 
mirrors, not z1 or z2 arrays.


1. OpenSuse and maybe others use kdm3 for Trinity, not kdm, so dm was failing.

2. Going along with fix 1, made kde version detection more robust so may catch
more fringe / corner cases for kde desktops. These were mainly added to correct
Trinity desktop version detections.

3. Mushkin ram vendor ID was failing, that is or should be corrected.

4. Added in /dev/disk/by-id handlers for zpool components, there are several
variants, wwn-, pci-, scsi-, ata-, but they all map to the real /dev drive IDs.
Failure to unmap these led to failing to match components and get size info 
etc for zfs.

5. See DOCUMENTATION: 2, language changes for weather feature abuse.

6. Failed uptime report data due to yet another random syntax change in the
data. See Code Change 1 for details on the fix.

7. A change at some point made sensors show 0 instead of N/A due to improperly 
setting undefined sensor values as 0. This in particular happened with mobo 
temps on systems without known mobo temp sensors.


1. Going along with the rpm issues, added dnf.conf support to yum/dnf repo 
types. Not sure how that one was missed, but there it is. This should tighten 
repo reports for dnf/yum/zypp types.

2. Added LeftWM. LeftWM confirmed working. Added unverifed detections for: 
penrose, 2bwm, 5dwm, catwm, mcwm, monsterwm, snapwm, uwm, wingo, wmfs, wmfs2. 

3. Added xfwm as a compositor type, that had been left out, somewhat on purpose, 
since xfwm can run in compositing or non compositing mode. But should show since 
many users use compositing mode now.

4. Added OpenMediaVault distro ID and systembase handlers.

5. Going along with zfs bug fix 3, using zfs list data for free, size, 
allocated. Trying to understand how zfs developers actually thought about this 
is nearly impossible so just used what seems to correspond to reality most. Also 
shows raw values for zfs data in RAID along with regular ones to make clear 
which is which value.

6. Added more CPU architecture ID matches for AMD Zen and a variety of Intel. 
Both vendors finally released some new CPUs and the data became available, which 
doesn't always happen quickly.

7. A bunch of new disk vendors and vendor IDs added. Never stops, like the sands 
of time, like the ocean waves, like the scuttling crabs scrounging around in the 
seaweed in the foam where the outgoing wave left its mark...


1. Added leftwm keybindinigs to inxi-data.txt desktop/wm section. Updated more 
wm in that section as well, and list more info on wms for future reference etc.
Also reorganized and made more readable wm section.

2. Help/Man now make more clear that automated requests or excessive use of the
inxi weather feature are not under any circumstance permitted. There had been 
some ambiguity and lack of clarity about what abuse is, now it should be more


1. Refactored uptime parser logic, the code and regex was just getting too messy 
and difficult to work with and debug, now it works similar to how the revised 
BSD parsers run, the regex are pulled apart and made more granular so a small 
syntax change ideally won't break the detections as easily.

2. Cleaned up sub cpu_arch() and made all the arch values line up nicely, over 
time I notice that almost invariably stuff done to save lines of code makes 
code harder to read as the feature expands, so it's generally worth just 
unravelling it so it all stacks and is easy to scan/read. Also removed extra 
white space in parens, which is something I'm leaning more towards but it's not 
worth fixing all at once so it's just done where it's noticed.

That's using: 
if ( /test/ ){ 
rather than:
if (/test/){

I believe using more white space helped with Perl comprehension in the 
intermediate stages, but is not required anymore and just looks like extra 
whitespace now.

-- Harald Hope - Sun, 11 Jul 2021 18:36:42 -0700

Version: 3.3.04 
Patch: 00 
Date: 2021-04-16

Enhanced features!! Huge BSD upgrades! Bug Fixes!! Elbrus Fixes!! More bluetooth 
fixes!! What are you waiting for?!!?

A special thanks for significant help, ongoing, leading to a huge boost to BSD 
support, Stan Vandiver, who did a lot of BSD testing, and setup many remote 
access systems for testing and development of the latest BSD upgrades. If you're 
a BSD user, you can thank him for helping to expand BSD support!

An ongoing thanks to Mr. Mazda, for continuous testing, suggestions, and helpful 

Take special note of the code folding fixes in Fix 1, those open up possible 
free software code editors that can be used to work with inxi to more than just 
Kwrite/Kate, to include scite and geany, nice lightweight code editors. You 
can't do real work in inxi without code folding, so getting this finally 
resolved was I think worth it.

Also, for the first time ever!! inxi is now using Pledge, well, if 
OpenBSD::Pledge module is available, which is currently only in OpenBSD, since 
that's the only system that supports Pledge security, except for Serenity, but 
inxi doesn't support Serenity. Note that OpenBSD was smart and added 
OpenBSD::Pledge and OpenBSD::Unveil to Perl Core modules, thus removing any hoop 
that might stop a Perl program from implementing it. Nice going OpenBSD guys!

The addition of OpenBSD softraid support for RAID and CRYPTO types highlights 
the problem with --raid and --logical, where --raid is really just a subset of 
Logical volume management. Note that while the hardware RAID feature only lists 
the actual PCI RAID device, OpenBSD bioctl supports hardware RAID out of the 
box, something I'd thought of doing in inxi for a few years, but it's too much 
work, but bioctl has done the work, which is impressive. Can't do much without a 
lot of debugger data there though, but it's worth being aware of. In this case, 
since softraid is the primary device, I opted to call Crypto and RAID types all 
RAID, same as with linear zfs.


1. FreeBSD: USB drivers. I really gave this a try, but could not get any logic 
to be stable across systems and varying syntaxes used. Will wait for FreeBSD to 
add drivers to usbconfig -vl. Note that this makes it not possible to correctly 
match USB networking devices to their respective IF data, so USB networking IF 
will fall back to the undetected IF-ID, which means it was found but not 
connected to a specific hardware device. 

2. FreeBSD Battery Report: there are non-objective values for Battery state data 
in sysctl output, as in minutes remaining, which has no meaning, and percent 
charge (percent of what? original design capacity? current actual capacity?). If 
data with voltages, design/current capacity in Ah or Wh, is made available, 
support will be added. Note that there are 3rd party tools that do supply this
data in a usable format, but they are not in core so no point.

3. BSDs All: have found no way to get physical CPU counts. this will lead to odd 
outputs in some cases, like a 2 cpu system reporting itself as a 2x the actual 
core counts single CPU, but the data just isn't there as far as I know. 
Dragonfly in some cases appears to have that data.

4. BSDs All: so far no way to get live per core cpu speeds using a file or fast 
command query. Thought I'd found a way in FreeBSD but that was not the correct 
clockrate values, or inconsistently right/wrong, so not using it. Also saw the 
same issue with max/min frequencies in FreeBSD so removed that item, it's 
better to show nothing than data that is not reliable or actually not even 
referring to what it seems to be.

5. BSD SOC Support: An issue poster asked why FreeBSD (but really BSD in 
general) SOC ARM device, like RaPi, support, was so weak in inxi. The reason is 
simple: to do SOC ARM device data in a meaningful way requires a complete path 
based data structure, which the BSDs do not appear to have, at least from what 
I've seen so far. See Linux's /sys data structures for examples of what is 
required to add or expand inxi SOC device support in inxi. It's hard even with 
that type of rich path based data, and without it I won't try.

The bright side is inxi runs perfectly on such devices, no errors, which was 
amazing to see, and spoke volumes of the recent work done to extend support for 
the BSDs.

6. Perl / inxi, when run as root, shows read error when trying to open a 200 / 
--w------- permission /sys uevent file for reading. The test works as expected 
as user, but not as root. Perl will try to read it when run as root even though 
it has no read permissions, only write. This in reality only manifests on very 
old /sys, from Debian Etch kernel 2.26 days.


1. tput + urxvt / FreeBSD: There appears to be a bug in Arch Linux urxvt that 
leads to failed terminal/console size from tput. Also while trying to resolve 
this bug, discovered that if you use "tput cols 2>/dev/null" in FreeBSD, for 
some inexplicable reason tput puts out defaults 80 cols x 24 rows. Why? Who 
knows. Added in non numeric tests of output to handle errors from tput instead.

The bug appears to be what rxvt reports itself as vs what it is actually running 
as. This issue isn't present in any other distro I tried, but could just be a 
new bug in urxvt, don't know.

2. Elbrus CPU: Ongoing issue #197 Elbrus poster gave sample of new 2C3 cpuinfo, 
that exposed some bugs internally in inxi Elbrus handling, I was using integer 
values instead of hex for model IDs in the Elbrus logic, which would fail after 
model 9.

3. BSD dmesg.boot: The logic used for dmesg.boot data processing had errors, and 
had to be fully redone because of the need to detect in a reliable way the 
current state of USB drives. This logic now is much more robust and reliable, 
and no longer relies on using 'uniq' values per line, which would fail in all 
kinds of situations.

4. OpenBSD USB Speeds: bugs fixed for OpenBSD speeds, these were found during 
the USB data refactor testing process. 

5. BSDs: in some cases, wrong memory used values were being generated, this 
should be largely corrected now. Also pulled the weird NetBSD use of 
/proc/meminfo which had wrong data in it, and now use vmstat for all BSDs, which 
after the used bug fixes, is more reliable for BSDs.

6. All systems: CPU stepping would report as N/A if stepping 0, luckily I came 
across some systems with an actual stepping: 0, which are not common.

7. FreeBSD: dmidecode sourced L2 cache data failed to show correct totals in 
some cases. Due to no MT detection possible for FreeBSD currently, these totals 
will still be wrong, but now it says note; check to let users know.

8. dmidecode: some cases were getting the wrong failure error message, this bug 
became exposed due to OpenBSD locking /dev/mem even to root, which then failed 
to show the expected message. This was a bug, and is now corrected.

9. FreeBSD: partition swap size didn't show in at least some cases, that's 

10. Linux Partitions: partitions would let doubled swap items through in several 
cases, and also failed to create in rare cases matches for hidden partition 
mapped id's. Finally tracked down the actual cause, when moving the partition 
filters I'd forgotten to add swap into the filter list, oops. But now it will 
catch duplicates in several different ways, so that's fine.

11. Unmounted: Failed to properly handle detecting RAID components in the case 
of lvm, mdraid, it was only working for zfs. This was an accident, and should 
now be corrected.


1. Code Folding: Note that this was NOT a bug or failure in inxi, it was a bug 
in scintilla/scite geany code editors with folding, basically if you commented 
out logic, without using a space or other marker after the comment #, folding 
would break in weird ways. Obviously the core scintilla engine should IGNORE the 
darned # commented out lines, but it doesn't, which is a real bug. But not in 

This was however worth working around, because without folding, you can't work 
on or learn how inxi works, and the only editor I know of in the free software 
eco-system that can handle folding reasonably accurately was until now 
Kwrite/Kate code editors, and those have some real, long standing, weaknesses, 
and bugs around folding that have never been resolved, and yes, did notify them 
about them, and no, they remain unfixed after years, or they were fixed briefly, 
then broke again.

So it was important to expand the base of possible code editors to more than 
just the KDE stuff. Fixing this was tedious, but I think worth it. On the bright 
side, geany/scite folding / unfolding is FAST, and once the code issues that 
triggered folding failures were resolved, very accurate, much better than Kate's 
to be honest, though Kate isn't as picky, but Kate's unfold top nodes has been 
broken more often than it's worked.

To avoid this issue, it's also important to configure geany/scite to use a space 
after the comment when using keyboard shortcuts to comment out lines/blocks. 
Same goes for Kate/Kwrite, by the way.

2. Battery: Forgot to add battery-force to -v7, which means you would never see 
the battery line in full output if there was no battery present, this is similar 
to how raid-forced worked, it was just an oversight which I hadn't noticed until 
testing the new BSD battery logic.

3. Indentation: small indentation fixes on Sound Server data. Those are visible 
with -y1, that is.

4. OpenBSD PCI: enabled Device matching to PCI networking device, this required 
an odd little hack, but seems to be pretty reliable, and allowed me to add 
driver to PCI device reports as well. Not sure why driver isn't in pcidump -v 
but it probably will be in the future. Note to self: add in support for that so 
if they include it in a future release, it will suddenly 'just work', assume 
they use the same basic syntax as usbdevs -vv output.

5. BSDs: Added in some null data protections for BSDs, which do not always have 
all the data types found in Linux, those would trigger Perl undefined value 
errors, which are warnings that inxi failed internally to test for null data in 
that, but it's hard to know when to do that when the data is basically always 
there in Linux.

6. Debugger: Added test for required Net::FTP module in debugger, had forgotten 
to make that test explicit, which led to odd failures.

7. BSDs: nvme detections should be better now. But I have seen no live test 
system to confirm the fixes work as expected, plus, at least, OpenBSD swaps 
nvme0 to sd0 internally, so I'm not actually sure how that data will even work, 
we'll see how that goes.

8. BSDs: oddly, despite using 0x hex numbers almost everywhere, for CPU 
stepping, the stepping is in decimal, which is even odder because CPU makers 
list their steppings as hex in many if not most cases. In case this is corrected 
in the future, if 0x appears before stepping number, will not then try to 
convert to hex since it already is.

9a. CPU L3: Subtle, probably won't change behaviors, but L3 cache is per physical 
CPU in every case I've found, so never multiply value by cores for L3. Like 
everything, this may lead to corner cases being wrong, but that's life, it will 
also lead to the data being right for most users.

9b. CPU L1: Different L1 syntaxes found so inxi now uses more loose detections, 
should cover most OpenBSD L1 variants at least.

10. BSDs: inxi was using internal 'sleep' right before reading /proc/cpuinfo, 
but that was silly for BSDs since cpu speeds there come from sysctl, so the BSD 
sleeps are now running before sysctl if CPU data feature is required.

11. Too many to remember, but lots of subtle message output changes to make more 
clear, more accurate, shorter, whatever.

12. USB: a very subtle fix, some devices can be both audio and video, like 
cameras, but inxi would default to the first detected. Now it checks for both 
before going to the list of checks, and correctly assigns a type that is both 
audio and video to the audio and video hashes so both features will show the USB 
device, not just Audio.

13: BSD: fixes for BSD ifconfig IF status, it was slicing off the full status 
string, like 'no network' to 'no', which is silly. Now shows full string.

14. OpenBSD: restored USB Hub ports: xx item, I hadn't realized that the data 
was still there with usbdevs but it required an extra -v, like: usbdevs -vv to 
trigger, so now the OpenBSD USB ports works fine again.

15. Fedora Xorg: updated --recommends to use the newer split apart xorg utils 
package names, only xrandr I think needed updating. Thanks Mr. Mazda for keeping 
up with that stuff!

16. OpenBSD SMART: the actual device being queried turns out to the 'c' 
partition, the one that represents the entire disk, NOT the main device ID, like 
sd0, so now inxi tacks on 'c', sd0c, when smartctl runs, and it works fine. So 
previously SMART report would never have worked in OpenBSD.

17. Partion labels/uuids: in Partitions and Unmounted, does not show label/uuid 
if fs type is ffs or if fs is a logical type one, like zfs, hammer, and remote 
fs mounts etc. This cleans up output, since these file system types will never 
have labels or uuids.

18. Mr Mazda inxi was missing data and showing errors if run in Debian Etch with 
Perl 5.008, and I realized I'd slipped up and had used the -k option without 
testing lspci version, but -k was only available in 3.0 in Lenny. But -v turns 
on -k automatically, so the easy solution was just to remove the -k and leave 
the -nnv, which is the same thing, but does not cause errors in early lspci.

There are also errors with reading as root some /sys uevent files, but upon 
examination, those had only root write permission, so the perl -r test isn't 
right. Don't think that can be fixed. See Can't/Won't fix for more.

Another issue I noticed was that in some cases Perl seemed to lose track of some 
hash values in local %trigger in OptionsHandler, and just lose them, thus 
leading to things like --help --version --recommends not working. Moving 
%trigger to globals %show and %use fixed that one, but that's weird, no idea 
what happened, but it works now.

Tested in Sarge 3.1, where core modules have to be explicitly installed, they 
were not included in base Perl install. Kernel 2.4 had some key differences, 
different lspci syntax, different /proc/partitions, so the block device output 
and device output is flawed, but otherwise inxi worked fine in Sarge, from 2005!
But these issues will not be corrected, kernel 2.24 is just too old, lol.

inxi should always run ok in very old systems, like Etch, back to when Perl 5.8 
was standard, so bugs like this are always welcome, it's easy to slip up and use 
something that didn't work in those old systems, then forget to test.

19. Corner case SMART errors, sometimes occur much later in output than inxi 
expects, this is now corrected and errors should show in smart data no matter 
where the main error type occured. 


1. Elbrus: Going along with Bug 2, Updated Elbrus microarch to use family 6, 
assuming models 10, 11, are the same, which they should be since 12 is the same 
as in family 4.

2. IPMI Sensors: More sensor syntax detections, sensors will never be stable...

3. OpenBSD: Rolled out live battery state feature, they have very good data, 
simple, but solid, that allows for a quality battery state report. Handles both 
Wh/Ah, though I am slightly suspicious of the reality of the arithmetic for Ah > 
Wh conversion, it seems to be too high. That's Ah * Design Voltage. But Linux 
battery data has the same issue, though I think in most cases, the data is in 
Wh, so this issue isn't BSD specific. My suspicion is that the voltages used to 
determine Ah may actually be slightly lower than the listed design voltage, 
which inxi calls min: but it's actually the design voltage.

Unknown if NetBSD data is the same as OpenBSD for battery, was unable to locate 
any samples, so can't say, if you have a NetBSD laptop that correctly reports 
battery state in sysctl -a, please file an issue with some sample battery 
charge/voltage syntax and values, ideally from > 1 system. If the data is 
complete, it's easy to add support.

4a. BSD USB rev: inxi now emulates USB rev versions for BSD USB speed/rev 
version data. Note that this is not guaranteed to be right, because USB devices 
can be different rev versions than the speed they run at, but as far as I could 
find, the USB revision data is not available in any practical sense, unless I 
create a complicated recursive tool to build up a snapshot of the usb system and 
devices from dmesg data, but I already blew a day on that attempt, so will wait 
for more complete data in the usb tools in future. The rev version is based on 
the device/hub speed, using a standard USB rev speed mapping. But a 12 Mbps 
device can be rev 2, not rev 1.1, for example, that is, it's actually a USB 2.0 
device, but a slow speed one. 

4b. USB Type: Expanded fallback USB device type tests, these are useful for 
cases where it's either a vendor defined type, or for Open/NetBSD, which do not 
yet show USB class/subclass data. But it's a good fallback tool, added Mass 
Storage, expanded detections.

5. BSD Sensors: Going along with Enhancement 3, rolled out live sensors data. 
Confirmed working in OpenBSD and FreeBSD, not sure about NetBSD, no data, 
problem with vm testing is no sensors, but don't have any NetBSD hardware 
installs to verify. Stan gave it a good try, but could not get NetBSD running so 
far, maybe later.

This basically means the -B and -s features are largely feature complete for the 
BSDs as far as practical, though due to difficulties in getting the data in a 
consistent clear way, some more advanced features, like gpu temps, which are now 
available in Linux kernel values and lm-sensors, do not yet appear to be present 
in the BSDs, though if this changes, the structures are in place to make 
updates to these logics very easy to implement now.

Note that the --sensors-include and --sensors-exclude items, or config items, 
work fine with this BSD logic, though you have to figure out what exact syntax 
to use, but that's the same in Linux.

6. OpenBSD Pledge: Yes, that's right, inxi is now Pledged!!! In OpenBSD, anyway, 
they did a really good job, and the OpenBSD Perl packager made a very nice Perl 
modules, OpenBSD::Pledge, which was very easy to implement. Now I know what inxi 
needs to run its features!!

So far OpenBSD only, but Pledge seems like a really good idea, so I figured, 
let's give it a spin, even if it will only currently work on OpenBSD, but that's 
fine, inxi is pledged as tightly as I could make it, including unpledging 
features not required post options processing, once inxi knows what it's 
actually going to be doing.

Note that I'm aware of OpenBSD::Unveil, but that's a lot harder to implement due 
to never really being sure about what files inxi will need to be looking at 
until well into the logic. I may look at that in the future.

7. Bluetooth Rfkill: Due to ongoing failures in current inxi to show consistent 
Bluetooth hci report on Linux, added in one last fallback, rfkill state, which 
allows inxi to always fallback to at least that basic data. Also added in which 
tool is providing the report mostly, like: Report: bt-adapter ID: hci0 and so 

Also integrated into -xxx data, or for down state, the full rfkill report, since 
that can be quite useful.

Note that bluetooth is a real pain for users to debug because you can have:

 * Bluetooth Service: enabled/disabled 
 * Bluetooth Service: started/stopped 
 * bluetoothctl: start/stop 
 * bt-adapter: start/stop 
 * hciconfig: start/stop 
 * rfkill: software: block/unblock; hardware: block/unblock - however, for 
   hardware, that means a physical button has been pressed to disable it, on the 
   laptop that is.
To make matters worse, one tool does not always even know when another tool has 
changed something, for example, if I rfkill blocked hci0, then unblocked it, 
hciconfig would keep seeing it as down until it was switched to on with 
hciconfig explicitly. This is I suspect one reason hciconfig is being dropped, 
it doesn't know how to listen to the newer tools like bluetoothctl, bt-adapter, 
or rfkill.

8. OpenBSD: Going along with Code Change 1, now has disk serial (doas/root), 
more consistent physical block size data, more reliable disk data, and for -Dxx, 
duid, if available. Also added disk partition table scheme, aka MBR / GPT. Some 
of these new items may also work with NetBSD. See also Fix 17, SMART fix for 

9. OpenBSD/NetBSD/FreeBSD: the DiskDataBSD refactor now allows Unmounted 
partitions report. 

10. OpenBSD: added in CPU MT detections using siblings data, I think only 
OpenBSD and Dragonfly support proper MT cpu core counts. Still no way to get 
physical cpu counts in OpenBSD or FreeBSD or NetBSD that I am aware of. 

11. OpenBSD: added in cpu speed min/max data, that was available in most cases, 
didn't realize that.

12. BSDs: expanded and made more robust cpu L1/L2/L3 cache detections, now for 
example, OpenBSD will report its L1/L2/L3 cache without root. FreeBSD requires 
root since that data is coming from dmidecode.

This logic update made BSD L-cache data much more reliable and consistent, and, 
important, easy to work with. This was directly connected to Code Changes 2 and 
3, which made dealing with those data sources a lot easier.

Note that L1/L2 cache data if not from OpenBSD will show note: check because 
it's not possible to determine if it's a multithreaded MT cpu or not, and thus 
if L1/L2 * core count would so often be totally wrong that inxi won't try to 
guess, it will just list the single value found, and tell the user to check it 

13. OpenBSD: Added rcctl tool to init tools, I hadn't known about that one, that 
replaces the fallback default used before, /etc/rc.d.

14. RAM Vendor: Issue #245 raised the point that it would be good to try to show 
RAM vendor data when the manufactorer field is empty, and since that logic is 
already present in disk_vendor, it was just matter of researching the product 
IDs to find the matching patterns for the RAM vendors, the initial list is 
pretty good, but will need updates now and then to correct errors. Also will 
override only vendor ID 4 character hex value and see if it can find a better 

15. OpenBSD RAM: data quality is decent (no vendor/product no, unfortunately). 
The data is often, but sadly not always, available. I'm not clear why sometimes 
it isn't, but since OpenBSD also defaults to blocking /dev/mem to even root 
user, which then blocks dmidecode, this is the only practical way to give basic 
RAM data for OpenBSD, so that's running fine now, when the data is available, 
with the added bonus of not needing doas/root. 

Note that due to the way that this data is present, I can have inxi deduce some 
things like how many arrays there are, and then guess at overall capacity, max 
stick size, and so on, but all Array-x: values are followed by note: est because 
they are never based on hard data, just extrapolations. I debated if inxi should 
even show the guesses, but I think by saying note: est after each Array-x: item, 
it's pretty clear that it's not hard data, and it does give an idea roughly. I 
made an initial guess at > 1 ram array but found no data samples to let me see 
if my guess was right or not, so > 1 array remains roughly theoretical until 
shown to work or not work empirically.

While NetBSD sometimes has the system ram data in a similar way that OpenBSD 
does in dmesg.boot, it varies too much, and is too inconsistent. There are not 
enough data samples with good consistent data, and the samples I did see 
suggested that it would take too much code and convoluted logic to handle the 
variations, so I'm leaving this one alone. Also, NetBSD probably doesn't block 
/dev/mem so dmidecode should work fine.

16. Using system clang version info for OpenBSD kernel compiler, the assumption 
being that a BSD is an OS, so the Clang version it shipped with would be the 
clang version that compiled the kernel. Please correct if this is wrong.

17. OpenBSD RAID: support added for softraid, including for drive storage 
totals, unmounted raid component detections. Plugged in pretty smoothly, able to 
generate a partial report for non root, and shows message if not root. 

18. VM detections upgraded, particularly for BSDs, now includes vmm, hvm, 
hyper-v, kvm. Not all of these would have been detected before. Also cleaned up 
vm logic, moved all vm detections into $dboot{'machine-vm'}, and only use the 
first found item. 

19. Disk Vendors!!: Yes, last, but not least!! More disk vendors, vendor ID 
matches!! Yep. What else can I say? Eternity? Man's quest for something that 
cannot be found, yet these strivings never cease, here manifested by always new 
vendors and ID matches!


1. Very significant ongoing upgrades to the docs in inxi-perl/docs/, 
particularly in inxi-values.txt, inxi-resources.txt, and inxi-data.txt. These 
are now increasingly useful, and I am trying to keep in particular 
inxi-values.txt up to date as a primary reference for various features, though 
it will always lag, because that's how it is, lol.

2. Cleaned up changelog, made 80 cols wide for text, bars, etc, made numbered 
lists and headers consistent, but otherwise did not change any of the actual 


1. Complete rewrite of BSD disk/partition data tools, now there is one core tool 
that generates a mega-disk/partition hash, which is then used for all features 
that need partition/disk data. This worked out super well, and allowed new 
features like BSD Unmounted disk data to be generated for the first time ever, 
along with filling in various block device fields that were missing before.

2. Change 1 also went along with a refactor of dmesg data tool for BSDs, which 
allowed for much more granular data generation, along with a complex %dboot hash 
which stores all sub types as well as the main full dataset. This allowed inxi 
to stop looping through all of dmesg data each time a feature needed it. Now all 
the data types are assigned if required by a feature, and only then. This, along 
with change 1, worked really well.

See also Bug 3, which mandated completely changing how dmesg.boot and dmesg live 
data were / are merged, the result is far more robust now, and far less prone to 

3. Similar to dmesg changes, used same methods for sysctl data, now all the data 
is assigned to %sysctl data structure based on if needed or not, so it only does 
the assignments one time, in one location. Much cleaner code this way, and 
allows for testing set/unset substructures, like $sysctl{'cpu'}.

4. The %dboot and %sysctl refactors went so well that I switched the core USB 
and Devices to also use %usb and %devices structures. These updates let me dump 
a lot of global hashes and arrays, and leaned everything down a lot, and also 
removed basically all the testing loops for these data types, now the Item 
features just test to see if a reference to the specific type exists, if it 
does, it has data, if not, it doesn't, this is a lot easier to manage.

5. Ongoing: moving related subroutines to Packages, the goal is to have pretty 
much all related subroutines (functions) contained in parent classes/packages, 
makes it easier to maintain.

6. Ongoing: making all internal package tools have similar sub names, getting 
rid of the specific names for output and data generator functions. This makes 
each Item Generator increasingly like all the others, as much as practical.

7. A big one, renamed all the feature generators to be XxxxxItem, instead of 
XxxxData, which was colliding as a package name with actual data generator 
tools, now all the Feature generators are [Feature]Item, and all the Data 
generators have Data type names where relevant. This avoided in particular the 
silly case where I was relying on case to differentiate UsbData and USBData, 
feature vs data generator.

8. As part of the move to data hash global structures, also moved as many of the 
top global scalars and hashes and arrays to these now much more heavily utilized 
global hashes, like %alerts, %use, %fake, %force, and so on. There are now far 
fewer globals running than before, and where it makes sense, I keep moving them 
into global hashes, and giving the global hashes more work to do.

9. Significantly expanded list of debuggers for specific data types always 
available, see docs/inxi-values.txt for list of options there. Decided for rapid 
development, it was too much of a pain to always be uncommenting the debuggers, 
so now am uncommenting, adding to @dbg supported items, then documenting. I 
guess this means the @dbg items are more or less stable and consistent now, give 
or take.

10. Refactored UsbData and DeviceData, for in particular the BSDs, to be much 
more robust and to rely less on very fragile regex parsing patterns, takes more 
lines of code, but better than having the detections break every other BSD 
release. This was part of the %device and %usb refactors as well.

11. Fixed system_files() too, which was really silly logic, it used a global 
packed hash of system files, then would do a function call for the paths when 
required, which was redundant since the values were already in a hash which 
could be used directly. This was a throwback to inxi gawk/bash, where hashes 
were not really used in this way, and the logic had been translated to Perl 
without thinking about it, but once I thought about it, I realized how silly 
that was. This must have knocked off a good 50 or more unnecessary, and always 
expensive, function calls.

-- Harald Hope - Fri, 16 Apr 2021 20:37:35 -0700

Version: 3.3.03
Patch: 00
Date: 2021-03-17

Bugs!! Fixes! Spring cleaning! 

Because these are either newly created, or newly discovered, bugs, this release 
was pushed as early as possible to get them fixed asap.


1. Desktop: Lumina detection had a syntax error which made it not work. This has 
been broken for a while.

2. Logical: if not root, and if LUKS / bcache detected, failed to load 
proc_partitions, which generates error on --logical --admin since the required 
components data was not loaded. This was an oversight.

3. The 3.3.02 ShellData refactor created a bug for console IRC, showed shell, 
not irc client, name, and set default shell data which also showed.

4. Console IRC tty: there was also an older bug that made -S, -G not work 
consistently, and there were errors that had been missed for many years in that 
logic. These should all be corrected, console irc out of display, or in display 
as root, should now show tty info, tty size in -G.


1. Memory: restored $BSD_type block on /proc/meminfo and force NetBSD to use a 
corrected vmstat. This leaves that block of logic to correct the NetBSD oddities 
in meminfo, but it may fix future isses that popup.

2. -Sxxx man page item incorrectly said XDG_VTNR was systemd/linux, it's not, 
it's various things, GhostBSD has it, for example. See what you get for 
believing what people say!

3. Logical: added in N/A for null maj-min in --logical report. While bug 2 
triggered those errors, there could be future cases where maj-min are null, like 
BSD lvm data etc.


1. Going along with Fix 1, added '--force meminfo' in case you really want that.

2. Distro: System Base: Added TrueNAS detection.

3. Package Data: Added mport [MidnightBSD] type. That requires root to run for 
some odd reason, so won't see the best output if not root.


1. Moved logical to -v7 from -v8, it's stable enough now.


1. Moved get_tty_number and get_tty_console_irc to ShellData:tty_number and 

ShellData::tty_number was being loaded several times, added 
$loaded{'tty-number'} test, and made client{'tty-number'} to store value.

tty_console_irc changed to console_irc_tty, which is what it gets, removed hacks 
and made it load once and store result in client hash.

2. Optimization: retested sub vs package::method and they run at exactly the 
same time, give or take, so moving more stuff into packages to make it easier to 

-- Harald Hope - Wed, 17 Mar 2021 19:36:39 -0700

Version: 3.3.02
Patch: 00
Date: 2021-03-15

Huge upgrade!! Bug Fixes!! Refactors!!! BSDs!!! More BSDs!!! raspberry pi!! New 
Features!!! Enhanced old features!!! Did I mention bluetooth?! USB? Audio? No? 
well, all hugely upgraded!


1. Sadly, 3.3.01 went out with a bug, forgot to remove a debugger, resulted in 
hardcoded kernel compiler version always showing.

Note that there is a new inxi-perl/docs/inxi-bugs.txt file to track such bugs, 
and matched to specific tagged releases so you know the line number and items to 
update to fix it.

2. Typo in manjaro system base match resulted in failing to report system base 
as expected.


1. OpenBSD made fvwm -version output an error along with the version, and not in 
the normal format for standard fvwm, this is just too complicated to work around 
for now, though it could be in theory by creating a dedicated fvwm-oBSD item in 
program_values. But that kind of granularity gets too hard to track, and they 
are likely to change or fix this in the future anyway. Best is they just restore 
default -version output to what it is elsewhere, not nested in error outputs. 

2. Discovered an oddity, don't know how widespread this is, but Intel SSDs take 
about 200 milliseconds to get the sys hwmon based drive temps, when it should 
take under a millisecond, this may be a similar cause as those drives having a 
noticeable SMART report delay, not sure. This is quite noticeable since 200 ms 
is about 15% of the total execution time on my test system.


1. For --recommends, added different rpm SUSE xdpyinfo package name.

2. Distro Data: added double term filter for lsb-release due to sometimes 
generating repeated names in distro.

3. Packages: fix for appimage package counts.

4. Desktop: fixed ID for some wm when no xprop installed, fallback to using 
@ps_cmd detections, which usually work fine.

5a. When swap used was 0, showed N/A, fixed to correctly show 0 KiB.

5b. If no swap devices found, BSDs were not correctly showing no swap data found 
message. Corrected.

6a. Bluetooth: Removed hcidump from debugger, in some cases, that will just hang 
endlessly. Also wrapped bluetoothctl and bt-adapter debugger data collection 
with @ps_cmd bluetooth running test. Only run if bluetooth service is running.

6b. Bluetooth: running detections have to be very strict, only bluetoothd, not 
bluetooth, the latter can show true when bluetoothd is not running, and did in 
my tests. 

7. USB: with Code Change 1, found a few places where fallback usb type 
detections were creating false matches, which resulted in say, bluetooth devices 
showing up as network devices due to the presence of the word 'wireless' in the 
device description. These matches are all updated and revised to be more 
accurate and less error prone.

8. Battery: an oversight, had forgotten to have percent used of available 
capacity, which made Battery data hard to decipher, now it shows the percent of 
available total, as well as the condition percent, so it's easier to understand 
the data now, and hopefully more clear.

9a. OpenBSD changed usbdevs output format sometime in the latest releases, which 
made the delicate matching patterns fail. Updated to handle both variants. They 
also changed pcidump -v formatting at some point, now inxi will try to handle 
either. Note that usbdevs updates also work fine on NetBSD.

9b. FreeBSD also changed their pciconf output in beta 13.0, which also broke the 
detections completely, now checks for old and new formats. Sigh. It should not 
take this much work to parse tools whose output should be consistent and 
reliable. Luckily I ran the beta prior to this release, or all pci device 
detections would simply have failed, without fallback.

9c. Dragonfly BSD also changed an output format, in vmstat, that made the RAM 
used report fail. Since it's clearly not predictable which BSD will change 
support for which vmstat options, now just running vmstat without options, and 
then using processing logic to determine what to do with the results.

10. It turns out NetBSD is using /proc/meminfo, who would have thought? for 
memory data, but they use it in a weird way that could result in either negative 
or near 0 ram used. Added in some filters to not allow such values to print, now 
it tries to make an educated guess about how much ram the system is really using 
based on some tests. 

11. Something you'd only notice if testing a lot, uptime failed when the uptime 
was < 1 minute, it had failed to handle the seconds only option, now it does, 
seconds, minutes, hours:minutes, days hours:minutes, all work.

12. Missed linsysfs type to exclude in partitons, that was a partner to 
linprocfs type, both are BSD types.

13. Added -ww to ps arguments, that stops the cutting width to terminal size 
default behavior in BSDs, an easy fix, wish I'd known about that a long time 

15. gpart seems to show sizes in bytes, not the expected KiB, so that's now 
handled internally. Hopefully that odd behavior won't randomly change in the 
future, sigh.

16. Fixed slim dm detection, saw instance where it's got like normal 
dms, not the slim.lock which inxi was looking for, so now inxi looks for both, 
and we're all happy!


1. Added in something that should have been there all along, now inxi validates 
the man page download as well as the self, this avoids corrupted downloads 
breaking the man.

2. Init: added support for shepherd init system.

3. Distro Data: added support for guix distro ID; added support for NomadBSD, 
GhostBSD, HardenedBSD system base. GhostBSD also shows the main package version 
for the distro version ID, which isn't quite the same as the version you 
download, but it's close. Also added os-release support for BSDs, using similar 
tests as for linux distros, that results in nicer outputs for example for 
Dragonfly BSD.

4. Package Data: added guix/scratch [venom]/kiss/nix package managers. Update 
for slackware 15 package manager data directory relocation, now handles either 
legacy current or future one.

5. Repos: added scratch/kiss/nix-channels; Added GhostBSD, HardenedBSD pkg 

6. USB Data: added usbconfig. That's FreeBSD's, and related systems.

7. Device Data: Added pcictl support, that's NetBSD's, I thought inxi had 
supported that, but then I remembered last time I tried to run netBSD in a vm, I 
couldn't get it figured out. Now debugged and working reasonably well.

8. Raspberry Pi 3, 4: ethernet nic now detected; wifi device, which is on a 
special mmcnr type, now works, that stopped working in pi 3, due to the change, 
now it's handled cleanly. Also added support for pi bluetooth, which lives on a 
special serial bus, not usb. For Raspberry Pi OS, added system base detections, 
which are tricky. Also matched mmcnr devices to IF data, which was trickyy as 
well. Note that as far as I could discover, only pi puts wifi on mmcnr.

9. Bluetooth: due to deprecated nature of the fine hciconfig utility, added in 
support for bt-adapter, which also allows matching of bluetooth data to device 
data, but is very sparse in info supplied compared to hciconfig. bluetoothctl 
does not have enough data to show the hci device, so it's not used, since inxi 
can't match the bluetooth data to the device (no hci[x]). This should help the 
distros that are moving away from hciconfig, in particular, AUR is only way arch 
users can get hciconfig, which isn't ideal.

10. New tool and feature, ServiceData, this does two things, as cross platform 
as practical, show status of bluetooth service, this should help a lot in 
support people debugging bluetooth problems, since you have bluetooth enabled 
but down, or up, disabled, and you can also have the device itself down or up, 
so now it shows all that data together for when it's down, but when the device 
is up, it just shows the device status since the other stuff is redundant then.

In -Sa, it now shows the OS service manager that inxi detected using a bunch of 
fallback tests, that's useful to admins who are on a machine they don't know, 
then you can see the service manager to use, like rc-service, systemctl, 
service, sv, etc.

11. Big update for -A: Sound Servers: had always been really just only ALSA, now 
it shows all detected sound servers, and whether they are running or not. 
Includes: ALSA, OSS, PipeWire, PulseAudio, sndio, JACK. Note that OSS version is 
a guess, might be wrong source for the version info.

12. Added USB device 'power:' item, that's in mA, not a terrible thing to have 
listed, -xxx. This new feature was launched cross platform, which is nice. 
Whether the BSD detections will break in the future of course depends on whether 
they change the output formats again or not. Also added in USB more chip IDs, 
which can be useful. For BSDs, also added in a synthetic USB rev, taken from the 
device/hub speeds. Yes, I know, USB 2 can have low speed, full speed, or high 
speed, and 1.1 can have low and full speeds, so you actually can't tell the USB 
revision version from the speeds, but it's close enough.

13. Made all USB/Device data the same syntax and order, more predictable, bus, 
chip, class IDs all the same now.

14. Added in support for hammer and null/nullfs file system types, which trigger 
'logical:' type device in partitions, that's also more correct than the source: 
Err-102 that used to show, which was really just a flag to alert me visibly that 
the partition type detection had simply failed internally. Now for detected 
types, like zfs tank/name or null/nullfs, it knows they are logical structures.

15. Expanded BSD CPU data, where available, now can show L1/L2/ L3 cache, cpu 
arch, stepping, family/model ids, etc, which is kind of nifty, although, again, 
delicate fragile rules that will probably break in the future, but easier to fix 

16. By an old request, added full native BSD doas support. That's a nice little 
tool, and it plugged in fairly seamlessly to existing sudo support. Both the 
internal doas/sudo stuff should work the same, and the detection of sudo/doas 
start should work the same too.

17a. Shell/Parent Data: Big refactor of the shell start/parent logic, into 
ShellData which helped resolve some issues with running-in showing shell name, 
not vt terminal or program name. Cause of that is lots of levels of parents 
before inxi could reach the actual program that was running inxi. Solution was 
to change to a longer loop, and let it iterate 8 times, until it finds something 
that is not a shell or sudo/doas/su type parent, this seems to work quite well, 
you can only make it fail now if you actually try to do it on purpose, which is 

This was very old logic, and carried some mistakes and redundancies that made it 
very hard to understand, that's cleaned up now. Also restored the old (login) 
value, which shows when you use your normal login account on console, some 
system will also now show (sudo,login) if the login user sudos inxi, but that 
varies system to system.

17b. BSD running-in: Some of the BSDs now support the -f flag for ps, which made 
the parent logic for running-in possible for BSDs, which was nice. Some still 
don't support it, like OpenBSD and NetBSD, but that's fine, inxi tests, and if 
no support detected, just shows tty number. Adding in more robust support here 
cleaned up some redundant logic internally as well.

17c. Updated terminal and shell ID detections, there's quite a few new terminals 
this year, and a new shell or two. Those are needed for more reliable detections 
of when the parent is NOT a shell, which is how we find what it is.

18. Added ctwm wm support, that's the new default for NetBSD, based on twm, has 
version numbers.

19. Upgraded BSD support for gpart and glabel data, now should catch more more 

20. For things like zfs raid, added component size, that doesn't always work due 
to how zfs refers to its components, but it often does, which is better than 
never before.

21. To make BSD support smoother, got rid of some OpenBSD only rules, which in 
fact often apply to NetBSD as well. That may lead to some glitches, but overall 
it's better to totally stay away from OpenBSD only tests, and all BSD variant 
tests, and just do dynamic testing that will work when it applies, and not when 
it doesn't. In this case, added ftp downloader support for netBSD by removing 
the openBSD only flag for that item.

There's a bit of a risk there in a sense since if different ftp programs with 
different options were to be the fallback for something else, it might get used, 
but that's fine, it's a corner case, better to have them all work now than to 
worry about weird future things. But limiting it to only BSDs should get rid of 
most of the problem.

vmstat and optical drive still use net/openBSD specifics because it is too 
tricky to figure out it out in any more dynamic way.

22. For -Sxxx, added if systemd, display, virtual terminal number. Could be 
useful to debug subtle issues, if the user is for example not running their 
desktop in vt 7, the default for most systems.

23. And, last but not least, yes, you guessed it!!! You've been paying 
attention!!! More disk vendors, more vendor IDs!!! As always, thanks linux-lite 
hardware database!!


1. Moved battery voltage to -Bx output, the voltage is quite important to know 
since that is the key indicator of battery state. If voltage is within .5 volts 
of specified minimum, shows voltage for -B since that's a prefail condition, 
it's getting close to death.

2. In partitions and raid, when the device was linear raid logical type layout, 
it said, no-raid, when it should be 'linear', that's now cleaner and more 

3. When running-in is a tty value, it will now show the entire tty ID, minus the 
'/dev/tty', this will be more precise, and also may resolve cases where tty was 
fully alpha, no numbers, previously inxi filtered out everything that was not a 
number, but that can in some tty types remove critical tty data, so now it will 

tty 2 [not changed]; tty pts/2 [adds pts/]; tty E2 [adds the E];
tty rx [would have not shown at ll before]


NOTE: unlike the previous refactors, a lot of these changes were done to make 
inxi more maintainable, which means, slightly less optimized, which has been my 
preference in the past, but if the stuff can't be maintained, it doesn't matter 
how fast it runs!

These changes have really enhanced the quality of the code and made it a lot 
easier to work with. It's also now a lot easier to add debuggers, force/fake 
data switches, etc, so it gets done, unlike before, when it was a pain, so it 
got skipped, and then caused bugs because of stray debuggers left in place, and 
so on.

The bright side is while reading up on this, I learned that using very large 
subs is much more efficient than many small ones, which I've always felt was the 
case, and it is, so the style used internally in inxi proves to be the best one 
for optimizations.

These refactors, ongoing, have now touched at least 1/3, almost 1/2, of the 
entire inxi codebase, so the stuff is getting more and more consistent and up to 
date, but given how old the logic is in places, there will be more refactors in 
the future, and maybe once the code is easier to maintain, some renewed 
optimizations!, if we can find anything that makes sense, like passing 
array/hash references back to the caller, already the first half is done, 
passing references to the sub/method always.

The second part is started, using the Benchmark Perl module, which really speeds 
up testing and helps avoid pointless tweaks that do little re speed 

I could see with some care some areas where working on data directly via 
references could really speed things up, but it's hard to write and read that 
type of code, but it's already being done in the recursive data and output 
logics, and a few other places.

1. Large refactor of USBData, that was done in part to help make it work for 
BSDs better, but also to get it better organized.

This refactor also made all the device items, like -A,-G,-N,-E use the same 
methods for creating USB output, previously they had used a hodgepodge of 
methods, some super old, it was not possible to add USB support more extensively 
for BSDs without this change.

Also added in some fallback usb type detection tools using several large online 
collections of that info to see what possible matching patterns could catch more 
devices and correctly match them to their type, which is the primary way now 
that usb output per type is created. This really helps with BSDs, though BSD usb 
utilities suffer from less data than lsusb so they don't always get device name 
strings in a form where they can be readily ID'ed, but it's way better than it 
was before, so that's fine!

Moved all previous methods of detecting if a card/device was USB into USBData 
itself so it would all be in one place, and easier to maintain.

All USB tools now use bus_id_alpha for sorting, and all now sort as well, that 
was an oversight, previously the BSD usb tools were not sorted, but those have 
been enhanced a lot, so sorting on alpha synthetic bus ids became possible.

Removed lsusb as a BSD option, it's really unreliable, and the data is 
different, and also varies a lot, it didn't really work at all in Dragonfly, or 
had strange output, so lsusb is now a linux only item.

2. Moved various booleans that were global to %force, %loaded, and some to the 
already present, but lightly used, %use hashes. It was getting too hard to add 
tests etc, which was causing bugs to happen. Yes, using hashes is slower than 
hardcoding in the boolean scalars, but this change was done to improve 
maintainability, which is starting to matter more.

3. Moved several sets of subs to new packages, again, to help with debugging and 
maintainability. MemoryData, redone in part to handle the oddities with NetBSD 
reporting of free, cached, and buffers, but really just to make it easier to 
work with overall. Also moved kernel parameter logic to KernelParameters, gpart 
logic to GpartData, glabel logic to GlabelData, ip data IpData, check_tools to 
CheckTools, which was also enhanced largely, and simplified, making it much 
easier to work with.

4. Wrapped more debugger logic in $fake{data} logic, that makes it harder to 
leave a debugger uncommented, now to run it, you have to trigger it with 
$fake{item} so the test runs, that way even if I forget to comment it out, it 
won't run for regular user.

5. Big update to docs in branch inxi-perl/docs, those are now much more usable 
for development. Updated in particular inxi-values.txt to be primary reference 
doc for $fake, $dbg, %force, %use, etc types and values. Also updated 
inxi-optimization.txt and inxi-resources.txt to bring them closer to the 

Created inxi-bugs.txt as well, which will help to know which known bugs belonged 
to which frozen pools. These bugs will only refer to bugs known to exist in 
tagged releases in frozen pool distros.

6. For sizes, moved most of the sizing to use main::translate_size, this is more 
predictable, though as noted, these types of changes make inxi a bit slower 
since it moved stuff out of inline to using quick expensive sub calls, but it's 
a lot easier to maintain, and that's getting to be more important to me now.

7. In order to catch live events, added in dmesg to dmesg.boot data in BSDs, 
that's the only way I could find to readily detect usb flash drives that were 
plugged in after boot. Another hack, these will all come back to bite me, but 
that's fine, the base is easier to work on and debug now, so if I want to spend 
time revisiting the next major version BSD releases, it will be easier to 
resolve the next sets of failures.

8. A big change, I learned about the non greedy operator for regex patterns, ?, 
as in, .*?(next match rule), it will now go up only to the next match rule. Not 
knowing this simple little thing made inxi use some really convoluted regex to 
avoid such greedy patterns. Still some gotchas with ?, like it ignores following 
rules that are zero or 1, ? type, and just treats it as zero instances. But 
that's easy to work with.

9. Not totally done, but now moved more to having set data tools set their 
$loaded{item} value in get data, not externally, that makes it easier to track 
the stuff. Only where it makes sense, but there's a lot of those set/get items, 
they should probably all become package/classes, with set/get I think.

10. Optimized reader() and grabber() and set_ps_aux_data(), all switched from 
using grep/map to using for loops, that means inxi doesn't have to go through 
each array 2x anymore, actually 4x in the case of set_ps_aux_data(). This saved 
a visible amount of execution time, I noticed this lag when running pinxi 
through NYTProf optimizer, there was a quite visible time difference between 
grabber/reader and the subshell time, these optimizations almost removed that 
difference, meaning only the subshell now really takes any time to run.

Optimized url_cleaner and data_cleaner in RepoData, those now just work directy 
on the array references, no returns.

Ran some more optimization tests, but will probably hold off on some of them, 
for example, using cleaner() by reference is about 50% faster than by copy, but 
redoing that requires adding in many copies from read only things like $1, so 
the change would lead to slightly less clean code, but may revisit this in the 
future, we'll see.

But in theory, basically all the core internal tools that take a value and 
modify it should do that by reference purely since it's way faster, up to 10x.

-- Harald Hope - Mon, 15 Mar 2021 18:42:04 -0700

Version: 3.3.01
Patch: 00
Date: 2021-02-08

Bug fixes!! Fixes!!! Refactors!!! Edits!!!

1. Big bug, 3.2 appears to have introduced this bug, for disks, rotation and 
partition scheme would never show, oops. 

2. Tiny bug kept one specific smart value from ever showing, typo.


1. Accidentally followed Arch linux derived distro page, which claims KaOS as 
arch derived, when of course it's not, it's its own distro, own toolchain, etc. 
I kind of knew this but had forgotten, then I believed the Arch derived distro 
page, oh well. Resulted in KaOS being listed with arch linux as system base with 
-Sx. Arch should fix this, it's not like it's hard, just remove the distro from 
the page. 

2. Cleared up explanations for drivetemp vs hddtemp use, updated --recommends, 
man, and help to hopefully make this clear. Debian will be dropping hddtemp, 
which is not maintained, sometime in the coming years, sooner than later. Note 
that users unfortunately have to manually enable drivetemp module unless their 
distros enable it by default, but the man/recommands/help explain that.

3. Fixed smart indentation issues, that went along with code change 1, was 
failing to indent one further level for failed/age values like it's supposed to.


1. Added /proc/device to debugger, that will help track block device main 

2. More disk vendors, more disk vendor IDs!!! As noted, the enternal flow flows 
eternally, thanks linux-lite hardware database users!! and other inxi users, 
whose outputs sometimes reveal a failure or two.

3. Added loaded kernel module tests to --recommends, this was mostly to let 
users know that drivetemp is needed if you want non superuser fast drive temps, 
and that this came along with kernels 5.6 or newer. Hopefully word will start 
drifting out. Note that if inxi is using drivetemp values, drive temps will 
appear as regular user with -Dx, and will be to 1 decimal place. hddtemp temps 
are integers, and requires sudo to display the temps.

4. To handle issue #239 which I'd thought of trying off and on, but never did, 
added option to -Dxxx to show SSD if a positive SSD ID was made to rotation: So 
rotation will show either nothing, if no rotation or ssd data is detected, the 
disk speed in rpm, or SSD if an SSD device. There may be corner cases where this 
is wrong, but I don't have data for that, for example, if a disk is parked and 
has zero rotation but is a HDD, not as SSD. I don't know what the data looksl 
ike in that case. Note that if sudo inxi -Da is used, and smartctl is installed, 
it should be right almost all the time, and with regular -Dxxx, it's going to be 
right almost always, with a few corner cases. That slight uncertainty is why I 
never implemented this before. Legacy drives also sometimes did not report 
rotation speeds even when HDD, so those may create issues, but inxi will only 
call it an SSD if it's an nvme, mmcblk device, both are easy to ID as SSD, or if 
it meets certain conditions. It will not call a drive an SSD if it was unable to 
meet those conditions.


1. Refactored the output logic for DiskData, that was messy, split it into a few 
subs, and also refactored the way smartctl data was loaded and used, that's much 
cleaner and easier to use now. Split the previous 1 big sub into: 

totals_output(), drives_output(), and smart_output(). 

Also split out the smart field arrays into a separate sub, which loads 
references to avoid creating new arrays and copying them all over when 
outputting smart data. References are weird to work with directly but they are 
MUCH faster to use, so I'm moving as much of the internal logic to use array 
raferences instead of dereferenced arrays/hashes assigned to a new array, or 

2. Redid all the output modules and renamed them to be more consistent and 
predictable, and redid the logic here and there to make the get() items be 
fairly similar on all the data builder packages. Now as with the data subs, 
which generally end in _data, now most of the output subs end with _output.

3. Roughly finished the process started in 3.2, got rid of redundant array 
loads, changed: 

@something = something_data();
push (@rows,@something);
push (@rows,something_data());

which avoids creating an extra array, this also let me remove many arrays 

4. Missed a few hashes in machine data that were being passed directly, not as 
references, to other subs, corrected that. I think I missed those because they 
were %, so the search I did for @ in sub arg lists didn't catch the % hashes.

-- Harald Hope - Mon, 08 Feb 2021 16:16:27 -0800

Version: 3.3.00
Patch: 00
Date: 2021-01-28

Bug fixes!! New Feature!! Edits, cleanups!! 


1. Small bug, wrong regex would make mdraid unused report never show. Was 
looking for ^used, not ^unused. No idea how that happened, but it's fixed.

2. Big RAID bug. Due to never having seen an 'inactive' state mdraid dataset, 
inxi had a bunch of bugs around that. I'd assumed active and inactive would have 
roughly the same syntax, but they don't. This is now corrected. Thanks Solus 
user for giving me the required data. This case when not corrected resulted in a 
spray of errors as RAID ran, and a fairly incomplete RAID report for mdraid.

3. A bug that probably never impacted anyone, but in SMART the matching rules 
failed to match field name Size[s]? in the logical/physical block sizes. 
However, those were already coming in from I believe pre-existing /sys data for 
the drives but now it's fixed anyway. I had not realized that smartctl made it 
plural when logical/physical were different, and singular when they were the 

4. Failed to use all possible sd block device major number matches, which led to 
false disk total/used reports, that is, totals less than used.

5. Bug probably introduced in 3.2, zfs single array device did not show raid 


1. Going along with bug 2, fixed some other admin/non admin report glitches. 
Made patterns more aggressively matching, whitelist based to avoid the types of 
syntax issues that caused bug 2.

2. Added 'faulty' type to mdraid matches, that had not been handled.

3. Found even more of those pesky 'card' references in help and man page, 
replaced all of them with 'device[s]'.

4. Subtle fix, for debugger data collectors, added -y1 support, which can be 
useful at times.


1. In USB data grabber, added fallback case for unspecified type cases, now uses 
a simple name/driver string test to determine if it's graphics, audio, or 
bluetooth. This was mainly to make sure bluetooth usb devices get caught.

2. New feature! -E/--bluetooth. Gives an -n like bluetooth Device-x/Report. 
Requires for the 'Report:' part hciconfig, which most all distros still have in 
their repos. With -a, shows an additional Info: line that has more obscure 
bluetooth hci data: acl-mtu sco-mtu, link-policy, link-mode, ´┐╝service-classes.

This closes the ancient, venerable issue #79, filed by mikaela so many years 
ago. Better late than never!! However, features like this were really difficult 
in legacy bash/gawk inxi 2.x, and became fairly easy with inxi 3.x, so I guess 
we'll slowly whittle away at these things when the mood, and global pandemic 
lockdowns, make that seem like a good idea...

Includes a small lookup table to match LMP number to Bluetooth version (bt-v:), 
hopefully that's a correct way to determine bluetooth version, there was some 
ambiguity about that.

-x, -xx, and -xxx function pretty much the same way as with -A, -G, and -N 
devices, adding Chip IDs, Bus IDs, version info, and so on. Since this bluetooth 
report does not require root and is an upper case option, it's been added to 
default -F, similar to -R, and -v 5, where raid/bluetooth shows only if data is 
found. With -v7 or -R or -E, always shows, including no data found message.

Includes a fallback report Report-ID: case where for some reason, inxi could not 
match the HCI ID with the device. That's similar to IF-ID in -n, which does the 
same when some of the IFs could not be matched to a specific device.

3. For -A, -G, -N, and -E, new item for -xxx, classID, I realized this is 
actually useful for many cases of trying to figure out what devices are, though 
most users would not know what to do with that information, but that's why it's 
an -xxx option!

4. Yes! You've been paying attention!! More disk vendors, and new vendor IDs!! 
The cornucopia flows its endless bounty over the grateful data collector, and, 
hopefully, inxi users!! Thanks as always, linux-lite hardware database, and 
linux-lite users who really seem set on the impossible project of obtaining all 
the disks/vendors known to man.


1. Small change in wording for mdraid report: 
'System supported mdraid' becomes 'Supported mdraid levels' which is cleaner and 
much more precise.

-- Harald Hope - Thu, 28 Jan 2021 19:34:17 -0800

Version: 3.2.02
Patch: 00
Date: 2021-01-10

New version, man page, bug fixes, changes, adjustments and cleanups!!!

Special thanks to mr. mazda for his ongoing suggestions, ideas, and 


1. In certain corner cases, it appears that lsusb has blank lines, which tripped 
errors in inxi output when the usb parser was trying to access split keys that 
did not exist. Added in check to make sure split actually resulted in expected 

2. A red face bug, I'd left the output debugger switched on with json output, so 
it was printing out the json data structure with Dumper, that's now switched 
off. Hope this doesn't mess anyone up, but it would have mattered only if the 
person was using: 
--output json --output-type print
It did not effect xml output.


1. Got rid of extra level of -L data structure and output handler. Not visible 
to users, but still irksome, so nice to get that fixed. Recursive structures are 
confusing, lol, but this extra level was pointless, but to fix it required 
redoing the logic a bit for both data generator and output feature.

2. Added in support for --display :0.0, previously it did not support the .0 
addition, but why not, if it works for people, good, if not, makes no 

3. There were some missing cases for LVM missing data messages, so the 
following fixes were added:
 * In cases where lsblk is installed and user is non root, or lvs is not 
 installed, but no lvm data is present, inxi now shows the expected 'Message: 
 No LVM data found.' instead of the permissions or missing program error that 
 showed before. If lsblk is not installed, and lvm is installed (or missing), 
 with lvs not root readable, the permissiosn message (or missing program) will 
 show since at that point, inxi has no way to know if there is lvm data or not.
 * Not an inxi, but rather an Arch Linux packaging bug, the maintainer of lvm
 has made lvs and vgs fail to return error number on non root start, which is
 a bug (pvs does return expected error return). Rather than wait for this bug
 to be fixed, inxi will just test if lvs and lsblk lvm data, it will show 
 permissions message, otherwse the no lvm data message as expected.
I think these cover the last unhandled LVM cases I came across, so ideally, the 
lvm data messages will be reasonably correct.

4. Some man page lintian fixes.

5. Changed usb data parser to use 'unless' instead of 'if' in tests since it's 
easier to read unless positive tests are true than if negative or negative etc.


1. Since I see too often things like -F --no-host -z which is redundant, the 
help and man now make it more clear that -z implies --no-host.

2. Even though it's not that pointful, I added in derived Arch Linux system base 
like Ubuntu/Debian have. It's not that meaningful because unlike Ubuntu/Debian, 
where you want to know what version the derived distro is based on, Arch is 
rolling thus no versions, but I figured, why not, it's easy to do, so might as 
well make the system base feature a bit more complete.

Note that the way I did this requires that the distro is ID'ed as its derived 
distro nanme, not Arch Linux, that will vary depending on how they did their 
os-release etc, or distro files, but that's not really an inxi issue, that's up 
to them. From what I've been seeing, it looks like more of the derived distros 
are being ID'ed in inxi as the derived name, so those should all work fine. Note 
that seeing 'base:' requires -Sx.

3. More disk vendors!! More disk vendor IDs!!! I really dug into the stuff, and 
refactored slightly the backend tools I use, so it's now a bit easier to handle 
the data. Thanks linux-lite hardware database, as always, for having users that 
really seemt to use every disk variant known to humanity.


1. In -G, made FAILED: lower case, and also moved it to be after unloaded: It 
was too easy to think that the loaded driver had failed. Also to make it more 
explicit, made output like this, in other words, driver: is a container for the 
possible children: loaded: unloaded: failed: alternate: which should be easier 
to parse and read without mixing up what belongs to what.

driver: loaded: modesetting unloaded: nouvean,vesa alternate: nv
driver: loaded: amdgpu unloaded: vesa failed: ati 

Note that if there is no unloaded: driver, failed: would still appear to come 
after loaded:, but hopefully it's more clear now.

Basically what we found was that the presence of the uppercase FAILED: drew the 
eye so much that it was sometimes not noted that it was a key: following the 
driver: item, which itself because it did not list explicitly loaded: was not as 
clear as it could have been. By making failed: the same as the other key names 
visually, hopefully it will be less easy to think that the loaded: driver 

In a sense, this is a legacy issue, because the original use of FAILED: was for 
non free video drivers, to see when xorg had failed to load them, but over more 
recent years, the most frequent thing I have been seeing is odd things like 
failed: ati, when xorg tries to load the legacy ati driver when amdgpu is being 

2. Likewise, for RAID mdraid and zfs changed FAILED: to Failed:, again, to make 
it more consistent with the other types.

3. In help menu and man page, removed legacy 'card(s)' in -A, -G, -N, and 
replaced that with 'device(s)', which is the more accurate term, since the days 
when these things were only addon cards are long behind us. I had not noticed 
that, but it caught me eye and I realized it was a very deprecated and obsolete 
syntax, which did not match the way inxi describes devices today.

4. It was pointed out how incoherent the naming of the item for setting wrap 
width, --indent-min and config item INDENT_MIN were super confusing, since it 
was neither indent or minimum, it was in fact wrap maximum, so the new options 
and config items are --wrap-max and WRAP_MAX. Note that the legacy values will 
keep working, but it was almost impossible in words to explain this option 
because the option text was almost the exact opposite of what the option 
actually does. Redid the man and help explanations to make the function of this 
option/config item more clear.

5. Made -J/--usb Hub-xx: to fit with other repeating device types in inxi 
output, before Hub: was not numbered, but it struck me, it should be, like all 
the other auto-incremented counter line starters, like ID-xx:, Device-x:, and so 

6. Reorganized the main help menu to hopefully be more logical, now it shows the 
primary output triggers, then after, the extra data items, -a, -x, -xx, -xxx, 
separated by white space per type to make it easier to read. This also moved the 
stuff that had been under the -x items back to where they should be, together 
with the main output control options. For readability and usability, I think 
this will help, the help menu is really long, so the more visual cues it has to 
make it clear what each section is, the better I think. Previously -a was the 
first items, then way further down was -x, -xx, and -xxx, then under those was 
-z, -Z, -y.

-- Harald Hope - Sun, 10 Jan 2021 18:25:48 -0800

Version: 3.2.01
Patch: 00
Date: 2020-12-17

Bug Fixes!!! Continuing internal refactor!!

This bug report came in right after 3.2.00 went out live, but I would never have 
found it myself in testing so better found than not found!


1. A bug was introduced to dmidecode data handlers in 3.2.00 resulted in the 
dmidecode data array basically eating itself up until errors appear. Quite 
difficult to trigger, but babydr from Slackware forums figured it out, using -F 
--dmidecode to force dmidecode use for all features that support it triggered 
thee bug always. This was a result of the refactor, previously inxi had worked 
on copies of referenced arrays, but in this case, it was working on the original 
array of arrays, subtle, but obvious. This method was only used on dmidecode 

2. A second bug was exposed almost by accident, for -M --dmidecode data, there 
was a missing field and also a missing is set test on that field that led to an 
error of using undefined value in string comparison. This was strictly speaking 
2 bugs, both very old, from 2.9 first rewrite, one failing to set/get the value, 
and the other failing to test if the value was set before using it. 


1. There were a few glitches in help menu and man page related to -L option, 
those are corrected.


1. removed bug inducing splice use in some cases, and added parens to splice to 
make it fit the new way of with perl builtins, when taking 2 or more arguments, 
use parens.

2. Found many more instances to add -> dereferencing operator. I have to say, 
not doing that consistently made the code much harder to read, and created 
situations where it's somewhat ambiguous what item belongs to what, with 
everything consistently -> operator run, the code is more clear and obvious, and 
some of the hacks I'd added because of the lack of clarity were also removed.

3. Removed explicit setting of hash references with null value, that was done 
out of failure to use -> operators which clearly indicate to Perl and coder what 
is happening, so those crutches were removed. Also got rid of unnecessary array 
priming like: my @array = (); Some of these habits came from other languages, 
but in Perl, declaring my @array means it's an array that is null, and you don't 
need to do a further (). @array = () is obviously fine for resetting arrays in 
loops or whatever, but not in the initial declaration.

-- Harald Hope - Thu, 17 Dec 2020 14:27:13 -0800

Version: 3.2.00
Patch: 00
Date: 2020-12-15

Huge upgrade, major rewrite/refactor, new features, everything is polished!!!

Note that due to large number of internal changes to code, a separate INTERNAL 
CODE CHANGES section is at the bottom. Those are changes which in general do not 
impact what users see that much, but which definitely impact working on and with 
inxi! They also make errors less likely, and removed many possible bad data 
error situations.


1. Obscure, but very old Tyan Mobo used a form of dmidecode data for RAM that 
I'd never gotten a dataset for before, this tripped a series of errors in inxi, 
which were actually caused by small errors and failures to check certain things, 
as well as simply never assigning data in corner cases. This system used only 
dmi handles 5 and 6, which is a very rare setup, from the very early days of dmi 
data being settled, but it was valid data, and actually inxi was supposed to 
support it, because I'd never gotten a dataset containing such legacy hardware 
data, the support didn't work. There were actually several bugs discovered while 
tracking this down, all were corrected.

2. Going along with the cpu fixes below, there was a bug that if stepping was 0, 
stepping would not show. I had not realized stepping could be 0, so did a 
true/false test instead of a defined test, which makes 0 in perl always test as 
false. This is corrected.

3. While going through code, discovered that missing second argument to 
main::grabber would have made glabel tool (BSD I think mostly) always fail, 
without exception. That explains why BSD systems were never getting glabel data, 

4. Many null get_size tests would not have worked because they were testing for 
null array but ('','') was actually being returned, which is not a null array. 
The testing and results for get_size were quite random, now they are all the 
same and consistent, and confirmed correct.

5. In unmounted devices, the match sent to @lsblk to get extended device data 
would never work with dm-xx type names, failed to translate them to their mapped 
name, which is what is used in lsblk matches, this is corrected. This could lead 
to failures to match fs of members of luks, raid, etc, particularly noticeable 
with complex logical device structures. This means the fallback filters against 
internal logic volume names, various file system type matches, would always 

6. A small host of further bugs found and fixed during the major refactor, but 
not all of them were noted, they were just fixed, sorry, those will be lost to 
history unless you compare with diffs the two versions, but that's thousands of 
lines, but there were more bugs fixed than listed above, just can't remember 
them all.


1. There was some ambiguity about when inxi falls back to showing hardware 
graphics driver instead of xorg gfx driver when it can't find an xorg driver. 
That can happen for instance because of wayland, or because of obscure xorg 
drivers not yet supported. Now the message is very clear, it says the gfx 
software driver is n/a, and that it's showing the hardware gfx driver.

2. Big redo of cpu microarch, finally handled cases where same stepping/model ID 
has two micorarches listed, now that is shown clearly to users, like AMD Zen 
family 17, model 18, which can be either Zen or Zen+, so now it shows that 
ambiguity, and a comment: note: check, like it shows for ram report when it's 
not sure. Shows for instance: arch: Zen/Zen+ note: check in such cases, in other 
words, it tells users that the naming convention basically changed during the 
same hardware/die cycle.

3. There were some raid component errors in the unmounted tests which is 
supposed to test the raid components and remove them from the mounted list. Note 
that inxi now also tests better if something is a raid component, or an lvm 
component, or various other things, so unmounted will be right more often now, 
though it's still not perfect since there are still more unhandled logical 
storage components that will show as unmounted when tney are parts of logical 
volumes. Bit by bit!!

4. Part of a significant android fine tuning and fix series, for -P, android 
uses different default names for partitions, so none showed, now a subset of 
standard android partitions, like /System, /firmware, etc, shows. Android will 
never work well though because google keeps locking down key file read/search 
permissions in /sys and /proc.

5. More ARM device detections, that got tuned quite a bit and cleaned up, for 
instance, it was doing case sensitive checks, but found cases where the value is 
all upper case, so it was missing it. Now it does case insensitive device type 

6. One of the oldest glitches in inxi was the failure to take the size of the 
raid arrays versus the size totals of the raid array components led to Local 
Storage results that were uselessly wrong, being based on what is now called 
'raw' disk totals, that's the raw physical total of all system disks. Now if 
raid is detected the old total: used:... is expanded to: total: raw:... 
usable:....used:, the usable being the actual disk space that can be used to 
store data. Also in the case of LVM systems, a further item is added, lvm-free: 
to report the unused but available volume group space, that is, space not 
currently taken by logical volumes. This can provide a useful overview of your 
system storage, and is much improved over the previous version, which was 
technically unable to solve that issue because the internal structures did not 
support it, now they do. LVM data requires sudo/ root unfortunately, so you will 
see different disk raw totals depending on if it's root or not if there is LVM 
RAID running.

Sample: inxi -D
Drives:    Local Storage: total: raw: 340.19 GiB usable: 276.38 GiB 
           lvm-free: 84.61 GiB used: 8.49 GiB (3.1%)

lvm-free is non assigned volume group size, that is, size not assigned to a 
logical volume in the volume group, but available in the volume group. raw: is 
the total of all detected block devices, usable is how much of that can be used 
in file systems, that is, raid is > 1 devices, but those devices are not 
available for storage, only the total of the raid volume is. Note that if you 
are not using LVM, you will never see lvm-free:.

7. An anonymous user sent a dataset that contained a reasonable alternate 
syntax for sensors output, that made inxi fail to get the sensors data. That was 
prepending 'T' to temp items, and 'F' to fan items, which made enough sense 
though I'd never seen it before, so inxi now supports that alternate sensors 
temp/fan syntax, so that should expand the systems it supports by default out of 
the box.

8. Finally was able to resolve a long standing issue of loading File::Find, 
which is only used in --debug 20-22 debugger, from top of inxi to require load 
in the debugger. I'd tried to fix this before, but failed, the problem is that 
redhat /fedora have broken apart Perl core modules, and made some of them into 
external modules, which made inxi fail to start due to missing use of required 
module that was not really required. Thanks to mrmazda for pointing this out to 
me, I'd tried to get this working before but failed, but this time I figured out 
how to recode some of the uses of File::Find so it would work when loaded 
without the package debugger, hard to figure it, turned out a specific sub 
routine call in that specific case required the parentheses that had been left 
off, very subtle.

9. Subtle issue, unlike most of the other device data processors, the USB data 
parser did not use the remove duplicates tool, which led in some cases to 
duplicated company names in the output for USB, which looks silly.

10. Somehow devtmpfs was not being detected in all cases to remove that from 
partitions report, that was added to the file systen filters to make sure it 
gets caught.

11. Removed LVM image/meta/data data slices from unmounted report, those are LVM 
items, but they are internal LVM volumes, not available or usable. I believe 
there are other data/meta type variants for different LVM features but I have 
added as many types as I could find.. Also explictly now remove any _member type 
item, which is always part of some other logical structure, like RAID or LVM, 
those were not explicitly handled before.

12. Corrected the various terms ZFS can use for spare drives, and due to how 
those describe slightly different situations than simply spare, changed the 
spare section header to Available, which is more accureate for ZFS.


1. Going along with FIX 2 is updating and adding to intel, elbrus microarch 
family/ model/stepping IDs (E8C2), so that is fairly up to date now.

2. Added in a very crude and highly unreliable default fallback for intel: 
/sys/devices/cpu/caps/pmu_name which will show the basic internal name used 
which can be quite different from what the actual microarch name is, but the 
hope is that for new intel cpus that come out after these last inxi updates, 
something may show, instead of nothing. Note these names are often much more 
generic, like using skylake for many different microarches.

3. More android enhancements, for androids that allow reading of 
/system/build.prop, which is a very useful informative system info file, more 
android data will show, like the device name and variant, and a few other 
specialized items. You can see if your android device lets inxi read build.prop 
if you see under -S Distro: Android 7.1 (2016-07-23) or just Android. If it 
shows just android, that means it can't read that file. Showing Android however 
is also new, since while inxi can't always read build.prop, if that file is 
there, it's android, so inxi finally can recognize it's in android, even though 
it can't give much info if it's locked down. Inxi in fact did not previously 
know it was running in android, which is quite different from ARM systems in 
some ways, but now it does.

If the data is available, it will be used in Distro: and in Machine: data to add 
more information about the android version and device.

4. A big one, for -p/-P/-o/-j now shows with -x the mapped device name, not just 
the /dev/dm-xx ID, which makes connecting the various new bits easier, for RAID, 
Logical reports. Note that /dev/mapper/ is removed from the mapped name since 
that's redundant and verbose and makes the output harder to read. For mapped 
devices, the new --logical / -L report lets you drill into the devices to find 
out what dm-xx is actually based on.

5. More big ones, for -a -p/-P/-o/-j/-R/-L shows kernel device major:minor 
number, which again lets you trace each device around the system and report.

6. Added mdadm if root for mdraid report, that let me add a few other details 
for mdraid not previously available. This added item 'state;' to the mdraid 
report with right -x options.

7. Added vpu component type to ARM gfx device type detection, don't know how 
video processing vpu had escaped my notice.

8. Added fio[a-z] block device, I'd never heard of that before, but saw use of 
it in dataset, so learned it's real, but was never handled as a valid block 
device type before, like sda, hda, vda, nvme, mmcblk, etc. fio works the same, 
it's fio + [a-z] + [0-9]+ partition number.

9. Expanded to alternate syntax Elbrus cpu L1, L2, L3 reporting. Note that in 
their nomenclature, L0 and L1 are actually both L1, so add those together when 

10. RAM, thanks to a Mint user, antikythera, learned, and handled something new, 
module 'speed:' vs module 'configured clock speed:'. To quote from supermicro:

Question: Under dmidecode, my 'Configured Clock Speed' is lower than my 'Speed'. 
What does each term mean and why are they not the same?

Answer: Under dmidecode, Speed is the expected speed of the memory (what is 
advertised on the memory spec sheet) and Configured Clock Speed is what the 
actual speed is now. The cause could be many things but the main possibilities 
are mismatching memory and using a CPU that doesn't support your expected memory 
clock speed. Please use only one type of memory and make sure that your CPU 
supports your memory.

11. Since RAM was gettng a look, also changed cases where ddr ram speed is 
reported in MHz, now it will show the speeds as: [speed * 2] MT/S ([speed] MHz). 
This will let users make apples to apples speed comparisons between different 
systems. Since MT/S is largely standard now, there's no need to translate that 
to MHz.

12. And, even more!! When RAM speeds are logically absurd, adds in note: check 
This is from a real user's data by the way, as you can see, it triggers all the 
new RAM per Device report features.

  RAM: total: 31.38 GiB used: 20.65 GiB (65.8%) 
  Array-1: capacity: N/A slots: 4 note: check EC: N/A 
  Device-1: DIMM_A1 size: 8 GiB speed: 1600 MT/s (800 MHz) 
  Device-2: DIMM_A2 size: 8 GiB speed: spec: 1600 MT/s (800 MHz) 
  actual: 61910 MT/s (30955 MHz) note: check 
  Device-3: DIMM_B1 size: 8 GiB speed: 1600 MT/s (800 MHz) 
  Device-4: DIMM_B2 size: 8 GiB speed: spec: 1600 MT/s (800 MHz) 
  actual: 2 MT/s (1 MHz) note: check

13. More disks vendor!!! More disk vendor IDs!!! Yes, that's right, eternity 
exists, here, now, and manifests every day!! Thanks to linux-lite hardware 
database for this eternally generating list. Never underestimate the creativity 
of mankind to make more disk drive companies, and to release new model IDs for 
existing companies. Yes, I feel that this is a metaphore for something much 
larger, but what that is, I'm not entirely clear about.


1. Recent kernel changes have added a lot more sensor data in /sys, although 
this varies system to system, but now, if your system supports it, you can get 
at least partial hdd temp reports without needing hddtemp or root. Early results 
suggest that nvme may have better support than spinning disks, but it really 
varies. inxi will now look for the /sys based temp first, then fall back to the 
much slower and root / sudo only hddtemp. You can force hddtemp always with 
--hddtemp option, which has a corresponding configuration item.

2. The long requested and awaited yet arcane and obscure feature -L/--logical, 
which tries to give a reasonably good report on LVM, LUKS, VeraCrypt, as well as 
handling LVM raid, both regular and thin, is now working. This took a lot of 
testing, and is a very solid and good start in my view, going from nothing to 
something is always a big improvement!! LVM reports require root/sudo. This 
will, finally, close issue #135.

3. Going along with -L, and serving as a model for the logic of -L, was the 
complete refactor of -R, RAID, which was a real mess internally, definitely one 
of the messiest and hardest to work with features of inxi before the refactor. 
It's now completely cleaned up and modularized, and is easy to add raid types, 
which was not possible before, now it cleanly supports zfs, mdraid, and lvm 
raid, with in depth reports and added items like mdraid size, raid component 
device sizes and maj:min numbers if the -a option is used. Note that LVM RAID 
requires root/sudo.

4. Added some more sensors dimm, volts items, slight expansion. Note that the 
possible expansion of sensors made possible by the recently upgraded sensors 
output logic, as well as the new inxi internal sensors data structure, which is 
far more granular than the previous version, and allows for much more fine 
grained control and output, though only gpu data currently takes advantage of 
this new power under the covers, although as noted, the /sys based hdd temps use 
the same source, only straight from /sys, since it was actually easier using the 
data directly from sys than trying to map the drive locations to specific drives 
in sensors output. Well, to be accurate, since now only board type sensors are 
used for the temp/fan speed, voltage, etc, reports, the removal of entire sensor 
groups means less chance of wrong results.

5. To bring the ancient RAID logic to fit the rest of inxi style, made zfs, 
mdraid, and lvm raid components use incrementing numbers, like cpu cores does. 
This got rid of the kind of ugly hacks used previously which were not the same 
for zfs or mdraid, but now they are all the same, except that the numbers for 
mdraid are the actual device numbers that mdraid supplies, and the LVM and ZFS 
numbers are just autoincremented, starting at 1.

6. Changed message  to  because 
it's shorter and communicates the same thing.


1. Small, transparent test, tested on Perl 5.032 for Perl 7 compatibility. All 
tests passed, no legacy code issues in inxi as of now.

2. Although most users won't notice, a big chunk of inxi was refactored 
internally, which is why the new -L, the revamped -R, and the fixed disk totals 
finally all can work now. This may hopefully result in more consistent output 
and fewer oddities and randomnesses, since more of the methods all use the same 
tools now under the covers. Ths refactor also significantly improved inxi's 
execution speed, by about 4-5%, but most of those gains are not visible due to 
the added new features, but the end result is new inxi runs roughly the same 
speed as pre 3.2.00 inxi, but does more, and does it better, internally at 
least. If you have a very good eye you may also note a few places where this 
manifests externally as well. Last I checked about 10-12% of the lines of inxi 
had been changed, but I think that number is higher now. Everything that could 
be optimized was, everything could be made more efficient was.

3. Several core tools in inxi were expanded to work much more cleanly, like 
reader(), which now supports returning just the index value you want, that 
always happened on the caller end before, which led to extra code. get_size 
likewise was expanded to do a string return, which let me remove a lot of 
internal redundant code in creating the size unit output, like 32 MiB. uniq() 
was also redone to work exclusively by reference.

4. Many bad reference and dereference practices that had slipped into inxi from 
the start are mostly corrected now, array assignments use push now, rather than 
assign to array, then add array to another array, and assign those to the master 
array. Several unnecessary and cpu/ram intensive copying steps, that is, were 
removed in many locations internally in inxi. Also now inxi uses more direct 
anonymous array and hash refernce assignments, which again removes redundant 
array/hash creation, copy, and assignment.

5. Also added explicit -> dereferencing arrows to make the code more clear and 
readable, and to make it easier for perl to know what is happening. The lack of 
consistency actually created confusion, I was not aware of what certain code was 
doing, and didn't realize it was doing the same thing as other code because of 
using different methods and syntaxes for referencing array/hash components. I 
probably missed some, but I got many of them, most probably.

6. Instituted a new perl builtin sub routine rule which is: if the sub takes 2 
or more arguments, always put in parentheses, it makes the code much easier to 
follow because you see the closing ), like: push(@rows,@row); Most perl builtins 
that take only one arg do not use parentheses, except length, which just looks 
weird when used in math tests, that is: length($var) > 13 looks better than 
length $var > 13. This resolved inconsistent uses that had grown over time, so 
now all the main builtins follow these rules consistently internally.

Due to certain style elements, and the time required to carefully go through all 
these rules, grep and map do not yet consistently use these rules, that's 
because the tendency has been to use the grep {..test..} @array and map 
{...actions...} @array

7. Mainly to deal with android failures to read standard system files due to 
google locking it down, moved most file queries to use -r, is readable, rather 
than -e, exists, or -f, is file, unless it only needs to know if it exists, of 
course. This fixed many null data errors in android even on locked androids.

8. Added in %mapper and %dmmapper hashes to allow for easy mapping and unmapping 
of mapped block devices. Got rid of other ways of doing that, and made it 
consistent throughout inxi. These are globals that load once.

9. Learned that perl builtin split() has a very strange and in my view 
originally terrible decision that involves treating as regex rules string 
characters in split string, like split('^^',$string), which should logically be 
a string value, not a ^ start search followed by a ^, but that's how it is, so 
that was carefully checked and made consistent as well. Also expanded split to 
take advantage of the number of splits to do, which I had only used occasionally 
before, but only updated field/value splits where I have a good idea of what the 
data is. This is very useful when the data is in the form of field: value, but 
value can contain : as well. You have to be very careful however, since some 
data we do want in fact the 2nd split, but not the subsequent ones, so I only 
updated the ones I was very sure about.

10. Going along with the cpu microarch fixes, updated and cleaned up all the 
lists of model/stepping matches, now they are all in order and much easier to 
scan and find, that had gotten sloppy over the years.

11. More ARM, moved dummy and codec device values into their own storage arrays, 
that let me remove the filters against those in the other detections. Makes 
logic easier to read and maintain as well.

-- Harald Hope - Tue, 15 Dec 2020 15:08:05 -0800

Version: 3.1.09
Patch: 00
Date: 2020-11-11

Bug fixes, new features!! Update now!! Or don't, it's up to you.


1. Let's call some of the android fixes and debugger failures bugs, why not? 
Those are fixed. Note that many of these fixes will impact any system that is 
ARM based, not just android.


1. Related to issue #226 which was a fine issue, fine tuned the debugger 
debuggers to allow for smoother handling of /sys parse failures. Also added 
debugger filters for common items that would make the /sys parser hang, oddly, 
most seem to be in /sys/power for android devices.

2. Added some fine-tunings for possible mmcblk storage paths, in some cases, an 
extra /block is added, which made inxi think mounted drives were unmounted. I've 
never seen this extra /block except on mmcblk devices on android, but you never 
know, it could be more widespread.

3. Also mainly related to android, but maybe other ARM devices, in some cases, 
an errant 'timer' device was appearing as a cpu variant, which is wrong. That 
was a corner case for sure, and part of the variant logic in fact uses timer 
values to assign the actual cpu variants, but it was wrong in this case because 
it was ....-timer-mem, not ...-timer, which led to non-existent CPU variants 

4. Issue #236 by ChrisCheney pointed out that inxi had never updated its default 
/proc/meminfo value to use the newer MemAvailable as default if present, which 
led to incorrect memory used values showing up. That's because back in the old 
days, we had to construct a synthetic Memory used from MemFree, buffers, cache, 
etc, but that wasn't always right, since sometimes the cache actually isn't 
available, often is, but not always.

This commit on the kernel explains it pretty clearly. Thanks Chris for bringing 
this to our attention.

5. Kind of more future-proofing, got rid of a bunch of hard-coded strings 
internally and switched those to use the row_defaults values, which is where 
string messages are supposed to go. That was mostly in the initial program check 
messages on start-up, but also a few other stray ones. Also consolidated them a 
bit to get rid of redundant messages, and added more variable based messages, 
like for missing/permissions on programs etc. The idea in general is that all 
the strings are contained in subs so that in theory they could be swapped for 
other strings, eg, languages, but honestly, I no longer see this as very likely 
to ever happen. But it's still nice to be consistent internally and not get 
sloppy with english strings.

This also got rid of some largely redundant items in row_defaults, and expanded 
the list of handled events, and of variable based events, so it shouldn't be as 
necessary to add new row_defaults items for similar events.


1. Debugger item to maybe try to find distro OEM, this was connected with issue 
#231 but the issue poster vanished, and didn't do the work required, so this one 
won't happen until someone who cares [not me, that is] does the required work. 
It's always funny to see how quickly people vanish when they have to do the 
actual boring research that they want me to do for them, lol. Or maybe, sigh is 
more appropriate than lol. But it is pretty much par for the course, sad to say. 
Or maybe this was an OEM hoping to have someone do their corporate work for them 
for free, who knows. Anyway, there's a certain category of items that I'm 
reasonably happy to implement, but NOT if I have to do all the boring research 
work, so such features being added will depend on the poster actually doing the 
boring work.

I've gotten burned on this a few times, cpu arch: for example, some guy said 
he'd track that and provide updates, he never even made it to the first release, 
so I got stuck doing that one forever after. But that one at least has some 
general value, so that's ok more or less, but I definitely won't take on stuff 
that I really don't personally care at all about unless the person requesting 
the feature does all the work beforehand. The boring part, that is....

2. Related to issue #226, much improved android ID and many small android fixes 
for machine data etc. Now uses /system/build.prop for some data, which is a nice 
source, sadly, most modern android devices seem to be locked down, with both 
build.prop and /sys locked down, which makes inxi unable to actually get any of 
that data, but if your device either does not have these root only readable, or 
if you have an android rooted phone, the android support will be more 

Hint: if you run inxi in termux on your non rooted android device, and it shows 
you what android version you are using in System:... Distro: line, then your 
android is not locked down. I have one such phone, android 7.1, but I cannot say 
how usual or non usual this is. The poster of issue #226 for instance had to 
root his android 7 phone to get this data to display. So it seems to vary quite 
a bit.

Note that due to these file system lockdowns, in general, trying to do android 
arm support remains largely a waste of time, but on some devices sometimes, you 
can now get quite nice system info. As I noted in the issue, if I can't get the 
features to work on a non rooted phone in my possession, I'm probably not going 
to try to do the work because it's too hard to try to work on android issues 
without having the device in front of you for testing and debugging. In this 
case, one of my phones did work, so I did the work just to see where android is 
at now.

Android showed some slightly odd syntaxes for some devices, but those are now 
handled where I got a dataset for them that revealed the changes required.

3. Also related to issue #226 for termux in android, will show -r info. That's 
an apt based package manager, but termux puts the apt files somewhere else so 
needed to change paths if those alternate paths existed for apt.

4. Added PARTFLAGS to debugger to see what knd of data that will yield, that's a 
lsblk key/value pair. 

5. Just because it's easy to do, added new -Ixxx item, wakeups: which is a 
subset of Uptime, this will show how many times the system has been woken from 
suspend since the last boot. If the system has never been suspended, shows 0.

6. Many more disk vendors and disk IDs. The list just never ends, possibly a 
metaphor for something, the endless spinning of maya, who knows?

7. Added newest known ubuntu release, hirsute, to buntu ID logic. Might as well 
catch them early, that will be 21.04.

-- Harald Hope - Wed, 11 Nov 2020 14:57:38 -0800

Version: 3.1.08
Patch: 00
Date: 2020-10-16

Bug fixes, updates!!! Yes!! Why wait!!! Can't stay frozen forever!


1. Not an inxi bug, but a weird change in defaults for ubuntu GNOME ENV variable 
values when running at least the gnome desktop, result to end users appears to 
be a bug. This resolves issue #228

Note that so much weird non desktop data was put into those environmental 
variables that inxi simply could make no sense of it. The fix was to make the 
detections more robust, using regex instead of string compare, as well as to at 
least try to strip out such corrupted data values, though that can never be 
fully predictable. 

As far as I know, this issue only hits ubuntu gnome desktops, I've never seen 
these value corruptions on any other distro, or on any other ubuntu desktop, 
though they may be there, but I'm not going to test all the ubuntu spins to find 

I'm hoping the combination of logic fixes and junk data cleaning will handle 
most future instances of these types of corruptions automatically. 

Again, this only happens on relatively laste ubuntu gnomes as far as I know.


1. An oversight, added sshd to list of whitelisted start clients. This permits 
expected output for: ssh  inxi -bay that is, running inxi as an ssh 
command string. Should have done that a while ago, but better late than never.

This corrects issue #227, or at least, has a better default, it worked fine 
before, but required using --tty to reset to default terminal behavior. The 
problem is that if inxi can't determine what it's running in, it defaults to 
thinking it's in an IRC client, and switches to IRC color codes, among other 
changes. But it was nice to get sshd covered automatically so users don't have 
to know the --tty option.


1. More disk vendors and vendor IDs!!! Yes, that's right, the list never ends!!

-- Harald Hope - Fri, 16 Oct 2020 13:43:40 -0700

Version: 3.1.07
Patch: 00
Date: 2020-09-29

Bug fixes, feature updates, changes!!


1. There was a glitch in the pattern that made -D samsung / seagate not ID 
right, fixed.

2. I do not like calling this a bug, because it's not an inxi bug, it's an 
upstream regression in the syntax used in /proc/version, they changed a fully 
predictable gcc version .... to a random series of embedded/nested parentheses 
and other random junk. inxi tries to deal with this regression, which will be 
perceived as a bug in systems running kernel 5.8 or newer and inxi 3.1.06 or 
older, since it will fail to show the kernel build compiler version since it 
can't find it in the string.

I really dislike these types of regressions caused by bad ideas done badly and 
without any thought to the transmitted knowledge base, but that's how it goes, 
no discipline, I miss the graybeards, who cared about things like this.


1. more -D nvme id changes, intel in this case.

2. FreeBSD lsusb changed syntax, which triggered a series of errors when run. 
[hint BSD users, do NOT file issues that you want fixed and then not provide all 
the data required in a prompt and timely manner, otherwise, really, why did you 
file the issue?].

Note: the fix basically just rejects any row from lsusb that does not have the 
expected syntax/value in the expected place, which was I think the right 
solution given that the change was random, broke expected syntax for lsusb, and 
wasn't really integrateable into existing inxi usb logic, so why fight it? Given 
that at least 99.99% of all lsusb output in the world, including by the way 
OpenBSD's [not sure about most recent version], shows the expected values in the 
expected place, I could see no value in creating a convoluted work-around for a 
non core BSD tool in the first place, so that's what I didn't do.

See the README.txt for what to do to get issues really handed in BSDs.


1. Added --dbg 19 switch to enable smart data debugging for -Da.

1. -C 'boost' option changed from -xxx feature to -x feature. Consider it a 


1. Some new tools to handle impossible data values for some -D situations for 
SMART where the smart report contains gibberish values, that was issue #225 -- 
tools were convert_hex and is_Hex. The utility for these is limited, but might 
be of use in some cases, like handling the above gibberish data value.

-- Harald Hope - Tue, 29 Sep 2020 16:08:05 -0700

Version: 3.1.06
Patch: 00
Date: 2020-08-16

New features, new changes, new bug fixes!!! Excitement!!! Thrills!!!


1. Forgot to set get Shell logic in inxi short form, oops, so Shell remained 
blank, only inxi short, which I rarely use so I didn't notice.

2. Failed to test pacman-g2 for packages, had wrong query argument, so it 
failed. Also failed to test for null data, so showed errors for packages as 
well. Both fixed.

3. A big bug, subtle, and also at the same time, an enhancement, it turns out 
NVME drives do NOT follow the age old /proc/partitions logic where if the minor 
number is divisible by 16 or has remainder 8 when divided by 16, it's a primary 
drive, not a partition. nvme drives use a random numbering when > 1 nvme drives 
are present, and the old tests would fail for all nvme drivers more than the 
first one, which led to wrong disk size totals. Thanks gardotd426 who took the 
time to help figure this out in issue #223 - fix is to not do that test for nvme 
drives, or rather, to add a last fail test for nvme primary nvme[0-9]n[0-9] 
drive detections, not the minor number.


1. Corrected indentation for block sizes, children were not indented.

2. Updated some older inxi-perl/docs pages, why not, once in a while?

3. Kernel 5.8 introduces a changed syntax to gcc string location, this has been 
corrected, and the kernel gcc version now shows correctly for the previous 
syntax and the new one. Hopefully they do not change it again, sigh...

4. Removed string 'hwmon' sensors from gpu, those are not gpu sensors, and are 
also usually not board/cpu sensors, but things like ath10, iwl, etc, network, or 
disk sensors, etc. In some cases hwmon sensor data would appear


1. Big sensors refactor, now inxi supports two new sensors options: 
--sensors-exclude - which allows you to exclude any primary sensor type[s]. Note 
that in the refactored logic, and in the old logic, gpu sensors were already 
excluded. Now other hardware specific sensors like network are excluded as well.

--sensors-use - use ONLY list of supplied sensor IDs, which have to match the
syntax you see in lm-sensors sensors output.

Both accept comma separated list of sensors, 1 or more, no spaces.

The refactor however is more far reaching, now inxi stores and structures data 
not as a long line of sensors and data without differentiation, but by sensor 
array/chip ID, which is how the exclude and use features can work, and how 
granular default hardware sensor exclusions and uses can happen. This is now 
working in the gpu sensors, and will in the future be extended to the newer 
5.7/5.8 kernel disk temperature sensors values, which will lead in some cases to 
being able to get sensors data for disks without root or hddtemp. This is a 
complicated bit of logic, and I don't have time to do it right now, but the data 
is now there and stored and possible to use in the future.

To see sensors structures, use: inxi -s --dbg 18 and that will show the sensors 
data and its structures, which makes debugger a lot easier for new features.

This issue was originally generated by what was in my view an invalid complaint 
about some inxi sensors defaults, which led me to look more closely at sensors 
logic, which is severely lacking. More work on sensors will happen in the 
future, time, health, and energy permitting. 

2. Added Watts, mem temp, for amdgpu sensors, as -sxxx option. More gpu sensor 
data will be added as new data samples show what will be available for the free 
modules like amdgpu, nouvean, and the intel graphics modules.

3. More disk vendors and IDs, as noted, the list never ends, and it hasn't 
ended, so statement remains true. Thanks linux-lite hardware database.


1. This has always bugged me since it was introduced, the primary cpu line 
starter Topology: which was only technically accurate for its direct value, not 
its children, and also, in -b, cpu short form was using the value as the key, 
which is a no-no, I'd been meaning to fix that too, but finally realized if I 
just make the primary CPU line key be 'Info:', which is short, yet 
non-ambiguous, it would solve both problems. 

To keep the -b cpu line as short as before, I removed the 'type:' and integraged 
that value into the primary Info: string:

  Info: 6-Core AMD Ryzen 5 2600 [MT MCP] speed: 2750 MHz min/max: 1550/3400 MHz 
-b 3.1.05 and earlier:
  6-Core: AMD Ryzen 5 2600 type: MT MCP speed: 1515 MHz min/max: 1550/3400 MHz
These resolve something that has irked me for quite a while, 'Topology:' didn't 
fit, it was too geeky, and worst, it only applied to the value directly 
following it, NOT to the rest of the CPU information. It also could not be 
shortened or abbreviated since then it would have made no actual sense, like 
topo:, and the same issue with value being used for key in -b, and wrong word 
for line starter in -C would have existed. Besides, someone might think I was 
trying to make a subtle reference to the great Jodorowsky film 'El Topo', which 
would be silly, because that's art, and this is just some system specs that are 
reasonably readable...

2. Was using opendns for WAN dig IP address, but apparently cysco bought that 
company, and now I've noticed the old opendns dig queries were failing more and 
more, so replaced that with akamai dig requests. Also made the WAN IP fallback 
to HTTP IP method if dig failed. New option: --no-http-wan and config item 
NO_HTTP_WAN with override --http-wan added to let you switch off http wan IP 
requests if you want. Note that if dig fails, you will get no wan ip address. 
Updated/improved error messages to handle this more complex set of wan ip 
options, so hopefully the error alert message will in most cases be right.

3. To future proof inxi, switched debugger upload location to from the old Updated man/help 
to remove those urls too.

-- Harald Hope - Sun, 16 Aug 2020 14:28:58 -0700

Version: 3.1.05
Patch: 00
Date: 2020-07-26

Bug fixes!!! New Features!! Why wait!!!


1. Issue #220 on github: inxi misidentified XFCE as Gnome. This was a kind of 
core issue, and pointed to some logic that needed updating, and some inadequate 
assumptions made, and some too loose cascade of tests. Hopefully now xfce will 
almost never get misidentified, and the other primary desktops ID'ed either from 
$ENV or from xrop -root will be slightly more accurately identified as well.

Note that this fix creates a possibility for obscure misconfigured desktops to 
be ID'ed wrong, but in this case, that will be technically a bug for them, but 
with the new fixes, that situation will be cleaner to handle internally in the 
desktop ID logic.

Also tightened the final Gnome fallback detection to not trigger a possible 
false positive, it was testing for ^_GNOME but that is not adequate, because 
some gnome programs will trigger these values in xprop -root even if GNOME is 
not running. Should be safer now, hopefully no new bugs will be triggered by 
these changes.


1. Missed an indentation level for -y1, gcc alt should have been indented in one 
more level, now it is.

2. In disk vendors/family, didn't clean items starting with '/', this is now 
corrected. Yes, some do, don't ask me why. Might be cases like: Crucial/Micron 
maybe, where the first ID is grabbed, not sure.


1. New Disk vendors, vendor IDs!!! The list never ends!!! We've finally found 
infinity, and it is the unceasing wave of tiny and not so tiny disks and their 

2. New feature: for -Aa, -Na/-na/-ia, -Ga, now will add the modules the kernel 
could support if they were available on the Device-x lines of those items. This 
was made an -a option because it really makes no sense, if it's a regular 
option, users might think that for example an nvidia card had a nouveua driver 
when it didn't, when in fact, all the kernel is saying is that it knows those 
listed modules 'couid' be used or present. This corresponds to the Display: item 
in -Ga, that lists 'alternate:' drivers that Xorg knows about that could 
likewise be used, if they were on the system.

In other words these are --admin options because otherwise users might get 
confused, so this is one where you want to know the man explanation before you 
ask for it.

It is useful however if you're not sure what your choices are for kernel 

When the alternate driver is the same as the active driver, or if none is found, 
it does not show the alternate: item to avoid spamming.

-- Harald Hope - Sun, 26 Jul 2020 19:10:21 -0700

Version: 3.1.04
Patch: 00
Date: 2020-06-28

New version, new man, huge update, bug fixes, cleanups, updates!! 

What started as a relatively minor issue report ended up with a refactor of big 
chunks of some of the oldest code and logic in inxi.

So many bugs and fixes, updates, and enhancements, that I will probably miss 
some when I try to list them.


1. In the process of fixing an issue about sudo use triggering server admin 
emails on failure, when --sudo/--no-sudo and their respective configuration 
items were added, sudo was inadvertently disabled because the test ran before 
the options were processed, which meant the condition to set sudo data was 
always false, so sudo for internal use was never set. The solution was to set a 
flag in the option handler and set sudo after options or configs run.

2. Issue #219 reported gentoo and one other repo type would fail to show enabled 
repos, and would show an error as well, this was due to forgetting to make the 
match test case insensitive. If only all bugs were this easy to fix!!

3. I'd seen this bug before, and couldn't figure out why it existed. It turned 
out that the partition blacklist filters were running fine in the main partition 
data tool, but I had forgotten to add in corresponding lsblk partition data 
filters, lol, so when the logic went back and double checked for missing 
partitions. This feature had been, if i remember right, to be able to show 
hidden partitions, which the standard method didn't see, but lsblk did, anyway, 
when the double check and add missing partitions logic ran, inxi was putting 
back in the blacklisted partitions every time, despite the original blacklists 
working well and as intended. This was fixed by adding in all the required fs 
type blacklists, then adding in comments above each black list reminding coders 
that if they add or remove from one blacklist, they have to do the same on the 

4. Found while testing something unrelated on older vm, the fallback case for 
cpu bugs, which was supposed to show the basic /proc/cpuinfo cpu bugs, was 
failing inexplicably because the data was simply being put into the wrong 
variable name, sigh.


1. While not technically an inxi bug, it would certainly appear that way to 
anyone who triggered it. We'd gotten issue reports before on this, but they were 
never complete, so couldn't figure it out. Basically, if someone puts inxi into 
a simple script that is in $PATH [this was the missing fact needed to actually 
trigger this bug in order to fix it], the script [not inxi], will then enter 
into an endless loop as inxi queries it for its version number using