Going Commando: Running Public Website on Server in a Closet

The blog you’re reading is hosted on a server that sits on the floor in a closet in our condo in San Francisco. You’re accessing it over my very pedestrian home internet connection (bizarrely, getting fast residential internet in San Francisco is hard). I don’t have a static IP address so DNS is resolved using Dynamic DNS (DDNS) and DNS records are updated whenever my ISP changes the external IP address. There’s no redundancy and power for the server has no battery backup. Some software update tasks are automated, but many I only do whenever I happen to log onto the server for one reason or another. There’s no fancy container orchestration, just Docker containers running with the --restart unless-stopped flag.

By all rights, uptime and availability for the blog should be horrendous. It should have been pwned by script kiddies many times over. The assorted software pieces should error or fail regularly.

But that’s not what actually happens. Uptime for the server is typically measured in months with the only interruptions happening when I flip the breaker to do electrical work on the house, or similar.

I reflected on this because of 37signals’ recent ONCE announcement where you buy and pay for their software once (as it were) and own a license to use it on your own hardware in perpetuity, instead of buying a subscription for a SaaS-hosted version. Some of the pushback on Twitter emphasized how SaaS is a better model because self-hosting software exposed to the public internet is uniquely difficult and scary. I’m not saying it’s easy, but I also don’t think it’s actually that hard and I can see how it’s a refreshing alternative to straight-jacket SaaS models with ever-increasing subscription prices.

iPad Review

For the past year and change I used a 32GB non-pro 7th/8th generation iPad for almost all of my personal computing needs. The setup worked really well and I’ve come to really like the device. This somewhat surprised me since I love fast computers and big monitors. So here’s a review of my experiences.

Before the iPad I used a Lenovo X1 Tablet 3rd Gen which is a wonderful device too: very fast (I had the fastest i7-8650U processor), dual Thunderbolt ports and an outstanding 3:2 aspect-ratio high-res screen. Unfortunately it mysteriously stopped working in the summer of 2020 right after the warranty expired.

New M1 MacBooks were expected that fall and since I’ve been drifting into the Apple ecosystem over the past decade I decided to wait to buy a replacement for the ThinkPad and use the iPad to tide me over me over for a couple months (it was a work-gift we had laying around). The first M1 MacBooks came out in November ‘20, but I was somehow underwhelmed—I don’t remember exactly why—maybe something with the limited external monitor support. So I decided to hold out for the follow-up M1-CPU MacBook Pros and the iPad soldiered on. The new MacBook Pros turned out to be super expensive so this winter I ordered what I should have gotten when they came out: a standard M1 MacBook Air.

Ultimately I think I’ll look back on this iPad-period as a Walden-Pond-kinda time where I successfully limited myself to a really constraining computing device, learned some things and then returned to using more powerful and ultimately more productive computers.

Hardware

First off: the base iPad model is a great device. I almost always use it with an Apple Smart Keyboard attached. The Smart Keyboard compares poorly with a ThinkPad keyboard but it’s surprisingly useful and I can type pretty quickly in relative comfort. The big drawbacks are lack of backlighting and the need for a stable typing surface (i.e. no good reclining on couch). If I was going to continue to use the iPad as my main device I’d try out the Logitech Combo Touch.

Some aspects of using multiple keyboard layouts (Danish and US in my case) and the interaction with keyboard shortcuts is not really thought through. For example the Safari tab-cycling shortcuts are cmd+shift+[ and cmd+shift+] which is fine on the US layout. It doesn’t make sense for the Danish one though, and there’s no keyboard shortcut for changing the layout. The workaround if I’m stuck on the Danish layout and want to switch Safari tabs requires clicking the Safari address bar (bringing up they on-screen keyboard controls), selecting US keyboard layout and then cycling through tabs. Not great.

