/ shape


Shape #120, "forward-sightedness", a black and white drawing of a childlike robot with bright beams of light streaming from its eyes

Shape began as a shower thought one summer evening in 2006. I was 16, and back then my home on the web was deviantART. I admired artists who could draw beautiful forms from a blank slate; in contrast, I felt like I was in a rut composing geometric presets. So, I challenged myself to draw something new from imagination each night. To keep the art simple and focused on form, I imposed a minimalist black and white format. The focus was on drawing shapes.

At first I was skeptical I would keep the habit, and probably wouldn’t have succeeded except for a trick: I promised myself I’d make 30 shapes before I’d share them with anyone. This turned out to be unreasonably effective at motivating me to continue until it became a habit. By the time I’d finished #30, the project had clicked: I’d gotten through the iffy beggining part and was now producing work that I loved and loving staying up late doing it. I settled into a groove of mostly silouhetted forms and conceptual art, with a few comics and typography experiments thrown in.

Overall, I drew 166 shapes, trailing off after my 17th birthday. Shape was often autobiographical, a process of digesting the most notable feeling or memory of the day. At the time, I was in my first year of an accelerated bachelor’s CS track at Portland State University. 2006 was filled with schoolwork, reflections on growth, and my first teenage romance. Shape was a perfect outlet to explore really specific ideas and feelings — without being too specific.

Shape taught me what a successful creative process looks like (for me, at least!). It worked because getting started was easy and I could make incremental progress each day. In another time or medium I don’t think it’d have come together so well. I’ve tried to rekindle that serial art journal magic again, but it’s easy to get overly ambitious. I find when takes more than a couple hours to make a piece, it’s harder to keep that raw connection to the work. Shape worked well because it was so efficient.

To this day, Shape remains one of the projects I’m most proud of. It’s powerful to believe in your work, and so fun and satisfying to learn by doing. Many nights set new high watermarks in the creative reach I felt working in vectors. At the time I felt I was making some of my favorite art I’d ever made, and I still feel this way about Shape today.

Restoring old artwork via time travel

Over time, the custom Wordpress site behind Shape bitrotted and stopped working, and eventually I took it offline around 2014. Oof. Bringing it back has been a rainy day project for almost a decade. A priority for the project would be to leave Shape in a format more likely to continue working over time. Recently, static site generators emerged as an attractive choice.

Last weekend, I reworked the original PHP templates and CSS in Astro, bringing the original pages back online. Then, I set to work modernizing them. My goal was to re-render the original Inkscape SVGs in higher resolution, so they’d look sharp on modern 2x density screens.

This process turned out… a lot more interesting I thought.

Initially, my batch re-export of the original SVGs looked good enough. To make it easier to spot any differences, I hacked the page template to alternate between new and old renders:

Clearly, fonts I’d referenced in the art were missing, and there were some text kerning differences. I whipped up a script to index every missing font used in the source and got to work finding them on the web.

I also spotted some variations in line dash positioning, and subtle differences in pattern rendering. But wait — what’s that going on with the base of the monitor in the top left image? That was a regular circle element. Why was it distorted?

It became clear that to accurately upscale these drawings, I’d need to replicate all the bugs and quirky behaviors from Inkscape 16 years ago. I started looking at inkscape.org’s version archive, but then I realized: hey, I have a disk image of the laptop I used to draw these images. Could I render in the same copy of Inkscape I drew them in? (see also: Backing up 18 years in 8 hours)

I fished the image out of my backups, spun up a VM using virt-manager, and it booted!

A screenshot of a virtual machine running my old laptop's Ubuntu 7.04 desktop environment

Wow. It’s difficult to describe what an intense feeling it was to crack open a time capsule like this. There was my login screen from 2007 staring back at me. I got the password on the first try. Waiting was my old desktop, lost emails, browser history, all frozen in time. I loved revisiting screenshots of old projects and desktop themes. Absolute nostalgia bomb. Inkscape worked too!

With the upscales now rendered in my original copy of Inkscape 0.45.1, I was still seeing some issues with dash positioning, so I tested out 0.44 as well. No difference. In fact, if I rendered an image at 1x, dash positions matched, but they’d appear differently at 2x and 4x. This appears to be a bug in Inkscape of that era, and didn’t impact the images much, so not worth fixing.

