GeistHaus
log in · sign up

Aaron Honeycutt

Part of Aaron Honeycutt

blog of a Linux nerd

stories primary
A 2025 review of Mobile Linux with postmarketOS v25.12
Show full content

Note

This was tested on a OnePlus 6T using Phosh as the desktop/shell. I purchased this phone from Swappa just for running Mobile Linux.

Donations

I'd like to start this post off by saying I HIGHLY recommend donating to postmarketOS if you want devices to have a second life once Android support is dropped or if you want them to be Linux first (not Android) first!

Hardware

This is an updated table based on my testing with v25.12:

Core FeatureStatus Wi-Fi/BluetoothWorks TouchpadWorks Touch ScreenWorks Fingerprint ReaderWorks CamerasBasic SpeakersWorks Headphone portN/A USB-C portWorks SIM SlotNot tested
  • work but not ideal quality
Cameras

Both work but they are not fully color and the quality is not best but I did not test them on Android using this hardware.

Wi-Fi and Bluetooth

I was able to connect to my home network without issues.

Speakers

The speakers work and sound great!

Battery

Checking upower -d shows the following information:

Device: /org/freedesktop/UPower/devices/battery_bq27411_0
  native-path:          bq27411-0
  vendor:               Texas Instruments
  power supply:         yes
  updated:              Sun Dec 28 09:43:56 2025 (14 seconds ago)
  has history:          yes
  has statistics:       yes
  battery
    present:             yes
    rechargeable:        yes
    state:               discharging
    warning-level:       none
    energy:              4.6904 Wh
    energy-empty:        0 Wh
    energy-full:         21.5776 Wh
    energy-full-design:  16.016 Wh
    voltage-min-design:  3.4 V
    voltage-max-design:  4.4 V
    capacity-level:      Normal
    energy-rate:         0.396 W
    voltage:             3.744 V
    charge-cycles:       N/A
    time to empty:       11.8 hours
    percentage:          40%
    temperature:         27.5 degrees C
    capacity:            100%
    technology:          lithium-ion
    icon-name:          'battery-good-symbolic'
  History (charge):
    1766940175	40.000	discharging
  History (rate):
    1766940236	0.396	discharging
    1766940205	0.383	discharging
    1766940175	0.405	discharging
    1766940145	0.352	discharging
USB-C port

The port works for power and data as expected, I did not test any external docks and such though.

Fingerprint Reader

I was not able to test this, it is under the screen unlike the OnePlus 6 which is on the back.

Software Phosh Phosh with no running applicationsPhosh with running applications Phosh – empty desktopPhosh – apps running

The animations in Phosh are smoother than this video shows when shown in person.

NOTE: The empty space on the bottom of applications in the overview is because of the keyboard placeholder being there.

GNOME Software

After the shell the next most important for a mobile device (and desktop in my eyes) should be the software store/center and for that we have GNOME Software

GNOME Software, your go-to for software!GNOME Software, your go-to for updates! GNOME Software for softwareGNOME Software app listing

For an OS based on Alpine Linux I usually just do a sudo apk update; sudo apk upgrade but if you are used to a UI you can use GNOME Software for applying updates as well.

GNOME Software, your go-to for updates! Social Media

For Mastodon usage Tuba is a great mobile (and desktop) client:

Tuba, Mastodon and Pixelfed client Smart Home

I personally use Home Assistant and thanks to my friend Cassidy there is a nice looking application called Butler (it is a webapp but it works really well!)

Butler for your home Navigation

GNOME Maps is included by default and it seems to be much better than the last time that I looked at navigation tools on Linux Mobile (there is also Pure Maps but you do need to get an API key to use it online I believe).

GNOME Maps Music Player

The default music player in v25.12 is called Gapless and it works well on mobile plus it supports my FLAC files without issue.

Gapless music player Video decoding

YouTube works without issue though Netflix (and I suspect other streaming websites) do not work, I suspect it is because postmarketOS ships with Firefox ESR rather than default Firefox.

File Transfer

I used Warp in my testing if I wanted to transfer files (since MTP does not work it seems but that will be fixed soon!) and it worked well minus using a QR code as the application froze on the OnePlus 6T.

Warp accept fileWarp transfer file Warp accept fileWarp transfer file

I was also able to use scp (to transfer the screenshots in this post) and ssh without issue, for enabling SSH on boot use this page.

Tips & Tricks
  • To hide the keyboard press and hold the bar at the bottom of the screen
  • For screenshots and video recording I used grim and wf-recorder for those tasks
Closing marks

If you have seen my older blog posts about Linux Mobile (I lost a few posts with my move) then you may remember how the open dialog (like with the Audio Player application in this example) did not scale well for mobile and kinda made them impossible to use. With that in memory I'm happy to report that it has been fixed in this example:

It fits just right!

I suspect this might depend on applications using a newer libadwaita version so your mileage may vary. I'm very happy to see additional process being made to make Linux work great on mobile devices, I know there are still issues such as banking, missing applications and such but I think there is a strong foundation here!

