From 2dfcadf413a5526fd5edc31dc16445de13a21835 Mon Sep 17 00:00:00 2001 From: utox39 Date: Sat, 6 Dec 2025 19:26:41 +0100 Subject: [PATCH 01/15] feat(linux-packages): add flatpak packages count --- src/linux/packages.zig | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/linux/packages.zig diff --git a/src/linux/packages.zig b/src/linux/packages.zig new file mode 100644 index 0000000..baacf8a --- /dev/null +++ b/src/linux/packages.zig @@ -0,0 +1,15 @@ +const std = @import("std"); + +fn countFlatpaks(allocator: std.mem.Allocator) !usize { + // flatpak list | wc -l + const result = try std.process.Child.run(.{ .allocator = allocator, .argv = &[_][]const u8{ + "sh", + "-c", + "flatpak list | wc -l", + } }); + const result_stdout = result.stdout; + const result_trimmed = std.mem.trim(u8, result_stdout, "\n"); + defer allocator.free(result_stdout); + + return try std.fmt.parseInt(usize, result_trimmed, 10); +} From b9dc58fabe741d526cafa376f263ac7bc7982930 Mon Sep 17 00:00:00 2001 From: utox39 Date: Sat, 6 Dec 2025 19:28:12 +0100 Subject: [PATCH 02/15] feat(linux-packages): add Nix packages count --- src/linux/packages.zig | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/linux/packages.zig b/src/linux/packages.zig index baacf8a..cb9080f 100644 --- a/src/linux/packages.zig +++ b/src/linux/packages.zig @@ -13,3 +13,18 @@ fn countFlatpaks(allocator: std.mem.Allocator) !usize { return try std.fmt.parseInt(usize, result_trimmed, 10); } + +fn countNixPackages(allocator: std.mem.Allocator) !usize { + // nix-store --query --requisites /run/current-system | wc -l + const result = try std.process.Child.run(.{ .allocator = allocator, .argv = &[_][]const u8{ + "sh", + "-c", + "nix-store --query --requisites /run/current-system | wc -l", + } }); + + const result_stdout = result.stdout; + const result_trimmed = std.mem.trim(u8, result_stdout, "\n"); + defer allocator.free(result_stdout); + + return try std.fmt.parseInt(usize, result_trimmed, 10); +} From 51de84d2103051f41dea6c8ca389a671cf2702f2 Mon Sep 17 00:00:00 2001 From: utox39 Date: Sat, 6 Dec 2025 23:17:24 +0100 Subject: [PATCH 03/15] refactor(linux-packages): rename countFlatpaks to countFlatpakPackages --- src/linux/packages.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linux/packages.zig b/src/linux/packages.zig index cb9080f..169772f 100644 --- a/src/linux/packages.zig +++ b/src/linux/packages.zig @@ -1,6 +1,6 @@ const std = @import("std"); -fn countFlatpaks(allocator: std.mem.Allocator) !usize { +fn countFlatpakPackages(allocator: std.mem.Allocator) !usize { // flatpak list | wc -l const result = try std.process.Child.run(.{ .allocator = allocator, .argv = &[_][]const u8{ "sh", From e2cbda50c17bf0e681a6fac18c54753da2264214 Mon Sep 17 00:00:00 2001 From: utox39 Date: Tue, 9 Dec 2025 12:26:35 +0100 Subject: [PATCH 04/15] fix(linux-packages): fix a memory leak caused by the child process writing to stderr --- src/linux/packages.zig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/linux/packages.zig b/src/linux/packages.zig index 169772f..f7c7b79 100644 --- a/src/linux/packages.zig +++ b/src/linux/packages.zig @@ -10,6 +10,7 @@ fn countFlatpakPackages(allocator: std.mem.Allocator) !usize { const result_stdout = result.stdout; const result_trimmed = std.mem.trim(u8, result_stdout, "\n"); defer allocator.free(result_stdout); + defer allocator.free(result.stderr); return try std.fmt.parseInt(usize, result_trimmed, 10); } @@ -25,6 +26,7 @@ fn countNixPackages(allocator: std.mem.Allocator) !usize { const result_stdout = result.stdout; const result_trimmed = std.mem.trim(u8, result_stdout, "\n"); defer allocator.free(result_stdout); + defer allocator.free(result.stderr); return try std.fmt.parseInt(usize, result_trimmed, 10); } From a64db7a7d3b960ede6714b03eb41b1db5ba66b4d Mon Sep 17 00:00:00 2001 From: utox39 Date: Tue, 9 Dec 2025 18:22:00 +0100 Subject: [PATCH 05/15] feat(linux-packages): add dpkg packages count --- src/linux/packages.zig | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/linux/packages.zig b/src/linux/packages.zig index f7c7b79..662e437 100644 --- a/src/linux/packages.zig +++ b/src/linux/packages.zig @@ -30,3 +30,23 @@ fn countNixPackages(allocator: std.mem.Allocator) !usize { return try std.fmt.parseInt(usize, result_trimmed, 10); } + +fn countDpkgPackages(allocator: std.mem.Allocator) !usize { + const dpkg_status_path = "/var/lib/dpkg/status"; + const dpkg_file = try std.fs.cwd().openFile(dpkg_status_path, .{ .mode = .read_only }); + defer dpkg_file.close(); + const file_size = (try dpkg_file.stat()).size; + + const content = try utils.readFile(allocator, dpkg_file, file_size); + defer allocator.free(content); + + var count: usize = 0; + var iter = std.mem.splitSequence(u8, content, "\n\n"); + // TODO: find a way to avoid this loop + while (iter.next()) |_| { + count += 1; + } + + // Subtruct 1 to remove an empty line + return count - 1; +} From 6f4e4eb0446acaf99207e51904d47e80973aa6aa Mon Sep 17 00:00:00 2001 From: utox39 Date: Tue, 9 Dec 2025 19:35:10 +0100 Subject: [PATCH 06/15] refactor(utils): move countEntries from macos utils in common utils --- src/macos/packages.zig | 2 +- src/macos/utils.zig | 14 -------------- src/utils.zig | 14 ++++++++++++++ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/macos/packages.zig b/src/macos/packages.zig index 319f368..39cf298 100644 --- a/src/macos/packages.zig +++ b/src/macos/packages.zig @@ -1,5 +1,5 @@ const std = @import("std"); -const utils = @import("utils.zig"); +const utils = @import("../utils.zig"); pub fn getPackagesInfo(allocator: std.mem.Allocator) ![]const u8 { var packages_info = std.array_list.Managed(u8).init(allocator); diff --git a/src/macos/utils.zig b/src/macos/utils.zig index 48046af..f295ba5 100644 --- a/src/macos/utils.zig +++ b/src/macos/utils.zig @@ -23,17 +23,3 @@ pub fn cfTypeRefToZigString(allocator: std.mem.Allocator, cf_type_ref: c_iokit.C return allocator.realloc(buffer, actual_len); } - -pub fn countEntries(dir_path: []const u8) !usize { - var dir = try std.fs.openDirAbsolute(dir_path, .{ .iterate = true }); - defer dir.close(); - - var count: usize = 0; - var iter = dir.iterate(); - - while (try iter.next()) |_| { - count += 1; - } - - return count; -} diff --git a/src/utils.zig b/src/utils.zig index 6b85114..0575462 100644 --- a/src/utils.zig +++ b/src/utils.zig @@ -125,3 +125,17 @@ pub fn readFile(allocator: std.mem.Allocator, file: std.fs.File, size: usize) ![ return allocator.dupe(u8, data); } + +pub fn countEntries(dir_path: []const u8) !usize { + var dir = try std.fs.openDirAbsolute(dir_path, .{ .iterate = true }); + defer dir.close(); + + var count: usize = 0; + var iter = dir.iterate(); + + while (try iter.next()) |_| { + count += 1; + } + + return count; +} From 2de0d6ec0964dc0ca0b1818bba8bd70d67a233df Mon Sep 17 00:00:00 2001 From: utox39 Date: Tue, 9 Dec 2025 21:24:24 +0100 Subject: [PATCH 07/15] feat(linux-packages): add pacman packages count --- src/linux/packages.zig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/linux/packages.zig b/src/linux/packages.zig index 662e437..9ae4b0c 100644 --- a/src/linux/packages.zig +++ b/src/linux/packages.zig @@ -50,3 +50,8 @@ fn countDpkgPackages(allocator: std.mem.Allocator) !usize { // Subtruct 1 to remove an empty line return count - 1; } + +fn countPacmanPackages() !usize { + // Subtruct 1 to remove `ALPM_DB_VERSION` from the count + return try utils.countEntries("/var/lib/pacman/local") - 1; +} From a88aab97ff80f3b405beeebafab59a969980852e Mon Sep 17 00:00:00 2001 From: utox39 Date: Sun, 14 Dec 2025 02:08:27 +0100 Subject: [PATCH 08/15] feat(linux-packages): add xbps packages count --- src/linux/packages.zig | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/linux/packages.zig b/src/linux/packages.zig index 9ae4b0c..bf9957d 100644 --- a/src/linux/packages.zig +++ b/src/linux/packages.zig @@ -55,3 +55,34 @@ fn countPacmanPackages() !usize { // Subtruct 1 to remove `ALPM_DB_VERSION` from the count return try utils.countEntries("/var/lib/pacman/local") - 1; } + +fn countXbpsPackages(allocator: std.mem.Allocator) !usize { + var dir = try std.fs.openDirAbsolute("/var/db/xbps/", .{ .iterate = true }); + defer dir.close(); + + var count: usize = 0; + + var dir_iter = dir.iterate(); + + while (try dir_iter.next()) |e| { + if ((e.kind == .file) and std.mem.startsWith(u8, e.name, "pkgdb-")) { + const pkgdb_file = try dir.openFile(e.name, .{ .mode = .read_only }); + defer pkgdb_file.close(); + const file_size = (try pkgdb_file.stat()).size; + + const content = try utils.readFile(allocator, pkgdb_file, file_size); + defer allocator.free(content); + + var file_iter = std.mem.splitSequence(u8, content, "installed"); + // TODO: find a way to avoid this loop + while (file_iter.next()) |_| { + count += 1; + } + + break; + } + } + + // Subtruct 1 to remove an useless line + return count - 1; +} From 29d5bb1d98e8723333f7ae34df5eedf6c0c75873 Mon Sep 17 00:00:00 2001 From: utox39 Date: Sun, 14 Dec 2025 02:09:50 +0100 Subject: [PATCH 09/15] refactor(linux-packages): change a comment --- src/linux/packages.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linux/packages.zig b/src/linux/packages.zig index bf9957d..22569d3 100644 --- a/src/linux/packages.zig +++ b/src/linux/packages.zig @@ -47,7 +47,7 @@ fn countDpkgPackages(allocator: std.mem.Allocator) !usize { count += 1; } - // Subtruct 1 to remove an empty line + // Subtruct 1 to remove an useless line return count - 1; } From c867ea69c69e6077b1c10648615b31ea2cb6f395 Mon Sep 17 00:00:00 2001 From: utox39 Date: Sun, 14 Dec 2025 02:28:52 +0100 Subject: [PATCH 10/15] feat(linux-packages): add packages count --- src/formatters.zig | 10 +++------- src/linux/linux.zig | 1 + src/linux/packages.zig | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/formatters.zig b/src/formatters.zig index 0bed40d..c71c235 100644 --- a/src/formatters.zig +++ b/src/formatters.zig @@ -100,13 +100,9 @@ pub fn getDefaultFormattedPackagesInfo(allocator: std.mem.Allocator) !Result { } pub fn getFormattedPackagesInfo(allocator: std.mem.Allocator, key: []const u8, key_color: []const u8) !Result { - if (builtin.os.tag == .macos) { - const packages_info = try detection.packages.getPackagesInfo(allocator); - defer allocator.free(packages_info); - return Result{ .string = try std.fmt.allocPrint(allocator, "{s}{s}:{s}{s}", .{ key_color, key, ascii.Reset, packages_info }) }; - } else if (builtin.os.tag == .linux) { - return Result{ .string = try std.fmt.allocPrint(allocator, "{s}{s}:{s} WIP", .{ key_color, key, ascii.Reset }) }; - } + const packages_info = try detection.packages.getPackagesInfo(allocator); + defer allocator.free(packages_info); + return Result{ .string = try std.fmt.allocPrint(allocator, "{s}{s}:{s}{s}", .{ key_color, key, ascii.Reset, packages_info }) }; } pub fn getDefaultFormattedShellInfo(allocator: std.mem.Allocator) !Result { diff --git a/src/linux/linux.zig b/src/linux/linux.zig index f7ee652..7c89615 100644 --- a/src/linux/linux.zig +++ b/src/linux/linux.zig @@ -2,3 +2,4 @@ pub const hardware = @import("./hardware.zig"); pub const network = @import("./network.zig"); pub const system = @import("./system.zig"); pub const user = @import("./user.zig"); +pub const packages = @import("./packages.zig"); diff --git a/src/linux/packages.zig b/src/linux/packages.zig index 22569d3..ed19ef3 100644 --- a/src/linux/packages.zig +++ b/src/linux/packages.zig @@ -1,4 +1,40 @@ const std = @import("std"); +const utils = @import("../utils.zig"); + +pub fn getPackagesInfo(allocator: std.mem.Allocator) ![]const u8 { + var packages_info = std.array_list.Managed(u8).init(allocator); + defer packages_info.deinit(); + + const flatpak_packages = countFlatpakPackages(allocator) catch 0; + const nix_packages = countNixPackages(allocator) catch 0; + const dpkg_packages = countDpkgPackages(allocator) catch |err| if (err == error.FileNotFound) 0 else return err; + const pacman_packages = countPacmanPackages() catch |err| if (err == error.FileNotFound) 0 else return err; + const xbps_packages = countXbpsPackages(allocator) catch |err| if (err == error.FileNotFound) 0 else return err; + + var buffer: [32]u8 = undefined; + + if (nix_packages > 0) { + try packages_info.appendSlice(try std.fmt.bufPrint(&buffer, " Nix: {d}", .{nix_packages})); + } + + if (flatpak_packages > 0) { + try packages_info.appendSlice(try std.fmt.bufPrint(&buffer, " Flatpak: {d}", .{flatpak_packages})); + } + + if (dpkg_packages > 0) { + try packages_info.appendSlice(try std.fmt.bufPrint(&buffer, " Dpkg: {d}", .{dpkg_packages})); + } + + if (pacman_packages > 0) { + try packages_info.appendSlice(try std.fmt.bufPrint(&buffer, " Pacman: {d}", .{pacman_packages})); + } + + if (xbps_packages > 0) { + try packages_info.appendSlice(try std.fmt.bufPrint(&buffer, " Xbps: {d}", .{xbps_packages})); + } + + return try allocator.dupe(u8, packages_info.items); +} fn countFlatpakPackages(allocator: std.mem.Allocator) !usize { // flatpak list | wc -l From 87d31a91125c5c250189c9ebc2d2089b903693cf Mon Sep 17 00:00:00 2001 From: utox39 Date: Sun, 14 Dec 2025 20:19:54 +0100 Subject: [PATCH 11/15] refactor(linux-packages): switch Flatpak package counting to filesystem-based method --- src/linux/packages.zig | 71 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/src/linux/packages.zig b/src/linux/packages.zig index ed19ef3..d904b13 100644 --- a/src/linux/packages.zig +++ b/src/linux/packages.zig @@ -5,7 +5,7 @@ pub fn getPackagesInfo(allocator: std.mem.Allocator) ![]const u8 { var packages_info = std.array_list.Managed(u8).init(allocator); defer packages_info.deinit(); - const flatpak_packages = countFlatpakPackages(allocator) catch 0; + const flatpak_packages = countFlatpakPackages() catch |err| if (err == error.FileNotFound) 0 else return err; const nix_packages = countNixPackages(allocator) catch 0; const dpkg_packages = countDpkgPackages(allocator) catch |err| if (err == error.FileNotFound) 0 else return err; const pacman_packages = countPacmanPackages() catch |err| if (err == error.FileNotFound) 0 else return err; @@ -36,19 +36,64 @@ pub fn getPackagesInfo(allocator: std.mem.Allocator) ![]const u8 { return try allocator.dupe(u8, packages_info.items); } -fn countFlatpakPackages(allocator: std.mem.Allocator) !usize { - // flatpak list | wc -l - const result = try std.process.Child.run(.{ .allocator = allocator, .argv = &[_][]const u8{ - "sh", - "-c", - "flatpak list | wc -l", - } }); - const result_stdout = result.stdout; - const result_trimmed = std.mem.trim(u8, result_stdout, "\n"); - defer allocator.free(result_stdout); - defer allocator.free(result.stderr); +fn countFlatpakPackages() !usize { + const flatpak_apps = try countFlatpakApps(); + const flatpak_runtimes = try countFlatpakRuntimes(); - return try std.fmt.parseInt(usize, result_trimmed, 10); + return flatpak_apps + flatpak_runtimes; +} + +fn countFlatpakApps() !usize { + var dir = try std.fs.openDirAbsolute("/var/lib/flatpak/app/", .{ .iterate = true }); + defer dir.close(); + + var iter = dir.iterate(); + + var count: usize = 0; + + while (try iter.next()) |e| { + if (e.kind != .directory) continue; + + var sub_dir = try dir.openDir(e.name, .{}); + defer sub_dir.close(); + + var current = sub_dir.openDir("current", .{}) catch continue; + defer current.close(); + + // If `current` was opened successfully, increment the count + count += 1; + } + + return count; +} + +fn countFlatpakRuntimes() !usize { + var dir = try std.fs.openDirAbsolute("/var/lib/flatpak/runtime/", .{ .iterate = true }); + defer dir.close(); + + var iter = dir.iterate(); + + var counter: usize = 0; + + while (try iter.next()) |e| { + if (std.mem.endsWith(u8, e.name, ".Locale") or std.mem.endsWith(u8, e.name, ".Debug")) continue; + + var arch_dir = try dir.openDir(e.name, .{ .iterate = true }); + defer arch_dir.close(); + var arch_iter = arch_dir.iterate(); + while (try arch_iter.next()) |arch_e| { + if (arch_e.kind != .directory) continue; + + var sub_dir = try arch_dir.openDir(arch_e.name, .{ .iterate = true }); + defer sub_dir.close(); + var sub_iter = sub_dir.iterate(); + while (try sub_iter.next()) |_| { + counter += 1; + } + } + } + + return counter; } fn countNixPackages(allocator: std.mem.Allocator) !usize { From 6ca8dcf3341904df055ee20ef5eeefb05c73b8e9 Mon Sep 17 00:00:00 2001 From: utox39 Date: Mon, 15 Dec 2025 23:12:44 +0100 Subject: [PATCH 12/15] perf(linux-packages): improve nix packages counting speed by adding a cache system --- src/linux/packages.zig | 95 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 11 deletions(-) diff --git a/src/linux/packages.zig b/src/linux/packages.zig index d904b13..c12157f 100644 --- a/src/linux/packages.zig +++ b/src/linux/packages.zig @@ -97,19 +97,92 @@ fn countFlatpakRuntimes() !usize { } fn countNixPackages(allocator: std.mem.Allocator) !usize { - // nix-store --query --requisites /run/current-system | wc -l - const result = try std.process.Child.run(.{ .allocator = allocator, .argv = &[_][]const u8{ - "sh", - "-c", - "nix-store --query --requisites /run/current-system | wc -l", - } }); + // `/run/current-system` is a sym-link, so we need to obtein the real path + const real_path = try std.fs.realpathAlloc(allocator, "/run/current-system"); + defer allocator.free(real_path); - const result_stdout = result.stdout; - const result_trimmed = std.mem.trim(u8, result_stdout, "\n"); - defer allocator.free(result_stdout); - defer allocator.free(result.stderr); + var hash: [32]u8 = undefined; + std.crypto.hash.Blake3.hash(real_path, &hash, .{}); + const hash_hex = try std.fmt.allocPrint(allocator, "{x}", .{hash}); + defer allocator.free(hash_hex); - return try std.fmt.parseInt(usize, result_trimmed, 10); + var count: usize = 0; + + // Inspired by https://github.com/fastfetch-cli/fastfetch/blob/608382109cda6623e53f318e8aced54cf8e5a042/src/detection/packages/packages_nix.c#L81 + count = checkNixCache(allocator, hash_hex) catch |err| switch (err) { + error.FileNotFound, error.InvalidCache => { + // nix-store --query --requisites /run/current-system | wc -l + const result = try std.process.Child.run(.{ .allocator = allocator, .argv = &[_][]const u8{ + "sh", + "-c", + "nix-store --query --requisites /run/current-system | wc -l", + } }); + + const result_trimmed = std.mem.trim(u8, result.stdout, "\n"); + defer allocator.free(result.stdout); + defer allocator.free(result.stderr); + + count = try std.fmt.parseInt(usize, result_trimmed, 10); + + try writeNixCache(allocator, hash_hex, count); + + return count; + }, + else => return err, + }; + + return count; +} + +fn getNixCachePath(allocator: std.mem.Allocator) ![]const u8 { + var cache_dir_path = std.process.getEnvVarOwned(allocator, "XDG_CACHE_HOME") catch try allocator.dupe(u8, ""); + if (cache_dir_path.len == 0) { + allocator.free(cache_dir_path); + const home = try std.process.getEnvVarOwned(allocator, "HOME"); + defer allocator.free(home); + cache_dir_path = try std.fs.path.join(allocator, &.{ home, ".cache", "zigfetch", "nix" }); + } else { + cache_dir_path = try std.fs.path.join(allocator, &.{ cache_dir_path, "zigfetch", "nix" }); + } + + return cache_dir_path; +} + +fn writeNixCache(allocator: std.mem.Allocator, hash: []const u8, count: usize) !void { + const cache_dir_path = try getNixCachePath(allocator); + defer allocator.free(cache_dir_path); + + try std.fs.cwd().makePath(cache_dir_path); + var cache_dir = try std.fs.cwd().openDir(cache_dir_path, .{}); + defer cache_dir.close(); + var cache_file = try cache_dir.createFile("nix_cache", .{ .truncate = true }); + defer cache_file.close(); + + const cache_content = try std.fmt.allocPrint(allocator, "{s}\n{d}", .{ hash, count }); + defer allocator.free(cache_content); + try cache_file.writeAll(cache_content); +} + +fn checkNixCache(allocator: std.mem.Allocator, hash: []const u8) !usize { + const cache_dir_path = try getNixCachePath(allocator); + defer allocator.free(cache_dir_path); + var cache_dir = try std.fs.cwd().openDir(cache_dir_path, .{}); + defer cache_dir.close(); + + var cache_file = try cache_dir.openFile("nix_cache", .{ .mode = .read_only }); + const cache_size = (try cache_file.stat()).size; + const cache_content = try utils.readFile(allocator, cache_file, cache_size); + defer allocator.free(cache_content); + + var cache_iter = std.mem.splitScalar(u8, cache_content, '\n'); + + const hash_needle = cache_iter.next().?; + if (!std.mem.eql(u8, hash, hash_needle)) { + return error.InvalidCache; + } + + // The next element in the split is the package count + return std.fmt.parseInt(usize, cache_iter.next().?, 10); } fn countDpkgPackages(allocator: std.mem.Allocator) !usize { From 937746ad506a5c91def932006db50f080537df2e Mon Sep 17 00:00:00 2001 From: utox39 Date: Mon, 15 Dec 2025 23:16:16 +0100 Subject: [PATCH 13/15] build: bump version to 0.25.0 --- build.zig.zon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.zig.zon b/build.zig.zon index daf5072..fb81d3a 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -10,7 +10,7 @@ // This is a [Semantic Version](https://semver.org/). // In a future version of Zig it will be used for package deduplication. - .version = "0.24.2", + .version = "0.25.0", // Together with name, this represents a globally unique package // identifier. This field is generated by the Zig toolchain when the From 8258df5aaede6e7465491efbb328d28c3178b8ec Mon Sep 17 00:00:00 2001 From: utox39 Date: Mon, 15 Dec 2025 23:26:49 +0100 Subject: [PATCH 14/15] docs: update README --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 78cced4..2bd1a38 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ Available modules: | os | Yes | Yes | WIP | | kernel | Yes | Yes | WIP | | uptime | Yes | Yes | WIP | -| packages | WIP | Yes (Homebrew, Macports) | WIP | +| packages | Yes* | Yes (Homebrew, Macports) | WIP | | shell | Yes (bash, zsh) | Yes (bash, zsh) | WIP | | cpu | Yes | Yes | WIP | | gpu | Yes | Yes (Apple Silicon only) | WIP | @@ -130,6 +130,8 @@ Available modules: | terminal | Yes | Yes | WIP | | locale | Yes | Yes | WIP | +\*(flatpak, nix, dpkg, pacman, xbps) + ```json "modules": [ { From df0f21bc482f27cdb341500e14ed7719fd5340d0 Mon Sep 17 00:00:00 2001 From: utox39 Date: Mon, 15 Dec 2025 23:29:33 +0100 Subject: [PATCH 15/15] docs: update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2bd1a38..5da3378 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ Available modules: | os | Yes | Yes | WIP | | kernel | Yes | Yes | WIP | | uptime | Yes | Yes | WIP | -| packages | Yes* | Yes (Homebrew, Macports) | WIP | +| packages | Yes* | Yes (Homebrew, Macports) | WIP | | shell | Yes (bash, zsh) | Yes (bash, zsh) | WIP | | cpu | Yes | Yes | WIP | | gpu | Yes | Yes (Apple Silicon only) | WIP |