I got a 1st generation Apple Pencil for good measure, just to see how much utility I could get with a full complement of input devices. Besides a few home DIY projects sketches I use the pencil to draw with my 2-year old son, and it’s great for that. No paper, no mess, easy storing and cataloging of drawings. We draw together in the Notes app, but I’d like to learn ProCreate. The pencil is also a nice alternative to finger input because it keeps smudges off the screen. I use a pencil-holder attached to the keyboard cover to hold the non-magnetic 1st gen pencil, which works well. 

iPad with Smart Keyboard and Pencil

The hardware design for the standard iPad feels dated. It’s not much changed from the very first iPad: Home button, big bezels, curved back. The 10.2” screen is small, but fine for single-window use in landscape mode. The USB 2 interface on the Lightning port also feels incredibly dated and it makes moving files using flash drives or local 1Gbs networking a drag.

The two worst aspects of the 7th/8th generation iPads were both fixed in the new 9th generation model (which I haven’t tried): The poor front-facing FaceTime camera and the cramped 32GB base storage model. I never take FaceTime calls (with my parents, for example, for them to talk to their grandson) on the iPad even though it has a bigger screen than my iPhone — the camera is just too crummy. For comparison I gifted my parents an iPad Pro, primarily to get them the Center Stage FaceTime feature, and it’s great. 

The 32GB storage situation is manageable, if annoying. The problem is not that I have 32GB worth of apps, it’s that Photos hoovers up any residual storage with cached images from my iCloud photo library. I wish there was a way to make Photos more aggressively offload images to free up device storage, or set a limit to the amount of device storage used by the Photos app.

Battery life is pretty OK and certainly better than Windows laptops. On weekends (when I tend to use the iPad a lot) I have to stay on top of charging at night or it’ll run low. Being used to newer iPhones, one thing to note is the lack of fast-charging: Trying to quickly top up the battery with a 30min charge doesn’t make a difference, the iPad has to more-or-less soak up a charge overnight.

iPadOS 15

I got onto the iPadOS 15 public betas as soon as they became available and I suspect that contributed to my positive experience (I never really used an iPad in earnest before, so can’t compare with earlier iPadOS versions). While the iPad screen is too small for actual multi-window use, the improved keyboard shortcuts and widget support probably helped make the iPad a more tenable laptop replacement. 

Speaking of keyboard shortcuts, one thing that still bugs me is the semantics of cmd+tab on iPadOS. Coming from full desktop operating systems I have deep muscle memory and always use alt+tab/win+tab/cmd+tab to switch between currently open apps. On iPadOS, however, cmd+tab doesn’t go through “currently open apps”, instead it is apps that the OS hasn’t swapped out for one reason or another. This seems arbitrary and, dare I say, un-Apple-like. A more charitable interpretation is that the cmd+tab app list is “apps that you can switch to really fast” (i.e. without the app having to swap back in) but even that is not really satisfactory: I don’t alt-tab around to find an app I can get going really quickly, I alt-tab to get to some app that I was using a minute ago and now need to use again, whether I have to wait for it to swap in or not.

The upshot is that I tend to use Spotlight search when switching apps which is not lightning-fast, but fine. The 🌐+⬆️ app switcher is also “fine” but not great for keyboard only use, partly because the default focus is on the upper-left corner app, which comes to what I was doing 6 apps back. I’m trying to make myself use 🌐+⬅️/➡️ which is actually fast (until you get to an app that has to swap in). It doesn’t give you an immediate overview of the list of apps you’re tab’ing through though, instead you’re just stumbling along, hoping that the next keypress produces the app you want.

I guess the ultimate cause of this difference is the auto-app-closing behavior in iPadOS. The equivalent in “normal” operating systems is memory being paged to disk, which seems to result in a more seamless user experience, but maybe I just haven’t used a low-memory Windows machine in a long time and it turns out that the iPadOS behavior of almost-fully closing apps that no longer fit in memory is the optimal one (also for battery life).

The base-model iPads have 3GB memory which is probably the right tradeoff to produce a ~$300 tablet, but looking at Marques Brownlee skimming through open apps on a 16GB iPad Pro it sure looks like more memory helps since apps almost never have to be closed by iPadOS.