There were a couple other small differences (mainly cases where I probably forgot to save the final SVG after rendering, oops), and in one case, I’d downloaded the wrong font with the same name. I manually fixed the vector originals as best I could, and accepted that it wouldn’t be totally pixel perfect.

The results turned out beautifully. It was exciting to experience these familiar works in 2x density for the first time. One cool surprise was how the finer details affected perceived contrast in some of the images. Where previously tiny details antialiased into gray, the 2x renders became bright white on black.

I was already a digital packrat before this exercise, but this has only further convinced me of the unpredictable value of preserving old data in situ. If you have the space, disk images are by far the easiest and most flexible way to archive old computers. Hopefully these new 4x renders will be large enough to stand the test of time, but if I ever wanted to return to this project someday, it’s nice to know I can pick up where I left off.

Sea Change

If I were to choose a favorite piece from Shape, it’d be “Sea Change”. Coming back to Shape half a lifetime later, it in many ways expressed my feelings transitioning into young-adulthood. Striving for context, to be understood, and to be loved. One of the paradoxes of growing up is that both your desires and how you understand what you want are developing at the same time.

When I drew “Sea Change”, I couldn’t yet put it in words, but I was getting close to figuring out the solution to this paradox: that what I wanted and who I was would create each other.

To get where I wanted to go, I needed to change my perspective.

Shape #124, "Sea Change", a black and white drawing of a figure swimming at the bottom of a vast tubular ocean, reaching up towards an island hanging down from above

There’s a funny little coda to this story. In my early 20s I printed out a poster-sized version of this image and hung it above my desk.

At the time, I was living my dream job at reddit. I’d grown up, moved out, gotten where I wanted to go, and beyond. I was happy, but I truly did not know what came next.

I didn’t realize at the time, but a couple years later I noticed I’d hung the poster upside down.

"Sea Change" flipped upside down
/ the-rise-of-self-hosted-apps

The rise of self-hosted apps

Here’s a sleeper prediction: a new crop of killer consumer apps are coming: self-hosted PWAs, and they will replace cloud services for many uses.

To name a few:

  • Home Assistant is a universal personal automation system, combining every smart device and data source available into dashboards, plots, and IFTTT-like automations.

  • Frigate monitors security cameras with private realtime AI object recognition.

  • Paperless indexes scanned documents with OCR and neural net based categorization.

  • PhotoPrism is an AI-powered private photo organizer with auto labeling and face recognition.

  • code-server is VSCode, the most popular code editor, with self-hosted remote access.

There’s a buzz building around apps like Home Assistant, which casts a large shadow over the smart home industry. You may not have heard of most of these apps before — that’s not unexpected. The technical knowledge required to set them up mostly relegates them to nerds running homelabs.

Thanks to favorable market conditions, home turf advantages of open source software, and a raft of enabling technologies from the past few years, there’s never been a better time for a few leading self-hosted apps to explode in popularity. Let’s dive into this phenomenon.

Users want to own their data

Recently, Eufy cameras were found to be uploading footage to their cloud. Notably, these cameras were marketed with claims of private, local-only storage. In the same month, home air quality monitor Awair junked their first generation of connected devices by discontinuing the cloud services on short notice. Through unaudited design faults and a business model which treats hosting as a cost center, IoT manufacturers are failing to deliver on privacy or longevity.

In a survey by Cisco in June 2022, 76% of respondents said they would not buy from a company they do not trust with their data. The study classified 32% as “privacy actives”, who identified as: caring about data privacy, willing to invest time and money in it, and had actually switched providers based on their data policies. In a 2021 US survey, KPMG found 86% say data privacy is a growing concern, with 30% responding that under no circumstances would they be willing to share personal info with businesses.

This is the sweet spot for open source self-hosted apps. Self-hosted apps have a home field advantage where data is private and sensitive: the sensors in your home, security cameras, paperwork, passwords, personal photos, and health data. There is latent unserved demand for apps which offer users confidence their data is truly private.

Local = fast

Another major benefit of local apps is latency. This is something you immediately feel when interacting with them. Every operation is nearly instant. The effect is magnified for users with slow or unreliable internet, or those without an always-on connection. Even with the shift towards edge computing to bring servers as close as possible to metro areas, for realtime automation and recognition tasks, you can’t beat physics: local apps will win.