Now a new interesting one to replace that issue! The print dialog! I was able to do this when trying to print out directions:

It doesn't scale Additional information

There are some more resources for updated information about Linux on this device:

This is some information about Mobile Linux applications:

https://ahoneybun.net/posts/mobile-linux-2025/
Welcome to Forgejo and it's Runners
Show full content
CI (Continuous Integration system)

I have been using some form of a CI either in GitHub or recently GitLab with it's CI but not with Forgejo/Gitea (they both use the same runner process since Forgejo is a hard fork of Gitea) so I thought it was time to change that!

My Forgejo instance

NixOS Service

Getting it going on a NixOS install is pretty easy (without using a secret management tool like agenix):

1{ config, pkgs, lib, ... }:
2
3let
4  cfg = config.services.forgejo;
5  srv = cfg.settings.server;
6in
7{
8  services.forgejo = {
9    enable = true;
10    database.type = "postgres";
11    stateDir = "/mnt/DATA/Git";
12    # Enable support for Git Large File Storage
13    lfs.enable = true;
14    settings = {
15      server = {
16        DOMAIN = "git.ahoneybun.net";
17        # You need to specify this to remove the port from URLs in the web UI.
18        ROOT_URL = "https://${srv.DOMAIN}/"; 
19        HTTP_PORT = 3001;
20      };
21      # You can temporarily allow registration to create an admin user.
22      service.DISABLE_REGISTRATION = true; 
23    };
24  };
25}

once you add that to your configuration.nix (or another nix file that you import) and rebuild you'll find it running on port 3001 (localhost:3001).

Setting up a Forgejo Runner

Since Forgejo is a fork from Gitea NixOS reuses it's gitea-actions-runner service (you should use something like agenix rather than a plaintext file like I did...):

1{ lib, pkgs, config, ... }: {
2  services.gitea-actions-runner = {
3    package = pkgs.forgejo-runner;
4    instances.default = {
5      enable = true;
6      name = "edi";
7      url = "https://git.ahoneybun.net";
8       tokenFile = "/etc/nixos/services/forgejo-runner-mono.txt";
9      labels = [
10        "ubuntu-24.04:docker://ubuntu:24.04"
11        "ubuntu-22.04:docker://ubuntu:22.04"
12        "nix-latest:docker://nixos/nix:latest"
13        "rust-latest:docker://rust:latest"
14        "amd64-builder"
15      ];
16    };
17  };
18}

I have a few labels which are the docker images I want to use and the name of the runner itself which I'll reference soon.

Now this covers my usage of building on x86_64 but what about aarch64? Well I have my Pi 5 setup with Armbian and after going though armbian-config to install Docker I used this page to set it up as a runner!

1aaron@sidera:~$ systemctl status forgejo-runner.service 
2● forgejo-runner.service - Forgejo Runner
3     Loaded: loaded (/etc/systemd/system/forgejo-runner.service; enabled; preset: enabled)
4     Active: active (running) since Mon 2025-12-15 08:30:59 MST; 1 day 3h ago
5       Docs: https://forgejo.org/docs/latest/admin/actions/
6   Main PID: 91170 (forgejo-runner)
7      Tasks: 10 (limit: 4670)
8     Memory: 8.8M (peak: 10.8M)
9        CPU: 37.373s
10     CGroup: /system.slice/forgejo-runner.service
11             └─91170 /usr/local/bin/forgejo-runner daemon
12
13Dec 15 12:17:14 sidera forgejo-runner[91170]: time="2025-12-15T12:17:14-07:00" level=info msg="task 139 repo is ahoneybun/lazarus https://data.forgejo.org https://git.ahoneybun.net"
14Dec 15 12:17:15 sidera forgejo-runner[91170]: time="2025-12-15T12:17:15-07:00" level=info msg="Cleaning up network for job arm64, and network name is: WORKFLOW-b10a3c6697f9b9e7a59e514dd53d2fef"
15Dec 15 12:25:22 sidera forgejo-runner[91170]: time="2025-12-15T12:25:22-07:00" level=info msg="task 142 repo is ahoneybun/lazarus https://data.forgejo.org https://git.ahoneybun.net"
16Dec 15 12:25:23 sidera forgejo-runner[91170]: time="2025-12-15T12:25:23-07:00" level=info msg="Cleaning up network for job arm64, and network name is: WORKFLOW-4b01f1d79963a84cfb5f0ae7b7dc2c21"
17Dec 15 12:25:52 sidera forgejo-runner[91170]: time="2025-12-15T12:25:52-07:00" level=info msg="task 144 repo is ahoneybun/lazarus https://data.forgejo.org https://git.ahoneybun.net"
18Dec 15 12:25:53 sidera forgejo-runner[91170]: time="2025-12-15T12:25:53-07:00" level=info msg="Cleaning up network for job arm64, and network name is: WORKFLOW-1a969f4f5a4f1e8118fcbd787e2bc3e0"
19Dec 15 12:27:20 sidera forgejo-runner[91170]: time="2025-12-15T12:27:20-07:00" level=info msg="task 146 repo is ahoneybun/lazarus https://data.forgejo.org https://git.ahoneybun.net"
20Dec 15 12:27:21 sidera forgejo-runner[91170]: time="2025-12-15T12:27:21-07:00" level=info msg="Cleaning up network for job arm64, and network name is: WORKFLOW-7d76fbfca6a7d3c3128fa7d75c86b90b"
21Dec 15 12:28:20 sidera forgejo-runner[91170]: time="2025-12-15T12:28:20-07:00" level=info msg="task 148 repo is ahoneybun/lazarus https://data.forgejo.org https://git.ahoneybun.net"
22Dec 15 12:28:21 sidera forgejo-runner[91170]: time="2025-12-15T12:28:21-07:00" level=info msg="Cleaning up network for job arm64, and network name is: WORKFLOW-826c02b6fed5affadcdb107cdfd65205"
Actions