Apps

iPadOS has had full Safari since version 13 and using an app versus a web-app is often a wash in my experience. Especially because some apps don’t support affordances like selecting and copying text that you’re used to on the web. I still use plenty of apps though, so I wanted to call out some of the high-and-lowlights.

I’m not the first one to point this out, but the Google productivity app suite (Docs, Sheets) is not good on iPadOS and you’re almost always better off using those services with Safari (or Chrome maybe, I didn’t try). I can understand why iPadOS is not a priority for Google, but it’s really a shame since those are otherwise such great services.

I can also understand why Amazon doesn’t prioritize the Apple ecosystem, but Amazon Fresh missing from the Amazon iPadOS app is really frustrating, especially since it’s in the iOS app.

The built-in Apple Files app is terrible. Trying to copy large files around or transfer them over the network will reliably cause the whole iPad to grind to a halt, the only action I’ve found to do that. It’s like Apple ended up in some strange middle-ground between the paradigms of strong on-device processing and cloud-first data storage, and the result is frustration. The file transfer problem is particularly frustrating because it’s been adequately solved on literally all other computing platforms I’ve used in the past decade. I tried a handful of 3rd party file apps but they either sucked in different ways or came with adds and other cruft.

The Microsoft Remote Desktop app is great. Part of the reason I could make do with just an iPad for so long was definitely that I had a full Windows VM on my home server that I could access to do the few things that just didn’t work on the iPad. The Remote Desktop app mostly bridges the iPad/Windows divide with sane defaults for what keys and keyboard shortcuts do and clearly a lot of thought and care has gone into making that seamless. The contrast with remote desktop’ing into a Mac is stark. Apple provides no built-in way to do this (from an iPad) and the assorted VNC-based apps and tools in the Apple ecosystem compare very poorly with Microsoft Remote Desktop.

The Photos app is good but as mentioned above its tendency to gobble up storage is a problem. There’s a very strange incompatibility where videos shot on my iPhone 12 Pro Max in 4K 30fps cannot be edited in the Photos app on the iPad. iMovie on the same iPad can edit those videos just fine, so it’s not a hardware or codec limitation. I prefer cropping videos on the iPad over my phone, but having to install 750MB of iMovie (which is also more cumbersome for simple things than editing right in Photos) ruins that.

Editing videos shot on iPhone doesn’t work in Photos app on iPad

Summary

So would I recommend a base-model iPad for your main computing device? No, not if you like “normal” computers and can afford a decent Mac or Windows laptop. And I’m not sure I’d feel different if I had tried this experiment with an iPad Pro, the OS is just too quirky and limited. But for less than $300 these iPads are incredible devices and I heartily recommend them to anyone than can live within the constraints or for whom the constraints (and the improved reliability and stability you get as a result) are actually a benefit.

ThinkPad W520: My (old) new computer

My home computer is a tricked-out 2011 ThinkPad W520. I find it to still be very fast and a joy to use. This post describes upgrades I’ve made to keep the machine relevant in 2018.

I got the W520 as my main work laptop in late 2011. In fact, you can see it in this 2012 AppHarbor housewarming invitation connected to two 23″ portrait-mode monitors. I spec’ed it with a quad-core/8-thread i7-2820QM 2.3/3.4GHz 8MB L3 processor, 8GB RAM, and two 320GB spinning disks configured for RAID 0 (You had to order with a RAID setup to get that option, and 320GB disks was the cheapest way to do that).

After taking delivery I switched out the disk drives for two 120GB Patriot Wildfire SSDs, also in RAID 0. The result was a 1GB/s read-write disk array which was good for 2011. At some later point I upgraded to 32GB RAM (4x8GB)—memory was much cheaper back then. I also added a cheap 120GB mSATA SSD for scratch storage (the mSATA slot is SATAII, so somewhat slower).

