Digital Spring Cleaning

A screenshot of this website.

I did some reorganizing on this website, and I think I’m pretty happy about it! The biggest thing I did was merging both personal.jagtalon.com and jagtalon.com. I’ve been maintaining separate WordPress sites for my professional and private blogs, but it was a pain because I had to make sure that I copy any plugin or theme changes from one server to the other.

I figured that it would be much easier to merge the two and simply label my personal updates as #personal. I think I like this more because the site is now a better representation of me now that it has both personal and professional content. It’s also easier to share with other people: just go to jagtalon.com to see what I’m up to.

Simplifying my website felt great and it gave me the energy to cut down on some of the hosting software and services that I no longer need:

  • I was able to downgrade Cloudron (a tool for self-hosting websites) to the free tier now that I got to remove an extra WordPress site. This will save me $180 per year.
  • I also cancelled my second Akismet subscription (a service that blocks spammy comments) since I’m only running one WordPress site. This saves me $18 per year.
  • I downgraded to a smaller server on Hetzner (a hosting company) as well and this saves me €132 or $160 per year.

That’s $358 of savings a year! It looks like reorganizing pays off.

File Sharing Setup

A drawing of a puffer fish floating in the sky.

When Firefox Send shutdown, I started running my own instance of NextCloud to send files to people. It worked as expected, but it also felt slow. It felt like I was using a website that just groggily woke up from a nap whenever I logged into it.

I figured that maybe I could replace it with something leanerespecially since I felt like I didn’t need a lot of the features that NextCloud offered. I’ve recently been learning how to set up static sites on OpenBSD and it occurred to me that I could use OpenBSD’s built-in HTTP server to send files to people.

Setting up the Server

I went through the same process that I listed in my notes on setting up an OpenBSD server using httpd. You can use any other web server, but I love how simple it is to setup httpd.

Changing Write Permissions

I wanted to be able to write in the /var/www/htdocs/send.jagtalon.com as a normal user, so I changed the permissions to be owned by my user instead of root:

$ doas chown -R jag:jag /var/www/htdocs/send.jagtalon.com

Easily Uploading Files

I don’t want to copy files manually to the remote server using the command line every time I wanted to send a file, so I set up Cyberduck to connect to my server using SFTP. I bet Transmit would work well too if you’re on macOS!

A screenshot of Cyberduck showing some of my remote files.

It was relatively easy to set up, but a bit intimidating. I needed my private SSH key, SSH password, my username, and the server’s IP address. Now I can drag and drop files into the server without touching the terminal.

I also added a few conveniences:

  • I set Cyberduck to go into /var/www/htdocs/send.jagtalon.com/ every time I connected to my server.
  • I added the URL of my server so that I could right click and copy the URL of any file.
A screenshot of my settings on Cyberduck showing the preferred path and web URL options.

And we’re done! Now I can send files and even host little “pens” for demos. Here are some examples:

Tiny Generative Art Template

A screenshot of Windows Terminal that shows the directory structure of the project.

I’ve been using canvas-sketch ever since I started learning generative art back in November. It’s an incredibly useful tool for creating a new project, setting up a local server, and saving my artwork to disk. The only issue that I have with it is that it comes with a lot of dependencies that I don’t think are necessary for the kind of art that I do.

So I thought that I could take a stab at creating a minimal generative art template that only includes the things that I need. This is is how it works:

Screencast showing a demo of the project. You can try it out yourself here: ~jagtalon/generative-art-template

It’s not a zero-dependency template, but as long as you have CoffeeScript and Browsersync installed, you should be good to go. To start a new project, all you need to do is:

  1. Download or clone the template.
  2. Run ./build.sh (runs the CoffeeScript compiler)
  3. Run ./server.sh (runs the Browsersync server)

