Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
1b5b32a
GPU (macOS): fixes a comment [ci skip]
CarterLi Nov 17, 2025
cd8ab8e
Command: Adds splitLines option
CarterLi Nov 17, 2025
da3a9be
Packaging: update debian stuff [ci skip]
CarterLi Nov 18, 2025
a94f0ef
CPU: adds NUMA node detection
CarterLi Nov 17, 2025
9d70469
Logo (Builtin): adds Amiga logo (#2061)
sgilissen Nov 18, 2025
7e8fb0f
Zpool: simplifies impl; exposes allocated/guid/readOnly
CarterLi Nov 19, 2025
50388ef
Zpool: uses runtime lookup for zpool properties to ensure portability
CarterLi Nov 19, 2025
ed6abfd
Logo (Builtin): adds OS/2 Warp logo (#2062)
sgilissen Nov 20, 2025
f703d9a
Zpool: simplifies implementation by dropping platform-specific code
CarterLi Nov 20, 2025
b569048
CMake (SunOS): remove static link of `libzfs`
CarterLi Nov 21, 2025
22c92c7
Doc: recommand Ubuntu PPA [ci skip]
CarterLi Nov 21, 2025
ffcddf3
Logo: improve builtin logo printing for piping and buffering
CarterLi Nov 24, 2025
1c2c664
DE: adds Android OEM UI detection
CarterLi Nov 24, 2025
5d13389
TerminalShell: uses absolute path when detecting version if available
CarterLi Nov 25, 2025
9a74e6d
Users (Linux): adds missing `endutxent`
CarterLi Nov 25, 2025
37639c3
Utils: inlines `ffIsAbsolutePath`
CarterLi Nov 25, 2025
2fe2a21
Terminal: reports `sshd` if `$SSH_TTY` is not available
CarterLi Nov 25, 2025
dbaf8a3
FFstrbuf: adds `ffStrbufGetdelim(Restore)`
CarterLi Nov 25, 2025
3a04ae2
Users (Linux): adds systemd fallback for user detection on Linux
CarterLi Nov 25, 2025
3cfef81
Users (Linux): always report the newest session info
CarterLi Nov 25, 2025
09362b2
Util (Windows): fixes compiling
CarterLi Nov 25, 2025
2738f20
GPU (Linux): detect driver specific info for zhaoxin
CarterLi Nov 28, 2025
ad7e23f
TerminalFont: supports the newest Alacritty config format
CarterLi Nov 28, 2025
84a5c6e
Packages (Linux): add kiss packages count (#2072)
VicRadioHead Dec 1, 2025
5e27ee0
Shell: fixes ksh version detection on Linux
CarterLi Dec 1, 2025
ce7455d
Zpool: allows disabling module
CarterLi Dec 1, 2025
76bee78
Chore: fixes comment for AerynOS in builtin.c (#2078)
Alxhr0 Dec 3, 2025
19f30ec
Logo (Builtin): updates Codex Linux new logo (#2071)
NoaHimesaka1873 Dec 3, 2025
3e22dd4
Chore: uses `_WIN32` always
CarterLi Dec 2, 2025
e99ecac
Chore: adds `ffIsValidNativeFD` and uses it
CarterLi Dec 2, 2025
f644df4
CPU: exposes numa node count in custom format
CarterLi Dec 4, 2025
2b620cf
CI (SunOS): fixes a CI error
CarterLi Dec 4, 2025
d6ac89e
Release: v2.56.0
CarterLi Dec 4, 2025
8652737
Fastfetch: enhances config file loading with support for config direc…
CarterLi Dec 5, 2025
7d6c79d
Doc: documents `-c -`
CarterLi Dec 5, 2025
4cb7a64
Logo (Builtin): tidy
CarterLi Dec 5, 2025
c016053
Zpool: fixes inconsistant CMake variables
CarterLi Dec 5, 2025
cb8b4b3
FFstrbuf: removes an unnecessary `return`
CarterLi Dec 5, 2025
417b944
Doc: updates changelog
CarterLi Dec 5, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,6 @@ jobs:
usesh: true
prepare: |
uname -a
pkg install pkg:/package/pkg
pkg update --accept
pkg install gcc14 cmake git pkg-config glib2 dbus sqlite-3 imagemagick

Expand Down
50 changes: 50 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,53 @@
# 2.56.0

Features:
* Enhances config file loading. `--config` and `-c` with relative path now also searches paths defined in `fastfetch --list-config-paths` (typically `~/.config/fastfetch/`)
* This allows users to use `fastfetch -c my-config` without needing to specify the full path.
* Adds NUMA node count detection (CPU)
* Exposed via `{numa-nodes}` in custom format
* Supported on Linux, FreeBSD and Windows
* Supports the newest Alacritty config format (#2070, TerminalFont)
* Detects driver specific info for Zhaoxin GPUs (GPU, Linux)
* Detects Android OEM UI for certain OSes (DE, Android)
* Improves users detection on Linux (#2064, Users, Linux)
* Adds systemd fallback when utmp is unavailable
* Fixes resource leaks
* Always reports the newest session info
* Adds kiss package manager support (#2072, Packages, Linux)
* Reports `sshd` if `$SSH_TTY` is not available (Terminal)
* Zpool module rewrite (#2051, Zpool)
* Adds new Zpool properties: allocated, guid, readOnly
* Zpool module now uses runtime lookup for properties to ensure portability
* Adds NetBSD (requires `sudo`) and macOS support
* Adds `splitLines` option for Command module, which splits the output into sub modules, each containing one line of the output (Command)
```
* Command output:
Line 1
Line 2
Line 3

* Old behavior:
Command: Line 1
Line 2
Line 3

* With `"splitLines": true`:
Command 1: Line 1
Command 2: Line 2
Command 3: Line 3
```

Bugfixes:
* Fixes {m,o}ksh version detection on Linux (Shell)
* Fixes Alacritty config parsing for TOML format (#2070, TerminalFont)
* Improves builtin logo printing for piping and buffering (#2065, Logo)
* Uses absolute path when detecting shell and terminal version if available (#2067, TerminalShell)

Logos:
* Updates Codex Linux logo (#2071)
* Adds OS/2 Warp logo (#2062)
* Adds Amiga logo (#2061)

# 2.55.1

Bugfixes:
Expand Down
44 changes: 12 additions & 32 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.12.0) # target_link_libraries with OBJECT libs & project homepage url

project(fastfetch
VERSION 2.55.1
VERSION 2.56.0
LANGUAGES C
DESCRIPTION "Fast neofetch-like system information tool"
HOMEPAGE_URL "https://github.com/fastfetch-cli/fastfetch"
Expand Down Expand Up @@ -92,7 +92,6 @@ cmake_dependent_option(ENABLE_DDCUTIL "Enable ddcutil" ON "LINUX" OFF)
cmake_dependent_option(ENABLE_DIRECTX_HEADERS "Enable DirectX headers for WSL" ON "LINUX" OFF)
cmake_dependent_option(ENABLE_ELF "Enable libelf" ON "LINUX OR ANDROID OR DragonFly OR Haiku OR GNU" OFF)
cmake_dependent_option(ENABLE_THREADS "Enable multithreading" ON "Threads_FOUND" OFF)
cmake_dependent_option(ENABLE_LIBZFS "Enable libzfs" ON "LINUX OR FreeBSD OR SunOS" OFF)
cmake_dependent_option(ENABLE_PCIACCESS "Enable libpciaccess" ON "GNU" OFF)

option(ENABLE_ZLIB "Enable zlib" ON)
Expand All @@ -107,6 +106,7 @@ option(INSTALL_LICENSE "Install license into /usr/share/licenses" ON)
option(ENABLE_EMBEDDED_PCIIDS "Embed pci.ids into fastfetch, requires `python`" OFF)
option(ENABLE_EMBEDDED_AMDGPUIDS "Embed amdgpu.ids into fastfetch, requires `python`" OFF)
option(ENABLE_WORDEXP "Enable using of wordexp(3) if available, instead of glob(3)" ON)
option(ENABLE_LIBZFS "Enable libzfs" ON)

set(BINARY_LINK_TYPE_OPTIONS dlopen dynamic static)
set(BINARY_LINK_TYPE dlopen CACHE STRING "How to link fastfetch")
Expand Down Expand Up @@ -410,6 +410,7 @@ set(LIBFASTFETCH_SRC
src/detection/version/version.c
src/detection/vulkan/vulkan.c
src/detection/weather/weather.c
src/detection/zpool/zpool.c
src/logo/builtin.c
src/logo/image/im6.c
src/logo/image/im7.c
Expand Down Expand Up @@ -582,7 +583,6 @@ if(LINUX)
src/detection/de/de_linux.c
src/detection/wmtheme/wmtheme_linux.c
src/detection/camera/camera_linux.c
src/detection/zpool/zpool_linux.c
src/util/platform/FFPlatform_unix.c
src/util/binary_linux.c
)
Expand Down Expand Up @@ -656,7 +656,6 @@ elseif(ANDROID)
src/detection/de/de_linux.c
src/detection/wmtheme/wmtheme_linux.c
src/detection/camera/camera_android.c
src/detection/zpool/zpool_nosupport.c
src/util/platform/FFPlatform_unix.c
src/util/binary_linux.c
)
Expand Down Expand Up @@ -739,7 +738,6 @@ elseif(FreeBSD)
src/detection/de/de_linux.c
src/detection/wmtheme/wmtheme_linux.c
src/detection/camera/camera_linux.c
src/detection/zpool/zpool_linux.c
src/util/platform/FFPlatform_unix.c
src/util/binary_linux.c
)
Expand Down Expand Up @@ -833,7 +831,6 @@ elseif(NetBSD)
src/detection/de/de_linux.c
src/detection/wmtheme/wmtheme_linux.c
src/detection/camera/camera_linux.c
src/detection/zpool/zpool_linux.c
src/util/platform/FFPlatform_unix.c
src/util/binary_linux.c
)
Expand Down Expand Up @@ -916,7 +913,6 @@ elseif(OpenBSD)
src/detection/de/de_linux.c
src/detection/wmtheme/wmtheme_linux.c
src/detection/camera/camera_linux.c
src/detection/zpool/zpool_nosupport.c
src/util/platform/FFPlatform_unix.c
src/util/binary_linux.c
src/util/smbiosHelper.c
Expand Down Expand Up @@ -986,7 +982,6 @@ elseif(APPLE)
src/detection/de/de_nosupport.c
src/detection/wmtheme/wmtheme_apple.m
src/detection/camera/camera_apple.m
src/detection/zpool/zpool_nosupport.c
src/util/apple/cf_helpers.c
src/util/apple/osascript.m
src/util/apple/smc_temps.c
Expand Down Expand Up @@ -1056,7 +1051,6 @@ elseif(WIN32)
src/detection/de/de_nosupport.c
src/detection/wmtheme/wmtheme_windows.c
src/detection/camera/camera_windows.cpp
src/detection/zpool/zpool_nosupport.c
src/util/windows/getline.c
src/util/windows/com.cpp
src/util/windows/registry.c
Expand Down Expand Up @@ -1145,7 +1139,6 @@ elseif(SunOS)
src/detection/de/de_linux.c
src/detection/wmtheme/wmtheme_linux.c
src/detection/camera/camera_nosupport.c
src/detection/zpool/zpool_linux.c
src/util/platform/FFPlatform_unix.c
src/util/binary_linux.c
)
Expand Down Expand Up @@ -1214,7 +1207,6 @@ elseif(Haiku)
src/detection/de/de_nosupport.c
src/detection/wmtheme/wmtheme_nosupport.c
src/detection/camera/camera_nosupport.c
src/detection/zpool/zpool_nosupport.c
src/util/platform/FFPlatform_unix.c
src/util/binary_linux.c
src/util/haiku/version.cpp
Expand Down Expand Up @@ -1294,7 +1286,6 @@ elseif(GNU)
src/detection/de/de_linux.c
src/detection/wmtheme/wmtheme_linux.c
src/detection/camera/camera_nosupport.c
src/detection/zpool/zpool_nosupport.c
src/util/platform/FFPlatform_unix.c
src/util/binary_linux.c
)
Expand Down Expand Up @@ -1611,24 +1602,6 @@ ff_lib_enable(PCIACCESS
"pciaccess"
"pciaccess"
)
# The system <libzfs.h> is only usable on SunOS. We provide our local copy of it so it's always available.
if(ENABLE_LIBZFS)
if(BINARY_LINK_TYPE STREQUAL "dlopen")
target_compile_definitions(libfastfetch PRIVATE FF_HAVE_LIBZFS=1)
else()
set(CMAKE_REQUIRED_LIBRARIES_BACKUP ${CMAKE_REQUIRED_LIBRARIES})
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} zfs)
check_function_exists("libzfs_init" LIBZFS_FOUND)
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES_BACKUP})
if(NOT LIBZFS_FOUND)
message(STATUS "Library: missing: LIBZFS")
else()
message(STATUS "Library: found LIBZFS")
target_compile_definitions(libfastfetch PRIVATE FF_HAVE_LIBZFS=1)
target_link_libraries(libfastfetch PRIVATE zfs)
endif()
endif()
endif()

if(ENABLE_THREADS)
target_compile_definitions(libfastfetch PRIVATE FF_HAVE_THREADS=1)
Expand All @@ -1643,6 +1616,15 @@ endif()
if(ENABLE_EMBEDDED_AMDGPUIDS)
target_compile_definitions(libfastfetch PRIVATE FF_HAVE_EMBEDDED_AMDGPUIDS=1)
endif()
if(ENABLE_LIBZFS)
target_compile_definitions(libfastfetch PRIVATE FF_HAVE_LIBZFS=1)

if(NOT BINARY_LINK_TYPE STREQUAL "dlopen")
target_link_libraries(libfastfetch
PRIVATE "zfs"
)
endif()
endif()

if(LINUX)
target_link_libraries(libfastfetch
Expand Down Expand Up @@ -1733,8 +1715,6 @@ elseif(SunOS)
PRIVATE "socket"
PRIVATE "kstat"
PRIVATE "proc"
PRIVATE "zfs"
PRIVATE "nvpair"
PRIVATE "devinfo"
)
elseif(GNU)
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ Some distributions package outdated versions of fastfetch. Older versions receiv
<img src="https://repology.org/badge/vertical-allrepos/fastfetch.svg?columns=2" alt="Packaging status" align="right">
</a>

* Debian: `apt install fastfetch` (for Debian 13 or newer)
* Ubuntu: [`ppa:zhangsongcui3371/fastfetch`](https://launchpad.net/~zhangsongcui3371/+archive/ubuntu/fastfetch) (Ubuntu 22.04 or newer; latest version)
* Debian / Ubuntu: `apt install fastfetch` (Debian 13 or newer; Ubuntu 25.04 or newer)
* Debian / Ubuntu: Download `fastfetch-linux-<proper architecture>.deb` from [Github release page](https://github.com/fastfetch-cli/fastfetch/releases/latest) and double-click it (for Ubuntu 20.04 or newer and Debian 11 or newer).
* Arch Linux: `pacman -S fastfetch`
* Fedora: `dnf install fastfetch`
Expand Down
6 changes: 6 additions & 0 deletions debian/changelog.tpl
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
fastfetch (2.55.1~#UBUNTU_CODENAME#) #UBUNTU_CODENAME#; urgency=medium

* Update to 2.55.1

-- Carter Li <zhangsongcui@live.cn> Mon, 17 Nov 2025 10:15:44 +0800

Comment on lines +1 to +6
Copy link

Copilot AI Dec 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The debian changelog template is missing an entry for version 2.56.0, which is the version being released in this PR (as indicated by the title "Release: v2.56.0" and the CMakeLists.txt version update). The latest entry is for 2.55.1. Consider adding an entry for 2.56.0 with the appropriate release date and changes.

Copilot uses AI. Check for mistakes.
fastfetch (2.55.0~#UBUNTU_CODENAME#) #UBUNTU_CODENAME#; urgency=medium

* Update to 2.55.0
Expand Down
5 changes: 5 additions & 0 deletions doc/json_schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -2111,6 +2111,11 @@
"type": "boolean",
"default": true
},
"splitLines": {
"description": "Set if the command output should be split into multiple lines",
"type": "boolean",
"default": false
},
"key": {
"$ref": "#/$defs/key"
},
Expand Down
17 changes: 17 additions & 0 deletions src/common/font.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#include "fastfetch.h"
#include "util/FFlist.h"
#include "util/FFstrbuf.h"
#include "common/font.h"

#include <string.h>
Expand Down Expand Up @@ -192,6 +194,21 @@ void ffFontInitValues(FFfont* font, const char* name, const char* size)
fontInitPretty(font);
}

void ffFontInitMoveValues(FFfont* font, FFstrbuf* name, FFstrbuf* size, FFstrbuf* style)
{
ffFontInit(font);

if (name) ffStrbufInitMove(&font->name, name);
if (size) ffStrbufInitMove(&font->size, size);
if (style)
{
FFstrbuf* styleBuf = FF_LIST_ADD(FFstrbuf, font->styles);
ffStrbufInitMove(styleBuf, style);
}

fontInitPretty(font);
}

void ffFontInitWithSpace(FFfont* font, const char* rawName)
{
const char* pspace = strrchr(rawName, ' ');
Expand Down
1 change: 1 addition & 0 deletions src/common/font.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ void ffFontInit(FFfont* font);
void ffFontInitQt(FFfont* font, const char* data);
void ffFontInitPango(FFfont* font, const char* data);
void ffFontInitValues(FFfont* font, const char* name, const char* size);
void ffFontInitMoveValues(FFfont* font, FFstrbuf* name, FFstrbuf* size, FFstrbuf* style);
void ffFontInitWithSpace(FFfont* font, const char* rawName);
void ffFontDestroy(FFfont* font);

Expand Down
2 changes: 1 addition & 1 deletion src/common/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ static void defaultConfig(void)

void ffInitInstance(void)
{
#ifdef WIN32
#ifdef _WIN32
// https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale?source=recommendat>
setlocale(LC_ALL, ".UTF8");
#else
Expand Down
20 changes: 14 additions & 6 deletions src/common/io/io.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,19 +171,27 @@ static inline void ffUnsuppressIO(bool* suppressed)

void ffListFilesRecursively(const char* path, bool pretty);

static inline bool ffIsValidNativeFD(FFNativeFD fd)
{
#ifndef _WIN32
return fd >= 0;
#else
// https://devblogs.microsoft.com/oldnewthing/20040302-00/?p=40443
return fd != INVALID_HANDLE_VALUE && fd != NULL;
#endif
}

FF_C_NONNULL(1)
static inline bool wrapClose(FFNativeFD* pfd)
{
assert(pfd);

#ifndef WIN32
if (*pfd < 0)
return false;
if (!ffIsValidNativeFD(*pfd))
return false;

#ifndef _WIN32
close(*pfd);
#else
// https://devblogs.microsoft.com/oldnewthing/20040302-00/?p=40443
if (*pfd == NULL || *pfd == INVALID_HANDLE_VALUE)
return false;
CloseHandle(*pfd);
#endif

Expand Down
4 changes: 4 additions & 0 deletions src/common/processing_linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,10 @@ void ffProcessGetInfoLinux(pid_t pid, FFstrbuf* processName, FFstrbuf* exe, cons
ffStrbufEnsureFixedLengthFree(exePath, (uint32_t)length);
ffStrbufAppendNS(exePath, (uint32_t)length, buf);
}
else
{
ffStrbufSetS(exePath, filePath);
Copy link

Copilot AI Dec 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting exePath to filePath (which is /proc/%d/exe) when readlink fails is misleading. The path /proc/%d/exe is a symbolic link, not the actual executable path. If readlink fails, it would be more appropriate to leave exePath empty or set it to an error indicator, rather than providing a symlink path that could be misinterpreted as the actual executable location. Consider using ffStrbufClear(exePath) instead or documenting this fallback behavior.

Suggested change
ffStrbufSetS(exePath, filePath);
ffStrbufClear(exePath);

Copilot uses AI. Check for mistakes.
}
}

#elif defined(__APPLE__)
Expand Down
2 changes: 1 addition & 1 deletion src/data/help.json
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@
"short": "c",
"long": "config",
"desc": "Specify the config file or preset to load",
"remark": "The file will be searched according to the order shown by \"fastfetch --list-config-paths\". Use \"none\" to disable further config loading. See also https://github.com/fastfetch-cli/fastfetch/wiki/Configuration for more info",
"remark": "The file will be searched according to the order shown by \"fastfetch --list-config-paths\". Use \"-\" to read config from stdin or \"none\" to disable further config loading. See also https://github.com/fastfetch-cli/fastfetch/wiki/Configuration for more info",
"arg": {
"type": "config"
}
Expand Down
1 change: 1 addition & 0 deletions src/detection/cpu/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ typedef struct FFCPUResult
uint16_t coresPhysical;
uint16_t coresLogical;
uint16_t coresOnline;
uint16_t numaNodes;

uint32_t frequencyBase; // GHz
uint32_t frequencyMax; // GHz
Expand Down
2 changes: 2 additions & 0 deletions src/detection/cpu/cpu_bsd.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,5 +100,7 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu)
detectThermalTemp(&cpu->temperature);
}

cpu->numaNodes = (uint16_t) ffSysctlGetInt("vm.ndomains", 0);

return NULL;
}
Loading
Loading