After leaving AppHarbor I used the W520 only sporadically for testing Windows Server pre-releases and running test VMs. Whenever I did, though, I found myself thinking “oh year, this is a really neat and fast machine, I should use it for something”. In 2017 I moved into condo and got to have a home office after 7 years of moving between assorted shared San Francisco houses and apartments. For my home PC, I wanted to see if I could make the W520 work.

My main requirement was a system that can power a 4K monitor running at 60hz. The W520 has a reasonably fast Nvidia discreet GPU and can render 4K just fine using remote desktop, but neither the VGA port nor the DisplayPort on the laptop can push out that many pixels to a plugged-in monitor.

Luckily the W520 has a bunch of expansion options that can potentially host a more modern graphics adapter:

  • 2xUSB 3.0 ports
  • Internal mini-PCIe slot used for WiFi adapter (the Lenovo BIOS whitelists approved devices however, so a hacked BIOS is required to plug in anything fun)
  • ExpressCard 2.0 slot

ExpressCard technology was on the way out in 2011 but had reached its zenith and in the W520 offers a direct interface to the system PCI Express bus. This avoids the overhead and extra latency of the USB protocol. An “eGPU” ExpressCard to PCIe adapter is required to plug in a real graphics card and I got the $50 EXP GDC.

I settled on a Nvidia GTX 1050ti graphics card since it’s reasonably fast and power efficient. Note that a 220W Dell power brick is also required to power the PCIe dock and graphics card.

UPDATE: This script from a user on the eGPU.io forums fixed the “Error 43” incompatibility for me.

Recent Nvidia driver versions have introduced an incompatibility with eGPU setups and I spent some time troubleshooting “Error 43” before getting output on the external screen. I never got recent drivers to work, but version 375.70 from 2016 is stable for me—implausibly since it predates and is not supposed to support the 1050-series GPU. The old driver has proven to be a problem only when trying to play very recent games, and is not a blocker (but do get in touch if you happen to have gotten a setup like this working with the latest Nvidia drivers). I also tried a Radeon RX 560. While it didn’t require old drivers to work, it had all sorts of other display-artifact problems that I didn’t feel like troubleshooting.

The standard ZOTAC fans are loud and I replaced them with a single 80mm Noctua fan mounted with zip-ties. The fan connector is not the right one but can be jammed onto the graphics card fan header and wedged under the cooler. I removed the W520 keyboard and zip-tied another USB powered 92mm fan to the CPU cooler so that the (louder) built-in fan doesn’t have to spin up as frequently (not in picture below).

The final upgrade was two 512GB Samsung Evo 860 SSDs that replaced the old 120GB Patriot ones to get me 1TB of local storage.

Computer on pegboard

The whole assemblage (gutted laptop festooned with adapters, the PCIe dock with graphics card, power bricks) is mounted on the wall under my desk. After much experimentation the components are now zip-tied to an IKEA SKÅDIS pegboard. The pegboard comes with stand-off wall mounts which allows some of the many cables to run behind the board. I put a small fridge magnet on the screen bezel where the “lid closed” sensor sits to keep the built-in LCD screen off.

I’m still very happy with the W520, and while I’m not sure getting the eGPU setup working was economical in terms of time invested (over just buying parts for a proper desktop), it was a fun project. To my amazement, it merrily runs slightly dated games like XCOM 2 and Homeworld 2 Remastered in full, glorious 4K.

Lenovo still supports the platform and recently released BIOS updates to address the Meltdown/Spectre exploits.

With the RAID 0 SSD disk system, the quad-core W520 still feels deadly fast and is a joy to use. It boots instantaneously and restoring a Chrome session with stupid many tabs (something I’m bad about) is quick. With 32GB of RAM I can run Docker for Windows and a handful of VMs without worry.

4K TV as PC monitor

I use a 49″ 4K TV as my computer monitor both at home and at work. TVs are generally much cheaper than computer monitors of the same size. For my use of general productivity, programming and very occasional gaming, a mid-size 4K TV beats getting a couple of regular monitors on both price and result.