And you’re good to go! The two most important files in it are index.html and art.coffee:

  • 💻 index.html is a barebones HTML file that lets me view and save the artwork. It has a little bit of CSS that makes the Canvas responsive (I often work with large 3600×5400 images!) and a little bit of JavaScript that lets me download the art.
  • 🎨 art.coffee is where I draw. It’s written in CoffeeScript, and it’s compiled to JS. I’m using it as a JavaScript module so that I can easily import libraries that are both local (like my little Canvas API wrapper called tiny-canvas.coffee) and remote (like NPM modules on Skypack).
Screencast showing how short the index.html and art.coffee files are.

And that’s it! build.sh and server.sh are set up to watch the files for any changes, so there’s no reloading involved once these two are running.

Of course, I could get really lean by removing the dependency on CoffeeScript, but I personally enjoy working with this language so I decided to include it. If you’re interested in tweaking the setup, feel free to fork the project and modify the template to your needs! You can find the repository on Sourcehut.

Hello, Tarsnap

A screenshot of Windows Terminal showing the Tarsnap command outputting the size of my backups.

I was put off by Tarsnap Backup when I ran into it many years ago. I liked that it’s trusted and secure enough to be used by companies like Stripe, but I just didn’t want to put in the work to modify configuration files, write shell scripts, and set up cron jobs to backup my files. That felt like too much effort for me to manage. I have a laptop, not a server.

But over time, my backups have become a bit of a fragmented mess. I ended up adopting multiple services (and overpaying for storage) because they were easy and tightly integrated with my devices. I have iCloud for my photos, OneDrive for my documents, and Backblaze for everything else on my computer.

I wanted to consolidate everything I had into a single place, and I wanted it to be cheap and secure. Tarsnap came to mind again because it’s inexpensive enough for my needs, and I like that I’d be the only one holding the encryption keys. (It costs $0.25 per GB, so it’s not the cheapest one out there, but deduplication has done wonders for me.)

This is how I have it set up on Windows through WSL.

Specific directories

I don’t want it to make a backup of my whole drive because that will take forever to upload on my 5Mbps network. Even though Tarsnap is affordable, it could get expensive if I backup unnecessary program files.

So in this script, I created a variable called $directories in the backup script that lists out the folders I care about in both Windows and Linux.

#!/usr/bin/fish

set directories "/mnt/c/Users/jag/Documents" "/mnt/c/Users/jag/Desktop" "/home/jag"

/usr/bin/tarsnap -v -c -f (uname -n)"-"(date +%Y-%m-%d_%H-%M-%S) \
    $directories

Backup Intervals

I want the backup to run automatically in the background, so I had to set a cronjob. I typed in crontab -e and set Tarsnap to run every half hour (4pm, 4:30pm, 5pm, etc.)

*/30 * * * * /home/jag/tarsnap-backup.sh

I haven’t run into this, but I’ve read that cron can fail silently. So I had Dead Man’s Snitch set up as well to warn me if my cronjob didn’t run in the last 24hrs just to be extra safe. They have a program called a Field Agent that monitors execution time and output of the backup script.

*/30 * * * * /home/jag/dms -s 012345 /home/jag/tarsnap-backup.sh
This is my dashboard on Dead Man’s Snitch. It’s free when you’re only monitoring one cronjob.

Cron in the background

This part gets pretty hacky. The problem is that the cron service doesn’t start automatically in WSL 2. Even though I have cron configured, it’s not going to execute unless the cron service runs in the background. Not having a normal boot process means that services in Linux have to be started manually, but I didn’t want to run the backup myself every time I boot up! I’d have to run the following manually:

  • Open Windows Terminal
  • Start Windows Subsystem for Linux by typing wsl or ubuntu
  • Run sudo /etc/init.d/cron start
  • Type in my password

I needed to make all these steps automatic. First, I removed the need to put it in a password when running cron by adding this to the sudoers file (which you can get to by typing in sudo visudo):

jag ALL=ALL NOPASSWD:/etc/init.d/cron start, /etc/init.d/cron status

Now that I can start cron without a password, I can get it to run in the background without a password prompt when I log in to WSL. I added this condition to config.fish (The .bashrc on Fish Shell):

# Start cron if it's not running.