The version that is in NixOS 25.11 has Actions enabled but the docs say you need to enable it per repository for an older version. Now the interesting part is that Gitea uses GitHub Actions syntax so take this one for example:

1name: Example
2
3on:
4  push:
5    branches: [ main ]
6
7jobs:
8  amd64:
9    runs-on: [ ubuntu-24.04, amd64-builder ]
10    steps:
11      - name: System Info
12        run: |
13          cat /etc/os-release
14          echo
15          uname -m

here we note that it is using a Ubuntu 24.04 Docker image and it will run on the amd64 system (which is edi in this case), for the Pi 5 I'll say arm64-builder instead.

Other questions

For more reading I have my nix files hosted on GitLab here. Reach out to my on Mastodon for questions!

https://ahoneybun.net/posts/forgejo-runners/
Using Hydra to build custom images
Show full content
Building custom images

You can build images with either the legacy (non-flake) and flake method, there are a few great resources such as nix.dev and NixOS Wiki. For example if we wanted a minimal (CLI only) ISO for x86_64 with helix and git we can do that here:

1{
2  description = "Minimal NixOS installation media";
3  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
4  outputs = { self, nixpkgs }: {
5    nixosConfigurations = {
6      exampleIso = nixpkgs.lib.nixosSystem {
7        system = "x86_64-linux";
8        modules = [
9          ({ pkgs, modulesPath, ... }: {
10            imports = [ (modulesPath + "/installer/cd-dvd/installation-cd-minimal.nix") ];
11            environment.systemPackages with pkgs; = [ helix git ];
12          })
13        ];
14      };
15    };
16  };
17}

We would build the image like this using flakes:

1git init
2git add flake.nix
3nix build .#nixosConfigurations.exampleIso.config.system.build.images.iso

I started my own nixos live disk repository recently for building images for my Pi 4, Pi 5 and x86_64 minimal CLI versions.

If we want to build an image for aarch64-linux with the graphical installer for GNOME with the latest kernel, hostname set and helix.

1{
2  description = "Minimal NixOS installation media";
3  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
4  outputs = {self, nixpkgs }: {
5    nixosConfigurations = {
6      drack = nixpkgs.lib.nixosSystem {
7        system = "aarch64-linux";
8        modules = [
9          ({ pkgs, lib, modulesPath, ... }: {
10            imports = [ "${modulesPath}/installer/cd-dvd/installation-cd-graphical-calamares-gnome.nix" ];
11            boot.kernelPackages = pkgs.linuxPackages_latest;
12            boot.supportedFilesystems = lib.mkForce [ "btrfs" "reiserfs" "vfat" "f2fs" "xfs" "ntfs" "cifs" ];
13            environment.systemPackages = with pkgs; [ helix ];
14            networking.hostName = "drack";
15            services.openssh.enable = true;
16            system.stateVersion = "25.05";
17          })
18        ];
19      };
20    };
21  };
22}
Having Hydra get a job

With the following in the flake we can have Hydra start building the images:

1    hydraJobs = {
2      images = {
3        vetra = self.nixosConfigurations.vetra.config.system.build.sdImage;
4        sidera = self.nixosConfigurations.sidera.config.system.build.sdImage;
5        drack = self.nixosConfigurations.drack.config.system.build.isoImage;
6        test-gui = self.nixosConfigurations.test-gui.config.system.build.isoImage;
7        test-cli = self.nixosConfigurations.test-cli.config.system.build.isoImage;
8      };
9    };
Hydra building images for different architectures
Hydra building images for different architectures
Other questions

Reach out to me on Mastodon for questions!

https://ahoneybun.net/posts/hydra-ci-images/
Welcome to Hydra
Show full content
CB (Continuous Build system)

This is what NixOS itself uses for building packages for it's channels. Setting it up yourself on NixOS is pretty easy with this nix config:

1{ config, pkgs, lib, ... }:
2
3{
4  services.hydra = {
5    enable = true;
6    hydraURL = "localhost:3000";
7    buildMachinesFiles = [ ];
8    notificationSender = "hydra@localhost";
9    useSubstitutes = true;
10  };
11}