How to take advantage of a 49″ monitor? Windows 10 has simple window tiling functionality (“Snap Assist”), and you can use Win + arrow keys to quickly arrange windows in a 2×2 equally-sized grid. On a 49″ screen, each of those 4 grid elements are the size of ~25″ screens, which is generous for browser windows or 2-pane text editors. This 4 window setup is what I mostly use when I’m being lazy.

If I’m working on the same thing for a while, I use WindowGrid to divvy up my screen to fit more apps. I really wish Windows had a way to customize the snap grid pattern, but WindowGrid is a good alternative. 3 horizontal by 2 vertical is perfect because you can have two centered apps, the three columns are plenty wide and it’s still quick to shuffle windows around a 6-pane grid.

Home: Samsung UN49KS8500 Curved 49″

I first got this 2016 curved Samsung 49″ TV to use with my home computer. I bought it used for $766. It’s the best monitor setup I’ve ever had (I’ve previously used and enjoyed dual 23″ IPS panels, 27″ Apple Cinema Display and 27″ Dell 4k monitor). I use it on a deep (32″) floating desk that I built in my office. The depth of the desk combined with the slight screen curve makes 49″ the perfect size. I don’t have to move my head much to look from one side of the screen to the other, and the screen fills up my field of view. The bezel is almost non-existent and the stand is attractive and doesn’t take up much desk-space. Text renders crisply, the colors are beautiful and the picture is calm at 60Hz.

Samsung TV in my home office

Office: TCL 49S405 49″

When I re-joined Salesforce a couple of months ago, I asked to get a 27″ 4K monitor because I had liked that while working at Docker. Unfortunately the IT department decided I was not approved for such extravagance (that’s not a dig at Salesforce—in fact, you should come work with me). Since I was so happy with my home setup, I went ahead and approved myself for a $320 2017 vintage 49″ non-curved 4K TV which was more-or-less the cheapest 4k TV on Amazon at the time.

Receiving the giant box at the office was a surreal experience: It seems improbable that this much plastic, LCD, electronics, polystyrene and cardboard can be put together and schlepped to a 3rd floor San Francisco office so cheaply. I suspect TCL is an Elon-Musk-like organization, only instead of obsessively working backwards from the cost of kerosene and aircraft-grade aluminium to determine how cheaply one ton of satellite can be put into orbit, they do the same for plastic and liquid crystals to get cheap TVs into people’s living rooms.

With the TV assembled on my work desk, I realized that this setup was not going to be as awesome as my home configuration:

  • My work desk is narrower, so I sit closer to the screen
  • With no curve (and sitting so close) the sides of the screen begin to suffer from fading because of the oblique viewing angle
  • While not bad, the TV screen panel is just not as good as the Samsung unit

I’ve partly addressed the two first problems by building and mounting desk extenders, and after much calibration and fiddling, I managed to get an OK picture out of the TCL TV. Even so, I’d definitely recommend limiting yourself to 43″ unless you have a big desk and/or you can get a curved TV. I had in fact planned to get the 43″ TCL model, but it’s only $20 cheaper so I made the mistake of springing for 49″.

Desk extenders for the corp office desk

Summary

Overall I’d heartily recommend getting a 4K TV for use as a monitor if you have the space. I can’t think of a setup I’d prefer over my current home office TV: dual 27″ screens have a bezel-seam down the middle and I have way more screen real-estate than any of the 34″ wide-screen monitors available. 4K has so many pixels that, even when spread out over 49″ and sitting just 2-3′ away, graininess is not really an issue. Another advantage is that TVs come with passable speakers—I listen to music piped over HDMI from my computer at home, and it’s fine (if not exactly amazing).

49″ is the largest TV that makes sense in my experience, and depending on your desk and ergonomics, 43″ is probably a better choice. When choosing a TV model, be sure to get one that supports chroma 4:4:4 (my $320 one does). Otherwise the TV will sub-sample the image and text will look smudged.

One final word of caution: If you sit in an open office (like me), expect to spend on average 15 minutes every day explaining random passersby why there’s a TV on your desk.