if sudo /etc/init.d/cron status | grep 'is not running'
    sudo /etc/init.d/cron start
end

Now that I’m able to start cron automatically, all I needed to do is to run WSL when I log in on Windows. Pressing Win+R and typing in shell:startup took me to the startup folder. In it, I wrote wsl.bat that just had ubuntu.exe in it.

Easier Tarsnap commands

I have trouble remembering Tarsnap commands, so I made some aliases to make it simpler for me. I wrote this function in ~/.config/fish/functions/tarsnap.fish:

function tarsnap
    switch $argv[1]
    case stats
        command tarsnap --print-stats --humanize
    case archives
        command tarsnap --list-archives | sort | tail
    case extract
        command tarsnap -xf $argv[2..-1]
    case ls
        command tarsnap -tf $argv[2..-1]
    case '*'
        command tarsnap $argv
    end
end

This means that I could just type in tarsnap stats instead of tarsnap --print-stats --humanize and tarsnap archives instead of tarsnap --list-archives | sort | tail. Much easier to work with!

Running tarsnap stats and tarsnap archives.

Was it worth it?

That was quite a bit of work to figure out and set upespecially on Windows! There should be fewer (and less hacky) steps on macOS or Linux, but I’m glad that it’s all running smoothly for me. There’s nothing else for me to do aside from making sure that it’s running. It should also be easier to set up in a new machine now that I know how to get it to work.

So was it worth it? I think it is. The reason I did this in the first place was that Tarsnap was affordable and more secure than anything I’ve used before, so I think I still come out ahead even after all that work. We’ll see if I change backup preferences in the future, but for now I think I’m content with what I have.

Creative Coding: Setting Up on Windows

A screenshot showing Windows Terminal

The Canvas and WebGL workshop that I’m taking right now is taught using macOS, so the course assumes that I can access some Unix tools and commands in the dev environment. Since Windows isn’t built on top of BSD or Linux, I have to do a bit more work to get up and running.

Install Windows Subsystem for Linux

Windows Subsystem for Linux or WSL is the best way to get a Linux environment running on Windows. It’s a lightweight virtual machine that runs unmodified Linux binaries on top of Windows. It’s so fast that it doesn’t feel like I’m using a VM at all.

See how quickly WSL boots up. It’s magic.

There are two versions of WSL, so I made sure to get WSL 2 because it’s 2-5x faster when it comes to IO operations like git clone and npm install—commands that I’ll often be using!

Install Remote – WSL Extension on VSCode

The Remote – WSL extension on VSCode forces all the commands to run in the Linux VM. It makes sure that I’m interacting with Linux all the time while I’m in VSCode. So even though the editor is running on Windows, programs like Git or Node are all running in Linux.

VSCode with the Remote – WSL extension.

Bonus: Install Windows Terminal

I’m a fan of good-looking terminals, and the built-in terminal on macOS is beautiful. It looks modern, and it supports tabs and theme customization. The built-in Command Prompt on Windows, on the other hand, looks quite ancient.

Fortunately, Windows Terminal is available in the Microsoft Store, and it supports tabs, vertical splitting, and even emojis. I don’t know why this isn’t included in the OS in the first place!

Windows Terminal with vertical splitting.

Moving to Windows

A screenshot of my desktop with the Windows start menu open.

Repairability has become a big part of my decision making when I buy new devices these days. I don’t know much about electronics, but learning to make minor repairs on my iPhoneAndroid, and Roomba made me realize that I could easily give new life to old and hobbling tech. It felt good to keep something going, and I’m hoping that this will help save me money and reduce my e-waste in the long run. So, now that it’s time for me to find a new laptop, I wanted to make sure that there was a chance for me to at least swap out a few components if I needed to. 

I’ve been a Mac user for many years now, so I thought it made sense for me to do some research on the latest MacBook Pro laptops first. How repairable are they? It would be great if I could avoid switching OSes in the first place.