once you add that to your configuration.nix (or another nix file that you import) and rebuild you'll find it running on port 3000 (localhost:3000). For creating a project and other admin roles I would recommand looking at this page.

Your own nixpkgs

I started my own nixpkgs repository recently and this is my flake:

1{
2  description = "Aaron Honeycutt's packages";
3
4  inputs = {
5    nixpkgs.url = "nixpkgs/nixos-unstable";
6    flake-utils.url = "github:numtide/flake-utils";
7  };
8
9  outputs = {
10    self,
11    nixpkgs,
12    flake-utils,
13    ...
14  }:
15    flake-utils.lib.eachSystem ["x86_64-linux" "aarch64-linux"] (
16      system: let
17        pkgs = import nixpkgs {
18          inherit system;
19          config.allowUnfree = true;
20          overlays = [
21            (import ./pkgs)
22          ];
23        };
24
25      in {
26        packages = (import ./pkgs {}) pkgs;
27
28        hydraJobs = (import ./pkgs {}) pkgs;
29      }
30    );
31}

With this you can run nix build .#honeyfetch (one of the packages in that repository) to build it for the host architecture. Now the part for Hydra itself is HydraJobs so that Hydra will pick up those packages and build them:

Hydra building for x86_64-linux
Hydra building for x86_64-linux
Building for other architectures

NixOS is great at supporting 4 main architectures (known as Platforms):

  • x86_64-linux
  • aarch64-linux
  • x86_64-darwin
  • aarch64-darwin

there is a 5th one which is i686-linux though it is not as common.

Hydra can build for all of them and this example we'll add aarch64-linux (for devices such as the Raspberry Pi in my case), this is how our Hydra configuration looks with that enabled:

1{ config, pkgs, lib, ... }:
2
3{
4  services.hydra = {
5    enable = true;
6    hydraURL = "localhost:3000";
7    buildMachinesFiles = [ "/etc/nix/machines" ];
8    notificationSender = "hydra@localhost";
9    useSubstitutes = true;
10  };
11
12  nix.buildMachines = [
13    {
14      hostName = "localhost";
15      protocol = null;
16#      system = "x86_64-linux";
17      systems = [ "x86_64-linux" "aarch64-linux" ];
18      supportedFeatures = ["kvm" "nixos-test" "big-parallel" "benchmark"];
19      maxJobs = 8;
20    }
21  ];
22}

If you just want to build for x86_64-linux or a certain Platform only you can use the system variable instead of the systems one. If you use both the system one will override everything so only that one will be used. Once the change is made simply rebuild your configuration with sudo nixos-rebuild and you should see this, it is important to note that building on a non-native Platform will take a while.

Hydra building for x86_64-linux and aarch64-linux
Hydra building for x86_64-linux and aarch64-linux
Other questions

For more reading I have my nix files hosted on GitLab here. Reach out to my on Mastodon for questions!

https://ahoneybun.net/posts/nixos-hydra-ci/
Review of my open source work in 2024
Show full content
New and updated packages in nixpkgs!

With the launch of the new System76 Thelio Astra we saw some updated system76 packages such as

but this update of the system76-io-dkms package in nixpkgs also added support for the Thelio Io v2 which is helpful for newer Thelio's that use that version of the board.

We also saw the first Alpha, second and third Alpha of the COSMIC packages that I (co)-maintain in nixpkgs though some skipped Alpha 2 going right from Alpha 1 to Alpha 3.

I would like to highlight the help from the following people who have helped me with my work in nixpkgs:

New update to nixos-hardware

I added the System76 galp5-1650 version with this PR. This enables the GPU and places the system in Hybrid mode basically where the system uses the Intel GPU for everything but you can launch application using the NVIDIA GPU like this:

nvidia-prime steam
Planned to adopt System76 packages

The current plan is to take over the packages for System76 packages:

  • system76 (open firmware systems)
  • system76-io (DKMS for Thelio Io board)
  • system76-acpi (non-open firmware systems)

The wonderful khumba has been maintaining these and I plan on taking over updates for them from him as we enter into 2025. Thank you for the work that you have done and wonderful groundwork plus answers to my questions as well! The PR for removing him has been done and I have my PR for taking them over is currently up for review.

Updated packages in Arch Linux AUR

We have had 11 releases of the System76 Keyboard Configurator for the Arch Linux AUR package! For those who don't know you can use this on the System76 Launch and Intel System76 Laptops!

Work in Hydra

My first PR to Hydra was merged and it is live! This fixes the hello example and it works!

Hydra building the hello example
Hydra building the hello example
COSMIC DE Fixes

I added the feature to use the Player Controls (Next, Pause/Play, Prev) with this PR

Bug reports

I reported a few issues in COSMIC and reporting them are as important as fixing them:

COSMIC Utils Org

Ed and I have formed the COSMIC Utils Org which has over 10 awesome folks (including ourselves) which is to have 3rd party COSMIC applications and applets in one place so that developers can help each other improve their application and/or applet or create one news!

Stellarshot

