My User-Control-Focused Stack
Published: 2024-01-11 by Clayton Hickey
As someone who likes to have control over what they use and dislikes businesses that infringe on rights that I believe users should have, I have sought more open alternatives to software and hardware than the more closed-off alternatives. For those who share similar preferences, I hope the following can help you get started. Mostly, I wrote this practice.
Server Hosting with Linode
Unfortunately, the ISP at my house blocks hosting from ports 80
and 433
, so I use Linode. I tried to use AWS, but as a minor at the time of trying, it was too annoying to create an account. Linode is very straightforward which I like. If you want a server, you create a Linode, basically just a cloud-connected computer on the internet. The connection is barebones enough that you can probably install whatever operating system you want. Personally, I run NixOS. On a single Linode, I host nearly every web-connected thing I use.
The base linode plan costs $5/month for 1GB RAM and 25GB storage. This was good enough for everything, but a Minecraft server, so I upgraded to the next tier up at $12/month for 2GB RAM and 50GB storage. I also bought 40GB extended storage for $4/month. You will see that I get good use out of this plan as I explain the services I have running on it.
Operating System/System Manager: NixOS
I use NixOS as my main operating system for both personal and server use. NixOS is cool because it allows you to define all the sys-admin type stuff about your system in a single configuration file. While I more often hear the reproducibility - the ability to copy over to another system or easilily - which is cool, especially if you're doing a serverless/sharded service, what I find most useful is the locality of it. The single config file, in one place, I find, significantly reduces the cognitive load compared trying to keep many disparate config files and programs in line with each other in an distro like Arch or Ubuntu. This makes it easier to set it, leave it, and come back. Instead of struggling to figure out how to sign into the Mastodon user or something, all you have to do is search for "mastodon" in the configuration file and possibly check the Mastodon section of the docs/wiki for config options.
In just 215 lines, I have been able to setup:
- a Nextcloud instance with a calandar, tasks, mailing list, file storage and sharing, and an RSS aggregator
- a Mastodon instance
- a custom blog website
- a custom (depracted) project hosting website
- a website for my girlfriend and I to store pictures and videos
- a Minecraft server
- a dedicated website for my language learning app
- and a Vaultwarden/Bitwarden all reverse proxied through NGINX with automatic HTTPS certificate renewal through ACME.
File Storage/Backup with Nextcloud
While I don't have many UX qualms with Google Drive, I like to use Nextcloud file storage to reduce my reliance on Google. This keeps a folder on my desktop, laptop, server, and partially phone, in sync. If you notice on my GitHub, I don't push to public repositories very often. This is because I just have all my code sync through Nextcloud. I didn't like the experience of accidentally forgetting to commit and push when switching devices, so now I just have it always in sync with Nextcloud. Nextcloud files also allows me to automatically backup photos and videos I take on my phone. It also allows me to share and host the files anywhere with the ability to optionally password lock them.
Calendar and Tasks with Nextcloud
I used to do my calendaring and tasking with Obsidian. However, I found the system too cumbersome to use and not really the right system for it. So, I turned on Nextcloud Calandar and Tasks. Through this, I get all the power of Google Calendar, but managed on my own system. I keep my contacts and calendar in sync with my phone through DAVx5. Tasks are kept in sync with jtx Board.
To turn these services on, I just had to add calendar = config.services.nextcloud.package.packages.apps.calendar;
and tasks = config.services.nextcloud.package.packages.apps.tasks;
to services.nextcloud.extraApps = {...}
.
Contact syncing with Nextcloud
I didn't want Google have access to all my contacts, so I turned on Nextcloud Contacts.
To turn this service on, I just had to add contacts = config.services.nextcloud.package.packages.apps.contacts;
to services.nextcloud.extraApps = {...}
.
Password Management with Vaultwarden
I host my own Vaultwarden, a Rust rewrite of Bitwarden, instance to host my passwords. I have so far experienced no problems with it. It required adding 2 sections to my NixOS config:
Decentralized Social Media with Activity Pub/Mastodon and RSS/Nextcloud News
I have found that what I'm most interested in on social media is more article/blog-post style content. While the hot takes and shitposts that can be found on 𝕏 are sometimes funny, there is almost no utility to them or the follow-up replies. A lot of the times, it feels like there's almost no real conversation occuring on 𝕏. Sometimes people go back and forth, but usually not productively and either way, I will probably never "see" that person/bot ever again.
I'm not sure how Mastodon is supposed to solve the problems with 𝕏, but it at least allows users to own their own profile - unless they're on a multi-user instance, which I don't think they should be.
To create a mastodon instance, I just added these 8 lines to my NixOS config:
I also had to create my user profile, which is a single command described on the NixOS Wiki: https://nixos.wiki/wiki/Mastodon.
I have found the Tusky on F-Droid as a nice mobile Mastodon client. I just use the website on desktop.
I've always wondered how people keep up-to-date with blogs and stuff, but now it seems obvious: they use RSS (specification)! I've heard of RSS bascially since I started using YouTube, but I never understood what it really was or how to use it. RSS is a simple, somewhat bloated IMO (but who cares), universal standard for sharing "feeds" (a list of items/posts). To create an RSS feed on your website, all you have to do is create and maintain a single file. A lot of site generators like Wordpress will do (and probably already have) it for you. Even YouTube has RSS feeds. With that, you can even do what I've always wanted on YouTube: subscribe to a playlist, but not the channel.
There are a bunch of weird, closed-off, RSS aggregators (a program/service that caches RSS feeds) that I saw you can use, but like, why would you...? Anyway, if you want to just subscribe to RSS feeds on your phone, Aggregator on F-Droid seems to work perfectly. Of course, I want all my devices to keep in sync, so I use Nextcloud News and the Nextcloud News app on F-Droid (costs money on the Google Play Store).
To enable Nextcloud News, I added these 4 lines to services.nextcloud.extraApps = {...}
in my NixOS config:
(You may want to get the latest version from https://apps.nextcloud.com/apps/news/releases)
Enhanced Usage of YouTube and other video services with YouTube ReVanced and Grayjay
I hate watching ads, so on my browser I use Firefox with UBlock Origin. However, the browser experience on YouTube leaves much to be desired. Luckily, there's YouTube Revanced, which blocks ads and allows background playback.
If you long for the ability to use multiple platforms including YouTube, PeerTube, Odysee, Twitch, Kick, Rumble, SoundCloud, Patreon, and Nebula at the same time, you can use Grayjay.
Eventually, I hope to replace YouTube ReVanced with GrayJay, but currently, I rely on YouTube recommendations for generating music mixes, which Grayjay does not support.
I do feel bad for blocking ads on creators that I watch's videos as they definitely do lose revenue from it, but I don't know what to do about it. My desire to not give Google money/personal data is about equal to my desire to give money to creators. I also don't follow sponsor links because they're usually not interesting/too expensive for me or donate (enough) because I do not have "donating money".
Note taking with Obsidian?
I still use Obsidian for notes, but I've been wanting to switch. Generally, the only thing that's keeping me on Obsidian is not feeling like sorting out an alternative.
I used to think that cross-linking notes was a killer feature, but I find it infinitely easier to just do a fuzzy search to find a specific note. So, now that I've adopted that my mindset, the options in the video make more sense.
Framework Laptop
I follow Louis Rossman and the Right To Repair Movement, so when he recommended the Framework Laptop as the most respective of your rights and I needed something more powerful than my Samsung Chromebook 3, I purchased one.
Motorola Phone; Possibly Pinephone Pro?
When my first phone, a Samsung Galaxy S7 died after 7 years (the last ~1.5 of which being with an open back), I just accepted its fate and let it die. However, I was not about to buy another $1k phone when I don't really care about having a top-of-the-line camera and the performance being practically irrelevant unless I wanted to play Genshin Impact or something. So, the cheapest, reasonably good (had the cellular bands I needed), was a Motorola G Stylus 2021. The camera isn't that bad and it feels just as fast as my friend's iPhones while having infinitely more freedom and being 1/5 of the price. The battery also lasts all day without issue. Sometimes, it can last 2 days when I forget to charge it at night even after 2 years of use.
For Christmas last year, I asked for a Pinephone Pro with the note that it was a completely unreasonable purchase for me to make myself because it was worse than the phone I already had in almost every way and was double the price. Surprisingly, I still received it. Oddly, iirc, it came pre-installed with Sailfish OS, a closed-source Linux distro. To be fair, it did however, have more things working out of the box than NixOS. I may work on improving NixOS support so I can use the phone (lacking GPS, camera, and MMS), but I don't know what I'm doing in that space.
Checking the time with Pine Time
I use a Pine Time watch as my main watch. It's pretty good, but not really featureful. I'm really disappointed that it does not currently support displaying Japanese text. However, my Pebble Time has been having trouble, so I'm sticking with it for now.
Code editing with NeoVim
I'm not that against using VSCodium, but it stopped working for a bit about a 8 months ago. So, since I was watching The Primeagen at the time, I switched to NeoVim and haven't looked back. I store my Neovim config within my NixOS config, which is a little scuffed tbh but it works.
Development Environment with Nix Shell
I heard other developers use Docker to create reproducable development environments. Luckily, when I was using Arch, I couldn't get Docker to work. When I started using NixOS, I found I could also use nix-shell. When I run nix-shell
, it reads the shell.nix
file in my current working directory and creates shell with the specific tools and dependencies I need to develop whatever I'm working on. No more messing with Node Version Manager or pyenv for me.
nix-shell
files (and other Nix stuff) can also be used on other Linux distributions and operating systems including MacOS and Windows (with WSL).
Personal Website with Web Components (aka: raw HTML and JS)
I've used many of the fun JavaScript, Rust, and even PHP web frameworks (albeit, just an outdated version of Laravel/Blade), but none have made me as happy as just writing raw HTML and JS. When I first started web development, I looked for exactly what Web Components are, a way to create reusable components of a website: like a nav bar. Unfortunately, Web Components were just being introduced as a concept at the time. Now, they exist, and they do everything I ever wanted React to do.
After learning about them in "WebComponents Will Outlive Your JavaScript Framework | Prime Reacts" by The Primeagen, who was reading "Web Components Will Outlive Your JavaScript Framework" by Jake Lazaroff, I put Web Components in the back of my mind.
Previously, I created this site with a specialized static site generator I made in Rust. Unfortunately, it kind of sucked and I hated working with it. So, when I wanted to update my portfolio (what the homepage of this site is), I decided I would switch to Web Components. Now, I am much happier with the development and actually updating this site again. While it is slower than it was when I generated it with Rust, I decided I didn't care and justified by decision by recalling the Free Software Foundation saying that a website's JavaScript should be readable (which it is because this site isn't compiled at all). That argument doesn't make any sense because before, the website didn't have any JavaScript, but oh well. If I were to make it better, I think the only thing that would make me happier would be to make it with the programming language I'm "developing".
Anyway, I'll show the MastodonComments component for this site, which I learned how to create from https://blog.thms.uk/2023/02/mastodon-comments, as an example:
To use it in an HTML file, make sure it's imported: <script src="/mastodonComments.js"></script>
. Then, just add <mastodon-comments post-url="https://cdt.social/@clayton/111678761831022044"></mastodon-comments>
(change the post-url
to point to the correct comment thread on Mastodon) anywhere you want.
Language Learning with Tutor Engine and Polygloss
I have not been fully satisfied by any language learning app other than language exchanges (though, I no longer wish to dedicate to 1:1 foreign exchanges). However, I've recently found Polygloss to be fun and actually helpful in actually practicing output. I would still call Polygloss good-ish (I'm very critical of language learning apps). Only "conversing" with those who are also just learning the language is probably not the best. Therefore, I am still developing Tutor Engine. It is not ready for public release, but in developing it, I have experienced rapid improvement in Japanese.
What I still need to do
While I do have my email on a custom domain, I still use Google to receive and send emails with it. I would prefer not to rely on Google for my email, but I have not yet had the energy to actually switch. Now that my Linode server uses NixOS, it may be easier to just slap yet another service on it (I think it may also be a Nextcloud app).
Hickey, C. L. (2024, February 11). My User-Control-Focused Stack. Clayton Hickey. https://claytonhickey.me/blog/my-user-control-focused-stack/.