Preface

I want weird things. Some of them don’t make sense other than, “Nice to have”. It’s a nice problem to have, to be able to consider things from the lense of an enthusiast. But it can be hard to relay the reason I want something, the why of it, to people who have no or little enthusiasm for what I like to try to achieve.

Ergonomics

I was a construction worker for many years, and before that I was in industry that damaged my neck, my back, my… hands and my wrists (sorry Khia). I’ve been dealing with the fallout as a computer programmer and musician, when it now hurts to follow my passions! So I have little choice but to consider ergonomics. Sometimes to make it work, there’s a lot of compromise.

Standing at a dresser

From this, I’m driven towards keyboard control, as it means I don’t have to move my shoulders in awkward ways to manipulate mice. As well, I’m driven to well designed work stations that match a task well, such as a drafting-style setup for drafting work, versus a workbench-style setup for electronics tinkering.

Standing drafting area

Neurodivergence

Some of the wanting weird things, comes from embracing how I interact and view the world, how I work - which can be different than for a neurotypcial person. In my case, I can be thrown off task with such ease it’s maddening. I want to be able to pull up my specific task, as I left it, as it again becomes actionable.

I want to walk up to a computer, type a few words, and let myself fall into the world I am targetting; or walk up to a computer, type a few words, and walk away lost in thought, over to another area, another setup. With browser tab groups, you do actually get a bit of that! But that requires cloud tabs, if you want it between devices. It requires everything living in a browser, which still is a compromise. It’s highly mouse-centric, keyboard controls can be tagged on, but they break all the time, it’s an uphill battle, truly.

Tinkerish Delights

I wrote a wm to match how I generally like my windows to be laid out, somewhat similar to dwm’s layout schema, but automated because I don’t actually like manipulating windows if I’m doing the same thing in 99% of cases; I can reduce that to an algorithm, which I did in my bin packing post. It really worked with me, it just stayed out of my way. I really miss it.

I should call her

dsearch

I wrote a Spotlight/launcher that works with something called a plumber that takes a resource string and launches the right program with a very high degree of control, like xdg-open on steroids. I miss that on macOS, I really really miss that. I miss a lot of the bespoke tools I built to match needs and wants, and when I’ve tried to port them or make them work, it’s always been somewhat of a compromise.

…buuuuut

minion but meme

I live in the world and have to work, I can’t lean into my ideals so fully that I can use whatever operating system I desire, for example. I have macOS on a MacBook Air M1 because it allows me a bunch of nice things that I like, but more importantly I need access to Xcode for work and to make things I care about a reality. I don’t have a server to virtualize macOS yet, and to be very clear I love this thing as it is as a piece of hardware. It’s light, runs cool, uses little power, looks great, and lets me communicate with loved ones with slightly less headache than I’m used to.

I live in the world and have partners/kids that factor in to what I can do. I can’t have a noisy server in the living room next to the ethernet ports. I need to be mindful of power consumption as the wiring in this house is… well, not great. I have to be mindful of my expenditures. So my solutions benefit from being affordable, power efficient, quiet, and compact.

In A Hypothetical Setup

Some of this is just saving up for and buying, some of it is just work I have to do to get it set up. Some of it is already in place!

Peripherals

keyboard

Keyboards have been quite a journey for me, I started with 60% mechanical keyboards, I’ve gone through making my own by hand, I’ve learned different layouts, just about anything I can do to try to mitigate how my hands feel after putting in a days’ work. Nowadays, it’s easy to get a bluetooth keyboard that is purpose-made to lessen hand strain, with mouse emulation even! So that’s something I’m planning to get, and I intend to use much more keyboard control.

Since I have mouse emulation available on the keyboard, I think I can get away with just using touchpads. I don’t mind them, but aside from that if I need precision I would like to get a pen + tablet set up. That precludes everything being digitized, and staying away from the current paper + pen solution I have now.

Audio peripherals are a wild and divisive topic, but I mostly just use headphones, and that’s mostly sorted out. I have a nice pair of headphones that sit at my work desk, and bluetooth headphones outside of that.

Devices