Self-hosted AI has a bright future

Local AI is a notable feature of the majority of apps I listed above. Historically, large firms have had an advantage here. They have larger data sets to work with and off-the-shelf alternatives were generations behind. While LLMs currently require impractically expensive hardware to run, thanks to projects like Whisper, DeepSpeech, and Hugging Face, an increasingly large class of cutting edge AI tools have become accessible to run locally.

An interesting scaling property of machine learning is that while vast amounts of compute are required to train models, the models themselves require orders of magnitude less time and energy to run. As it becomes cheaper to run models locally, inference in private spaces like speech and cameras are seeing a push towards local processing, both for speed and privacy.

Successful communities outcompete big tech

Let’s take another look at Home Assistant. One of its key successes is its massive library of integrations with any device imaginable. The smart home industry faltered when it became a cross product of individual hardware makers supporting Google, Apple, and Amazon’s disparate home automation systems. Product companies are bandwidth-limited by how they form partnerships. Planned two-way handshakes are slow vs. permissionless integrations built on APIs or hacks.

An army of nerds are now using Home Assistant to solve their specific problems and sharing how they did it. If you search for any particular home automation challenge, you’ll probably find one of the first results is on the Home Assistant forum.

Why have products like Google Home plateaued, while Home Assistant has taken off? To its part, Google Home has its own huge list of device integrations, but the controls it provides are too simplistic. An expensive, top-heavy product development team like Google or Apple has to focus on solving bounded problems. This makes them uncompetitive when the problem space is sparse and a community of devs are expanding the space for free.

The web is good enough

The future of apps will not be installed individually on each device. Apps are becoming services you interact with across all your devices. Self-hosted web apps are uniquely well positioned for this, though there’s still a few pieces missing (particularly discovery of available local web-apps).

Progressive Web Apps have been around for a while, but have never had their day in the sun. One reason was the lack of push notifications on Mobile Safari, which was recently announced to be added in iOS 16.4. It’s no coincidence that the apps I listed above are all PWAs: the web is easiest to develop for, works everywhere, and has the largest pool of developers.

A common critique is that web apps yield clunky user experiences. This will be debated endlessly in developer circles, but native feeling UI is not necessary for mass adoption; the bar is “good enough”. Component libraries have closed that gap. MUI, Chakra, and Tailwind make it easy to create a UI which feels cohesive and adapts well to any sized device. Looking back across my 15 year professional history building apps, PWAs + an off the shelf component library are the fastest path to “good enough” that has ever been available.

The last mile is a huge opportunity

It’s never been easier to self-host apps: Let’s Encrypt made securing apps instant and automatic. Docker made them easy to install. Aside from Raspberry Pis becoming unobtanium over the past year, there are many available small low power computers in the $30-50 dollar range.

However, let’s be real: the biggest thing holding self-hosted apps back is they’re still too difficult to install.

A potential user must be able to:

  • Set up Linux on a device and get it onto their network.
  • Follow installation instructions specific to their chosen apps and distro.
  • Configure subtleties like DNS and HTTPS, then open the right address in their browser.

These steps are hindered by there being multiple ways to accomplish them, yet no best way.

For self-hosted apps to succeed, 5 minutes must be all it takes to get up and running. It must be trivial to discover and install new apps, and the apps themselves must be immediately locatable on all of your devices.

One promising approach would be a physical device which tunnels to the internet for external access. Such a tunnel could simplify user setup greatly by providing an easy to remember URL and automated certificate management. This is what Home Assistant Yellow is doing, complete with an add-on browser where you can install containers packaging other apps.

The future of self-hosted apps looks bright, but to have a shot at disrupting the past decade’s markets dominated by cloud hosting, they must solve this adoption problem. There is a chicken-and-egg problem here, but all that’s remaining is a foot in the door. As more awesome self-hosted apps appear, the incentive to ease adoption grows. Once you’ve solved it for one app, you’ve opened the door for others.

I think it will take vision and creative thinking, but eventually this dam will break. We’ve seen this story play out many times before in the history of computing. When free apps are trustworthy, solve a problem well, and become easy to adopt, they take off explosively.