I found out that the new MacBook Pros only scored an abysmal 1 out of 10 on iFixit’s reparability rating. Apparently, they’ve all had terrible scores since 2012. They have everything soldered and glued together which meant that I wouldn’t even be able to upgrade the drive or RAM if I wanted to. It was clear that I was going to have to leave macOS if I’m adamant about getting a repairable laptop. (There are repairable Macs out there, but they’re desktops and not laptops. The Mac Mini scored a 6 out of 10, and the Mac Pro scored an amazing 9 out of 10! But even if I wanted a desktop, a Mac Mini is too underpowered for work, and the Mac Pro is almost too excessive.)

Trying it out

I wasn’t sure if I could even pull off moving to another OS. I knew that I wouldn’t be able to use Linux for work, but could I move to Windows? It’s been 13 years since I last used one.

I thought that the best way to know was to try it out. So, I committed to using Windows 10 on Bootcamp for a week to see if it was any good. I told myself that if it didn’t work out, I could just get a Mac like I always did.

After a week, I was surprised at how good Windows actually was. A lot of the things that I enjoy on the Mac are now on Windows like virtual desktops, Do-Not-Disturb mode, Spotlight-like search, a screenshot annotation tool, an emoji picker, and even a Linux! Past Me would have laughed at the ridiculous idea of Microsoft creating a Linux compatibility layer on Windows.

Programs

Most of the apps I use are fortunately cross platform. Figma Desktop, Krisp.ai, TiddlyWiki, VSCode, and Zoom all work the same way on Windows. For everything else, I had to do some work to find alternatives. Here’s where I moved to:

I’m sad that nothing really comes close to a Fantastical alternative on Windows. The built-in calendar is fine to manage both my personal and work calendars, but it’s missing a lot of the features that I use. It doesn’t have calendar groups/sets, and it doesn’t understand natural language. Typing in “Order chicken wings every Friday at 7pm” just won’t work on Windows.

The repairable laptop

I was convinced that Windows was good enough for my day-to-day work, so I went ahead and got a Dell XPS 17. Its slightly smaller counterpart got a 9 out of 10 on iFixit, and it’s got some good reviews online, too. I’ve been using it for a week now as I’m writing this, and I’m loving it.

I’ll still have my old MacBook Pro around to use from time to time (looking at you, Principle and Rotato), so I won’t be 100% on Windows. There’s also a lot to look forward to on the Apple side. They recently released their environmental progress report, and they talk about making it easy for people to repair their devices. I hope to one day see more repairable laptops from them.

Working with TiddlyWiki on iOS

Screenshot of my journal updating through git on my phone.

I’ve been using TiddlyWiki for two months now, and I’m amazed at how versatile this piece of software is. Since it’s able to weave together all the disparate parts of my life, it’s become my go-to notebook for almost anything. I’ve become dependent on it for documenting and understanding my life.

But if TiddlyWiki is going to be my notebook for everything, I have to get it to work on my phone, too. I’ve been hesitant about it because I assumed that it would be a pain to work on WikiText without a keyboard, but it didn’t end up being as bad as I thought it would be. I also like that I get to look things up on my wiki while I’m away from my computer.

The first thing that I needed to do to get set up on my phone was to get an app called Quine. Even though TiddlyWiki is just an HTML file (there’s no server component here), saving can be a bit of a pain because browsers don’t allow websites to write directly into files. Quine is a modified browser specific for TiddlyWiki that lets you bypass that restriction.

Next, I needed to figure out how to sync the wiki between my computer and my phone. The simplest solution is to drop the wiki into a service like iCloud, Dropbox, or Resilio and call it a day. Any changes that I make on my phone would automatically sync with my computer and vise versa. If you’re thinking of doing this yourself, this might be good enough for you! Dropbox even lets you recover old versions of the file if you ever needed to revert back to them. 

But I wanted more control over my backups. I want to have the freedom to tweak the code and try out new themes and plugins without worrying about breaking my wiki. I wanted version control. I wanted Git on my phone.