I have a MacBook Air M1, I have a Thinkpad x230 that runs 9front, and things like a Raspberry Pi 3. That’s enough to do most of what I want, but I run into issues. I have too little storage for running VMs + Docker, like far too little space to work on more than one project at a time aside from work things. I feel the best way to address this, as well as afford many other niceties, is using a NAS.

A NAS would give me space for Docker images, VMs/device emulators, a place for photos/videos which currently takes up too much of my space. I can use cloud storage and mitigate some of this, but that’s slower, with edge cases where users have lost access to files because of glitches or account bans. Now from the above, I also want it to look nice, run on little power, and be quiet. So no spinning rust hard drives, NVME drives match those predicates much better.

NAS drive

For my needs, I’m thinking something like this case with these m.2 hot swap trays in the front to hold m.2 drives. This would require many PCIe lanes, so something like an EPYC or newer Ryzen would be in order for a motherboard.

I could run VMs on the NAS, and likely will initially. But down the road I would love to get dedicated hardware, and I’ve been thinking of making use of something like a Lenovo Thinkcentre M Series, moving up from there if needed, as well as playing around with a HA cluster.

Finally, I would like to get a nice monitor to ensure my computer is correctly at eye level for my main setup, reduce eye strain, and increase my screen real estate. That’s not too difficult to sort out, but it does come after the rest of it.

Software Stack

computer setup I want to walk up to a computer, log in, and it’s my world. My files, my programs, my everything. My dearest love, I hope this letter finds you well. Currently, things exists from Apple or Google or Samsung where I log in to a device with my phone/email. For example, Android Auto or Apple CarPlay, you get a well-enough designed view of your mobile world, and in general it’s intuitive and handy. In the same way, I can log in to services on a TV/smart speaker, and my media consumption is pretty painless.

There’s good reasons to not wholly trust cloud based solutions, as well as good reasons to not wholly trust your account won’t fall into violation of terms and services, even accidentally. But there’s also reasons from an enthusiast perspective that factor in, and are worth iterating. I’m opinionated, biased by things I’ve made and learned, and that’s ok! Your mileage may, and most likely should vary here.

bad cloud My basic setup would be indeed, walking up to a computer, logging in, and it’s my world. Access to various services should be as simple as a command, start work for example would load up a view of my editor + work tabs in a browser, with ports forwarded to my localhost from, for example, Docker. Socially-oriented computing would be no different, but disparate in the sense of it doesn’t come in to my view unless I want it to, especially while working. Games + media consumption would also be that same start gaming, start media, allowing me to compose the type of computing interaction I want from individual pieces.

My world is briefly explained above, my fanciful window manager and bespoke pieces of software. Additionally though, I also like several pieces of frequently used software on macOS that work well in my particular household, such as calendars, shared notes, reminders, and Spotify. Having direct access to them, to me, is idempotent with having alternative access to them. That is to say, I don’t really care so much how I do the thing, so long as I can do the thing.

Where Am I Today?

Today, I mostly work on macOS, or Plan9 (via 9front). Plan9 is a really interesting OS for achieving what I want, due to it being designed from the ground up as a networked operating system. It’s designed to have a separation of concerns at the hardware level, where you have a file server, a powerful compute node, and discrete terminals.

The discrete terminals are built to be the proper thin clients, though they are more than competent as standalone systems. And they can be written without that much overhead; one mostly needs to abstract the hardware in a way that 9 expects, and you’re most of the way there. But I don’t intend to port the operating system anywhere I don’t have to, which is where Drawterm comes in. Drawterm emulates a terminal, running on many popular operating systems. Including macOS! I can spin up Drawterm, today, and be in my world. I have much of my window management ported over, and aside from the fact that my window management keys aren’t being passed through from my keyboard to the remote system, I have my cake in that regards. So I have the main, “my world, my files, my Sharona” already sorted out. The key missing piece there isn’t a link to the song, it’s my programs that are missing from this. Right now, I use a hybrid of Drawterm, and macOS native programs. This is very much a compromise, and the next steps I want to take will ideally sort this out.

rcpu

