index

Destination Terminal

We’re installing Arch Linux on an old refurbished Dell laptop for our GUI fast.

archlinuxarchinstall

--

-- -- --

Do it the hard way first and hold the arch wiki hand. Doing full disk encryption is hard so I grabbed another guide’s hand for that one. Apart from that though I found the entire process to be incredibly tedious as I suppose a manual process should be.

Nuke it and start again but this time with archinstall. Doesn’t it feel great? I appreciate you archinstall. As I mentioned before we’re doing a GUI fast so no KDE and no Gnome. Ah wait also no Xorg or Wayland. Remember the minimalists well I don’t know what they’re doing these days but they had the right idea. We’re going full Virtual Ret… Terminal.

Everything in the Terminal, nothing outside the Terminal, nothing against the Terminal.

There’s something special about booting into an actual tty. It greets you with only 8 colours because your eyes need a dopamine detox. To thrive in this digital flatland all you need is an editor. You could go with vim or newvim but that’s for old people I’m using helix. Now the colours are all jacked up but remember it has that charm. Appeal aside, the virtual terminal is basically a single application fully maximised stealing all your attention. I’m not a single track mind so I’m going down a few thought streams concurrently which requires multiple tabs and windows. Easy fix with a multiplexer so maybe you need two tools alright. Here subverting expectations again by rejecting tmux and embracing zellij. All I can say is batteries included.

Do browsers and terminals work together? No but has that stopped some mad programmers trying to mix the two… no. I really tried to use some of these creations like w3m but got hit with a post-use clarity and felt disgusted. This newfound and ephemeral clarity threw a solution out at me… LLMs. That’s it I’m going to use an agent harness and I label it another essential requirement - no further questions.

kmsconkmscon

--

-- -- --

With my eyes in a strained and watery state I realise I’m actually too modern and weak to handle only 8 colours. Kmscon provides salvation for those who seek - true colour support and works without a display server at all. It apparently survived in a fork for 11 years 😳 and only in the past year did the project gain a pulse again. Blah blah it doesn’t have support for kitty protocols or sixels amongst a bunch of other modern niceties. I hear you and I want those things too but we can’t get everything we want in life. Perhaps we can though… I came across this issue and it may be worth just using libghostty to build a terminal emulator that sits on top of the Linux DRM/KMS like kmscon but better. There’s a free idea for you the reader.

In other news, I came across an interesting accommodation if you still want to GUI fast but in a way that plays loose with the definition. You can use cage which itself runs a single maximised application - with a Wayland display server - which as you may have guessed can just embed a terminal. A lot of bloat for just running a terminal but I’m not judging.

Some Developer Notes

Helix Editor

If you just want to use your editor of choice for root level operations and you don’t want to add sudo EDITOR=<editor>... or sudo -E everywhere then some adjustments are required - check visudo manual.

sudo visudo

The above safely edits /etc/sudoers config files. You need to look for the following

Defaults!visudo env_keep += "SUDO_EDITOR EDITOR VISUAL"

Change this to

Defaults env_keep += "SUDO_EDITOR EDITOR VISUAL"

Now ensure that the EDITOR env variable is in your shell config. I would do the following:

echo EDITOR=helix > ~/.bashrc

KMSCON

Just follow the arch wiki and you should be able to figure it out. In my case I just wanted the service enabled on tty2 and still continue to run the traditional agetty service on tty1. I came across a small hurdle with wanting the login screen to auto launch tty2 so I’ll share what I did to fix it.

Once you’ve installed it you should add your config options with the following

sudo helix /etc/kmscon/kmscon.conf

There is a kmscon.conf.example file in that directory that you can use to guide your decisions. I set the following for my use case with respect to seat options.

vt=2
switchvt
libseat

If you reboot (or just restart the service) then you’ll see that it still doesn’t automatically switch consoles. The issue is a certain --noswitch-vt arg being passed in which has greater precedence than the configuration file you defined previously. Let’s fix this by removing the aforementioned arg in ExecStart and then reboot. Note that the initial ExecStart= is not a mistake.

sudo systemctl edit kmsconvt@tty2.service
[Service]
ExecStart=
ExecStart=kmscon --vt=%I --seats=seat0 --login == /sbin/agetty -8 -o '-p -- \\u' --noclear -- - $$TERM

Zellij

catppuccinzellij

--

-- -- --

I try to use the same colour theme in every tool that I use frequently and thankfully Catppuccin Mocha is found most places.

Apart from that I’ve been using custom layouts with zellij and you might find some inspiration.

// layouts/helix.kdl
layout {
  pane size=1 borderless=true {
    plugin location="compact-bar"
  }
  pane split_direction="vertical" {
    pane name="Editor" focus=true {
      command "helix"
      args "."
      close_on_exit true
    }

    pane split_direction="horizontal" {
      pane name="Terminal"
      pane name="Clanker" {
        command "codex"
        args "resume"
        start_suspended true
        close_on_exit true
      }
    }
  }
  pane size=1 borderless=true {
    plugin location="status-bar"
  }
}
// layouts/sys.kdl
layout {
  pane size=1 borderless=true {
    plugin location="compact-bar"
  }
  pane split_direction="horizontal" {
    pane split_direction="vertical" {
      pane name="System Info" command="fastfetch"
      pane name="Star Map" command="astroterm" 
    }
    pane split_direction="vertical" {
      pane name="Resources Monitor" focus=true {
        command "btm"
        close_on_exit true
      }
      pane name="System Journal" {
        command "journalctl"
        args "-f" "-n" "50"
        close_on_exit true
      }
    }
  }
  pane size=1 borderless=true {
    plugin location="status-bar"
  }
}