I didn’t know if it was even possible to use Git on iOS, but I did a quick search and found Working Copy. All I had to was to link my GitHub account and point it to the right repository. GitHub now offers unlimited private repos for free, so I’ve taken advantage of that for backing up my wiki. Working Copy downloads the repo to my phone, and it makes the files available to third-party apps like Quine. 

While this is not as convenient as using Dropbox, it makes me feel more confident about my wiki’s integrity in the long run. I’m excited about this setup, and I hope I can keep this going in the years to come.

After-hours Setup

A screenshot of Apple's to-do list app.

I used to ignore anything that looked like responsibility. I didn’t read my mail, I often forgot about appointments, I didn’t plan ahead, and I could never tell where my money was going. Although my strategy surprisingly worked for a couple of years, I eventually reached a tipping point where I was spiraling with guilt and mounting obligations. I’m happy that I’ve gotten to work on my ostrich-like hangups on life admin since then, and I think—for me at least—having the right software tools have helped along the way.

I often see people writing about the tools that they use to get their work done, but it’s rare for me to see much of anything on how people manage their lives outside of work. I’ve been reassessing my setup recently, so I thought I could share the things that have been working well for me and the tools that I’m currently playing around with.

You Need A Budget

In the past, I would budget my money by adding up all my recurring expenses each month and subtracting the total from my income. I’d put down the result as money that I’m allowed to spend. I figured that whatever is left behind after that can turn into my savings. It seemed like a good system: it was simple, and I didn’t have to do it that often.

But reality was very different. It felt like there was always that one “emergency” that would throw a wrench into the whole thing: a doctor’s appointment, going out to dinner with friends, a subscription that I forgot about. So even though I had a great system in place (I didn’t), I still couldn’t manage to put money towards my savings or my credit card debt. So I gave up and figured that I was just bad with money.

I forget how, but I came across an app called You Need A Budget around two years ago. I had a hard time using it at first because I couldn’t wrap my head around the philosophy of only budgeting the money that I currently have. I also struggled because I didn’t understand that I needed to be proactive with budgeting. I didn’t know that I had to:

  • Actively look at what’s left of my budget to guide my decisions
  • Figure out what categories I needed to prioritize
  • Plan and set goals

But after a couple of failed attempts, I eventually joined their workshops and learned how to use the app. I’m not going to go into detail about its features (there’s a bunch), but the gist is that it’s super useful for life admin. Those “emergencies” that I talked about earlier? They’re basically things that YNAB helps me prepare for. If I know that I’ll be getting my wisdom teeth removed soon, I can start putting money towards a category called “Oral Surgery.”

I also have a thing called a “wish farm” to budget my discretionary money into categories like future travel or a pair of boots.

Fantastical

I couldn’t find a single calendar event before 2016, so I don’t really know how I managed to remember things before that year. I think I had this idea that calendars were only for very busy people. Normal people like me, I thought, don’t really have a use for it outside of work. Unfortunately, I wasn’t any good at keeping tabs on my appointments and get-togethers. I realized that computers were a lot better at remembering dates than I am.

I have my calendar hosted on Fastmail, and I started to use it a lot more when I found Fantastical. I think what got me to use it was how ridiculously easy it is to add an event in the calendar. Basically, you just type in “Water plants every other Friday” and it’ll automatically create a recurring event just for that. It suddenly made remembering events easy for me to do.

With YNAB, you can only budget the money that you already have.

One other feature that I love about Fantastical is that it lets me bundle calendars into different sets. This means I can switch between different contexts throughout the week:

  • A set that just shows my personal calendars. (Perfect for weekends or when on holiday.)
  • A set that just shows my work calendars. (This gives me an overview of my work.)
  • A set that combines personal & work calendars. (This is usually my view during the week because, naturally, I don’t want to miss any work meetings or personal appointments.)

Reminders

I don’t have any complex to-do list requirements, so I’ve found popular apps like Things and Todoist to be a bit too much for my personal needs. I didn’t think it was worth paying for features that I wasn’t going to use. Paper, on the other hand, is often inconvenient to carry around and to write in while I’m on the bus or train or at the grocery store.