This project also includes our own application called Stellarshot which is a backup tool for COSMIC using rustic on the backend to handle the snapshots which are also encrypted!

https://ahoneybun.net/posts/open-source-work-in-2024/
A review of the Thinkpad X13s with Ubuntu Linux
Show full content

Note

I purchased this system from Amazon's Renewed Store and the listing for this model is also in that link if you wanted to purchase it after this review. This review has been done over a week of using the system with my findings broken down with the Good, Bad and Ugly system.

Ubuntu support (general Linux support)
Neofetch
Running Neofetch
About System
About System in GNOME Settings

Ubuntu has a custom image for this system which is nice until it can be merged into a general ARM64 image but with this platform it seems there is special settings that you need per device. This image is based on Ubuntu 23.10 but there are Noble Numbat (24.04) daily images as well here which is nice to see.

My original install was done using the 23.10 image but I have upgraded to 24.04 (which is still in testing until the end of April) but both have the 6.5.0 kernel series so other then possible newer versions of Mesa, PipeWire/PulseAudio everything should be pretty much the same for testing.

Ubuntu 24.10 note: with this release there is now a generic arm64 image that works on this device from this link.

Now before you get try booting an ISO you will need to do two things in the BIOS (which you can get to with F1 at boot):

  1. Enable Linux Boot (Config -> Linux -> Linux Boot (Beta))
  2. Disable Secure Boot (Security -> Secure Boot -> Secure Boot)

Now you might be able to leave Secure Boot on if you use Ubuntu or another distro that supports it but I did not test that in this review. These steps are from the Debian Wiki for this model which you can find here.

This is an updated table based on my testing on Ubuntu 23.10/24.04/24.10:

Core FeatureStatus Wi-Fi/BluetoothWorks TouchpadWorks Touch ScreenWorks Fingerprint ReaderWorks WebcamCan work SpeakersWorks-ish Headphone portWorks-ish USB-C portsWorks SIM SlotNot tested
  • Not in the default configuration ** Can be enabled in Ubuntu 24.10 with steps in this review *** They are very low due to active speaker protection not being enabled source

NOTE: Like mentioned in the Debian Wiki page for this system I'm not sure if the special keys other then for the screen brightness and volume work. I'll need to use a SIM to test if those buttons work but I doubt they do. From the Debian Wiki page the SIM should work but it may have some hoops to go though but perhaps not on Ubuntu.

The Elephant in the Room and it's name is something different then x86_64

One of the good things about x86_64 is since every application is packaged for it by default and aarch64 is more of an after thought other then packages in the ports.ubuntu.com repo which is different then the default us.archive.ubuntu.com that most folks are used to.