One of the really cool things about Plan9 (9front) is the cpu command, redone on 9front as rcpu. It (approximately) allows you to connect to a remote plan9 server, exporting your local directory structure along with it. This is important, as on 9, your windows are drawn via your local directory structure, so you can run more power-hungry programs on these remote systems, and have them write to your local window manager as if it were running locally. A session can look like this:

# some-light-task
[ ...output ]
# rcpu $cpu
# my-heavy-task
[ ...output ]

It’s also beneficial to note that both machines can, and likely should share files between each other, making reads and writes very much faster when you are working on a remote system. I used this to great advantage with a Raspberry Pi when compiling large binaries in Go. (Something felt magical about physically working on an ARM system, compiling code on an amd64 system, but that’s a story for another time)

It feels like you basically just pulled in the power of that remote machine, to your local one. But we could take it further than this.

Beyond Today, Maybe Even Tomorrow

I would like to take this rcpu idea, and really run with it. My, start work would roughly translate to rcpu $work, and then running some session management to pull up my last session on successful connection. I’ve started work on this front, mixed with some inetd invocations, I will be able to listen on a Unix-based system for incoming connections from a 9 environment. Furthermore, I should be able to draw content to the screen on my 9 as if it was a local application, from X11 remotely. (Note, this is already possible if you want to run VM software (vmx) on 9 itself, from something called Equis.)

The NAS would primarily be used in serving up Time Machine/NFS/Samba/9fs/etc. Using something like Proxmox, attached either directly to the NAS via very fast ethernet, or running on the NAS itself would host a Docker/Kubernetes engine for work, my main $cpu for my 9 network,

The Docker/Kubernetes cluster would house various stacks for work, mostly Laravel/NodeJS setups, as well as a self-hosted Visual Studio session that I can connect into trivially from a browser window (Visual Studio is Electron anyways, there’s very little difference at the end of the day where it lives). Additionally, I could host my Altid services in either a VM, or possibly as Docker containers themselves. This gives me access to most all of My Programs™, with the glaring exception of my macOS wants and needs. It seems circuitous, but one option that is possible is to virtualize macOS itself on the stack, and allow access into it. This only really makes sense when I’m not already running on macOS as the host OS for Drawterm but if the workflow ends up being very streamlined, it may be a thing I just do and try to be ok with. (I strongly suspect running Xcode this way, one of the heaviest hitters to overall disk space on my computer, would be beneficial.)

Running Drawterm or native 9 is a relatively low bar to entry to integrate a new device into my usable computing world. There’s already a Drawterm build for Android, 9 uns and builds on inexpensive SBC solutions such as the Raspberry Pi, and screens are fairly affordable. This threatens to meet the needs of me being able to work where I am at somewhat more fluidly, pulling up a tablet or a laptop or sitting at a desk or standing at one - without many of the caveats. A bluetooth keyboard (specifically one that can pair with multiple devices) allows me to have a more homogenized interaction with a given device. 9’s very hackable userland allows me the flexibilty to make things that work better for my particular approach to computing, to leave room for what I need to do differently than others. Having access to the full power of something like Proxmox, and pulling in the service I am hoping to use to whatever device I’m on seems like what we should have been doing all along - it’s the exact same thing as browser apps, realistically speaking. Just in this case, your browser apps aren’t limited to what someone has made out there. (Additionally, they aren’t bogged down with payment plans and usage limitations and credential leaks and corporate buyouts and the Google Graveyard… looking at you, Google Play Music.) I should be able to run games, on all of my devices like I actually own the thing. This has turned into somewhat of a rant, so next paragraph.

Signing Off

In this, I don’t intend to work alone. I would love to hear from you, about what you would do! Why and how I’m wrong about my keyboard choices, and why Arch Linux is better. (Btw, I used Void after Arch, I think it was much better for my needs)

This setup is designed to hit a specific neurodivergent, RSI suffering, pedantic niche. It’s not gonna tick every box, but the core features of it may speak to you. The “My files, my programs, my everything” fundamental piece is something I think we would all appreciate, if we work on multiple devices in any capacity!