I was doing some research on to-do lists, and it turns out that most calendars already support simple task management. I thought this would be great at first because the bulk of my tasks are basically events that I want to check off like “Take the trash outside at 9pm every Monday” or “Change out your contact lenses every two weeks.” The downside is that it the more tasks I made, the more cluttered my calendar looked.

The solution for me was to switch to Apple’s built-in Reminders app. It actually syncs with my calendar on Fastmail which meant that I didn’t have to migrate my tasks over to another system.

Reminders makes it easy to for me to create to-do lists that sync with my calendar.

To-do lists are at the heart of my life admin because I would forget a lot of things if I didn’t have it. It has a lot of those recurring items that I used to forget like paying off my credit card every month or taking the compost bin out. Since it’s also on my phone, it’s also really useful for remembering those responsibilities that bubble up when I’m commuting. “Oh yeah I need to get some onions for dinner later.”

Monica

In the past, Facebook was my contact list. I could message friends easily, I could hop on a video call with them, I knew what people were up to, and I knew if their birthdays were coming up. It worked pretty well up until I stopped using Facebook. And at that point, I didn’t realize just how much I relied on it for keeping in touch with friends.

Fortunately, a friend told me about this website called Monica. It’s basically a CRM but without all the business-y language around it. I managed to use it for a couple of months, but my motivation died out soon after.

I tried Airtable for a little bit, but that ended up being even more work. I just wanted something that didn’t require me to build the scaffolding so that I could get on with the actual work. So recently, I started using Monica again, but now I also have a reminder to update it every other day so that I don’t forget about it. I also made it into a “desktop app” using Fluid, so that I’m reminded of it whenever I’m on my computer.

It’s too early for me to say if it’s working for me, but I’m glad that there’s a way for me to keep track of when I last hung out with someone, the names of their pets, and the things that we talked about. It’s almost a complement to my journal. I also appreciate that I get reminders from Monica that basically says, “Hey, you should really keep in touch with this person.”

That’s it

You made it! The invisible work of life admin isn’t glamorous, but thanks for letting me geek out and reading all the way to the bottom. If you have tools that you use to manage your daily life, I’d be happy to hear about it.

Still Going

Last Friday, the same day Apple started selling the newly-released iPhones to everyone, I decided to pry my iPhone 7 open. It had an aging battery, and I had the option of taking my out-of-warranty phone to either the Apple Store or a local repair shop. But swapping it out myself sounded more fun, and going the DIY route also meant that I would pay less.

It was, of course, a complete coincidence that I did it on the day of the event. But learning about it after the fact made me feel a bit more defiant and subversive. I felt like I had just saved my wallet from the world’s first trillion-dollar company by holding off on buying a new phone. I felt good about extending the life of a device that Apple doesn’t want people to repair.

I’m fortunate that I also don’t do much on my phone, so it pretty much does whatever I need it to do. I can play games, browse the web, find my way across the city, take pictures, and manage my budget. The only thing that was really missing was a longer battery life.

But changing the batteries myself does have its risks. I was terrified of opening up my phone because there was a chance that I could accidentally puncture a component or pull on the wires a little too hard. I definitely didn’t want to lose the whole phone altogether. This fix could easily switch from being the cheapest repair option into being the most expensive one.

But I went ahead and did it anyway. I had the tools and the battery, so to hell with those sunk costs.

Of course, it ended up being a success. It took around fifteen minutes, and all I did was follow instructions on iFixit. I felt empowered and proud that I was able to extend the life of a device that I use every day, but also a bit of relief that I didn’t end up bricking my phone. I also felt like I’ve crossed a boundary: I no longer feel like a consumer, but more of a participant in the device’s existence.

There was one thing that I did screw up: I forgot to reapply the display adhesive around the screen. It’s meant to prevent water from getting into the phone, but as long as I never take it near a tub or a swimming pool, I should be good.

The iPhone with the new iFixit-made battery.