Debian (and there for Ubuntu for the most part) have a fairly large repository of cross-compiled (meaning that it built for more then one architecture which is great and it means applications like Signal, LibreOffice and other software are packaged (Signal being a snap).

Now applications like Slack and Discord that I use quite a bit don't have aarch64 support in either their Debian packaging, flatpak or snap since upstream does not create them or support them from what I can tell. You have odd expections like with ProtonVPN which has both x86_64 and aarch64 support but not Proton Mail Bridge which is odd and I've pointed it out on their social.

The Good

These are the items that are amazing and work really well.

BIOS/UEFI

I did enjoy seeing a Linux option in the BIOS though I think it should just be on by default and ideally not needed. The settings for swapping the Fn row from needing to press Fn+F5 to refresh a web page to just pressing F5 like I expect. I also liked the option to swap the Fn and Ctrl since I'm used to the Ctrl being on the bottom left rather then the Fn.

Upgradable

Now the RAM is soldered (there are 8GB/16GB/32GB options, I have the 16GB model) BUT the drive is actually a M.2 2242 (not 2230 like the Steam Deck and Surface line and not 2280 like most desktops) based on the overview sheet from Lenovo. Plus based on the manual it looks like it is just a few screws to remove the bottom panel and the drive is held in with a single M.2 screw like normal M.2 drives!

GNOME Shell

The animations in GNOME Shell are really smooth and great with the touchpad! See the video below for yourself!

Screen

This is nice and large even on a 13.3" display thanks to the 16:10 resolution of 1920x1200 (instead of the average 16:9 1920x1080 that I'm used to). If you get the touch screen model like is included with this one it works as expected and I can move between workspaces, move windows and highlight text. I did not test onscreen keyboards but I suspect they will just fine, this system does not fold completely like some Chromebooks or partly like some Thinkpad Yoga models so you won't be able to use it like that.

Wi-Fi and Bluetooth

I was able to connect to two different networks without issues. While Bluetooth was testing with my Pixel Buds-A I did notice some odd "audio glitching" but it would happen randomly and the audio would keep playing during these moments but would sometimes stop for a second or two then continue playing.

Bluetooth devices
Settings listing Bluetooth devices
Bluetooth sound
Bluetooth Sound Settings
USB-C ports

Getting used to only 2x USB-C ports is going to be interesting (I did give Apple a lot of shit when they did it) so I'll have an Anker adapter with an SD card (useful for Pi usage), HDMI and USB-A ports.

Both ports are 3.2 Gen 2 and support video out and power in though my testing, I did note that when you first connect a display GNOME Shell crashes and throws you to the login screen again. It doesn't seem to happen again until you reboot the system then connect a display again.

Fingerprint Reader

To my surprise the fingerprint reader works well and I can enroll my fingers! It even unlocks the system the system at the login screen too!

Button

I've never had a Thinkpad before but I've heard many friends praise the keyboard, the nib and the buttons like the ones above the touchpad. I'm happy to say that they were indeed correct and it is really nice to have physical buttons in addition to the buttons under the touchpad such as the middle mouse button.

Touchpad

It is a joy to use though it would be nicer if it was a little larger though perhaps that'll happen if they make a 14" or larger model (this is 13.3"). It is certainly larger then my last laptop that I purchased and used for years (still do as a great backup machine). I'm able to use the gestures for GNOME (for moving workspaces and going to the application view) and Firefox (for going forward and back on web pages).

Cooling system

This is a fan-less system so how well the system can keep cool is a good question to ask, while building the System76 Keyboard Configurator the highest temperature that I saw was about 67C which I think is really good. The system's CPU is near the USB-C ports so the top left if you are looking at the screen and you can feel it getting a little warm there.

Compiling Rust
Keeping cool while building Rust
Video decoding

YouTube works and here are some stats for the nerds:

YouTube Encoding
YouTube Encoding at 1080p @ 60Hz
YouTube Encoding
YouTube Encoing at 2160p @ 60Hz

As you can see it reports that videos are able to decode up to 4K@60 without issue, the videos are smooth and audio matches without issue.

The Bad

These are the items that don't make or break the system for most folks but are important to note their status.

Speakers

The speakers which are really low for some reason and do not get better even at the lightest volume for some reason, perhaps driver/PipeWire/Kernel updates will help in the future but I'm not sure.

Ubuntu 24.10 note: they do not work better with 6.11 in this release as they are still pretty low due to active speaker protection not being enabled.

Headphone/Microphone port

The headphone port and even at the lower volume it has a lot of cracking in the output and it gets worse as you increase the volume. I tested two different headphones with the same result. Now using a USB headset (though the USB-C port) seems to work without issue so that is a workaround though you'll need to use an adapter to do this. I have not tested a headset with a microphone yet since I mainly use a USB-A headset so I don't use the port much.

Widevine/DRM

Now streaming sites that use Widevine DRM like Max and Disney+ do not work at all when you try to load a video. I tested Firefox (snap default install) and Vivaldi (they have an ARM64 Debian release). Now I was able to get Max and Disney+ to work (but not Netflix currently) with Brave by using the Widevine Installer from the Asahi project and these steps from Brave. Now this can break at any time with how Widevine is but it does work currently at this time.

Battery

Checking upower -d shows the battery should last 5.8 hours while Lenovo quotes 25-28 hours on Windows. I tested the system with no changes including TLP and with the 6.5 kernel from Ubuntu and I saw about that while doing the following things:

  • Writing this review using helix, nano, Text Editor
  • Researching how to fix the Widevine issue so basic web browsing including some YouTube here and there
  • Downloading updates, installing new applications including snaps and Debian packages

Suspending does not seem to work correctly as the display is still on when the lid is closed but it does turn off if you use the menu to suspend. The battery does still seem to drain while suspended much higher then one would expect when in that state. This system does work with S0ix and we can confirm with this output from this command:

aaronh@drack:~$ cat /sys/power/mem_sleep 
[s2idle]

Note that the deep option is not available on this system.

Ubuntu 24.10 note: this device does not enter the deepest low-power state during suspend yet.

The Ugly

Here are the items that will most likely help you decide if this is a system for you.

Webcam

For a really nice and portable system this would be an ideal candidate for remote working but since the camera does not work that might be the biggest deal breaker. I imagine support would be added in the future but it depends on how important it is to you. This part is short as I'm not able to detect it with any software that I can find like camaeractrls, websites and such.

Ubuntu 24.10 note: this can work with some steps below:

The following packages and changes are needed for the webcam to work as of this update:

sudo usermod -aG video $USER
sudo apt install pipewire-libcamera libcamera-tools libcamera-ipa

Add this file: /etc/udev/rules.d/95-libcamera-hack.rules with this as the content:

ACTION=="add", SUBSYSTEM=="dma_heap", KERNEL=="linux,cma", GROUP="video", MODE="0660"
ACTION=="add", SUBSYSTEM=="dma_heap", KERNEL=="system", GROUP="video", MODE="0660"

Set this value in Firefox's about:config page:

media.webrtc.camera.allow-pipewire

Now restart the system and test:

sudo qcam
Compiling

I did have it freeze on me when I was trying to build a rather large Rust project but limiting compiling options to lower the system load might help with that but I did not do that in my testing.

Closing marks

Once Ubuntu 24.04 is released with the 6.8 kernel I believe things will get even better as it has a lot of changes, here is a small list of a few articles with information:

This system is a great little portable machine with an ARM64 CPU and works great on Ubuntu. If you are looking for a system that is fanless for working on documents, web browsing, watching some YouTube videos and a little development work this is a great option! With that said if you travel and use streaming services that might be a deal breaker for you but I hope that it improves in the near future.

Additional tracking

There are some more resources for updated information about Linux on this device:

https://ahoneybun.net/posts/thinkpad-x13s-review/
Hosting on NixOS
Show full content

description: Running NixOS on Linode VPS for services like Jekyll, Mastodon and Nextcloud.

Installing on Linode

I've been using Linode for a while and I used this article to install NixOS on a Linode. Now I was using one large server (2GB plan) to host everything but I thought that splitting them up would be better so I just cloned my server onto another Linode using their great webUI!

Two is better than one

Now that I have two servers I needed names for them, I've never been good with hostnames but I'm not using Mass Effect (Andromeda) characters for my systems. Mass Effect characters are for x86_64 systems and Andromeda characters for ARM64 devices. The two servers themselves are names after Reapers so sovereign and harbinger!

Hydra

The hardest part of starting for me was understanding DNS and HTTPS setup, this included using Nginx to reverse proxy a locally running service like Hydra. I was able to get this working with this configuration this allows it to be viewed from the subdomain of hydra on ahoneybun.net (it is currently off as I was just testing).

When I first tried setting Hydra up I was using the default settings for using a Nginx reverse proxy but it was not loading CSS and JavaScript, after hours of going though GitHub and Reddit I found this option which was the key:

recommendedProxySettings = true;

Once that was added and I rebuilt nixos-rebuild everything worked as it should have!

Jekyll

For a long time this site has been on GitHub pages but I wanted to change that (partly as I was having issues with how GitHub handles DNS) and this is the first blog post since that happened and now you're on a site hosted on NixOS! Getting Jekyll to build with my site took a while but these commands was able to build with my plugins:

cd ahoneybun.net
nix-shell -p jekyll rubyPackages.webrick rubyPackages.jekyll-feed rubyPackages.jekyll-redirect-from
jekyll build

I created a nix-shell file (in the repository) so that I can run these commands (from the root directory) to update the site once I make a change on GitHub:

git pull
nix-shell
jekyll build
Mastodon

Setting up Mastodon on NixOS was just using this wiki page and then rebuild. One issue with my configuration is that I don't have SMTP working so confirmation emails are not sent out. To workaround this I can confirm the account using tootctl on the server itself like this:

# Switch to root
sudo su

# Switch to mastodon account
su - mastodon -s $(which bash)

## Approve accounts though tootctl
mastodon-env tootctl accounts approve PUT-YOUR-USERNAME-HERE

## Accept email address though tootctl 
mastodon-env tootctl accounts modify PUT-YOUR-USERNAME-HERE --confirm

Source

Nix Files

You can find all of my nix files here.

https://ahoneybun.net/posts/hosting-on-nixos/
Automounting a drive in NixOS
Show full content

After you create the mount point then we'll add that drive to our `/etc/nixos/configuration.nix':

  fileSystems."/mnt/ExtraDrive" =
    { device = "/dev/disk/by-uuid/72315f9e-ceda-4152-8e8d-09590affba28";
      fsType = "ext4";
    };

NOTE: You can find the UUID by using the blkid command, you will need to use sudo or change to the root user.

sudo blkid

or

sudo -i
blkid

then rebuild NixOS:

sudo nixos-rebuild switch

You'll see the following if done correctly:

unpacking channels...
building Nix...
building the system configuration...
these 3 derivations will be built:
  /nix/store/3ryw7m6gvim8zs593wkibcg143pix7zd-etc-fstab.drv
  /nix/store/va8nfw2j4i5jviibqy5cggnmjsjmds2v-etc.drv
  /nix/store/hpm2aykvls876qgjrkva2ys3xmn08sri-nixos-system-rpi4-22.11pre405560.2da64a81275.drv
building '/nix/store/3ryw7m6gvim8zs593wkibcg143pix7zd-etc-fstab.drv'...
building '/nix/store/va8nfw2j4i5jviibqy5cggnmjsjmds2v-etc.drv'...
building '/nix/store/hpm2aykvls876qgjrkva2ys3xmn08sri-nixos-system-rpi4-22.11pre405560.2da64a81275.drv'...
stopping the following units: mnt-ExtraDrive.mount
activating the configuration...
setting up /etc...
reloading user units for gdm...
reloading user units for aaronh...
setting up tmpfiles
starting the following units: mnt-ExtraDrive.mount
the following new units were started: systemd-fsck@dev-sda1.service

Now we'll see it when we reboot:

[aaronh@rpi4:~]$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0 232.9G  0 disk 
└─sda1        8:1    0 232.9G  0 part /mnt/ExtraDrive
mmcblk0     179:0    0  29.7G  0 disk 
├─mmcblk0p1 179:1    0    30M  0 part 
└─mmcblk0p2 179:2    0  29.7G  0 part /nix/store
                                      /

[aaronh@rpi4:~]$ ls /mnt/ExtraDrive/
Backups  lost+found  test
https://ahoneybun.net/posts/automount-nixos/
Unstable software in NixOS
Show full content
Installing newer software

Recently I ran into this bug with the stable (22.05 at this writing) of the ProtonVPN software in NixOS. A way to work around it was use the unstable version of the software which had the fix. I did a bit of Googling to find how to do that so I wanted to share what I found, this is the file that I use:

{ config, pkgs, ...}:

let
  unstable = import
    (builtins.fetchTarball https://github.com/nixos/nixpkgs/tarball/master)
    # reuse the current configuration
    { config = config.nixpkgs.config; };
in
{
  environment.systemPackages = with pkgs; [
    unstable.protonvpn-cli
    unstable.protonvpn-gui
  ];
}

Now I made this in a file like this /etc/nixos/unstable-programs.nix and then edit my /etc/nixos/configuration.nix file to import it like this:

    [
        ./hardware-configuration.nix
        ./plasma.nix
        ./programs.nix
        ./unstable-programs.nix
    ];

That way I can comment it out once the fix is released or if I want to remove it for some reason. Once I made these edits to those two files I would rebuild and switch with this command sudo nixos-rebuild switch now if you want to test it just for the next reboot in case you are worried you can run this command instead sudo nixos-rebuild test. Now when you reboot it boots into that generation but if it doesn't work just reboot and you'll be in the previous generation without the change.

https://ahoneybun.net/posts/unstable-nixos/
Welcome to NixOS
Show full content
Automate the OS

With NixOS you can setup your OS using the "configuration.nix" file which is in "/etc/nixos" and mine enables the following:

  • Xorg
  • OpenSSH
  • PipeWire
  • Bluetooth
  • CUPS
  • fwupd
  • Flatpak

This installs my desktop, default applications and other tools that I need. I'm still working on it but this gets me up and running out of the box. You can see the full file here.

Rollback the OS

One of the cool features that I have loved the idea of before I found out about NixOS is rolling back an update. We have similar features in Fedora Silverblue and how NixOS does it is similar at least from the users POV, every time that you run nixos-rebuild switch you create a new generation though you would have to have changed your "configuration.nix" file before running the command. You can read more about Generations here.

Spliting the user-wide and system-wide

Another cool feature is allowing the user and system to have different applications/versions, of the benefits of this is the following:

  • The user can have Inkscape 1.1.2 (unstable) while the system would have version 1.1.1 (stable) (this is based on version 21.11)
  • The system can have Python 3.9 while the user who needs a newer version can have Python 3.10
The Nyxi Installer

I created this installer based on my Arch-itect installer which you can find here and expended based on a co-workers request of using an encrypted LVM which includes a BTRFS root fs and swap. This installer creates the swap partition based on the amount of RAM for hibernation and it is fairly safe since the swap is in an encrypted LVM.

https://ahoneybun.net/posts/welcome-to-nixos/
systemd-boot and efibootmgr
Show full content
systemd-boot

Systemd-boot started with just support for UEFI which means the code base is much smaller when compared to GRUB which has a ton of code to work with different types of drives that have been released in the last decade. Pop!_OS has been using it since the 18.04 LTS release and I have been using it as my go to boot manager ever since.

efibootmgr

This command allows us to edit the EFI variables though EFISTUB, the Arch Wiki has a really good selection about using efibootmgr. Here is my output as an example since I will be using the output in the next section:

BootNext: 0001
BootCurrent: 0001
Timeout: 2 seconds
BootOrder: 0001,000A,0002,0006,0000
Boot0000* UiApp
Boot0001* Pop!_OS 22.04 LTS
Boot0002* WDC WDS120G2G0B-00EPW0 
Boot0006* WDC WDS100T2B0C-00PXH0 
Boot000A* Linux Boot Manager

Now you may not have the "BootNext:" option if you haven't used efibootmgr before.

Desktop files

You can make your own desktop file and for system-wide you would put them in /usr/share/applications/ but if you want them just for your user you can use ~/.local/share/applications/. We can make .desktop files for these boot entries to set them as the next boot target but once you reboot again it reverts to using "BootOrder" order instead.

This is my file for booting Arch on the next reboot:

[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Exec=sh -c "pkexec efibootmgr -n 000A"
Name=Boot to Arch
Icon=/home/aaronh/Documents/archlinux-icon.svg

and this is my file for booting Pop!_OS on the next boot:

[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Exec=sh -c "pkexec efibootmgr -n 0001"
Name=Boot to Pop!_OS
Icon=/home/aaronh/Documents/pop_icon.svg
https://ahoneybun.net/posts/systemd-boot/
Welcome to my blog!
Show full content
What will be here
  • My personal thoughts and links to current projects or life events that are happening
  • Reviews of tech things
What won't be here
  • Ads
  • Tracking
  • Comments (reach out over my socail media links)
https://ahoneybun.net/posts/welcome/