Reading view

There are new articles available, click to refresh the page.

Introducing the blogroll

Plant

This website has a new section: blogroll.opml! A blogroll is a list of blogs - a lightweight way of people recommending other people’s writing on the indieweb.

What it includes

The blogs that I included are just sampled from my many RSS subscriptions that I keep in my Feedbin reader. I’m subscribed to about 200 RSS feeds, the majority of which are dead or only publish once a year. I like that about blogs, that there’s no expectation of getting a post out every single day, like there is in more algorithmically-driven media. If someone who I interacted with on the internet years ago decides to restart their writing, that’s great! There’s no reason to prune all the quiet feeds.

The picks are oriented toward what I’m into: niches, blogs that have a loose topic but don’t try to be general-interest, people with distinctive writing. If you import all of the feeds into your RSS reader, you’ll probably end up unsubscribing from some of them because some of the experimental electric guitar design or bonsai news is not what you’re into. Seems fine, or you’ll discover a new interest!

How it works

Ruben Schade figured out a brilliant way to show blogrolls and I copied him. Check out his post on styling OPML and RSS with XSLT to XHTML for how it works.

My only additions to that scheme were making the blogroll page blend into the rest of the website by using an include tag with Jekyll to add the basic site skeleton, and adding a link with the download attribute to provide a simple way to download the OPML file. Oddly, if you try to save the OPML page using Save as… in Firefox, Firefox will save the transformed output via the XSLT, rather than the raw source code. XSLT is such an odd and rare part of the web ecosystem, I had to use it.

Recently

I have a non-recently post ready to write, any day now…

Reading

This was a strong month for reading: I finished The Hidden Wealth of Nations, Useful Not True, and Cyberlibertarianism.

I had a book club that read Cyberlibertarianism so we discussed it last week. I have a lot of qualms with the book, and gave it two stars for that reason. But I will admit that it’s taking up space in my mind.

The ‘cyberlibertarian’ ideology was familiar to me before reading it. The book’s critique of it didn’t shift my thinking that much.

But I have been thinking a lot about what it argued for, which is a world in which the government has very extensive powers – to limit what is said online, to regulate which companies can even create forums or social media platforms. He also believed that a government should be able to decrypt and read conversations between private citizens. It’s a very different idea of government power than what I’m used to, and well outside my comfort zone.

I think it’s interesting to consider these things: the government probably should have some control of some kinds of speech, and in some cases it’s useful to have the FBI tapping the phones of drug smugglers or terrorists. How do we really define what’s acceptable and what isn’t? I don’t know, I want to do more thinking about the uncomfortable things that nevertheless may be necessary for functioning of society.


Besides that, there is so much to read. This month I added a lot of news subscriptions to my pile, which I think is now Hell Gate, Wired, NYTimes, Bloomberg, 404 Media, The Verge, and a bunch of newsletters.

Listening

We’ve been rewatching The Bear and admiring the dad-rock soundtrack.

This Nine Inch Nails track shows up at the end of a season:

And this Eno track:

Besides that, this track from Smino played at a local cocktail bar. The bars at 0:45 sound like they’re tumbling downhill in a delightful way.

Watching

So I bought a sewing machine in February, a beautiful old Kenmore 158-series, produced in the 1970s in Japan. It’s awesome. How sewing machines work is amazing, as this video lays out. There’s so much coordinated motion happening for every stitch, and the machines are so well-designed that they last for decades easily.

Besides that, I just watched The Apprentice, which I really did not like.

Elsewhere

Recently

I am not going to repeat the news. But man, things are really, really bad and getting worse in America. It’s all so unendingly stupid and evil. The tech industry is being horrible, too. Wishing strength to the people who are much more exposed to the chaos than I am.

Reading

A Confederacy of Dunces was such a perfect novel. It was pure escapism, over-the-top comedy, and such an unusual artifact, that was sadly only appreciated posthumously.

Very earnestly I believe that despite greater access to power and resources, the box labeled “socially acceptable ways to be a man” is much smaller than the box labeled “socially acceptable ways to be a woman.”

This article on the distinction between patriarchy and men was an interesting read. With the whole… politics out there, it’s easy to go off the rails with any discussion about men and women and whether either have it easy or hard. The same author wrote this good article about declining male enrollment in college. I think both are worth a read.

Whenever I read this kind of article, I’m reminded of how limited and mostly fortunate my own experience is. There’s a big difference, I think, in how vigorously you have to perform your gender in some red state where everyone owns a pickup truck, versus a major city where the roles are a little more fluid. Plus, I’ve been extremely fortunate to have a lot of friends and genuine open conversations about feelings with other men. I wish that was the norm!

Watching

David Lynch was so great. We watched his film Lost Highway a few days after he passed, and it was even better than I had remembered it.

Norm Macdonald’s extremely long jokes on late-night talk shows have been getting me through the days.

Listening

This song by the The Hard Quartet – a supergroup of Emmett Kelly, Stephen Malkmus (Pavement), Matt Sweeney and Jim White. It’s such a loving, tender bit of nonsense, very golden-age Pavement. They also have this nice chill song:

I came across this SML album via Hearing Things, which has been highlighting a lot of good music.

It’s a pretty good time for these independent high-quality art websites. Colossal has done the same for the art world and highlights good new art: I really want to make it out to see the Nick Cave (not the musician) art show while it’s in New York.

2025 Predictions

Crystal ball for predictions

I was just enjoying Simon Willison’s predictions and, heck, why not.

1: The web becomes adversarial to AI

The history of search engines is sort of an arms race between websites and search engines. Back in the early 2000s, juicing your ranking on search engines was pretty easy - you could put a bunch of junk in your meta description tags or put some text with lots of keywords on each page and make that text really tiny and transparent so users didn’t notice it but Google did.

I doubt that Perplexity’s userbase is that big but Perplexity users are probably a lot wealthier on average than Google’s, and there’s some edge to be achieved by getting Perplexity to rank your content highly or recommend your website. I’ve already noticed some search results including links to content farms.

There are handful of startups that do this already, but the prediction is: the average marketing exec at a consumer brand will put some of their budget to work on fooling AI. That means serving different content to AI scrapers, maybe using some twist on Glaze and other forms of adversarial image processing to make their marketing images more tantalizing to the bots. Websites will be increasingly aware that they’re being consumed by AI, and they will have a vested interest in messing with the way AI ‘perceives’ them.

As Simon notes in his predictions, AIs are gullible: and that’s before there are widespread efforts to fool them. There’s probably some way to detect an AI scraper, give it a special payload, and trick it into recommending your brand of razors whenever anyone asks, and once someone figures it out this will be the marketing trend of the decade.

2: Copyright nihilism breeds a return to physical-only media

The latest lawsuit about Meta’s use of pirated books, allegedly with Mark Zuckerberg’s explicit permission, if true, will be another reason to lose faith in the American legal system’s intellectual property system entirely. We’ve only seen it used to punish individuals and protect corporations, regardless of the facts and damages, and there’s no reason to believe it will do anything different (POSIWID).

The result, besides an uptick in nihilism, could be a rejuvenation of physical-only releases. New albums only released on vinyl. Books only available in paperback format. More private screenings of hip movies. When all digital records are part of the ‘training dataset,’ a niche, hipster subset will be drawn to things that aren’t as easily captured and reproduced.

This is parallel, to the state of closed-source models from Anthropic or OpenAI. They’re never distributed or run locally. They exist as bytes on some hard drive and in some massive GPU’s memory in some datacenter, and there aren’t Bittorrents pirating them because they’re kept away from people, not because of the power of copyright law. What can be accessed can be copied, so secrecy and inaccessibility is valuable.

3: American tech companies will pull out of Europe because they want to do acquisitions

The incoming political administration will probably bring an end to Lina Khan’s era of the FTC, an era in which the FTC did stuff. We will go back to a ‘hands off’ policy in which big companies will acquire each other pretty often without much government interference.

But, even in Khan’s era, the real nail in the coffin for one of the biggest acquisitions - Adobe’s attempt to buy Figma – was regulators from the EU and UK. Those regulators will probably keep doing stuff, so I think it’s likely that the next time some company wants to acquire a close competitor, they just close up shop in the EU, maybe with a long-term plan to return.

4: The tech industry’s ‘DEI backlash’ will run up against reality

The reality is that the gap between women and men in terms of college degrees is really big: “Today, 47% of U.S. women ages 25 to 34 have a bachelor’s degree, compared with 37% of men.” And that a great deal of the tech industry’s workforce is made of up highly-skilled people who are on H-1B visas.

The synthesis will be that tech workers will be more diverse, in some respects, but by stripping away the bare-bones protections around their presence, companies will keep them in a more vulnerable and exploitable position. But hard right-wingers will have plenty to complain about because these companies will continue to look less white and male, because the labor pool is not that.

5: Local-first will have a breakthrough moment

I think that Zero Sync has a good chance at cracking this really hard problem. So does electric and maybe jazz, too. The gap between the dream of local-first apps and the reality has been wide, but I think projects are starting to come to grips with a few hard truths:

  1. Full decentralization is not worth it.
  2. You need to design for syncing a subset of the data, not the entire dataset.
  3. You need an approach to schema evolution and permission checking

These systems are getting there. We could see a big, Figma-level application built on Zero this year that will set the standard for future web application architecture.

6: Local, small AI models will be a big deal

Embedding models are cool as heck. New text-to-speech and speech-to-text models are dramatically better than what came before. Image segmentation is getting a lot better.

There’s a lot of stuff that is coming out of this boom that will be able to scale down to a small model that runs on a phone, browser, or at least on our own web servers without having to call out to OpenAI or Anthropic APIs. It’ll make sense for costs, performance, and security. Candle is a really interesting effort in this area.

Mini predictions

  • Substack will re-bundle news. People are tired of subscribing to individual newsletters. Substack will introduce some ~$20/month plan that gives you access to all of the newsletters that participate in this new pricing model.
  • TypeScript gets a zeitwork equivalent and lots of people use it. Same as how prettier brought full code formatting from TypeScript, autoloading is the kind of thing that once you have it, it’s magic. What if you could just write <SomeComponent /> in your React app and didn’t have to import it? I think this would be extremely addictive and catch on fast.
  • Node.js will fend off its competitors. Even though Val Town is built around Deno’s magic, I’ve been very impressed that Node.js is keeping up. They’ve introduced permissions, just like Deno, and native TypeScript support, just like the upstarts. Bun and Deno will keep gaining adherents, but Node.js has a long future ahead of it.
  • Another US city starts seriously considering congestion pricing. For all the chatter and terrible discourse around the plan, it is obviously a good idea and it will work, as it has in every other case, and inspire other cities to do the same.
  • Stripe will IPO. They’re still killing it, but they’re killing it in an established, repeatable way that public markets will like, and will let up the pressure on the many, many people who own their stock.

Recently 2024

Happy end-of-2024! It’s been a pretty good year overall. I’m thankful. There’s no way that I’ll be able to remember and carve out the time around New Years to write this, so here’s some end-of-year roundup, ahead of schedule!

Running

This was my biggest year for running on record: 687 miles as of today. I think the biggest difference with this year was just that nothing stood in the way of my being pretty consistent and putting in the miles: the weather has been mild, I haven’t had any major injuries, and long runs have felt pretty good.

CityStrides

I was happy to hit a half-marathon PR (1:36:21), but my performance in 5Ks was far short of the goal of sub-20 – partly because Brooklyn’s wonderful 5K series was run at the peak of summer, with multiple races at over 85°F.

I learned the value of good lightweight running gear: Bakline’s singlets and Goodr sunglasses were super helpful in getting me through the summer.

Work

Val Town office

Val Town raised a seed round and hired a bunch of excellent people. We moved into a new office of our own, which has a great vibe. It’s been good: we’re doing a lot of ground-up work wrangling cgroups and low-level worker scheduling, and a lot of UX-in work, just trying to make it a pleasant tool.

Frankly, with every product I’ve worked on, I’ve never had a feeling that it was good enough, and accordingly, for me, Val Town feels like it has a long way to go. It’s probably a good tendency to be sort of unsatisfied and motivated to constantly improve.

New York

New York scale model at the Queens Museum

It’s still such a wonderful place to live. Late this year, I’ve been rediscovering my obsession with cycling, and realizing how much I whiffed the opportunity to ride more when I lived in San Francisco. I guess that’s the first time I felt genuinely nostalgic for the West coast. I miss DC a bit too: it’s one of the few cities where my friends have been able to stay in the city proper while raising children, and I miss the accessible, underdog punk scene.

But Brooklyn is just a remarkable place to live. My walk score is 100. The degree to which people here are in the city because they want to be, not because they have to, shapes so much of what makes it great.

Other ‘metrics’

Relative to my old level obsession about self-quantification, my ‘metrics’ are pretty moderate now. Everything’s just backward-looking: I’m not paying much attention to the numbers as I go, it’s just fun to look at them year-over-year trends.

Reading

That said, this was a lackluster year for reading: just 18 books so far. I think I just read an above-average number of books that I didn’t enjoy very much. Next year I’m going to return to authors who I already love, and stay away from genres that – the data shows – I don’t like.

Films

Whereas this was a banner year for watching movies: not great! Next year, I want to flip these results. Of everything I saw, Kinds of Kindness will probably stick with me the most.

Placemark

It seems like a decade ago that I released Placemark as open source software, as developing it as a closed-source SaaS application for a few years. But I did that in January. There have been a few great open source contributions since then, but it’s pretty quiet. Which is okay, somewhat expected: there is no hidden crowd of people with extra time on their hands and unending enthusiasm for ‘geospatial software’ waiting to contribute to that kind of project. Placemark is also, even with my obsessive focus on simplicity, a pretty complicated codebase. The learning curve is probably pretty significant. Maps are a challenging problem area: that’s what attracts a lot of people to them, but people who use maps persistently have the feeling that it couldn’t be that complicated, which means that few users convert into contributors.

There are a few prominent efforts chasing similar goals as Placemark: Atlas.co is aiming to be an all-in-one editing/analysis platform, Felt a cloud-native GIS platform, and then there are plenty of indiehackers-style projects. I hope these projects take off!

Figma plugins

Placemark Figma Plugins

I also kept maintaining the Figma plugins I developed under the Placemark name. Potentially a lot of people are using them, but I don’t really know. The problem with filling in water shapes in the plugins is still unsolved: it’s pretty hard and I haven’t had the time or motivation to fix it.

The most energy into those plugins this year, unfortunately, was when someone noticed that the dataset I was using - Natural Earth – marked Crimea as part of Russia. Which obviously: I don’t draw the countries in datasets, but it’s a reasonable thing to point out (but to assume that the author is malicious was a real downer, again, like, I don’t draw the countries). This decision from Natural Earth’s maintainer is heavily discussed and they aren’t planning on changing it, so I switched to world-atlas, which doesn’t have that problem.

Which was fine, but a reminder of the days when I worked on maps full-time and this kind of unexpected “you’re the baddie” realization came up much more often. Sometimes it was silly: people who complain about label priority in the sense of “why, at zoom level 3, does one country’s name show up and not anothers?” was just silly. The answer, ahem, was that there isn’t enough space for the two labels and one country had a higher population or a geometry that gave their label more distance from the other country’s centroid. But a lot of the territorial disputes are part of people’s long cultural, political, military history and the source of intergenerational strife. Of course that’s serious stuff. Making a tool that shows a globe with labels on it will probably always trigger some sort of moment like that, and it’s a reason to not work on it that much because you’re bound to unintentionally step on something contentious.

Other projects

Obsidian Freeform

I released Obsidian Freeform, and have been using it a bit myself. Obsidian has really stuck for me. My vault is well over 2,000 notes, and I’ve created a daily note for almost every day for the last year. Freeform was a fun project and I have other ideas that are Obsidian plugin-shaped, though I’ve become a little bit let down by the plugin API - the fact that Obsidian-flavored-Markdown is nonstandard and the parser/AST is not accessible to plugins is a pretty big drawback for the kinds of things I want to build.

Elsewhere recently

I’ve been writing a bit: Recently I’ve written about dependency bloat and a developer analytics tool we built at Val Town, and started writing some supplementary documentation for Observable Plot about parts of its API that I think are unintuitive. On the micro blog, I wrote about not using GitHub Copilot and how brands should make a comeback.

This blog got a gentle redesign in May, to show multiple categories of posts on the home page, and then in August I did a mass update to switch all YouTube embeds to lite-youtube-embed to make pages load faster. I’m still running Jekyll, like I have been for the last decade, and it works great.

Oh, and I’ve basically stopped using Twitter and am only on Mastodon and Bluesky. Bluesky more than Mastodon recently because it seems like it’s doing a better job at attracting a more diverse community.


I’m looking forward to 2025, to cycling a lot more and a new phase of startup-building. See you in the new year.

Bandcamp wrapped

I still use Bandcamp almost exclusively to buy music, and keep a big library of MP3s. The downside is that this marks me as a weirdo, but otherwise it’s great and has been working well for me.

Since I last wrote about it, Bandcamp was acquired by Epic games (?) and then acquired from them by Songtradr, and its employees are trying to get recognized as a union. Times are changing and Bandcamp is no longer a lovely indie company, but it’s still a heck of a lot better than Spotify.

Bandcamp wrapped

People (who?) are sharing their ‘Spotify wrapped’ auto-generated compilations and I wanted the same, for my Bandcamp purchases, so I built it on Val Town. You can create your own! Or edit the code of the tool that generates them. Because of API limitations – really, the absence of an API – it requires you to copy & paste content from your purchases page, but isn’t copy-and-paste really a kind of API?

Anyway:



Looking back on the year, I like how I can remember a few of these albums from my first exposure to them in odd places - I heard Jessie Mae Hemphill playing in a Chipotle, and Rosie Lowe playing in my hair salon.

It was apparently a big year for instrumental, electronic, minimalist music. The only ‘rock’ album that hooked me was Wall of Eyes, and the only pop album that made an impact was Imaginal Disk - the fuzzy outro of Image is something I keep re-listening to.

MIZU has been on heavy rotation, too – the only of these artists that I learned about by seeing them live - she opened for Tim Hecker and I think made a lot of fans there with a really theatric and heavy performance.

Buy some music! Listen to it repeatedly, and put it in your MP3 player!

Recently: Cycling and Autumn

I haven’t been posting much to the ‘main blog’ recently, but I have been keeping the micro blog updates humming. If you want more content in your RSS reader, you can subscribe to those posts, which are shorter, more scattered, and even less copyedited. It feels bad to have multiple “Recently” headings in the blog listing, so I’ll give them short subtitles from now on.

Anyway, what’s up? October was all right. At Val Town, we spent a lot of time interviewing job candidates and improving the AI assistant, Townie. I also got some time to tackle long-awaited technical debt cleanups: I conquered the ‘big scary function’ that did the actual ‘running’ of val code.

Cycling

Outside of work, a lot of my October-related excitement was related to being outdoors. It’s been a great year for running – I just passed 600 miles so far and will probably hit 650 barring any injuries or life complications. But cycling is on the mind. We just rode the Old Croton Aqueduct trail from Ossining back to Brooklyn. It’s a fairly rough trail: plenty of rocks and terrain. Rideable on my ~32mm tires, but it’d be a lot easier with a mountain bike.

Osage orange

We rode past some osage orange trees with their funky-looking and inedible fruit the size of large grapefruits.

Lyndhurst estate

The trail passed right next to the Lyndhurst Estate, which was owned by a series of rich and powerful people, including Jay Gould, who is especially hated. Upstate, a lot of the attractions are like this, other big historic houses.

OCA

The trail was mostly really beautiful, though the parts closer to Yonkers have a lot of trash. It’s much more popular with hikers than with cyclists. Even though bikes are explicitly permitted, locals seemed a little surprised by our presence, even though we were ringing bells, going slow, and making lots of space.

It’s kind of funny to compare the general spatial awareness of people upstate to those in the city: we encountered a lot of people upstate who were standing in the center of the trail, completely zoned out and surprised by the presence of another human, and then on the way back were on city streets with four people within a few feet of us on foot, bikes, cars, scooters, all mostly aware and ready to silently negotiate how to move together through a shared space. I remarked that I think that when some people move out of the city because of the ‘inconvenience’, the inconvenience is people, and once you leave, you lose a certain ability to live around other people - from then on, you expect to have a suburban yard-sized perimeter around your personal space.

Micro

I wrote a lot on the microblog this month: about the Arc browser’s recent news that it’ll be abandoned, Reddit adopting Web Components, domain squatting, Python datascience tech, and Knip, a tool for finding dead code in TypeScript systems.

Content

I watched a bunch of films, which are on my Letterboxd, and the only new album on my rotation is Yasmin Williams’s Acadia:

This YouTube channel is showing all of the steps involved in doing a multi-day bikepacking trip through India. It’s a lot of fun:

And that’s it for this month! I’ll write a full-fledged blog post one of these days.

Recently

Apples

Reading

It is very easy to get ChatGPT to emit a series of words such as “I am happy to see you.” There are many things we don’t understand about how large language models work, but one thing we can be sure of is that ChatGPT is not happy to see you.

Ted Chiang’s article about AI in the New Yorker started slow for me, and having read a lot of other articles from the same genre it hit some familiar points, but still it was compelling and a gift to read another piece by one of my favorite authors.

I read a lot of articles about the Internet Archive lawsuit in September. The Verge had a good piece about it. I’m a longtime fan of the archive – who isn’t – but it’s hard to absorb the weight of the decision and the fact that, despite being the clear-cut villains, the publishers at least have a good argument. The threat of losing the archive would be a gigantic change in the whole shape of the internet.

Exciting month for New Yorkers, obviously, with the mayor getting indicted. I’m feeling thankful for the New York media ecosystem: with Hell Gate and The City, we have really good local, independent journalism. It’s both deep - Hell Gate’s Table of Success is an incredible reference for Adams’s corrupt circle of friends - and punchy.

Watching

I guess I watched a lot of movies this month? The big hit was Death Becomes Her, which is an absolute classic - my favorite kind of film, ‘a romp.’ Beetlejuice was just okay, surprisingly.

I’ve been doing a lot of daydreaming about cycling more. In the near future, I want to ride the Empire State Trail again, and the C&O, and the GAP, and more. I just want to get out on a bike. And I’ve been enjoying some smaller YouTube channels about riding. Dwayne Pedals is a good one:

Tim Fitzwater has a good video about the Old Croton Aqueduct Trail. These sorts of videos are great: as the geospatial dorks say, “the map is not the territory.” That is especially true for hiking, biking, running, and all forms of non-vehicular transporation. A trail on a map can mean a lot of different things. A ‘bike lane’ on a map can be blissful or non-existent in real life. So I’ve long had the habit of cross-referencing run & bike plans with streetview. You can’t do streetview on bike trails usually, because Google sucks at making maps for non-drivers doesn’t have data there.

Stay tuned for more bicycle content. It’s been a lifelong thing for me but I am getting much more serious about it, again.

Park

Had a really great ride this month - after biking through Long Island in August, we wanted to experience some good bicycle infrastructure, so the Shore Parkway and Jamaica Bay Greenway hit the spot. This photo is from Brooklyn! Shirley Chisholm State Park is a fresh new park, opened in 2019. You can bike through the park just by veering off of the Jamaica Bay Greenway, and easily get back on the Greenway afterward. Sure, it’s built on landfills, but after $235 million of remediation and $35 million of renovations, it’s a really nice spot. It was like we stumbled upon an oasis.

Listening

Pretty decent month for music, too!

I heard this at the place where I get my hair cut. A good sign.

Great new electronic music - this has been powering my focus at work recently.

I had thought incorrectly that Death From Above stopped playing music a while ago. Happy to learn that I was wrong and this album - Outrage! Is Now exists.

Elsewhere

In the micro blog, I wrote about React, syncing light and dark mode in Neovim, Crypto’s missing plateau of productivity and NYC cycling paths.

Recently

Reading

Since last time, I read a few books: Sea of Tranquility, a book club book, Doppelganger, the new Naomi Klein, and Manywhere, a collection of short stories.

Sea of Tranquility was very digestible sci-fi. I haven’t read that much sci-fi overall, so it’s probably inaccurate to say that it’s spiritually similar to Ted Chiang, but that’s the closest reference I know of. In the end, I think it’s a little empty - the book shows off a lot of complexity but doesn’t really deliver on it and things conclude in a way that’s a bit too cute. That said, it was a perfect book to read in a few days and discuss with a friendly group.

Doppelganger, I found kind of annoying. I agree with Naomi Klein on nearly everything, including all of her thoughts in the book, and I think she’s a very cool person, but it just isn’t the style of book I like to read.

Manywhere was a good quick read, too - a collection of short stories. It’s nice to read short stories, and usually quick, too. It’s tempting to read a lot more books like this: I read about two books a month on average, but could ‘pump up those numbers’ by avoiding behemoth books and sticking to short fiction. Maybe next year I’ll aim for 36 books and see if I can achieve that goal.

Listening

I’ve been listening to a lot of Mal Blum, who I discovered via a mailing list for a local wine store. The store is kind of known for its emails, which recently have been about bad customers that the owner hates to deal with, also streetlights and whether the local business district is going to fix them, and the difficulties of capitalism, and also a lot of links to good bands that are new to me.

New Daedalus album! It’s perfect!

Watching

Death Becomes Her is such a classic early-90s romp of a film.

I accidentally spent some time being sick in August, and in the haze my best discovery was this YouTube channel, Elephant Graveyard, which recounts the right-wing “cancellation-free” comedy scene. It’s artistic, the comedic pacing (of the channel, not the comics) is great, and it made fun and easy watching.

I’m also not a video gamer by any stretch of the imagination, but I picked up No Man’s Sky, an open-world space adventure game that was a total flop when it was released, but in eight years of fixes and updates has become something really compelling. It aligns with my previous game that I played when I had COVID, Cyberpunk 2077, which also had a disastrous launch. No Man’s Sky is great: I’m playing it on easy mode, so it’s more about adventuring than it is about fighting, surviving, or commerce.

Elsewhere

Val Town started funding more open source software, to the tune of $9.6k in 2024. Pretty exciting times for open source! It was an interesting process to figure out what to fund, in part because a lot of OSS projects are themselves companies: heck, just today, Laravel, the PHP framework, raised $57M in a Series A round.

Ride to Patchogue

We rode to Patchogue - terminating around Blue Point Brewing Company. Long Island provided some really nice views. Overall, the streets were quite a bit more bike-hostile than last year’s trip up the Empire State Trail, so I’ll probably stick to that, or the C&O, or a bikepacking trail for future trips.

Recently

I skipped Recently last month. This one’s even more of a grab-bag than usual!


The <video> element and browser abstractions

I was reading Iván Sánchez Ortega’s thoughts on maps4html (at the time of writing, his website is down, so that’s an archive.org link). The post is about a theoretical HTML element that embeds a map on a webpage - something that Iván is skeptical of and I am as well. But this section really got me thinking:

The user experience for video back in the day, both for the user (“I have to download what and install it where?”) and the web developer (user agent sniffing plus an <object> inside an <embed> with a MJPG fallback in the form of a <img>) was quite abismal (sic). A <video> element back then made sense.

So let’s fast-forward ten years, and see what <video> has really brought us. For me, three things spring to mind:

  1. Chunked video
  2. DRM (in the form of EME).
  3. Consistent UI, then inconsistent UI back again.

This is clear in hindsight but I had never really connected the pieces – the rise of standardized streaming video has also enabled DRM to be so commonplace. I can no longer take screenshots of Netflix, which was something that I used to love to do. There are good tools for downloading YouTube videos, but the same won’t exist for Hulu or HBO Max, and once a TV show declines to renew its streaming license, it’ll be inaccessible.

I think this is a really interesting point: the standardization of the element meant that video decoding and UI would be part of the browser rather than the application, which allowed for strong copy-protection to be standard, and shifted power away from users. It makes me think twice about standardizing more elements of the web.

Maps are what the maps4html project wants to standardize, but argument is basically the same for cryptocurrency boosters (those who remain). They argue that the web was missing a “payments primitive” and it should be implemented at a protocol level. I don’t even agree with their goals (this current level of capitalist dystopia is enough, thank you very much, we don’t need to financialize any more stuff, please), but I also don’t feel great about the means of accomplishing those goals - embedding an opinionated currency and transaction system into standard technology.

Part of the same thought bubble: is the web as a low-level abstraction of basic HTML elements and raw JavaScript on which the developer brings their own higher-level abstractions (web frameworks, or previously, Flash?), more egalitarian or free than a web with higher-level abstractions that are dictated by browsers and operating systems?


Leverage

Historically, a key way to turn mediocre investments into good investments has been to apply leverage. That’s not a recommendation; that’s a historical analysis, and it comes with survivorship bias.

This blog post from Lyn Alden is a compelling and risqué unified theory of investing. She claims that real estate, stock, and bond investments are all pretty bad in the long run, and that taking leverage is actually a historically winning strategy because it shorts your fiat currency and amplifies your exposure to the other thing.

Within the context of the fiat currency system, it has been both quantifiably workable and socially acceptable to own real estate with 5-to-1 or even 10-to-1 leverage. People who are not professional investors will routinely put 20% down and borrow 80% of the value of a home, with various options to increase that to 10/90 in some cases, because we set up our financial system around this being a normal thing to do.

This is a good point that I never stop mentioning – mortgages are complicated and risky investments. Sometimes not as risky for the borrower but always risky).


BeOS & Haiku

I love the BeOS and Haiku icons and designs? They really are something. I’ve always had a love for the Mac OS 8 look, but BeOS is just beautiful: it has some of the strong colors of Windows, but used in a different way. And the icons…

BeOS icons

From guidebookgallery.org. By the way: did you know about the image-rendering: pixelated CSS option?

And then look at the icons from Haiku, the successor to BeOS:

HaikuOS icons

I’m not going to go as far as actually running these operating systems, but man, it all reminds me of a day when computers felt so much more focused and personal.


Bikes are electric now

I’ve been biking more recently, and getting ready for a small Labor Day bike trip through Long Island. Eventually, when I have time (ha!) I want to do some much longer trips. I’ve been spending a bit more time getting reacquainted with the state of bicycles. In my lifetime, there have been a bunch of big changes for high-end bikes:

  • Disc brakes replaced V-brakes, even for some road bikes
  • Tubeless tires replaced tires with tubes for most bikes
  • Wheels got bigger and most mountain bikes are 29ers or above

I’ve mostly been on board with these things - the bigger wheels were obviously an upgrade from day one, especially.

The weird new thing is electronic shifting, which is apparently becoming the norm. It’s a pretty odd turn, if you ask me: your bike as a little wireless electronic network in which the shifter on the handlebars connects to a motor in the derailleur.

It’s nice to see though, from some ‘bike influencers’, a pushback and some people even going back to non-indexed shifters so they can use any kind of mech drivetrain.

I think that when I get a midlife-crisis bike, there’s a decent chance it’ll be electric, partly because it allows for fewer cables to route, which would make mounting bikepacking bags a little easier. But ‘running out of power’ in the middle of the woods, or just having ‘firmware’ installed on my bicycle creeps me out.


Running

The 5k season continues. So far this summer: 21:00, 21:01, 20:27, 21:26. My goal is sub-20, which should be achievable (I’ve run it before in previous seasons), but mostly the weather hasn’t been cooperating. Last night’s race (21:26) was in 83°F, 68% humidity. Shoutout to singlets for helping me survive the heat. I picked up a Bakline one and have been impressed. I see Tracksmith gear constantly, and it’s good too, but I fear that some of these running brands are getting a ‘fashion brand’ markup.

It’s hard to compete with DC and San Francisco as running cities. The DC region is the ‘fittest’ in the country there are great trails in Rock Creek Park and super wide sidewalks in some neighborhoods. San Francisco has spectacular hills and trails that can convince you that you’re really in the wild. New York’s sidewalks have far fewer cars parked on them than San Francisco’s, but you always need to look where you’re going. The sights are better, in my opinion: while SF’s hills look cool in the distance, there’s nothing like seeing the skyscrapers of Manhattan or running across the Brooklyn Bridge.

New York’s running culture is great. There are tons of running clubs, and there are so many races to pick from. San Francisco had a free weekly 5k called Park Run (part of a global network of events), but it was cancelled in 2020. Brooklyn doesn’t have a Park Run, but it has the Al Goldstein race series, which is about $15, competitive, and well-run.

CityStrides

I’ve competed 10.24% of Brooklyn so far on CityStrides: progress has stalled because I’ve been just running Prospect Park loops over and over again to get in shape for 5ks.


Listening

I started listening to brat but was disappointed. The biggest find of the last few months has been Jessie Mae Hemphill, who I embarrassingly discovered because her song ‘Tell Me You Love Me’ came on the rotation in a Chipotle.

Reading

Oh man, The World Beyond Your Head was such a read. It’s hard to summarize. In hindsight, I’m not even sure what it was about the book that hooked me - there were a few loosely-connected topics, each of which was really compelling. It made me think a lot. Hell of a book.

Watching

Kinds of Kindness was great: I’ve now watched 29% of Yorgos Lanthimos films and love his style.

Reverse engineering a day’s worth of websites

Some light reverse-engineering of websites has been a source of entertainment and knowledge for me. I’ll poke around in the Chrome DevTools and figure out the basics of how popular websites work.

Sure, it’s common to compress JavaScript and other resources, and the HTML source of webpages no longer give many hints for technology – long gone are the days of having a <meta name=generator tag that revealed your tech stack. But it’s pretty easy to suss out the major tech involved and reading obfuscated source isn’t too bad. The more you practice the easier it is to notice the patterns.

Here’s some of what I look at in a day, with some quick reverse-engineering applied. It’s interesting to get a sample of these applications, the ones that I use on a daily basis.

The websites

  • Fastmail: custom framework ‘Overture’, custom protocols
  • Kagi: Vanilla JavaScript
  • GitHub: Ruby on Rails + React + Web Components
  • Linear: React + the kitchen sink
  • Discord: React
  • Sentry: React (open source)
  • Obsidian: Vanilla JavaScript + CodeMirror customized to the hilt
  • Signal: React (open source)
  • Reddit: Web Components
  • Lichess: Snabbdom

Fastmail

I’ve used Fastmail for six years as an alternative to GMail. It’s the first thing I open every day. I like them a lot. I am not happy that they laid of 60% of the bargaining unit of a union that attempted to get a contract.

Fastmail’s architecture is pretty cool! They have their own frontend framework called Overture, their own rich text editor called Squire, and they are the main authors of jmap, a standard that aims to be the successor to IMAP/POP, but contains a lot of interesting batch query ideas.

JMAP reminds me of GraphQL in a lot of ways because it lets you batch requests, and it has a wacky sort of spec for requests & responses.

Kagi

I’ve been using Kagi as a Google alternative for searching. It’s pretty great. There are reasons to doubt them, but the pros outweigh the cons for me, and it is not easy to find a high-quality search engine.

Kagi’s search page doesn’t use any major framework. It looks like they wrote the essential UI code in vanilla JavaScript. They do use floating-ui, the excellent library for positioning floating elements like tooltips and popovers, that might become unnecessary because the CSS anchor spec will provide that functionality at the platform level but for now is an absolute godsend and we use it at Val Town because both Radix and Headlessui use floating-ui to solve some of the positioning math for them.

GitHub

Then I open GitHub for work. I’ve been using GitHub for my entire career and I love it. I think it’s one of the best designed, most useful websites out there. I have basically no complaints.

GitHub is famously a Ruby on Rails shop, and they used to really embrace that style of frontend experience: they published a set of web components which were extremely good quality, powered a lot of UI using HTML fundamentals - muan’s writing about the <details> element is a classic of the genre.

They still do some of this stuff: for example, if you open the GitHub Activity Feed with your Chrome devtools open, and you hover over someone’s username in the feed for long enough for a hovercard to show up, you’ll see a web request to a URL like

GET https://github.com/users/tmcwe/hovercard…

And if you look at the response body, you’ll see the contents of that hovercard as HTML! This used to be true even of inline autocompletions when you typed @ in a text field - the list of autocomplete options were genuine HTML returned in an HTTP response. htmx is re-popularizing this pattern, but GitHub was doing it with web components and the Rails patterns now known under the hotwired.dev project group.

Nowadays, it’s a mix: some HTML stuff powered by Rails, some web components, and a bunch of React stuff. There’s still some magic happening with the <details> element, which brings me joy.

Linear

We’ve been managing our tasks with Linear. It’s extremely impressive, luxurious software but I have mixed feelings about it. I’ve encountered a bunch of bugs, and I think it provides so many ways to organize that things get over-organized and disorganized because there is a lack of authoritative “single dimension” ways to look at tasks - it always wants me to look at some filtered view that inevitably skips something important.

But there’s no denying that Linear is a work of art when it comes to engineering. I’ve studied the videos about how Linear implemented sync and scaled it in depth for when I was trying to build my own sync system. They heavily use MobX, a state management system based on Observables (not to be confused with Observable). Using computed and reactive state has never felt right to me so I’ve stuck with systems like Jotai, but Linear has really made it work, and is a classic example of a web app that has entirely desktop-app-like tradeoffs - they probably don’t care about initial load times at all, or server-rendering, but they do really care about offline usage and runtime speed.

Linear is a React app, and quite a big one.

  • They use Prosemirror for editing text - the other library from Marijn, who also wrote CodeMirror. He is a hero of the internet.
  • They use Nivo for data visualization components, like those line/area charts of cycle progress.
  • They use Sentry for catching and tracking bugs, react-spring for animation, and GraphQL for querying remote data.
  • I think that Linear is using Popper predecessor to floating-ui, for its right-click menus and the like.

Discord

My team at work uses Discord for group chat. Like Linear, Discord is really a web application with entirely desktop-app-like tradeoffs: they aren’t motivated by writing quick-loading basic HTML webpages or minimizing bundle size. It’s a lot of JavaScript magic and the focus is on power and runtime speed. I should note, though, that poking around in the HTML for Discord revealed some good attention to detail for ARIA accessibility attributes. Good job, folks!

Discord is famously an Elixir shop when it comes to the backend - which makes perfect sense, as Erlang, the language that inspired the BEAM virtual machine that Elixir uses, was a major part of the WhatsApp success story. There is a lot of very fancy WebSocket-based binary-encoding streaming happening under the hood for Discord.

Discord was harder to reverse-engineer than the rest - they aggressively compress everything and don’t have even slightly descriptive filenames. That said,

  • Discord is still using webpack, which is pretty interesting. Webpack has some staying power with high-end setups: I’ve heard that Figma uses it quite a bit because there are advanced bundle-splitting problems that only Webpack solves. Most ‘hip’ companies have moved on to rollup, vite, esbuild, or whatever Next.js bundles.
  • Discord is using React, and surprisingly has a bunch of class components! It’s surely a huge codebase so it makes sense that there’s some technical debt, or maybe they know about some case where class components are superior.
  • They use Lottie, a library that lets you render animated graphics exported from After Effects, and react-dnd for drag & drop. They also have Immutable-JS in the bundle, a library that I used heavily back in Mapbox Studio but probably wouldn’t use today because it has a pretty high overhead and a costly learning curve for the rest of the team.
  • Like Linear, there’s Sentry for catching and tracking bugs.

Sentry

We use Sentry for bug tracking at Val Town, and I open it up every morning to check for anything new. There’s no need to reverse-engineer Sentry because it’s open source!

Obsidian

I use Obsidian quite a lot. It’s where I manage my day-to-day TODO lists, track little things like what batteries I need to buy for my guitar pedals and thermometers.

It’s very high-quality software: it does some complex things, like searching large document collections and supporting a pretty expressive plugin API, and it rarely crashes or shows any flaws.

Like Linear and Discord, Obsidian works as an embedded webview: it’s using Electron as a wrapper.

The main editing view of Obsidian is powered by CodeMirror, but it’s an exceptionally customized version of CodeMirror which supports both Markdown rendered as rich text, and Markdown edited as raw code, all at the same time. They’ve done a really great job of building a very sophisticated integration with CodeMirror.

  • They have a bit of technical debt (if I can call it that) in continued use of Moment, a JavaScript library for parsing and manipulating dates, which is pretty thoroughly deprecated.
  • They use turndown to convert pasted HTML content into Markdown.
  • They use MathJAX for embedded LaTeX math equation support.

Surprisingly, maybe, Obsidian doesn’t seem to use a major web framework. They don’t even appear to be using some high-level abstraction of their own - it’s a pretty Vanilla approach to JavaScript - creating div elements and slapping classes on them. It works really well!

Signal

I use Signal for most of my group chats with friends. It’s magical software: it bridges the gap between the Android and iPhone users, the encryption has been pretty good.

The Signal macOS app is yet another website in an electron wrapper. It doesn’t require any reverse-engineering because it’s open source. The app is yet another React application, that uses Redux to manage state, some bits of react-aria for accessible components, popper for floating elements, and a long list of other dependencies. They famously have a heavy-hitting engineering team and it shows.

Reddit

My afternoon distraction is mostly Reddit. They’ve actually transitioned between technologies recently: a year ago, the Reddit I was using was a React app, but now it’s built on Web Components and custom elements. I’ve been writing about the lack of web components success stories, and Reddit is the first that I can personally testify to. I’m not sure if the WC version of Reddit is that much faster for my personal usage, but it certainly works pretty well.

They’re using lit-html for templating, and a custom set of components that they seem to call ‘shreddit’ internally.

Lichess

My other distraction is Lichess. I play a lot of chess. My rating has plummeted but I’m getting it back.

No mystery here - Lichess is open source!

And it’s a masterful application - I’m continually impressed by how fast and capable Lichess is. The stack is Scala on the backend and they use snabbdom to build frontend components.


Takeaways

  • For these kinds of web-applications, React is pretty common!
  • All applications have a bit of technical debt.
  • Two of my favorite applications had weird stacks (Fastmail and Lichess)
  • Long-lived websites like GitHub are more likely to have mixed stacks
  • Reddit is the first example of a Web Component-based site that I use
  • I’ve said it before, but web framework choice rarely kills a startup. It’s probably not the thing that makes any product or company succeed, either. Idiosyncratic framework choices probably reflect some cultural feature, though, and that has some information value.

Obsidian Freeform

Prefer video? You can also watch an intro video that I recorded for this on YouTube.

Obsidian Freeform is an extremely small Obsidian plugin that enables totally custom JavaScript-powered frames alongside your notes. I created it because I use Obsidian as my note-taking application, and I found myself wanting to create charts for certain concepts.

For example, I recently learned about the availability of mortgage discounts from some banks in exchange for having a high balance. I am not buying a house, but nevertheless, these were numbers from multiple sources that could be charted and compared and nobody was doing it, so I had to. So I made a chart:

Chart of mortgage discounts

It seems like mortgage discounts are mostly a bad idea, but now I at least have a quick visual reference for how they work across multiple banks.

The font I’m using in that screenshot is iA Writer Quattro, and the theme is minimal, both of which I learned about from Everyday Obsidian.

How it works

The code is small enough to read in a few minutes.

Obsidian Freeform adds a new code block type to Obsidian, tagged with freeform. Here’s the simplest possible block:

```freeform
display(1);
```

When this block is displayed, it creates an iframe in your Obsidian document and injects the code display(1) into it via a dynamic import.

Why inject the code as a dynamic import? Because I want to make it possible to use import within your custom code to import modules, and import needs to be top-level. In practice, this detail shouldn’t matter to you.

The display method comes from observablehq/inspector, which is added to the global namespace as display, just like how it works in Observable Framework.

There is no implicit display in Obsidian Freeform, and while it provides a width variable, that variable isn’t reactive. I’m trying to avoid adding too much magic. It’s just your JavaScript, as verbatim as I can make it.

Example: Making charts with Observable Plot

Observable Plot example of a house

You can recreate a lot of Observable examples in Freeform. Generally, the gap between the two is:

Plot isn’t available globally. You have to import it from jsdelivr like:

import * as Plot from "https://cdn.jsdelivr.net/npm/@observablehq/plot@0.6/+esm";

But then you’re basically good to go, as long as you remember:

  • It’s just JavaScript, not Observable-flavored JavaScript, so you need to use let or const in front of variables.
  • There’s no implicit display, so you need to call display() if you want to display something.

Example: Loading data from Dataview

I use the fantastic Dataview Obsidian plugin to do things like show charts of all the electronics I have in my house and which batteries they require.

Because the Obsidian context is available via window.top in Obsidian Freeform, I can access the Dataview JavaScript API:

Things I own cost vs when I bought them

import * as Plot from "https://cdn.jsdelivr.net/npm/@observablehq/plot@0.6/+esm";

const items = await window.top.app.plugins.plugins.dataview.api
  .query(`table price, purchased, color
from "03 Stuff"
where price and sold = undefined
sort purchased desc`);

const mapped = items.value.values
  .map((item) => {
    if (!item[2]) return;
    return {
      price: item[1],
      date: new Date(item[2].toMillis()),
    };
  })
  .filter((r) => r);

display(Plot.dot(mapped, { y: "price", x: "date" }).plot());

No, I don’t think window.top.app.plugins.plugins.dataview.api is a graceful, beautiful line of code, but it works and it’s explicit.

Example: Loading data from a table

One of my few complaints with Obsidian is that it doesn’t expose its own Markdown parser and the internal syntax tree for its CodeMirror instance tree is oddly structured and undocumented. So it’s tough for a plugin to interact with notes in a structured way.

Parsing a table

But Freeform makes this easy possible! Here’s some magic that parses the current document, finds its first table, and turns that table’s contents into data that you can use in charts:

import { unified } from "https://esm.sh/unified?bundle";
import remarkGfm from "https://esm.sh/remark-gfm?bundle";
import { toString } from "https://esm.sh/mdast-util-to-string?bundle";
import remarkParse from "https://esm.sh/remark-parse@11?bundle";
import remarkFrontmatter from "https://esm.sh/remark-frontmatter?bundle";
import { selectAll } from "https://esm.sh/unist-util-select?bundle";
import { autoType } from "https://esm.sh/d3-dsv";

const md = window.top.app.workspace.activeEditor?.editor.getDoc().getValue();

const file = await unified()
  .use(remarkParse)
  .use(remarkGfm)
  .use(remarkFrontmatter)
  .parse(md);

const table = selectAll("table", file)[0];

const [header, ...rows] = table.children.map((row) => {
  return row.children.map((child) => toString(child));
});

const data = body.map((row) => {
  return autoType(Object.fromEntries(row.map((text, i) => [header[i], text])));
});

display(data);

I think this is pretty cool. The magic ingredients here are totally free access to NPM modules like remark, a Markdown parser, plus access to the Obsidian API via window.top.app, plus the ability to display any kind of data pretty easily using @observablehq/inspector.

The plugin is basically those things and not much more, but it adds up to a lot.

Annoyance: the edit cycle

The cycle of editing code and seeing the results is pretty rough: you need to stop editing and click outside of the fenced code block to see what will happen. Plus, Obsidian doesn’t highlight freeform code blocks as JavaScript. This seems like a common problem for plugins, given that Dataview, one of the most popular plugins in the entire ecosystem, doesn’t have code highlighting for its query blocks.

I wish that this plugin used a Decoration instead of a markdown code block processor: that’d make the editing cycle a lot smoother. I think that, possibly, if I were to re-parse the document using remark like I do in the table example above, it’d be somewhat possible, but it’d be a lot more complicated, and there is the unknown of how Obsidian flavored Markdown will play with these parsers.

Missing: Reactive blocks and shared variables

You can technically set variables in one block using window.top.foo = 1 and get that variable in another block. After I announced the plugin, a few people requested some kind of shared variable namespace, like in Observable.

Honestly, this doesn’t seem like a great thing to invest time in; making blocks reactive would make the scope of this project much broader. It might require parsing code to find references (like Observable does) and running blocks in a more magical way. Plus, it’d open up the question of how cross-document block references would work. So also unlike Observable, there isn’t an idea of response caching at the moment: it’s just JavaScript, and without changing the language or implementing a heavyweight middle layer, it isn’t possible to do that.

I don’t use “small cells” in my own editing and am inclined to think that they just aren’t worth it - they make it harder to refactor, harder to repurpose code, and add a bunch of cognitive overhead for “where things are.”

But I’m open to ideas for how to implement something like reactive cells without blowing up the scope. It’d be neat to use a reactive signals module like signia for them and put them in userspace.

Caveats: Security

As some of these examples demonstrate, you can reach up to window.top and access APIs from Obsidian. This is super powerful: it enables access to the Dataview API, lets you access Obsidian’s own APIs.

This does mean that if you import a module, you need to trust that they aren’t going to try to do something nefarious. And you shouldn’t blindly copy-and-paste huge amounts of code into a code block from someone you don’t trust. It’s your vault, you have the power, hence the responsibility.

I think that a separate-origin version of this plugin is possible in which window.top is inaccessible, which would give a different power / security tradeoff.

Caveats: Just JavaScript

There are more accessible ways to create charts in Obsidian, like the Charts plugin. There is basically no abstraction in using Freeform, so it requires knowledge of JavaScript.

How does this compare to DataviewJS blocks?

I love the Dataview plugin, and it has a codeblock way to run JavaScript code, including access to its API. How is Freeform different?

  • dataviewjs codeblocks run in the Obsidian top frame, so if you add weird CSS, it affects the whole application. You can get into more trouble doing things in the top frame. Freeform runs in an iframe, so by default, at most you’re mucking up the iframe.
  • dataviewjs runs via eval, whereas Freeform runs code via a dynamic import(), so you can use ES module import statements to pull in new modules in Freeform, whereas you can’t in dataviewjs

Lest I be interpreted as throwing shade on Dataview: its tradeoffs make a lot of sense for what it’s targeted to do: create inline tables and listings based on Dataview information with clickable links. Dataview is amazing. To access the dataview API from Freeform, you need to write that tedious window.top.app.plugins.plugins.dataview.api variable reference and deal with the fact that Date objects have separate prototype identities when transferred between frame contexts.

Also, that being said: someone has probably already implemented something similar to this plugin, but I haven’t found it yet.


You can install Freeform in Obsidian, and here’s a link to the GitHub repo for the plugin!

Recently

If you’re reading this on macwright.com, you might have noticed that the website got a very slight upgrade this month. I’ve been publishing a lot of content in the /micro/ section, and I update my /reading/ list once or twice a month when I finish books, but these proper blog posts have been pretty sporadic. The new homepage features all of the sections of the site, which makes it fresher.

I do have a few proper blog posts in the queue - I’ve written a tiny Obsidian plugin that I think it pretty neat. I haven’t had many ideas about opinions in technology, probably because life’s been busy, I’m getting over a summer cold, and my day-to-day work on Val Town involves a lot of tough tradeoffs and subtle bugfixes and not many big technology choices recently, besides our transition from one authentication provider to another. Having already written about a big migration, I’m not trying to get a reputation slagging off other startups.

So: what happened in May? I made my way to SatSummit, a conference in DC held by my first employer, Development Seed, which is absolutely thriving now: working on big projects with a big team. They’re still building in the open, doing good by existing open source projects, and working on projects with positive impact. I’m sure their day-to-day is less rosy that I make it out to be, but still - it’s nice to see. I sat on a panel with a bunch of nice folks and talked about data in the browser and about the promise of WebAssembly, from a very high level.

In New York, Val Town has grown the team and I’m very pumped about that. We’re heading to a new office very soon, too. Summer is here and as soon as I stop sniffling from this cold, I am ready to seize it.

Reading

I had to declare Instapaper bankruptcy again: I just don’t have the time to read everything on the internet. Still, found some nice words:

The goal for companies is to keep users scrolling, and not connecting too deeply with any particular creator because gatekeeping access to the audience is what gives platforms power over creators who (need I remind you) make the stuff audiences actually want to see. By controlling access, companies can prevent creators from ever amassing enough power of their own to leave their platform.

From Future Grandmasters of the Attention Game. I have an ever-increasing amount of fear and disgust for TikTok and YouTube as platforms, and for platforms that are following in their footsteps. Justin Hanagan’s piece outlines the dynamics of this kind of system more eloquently than I could.

Algorithmically-delivered, context-free information scares me like nothing else. When I see a TikTok touting some wrong fact and referencing Google, there’s usually the Google UI featured, and 100% of the time, the “creator” is referencing a Google “quick answer” or “AI Overview.”


It creates meaningless, disposable images. It teaches me music theory and helps me write crappy little melodies. It does everything badly and confidently. And I want to be it. I want to be that confident, that unembarrassed, that ridiculously sure of myself.

If you only read one thing about “generative AI”, make it this Paul Ford piece on Wired, which I think perfectly captures the feeling of chatting with a GPT.


The third major cost of building a new house is the cost of the land itself. Given how prominent regulatory restrictions on housing are in online discourse (zoning, NIMBY vs YIMBY, and so on), I think many people would be surprised that land only makes up around 20% of the cost of a new home.

Construction Physics talks about the cost of a new home. The punchline to its statement about land cost is that in major cities, the land cost is the main component of homes. In San Jose, the most expensive and mediocre place on Planet Earth, land accounts for 80% of costs.

It’s well-understood at this point that most of the YIMBY movement is talking about building in major cities, not in minor suburbs. Strong Towns is there to talk about mid-tier suburbs, and there isn’t a strong movement to advocate for housing in truly rural areas, because, well - not many people live out there and zoning isn’t a big problem.

Part of the implicit sentiment that should be stated clearly is that encouraging housing in cities is important because more people should live in cities because suburbs are dramatically worse for the environment. There are plenty of maps and studies proving this out.


The TypeScript situation

The future of software development tooling that is being built is closed as fuck, and people seem to be okay with it because select components meet the OSI definition whilst missing the bigger picture that the compositional graph of components does not.

I complained a bit about the TypeScript / LSP state of the art, and Geoffrey Huntley’s article got linked. It’s pretty related.

For context, because this is a bit of inside baseball:

  • Programming languages usually require some “editor tooling” like autocomplete, linting, jumping from one symbol to another, and so on.
  • Microsoft invented the Language Server Protocol to make this kind of editor tooling editor-agnostic: you could have an “LSP client” in your editor and plug in an LSP server for Gleam or TypeScript or Python or anything else, and it’d just work, without having to rebuild all of the code to do the basics.
  • Microsoft also invented TypeScript, a quite good programming language that I’ve used quite a lot.
  • Microsoft also created VS Code, a code editor that I don’t like but everyone else does and that’s fine.

You would hope that this story ends with “and Microsoft used the LSP standard so that TypeScript talks to VS Code via the standard and other editors can easily do the same and provide top-tier TypeScript support.”

They didn’t. If you’ve used TypeScript with another editor, you’ve probably been using the typescript-language-server project, which was maintained by TypeFox and is now just maintained by enthusiasts. But, it doesn’t work that well, so there are projects like typescript-tools.nvim, vtsls, which try to integrate with TypeScript the same way that VS Code does, or extensions that straight-up fork the VS Code code to try to make it work with other editors.

So if you’re using VS Code or Monaco as your editor, TypeScript probably works great. If you aren’t, you are in for a pretty bad time.

I’m less familiar with the Python ecosystem but reportedly something similar is happening there too - Pylance integrates tightly with VS Code and has advanced features, but it’s a proprietary extension with a “documentation and releases” repo.

Now, I notice this scenario because I use neovim as my main code editor (I’m writing this in Neovim right now), and because part of Val Town’s product is good TypeScript integration. So I notice, often, how working with TypeScript internals is a matter of reading through the saddest, least-maintained Wiki page of barebones documentation, whereas things would just work, if I were to give up and use VS Code locally and Monaco in the application.

It is what it is – a nerdy childhood of following the Microsoft antitrust cases and an adulthood of reading about the excesses of capital makes me hesitant to love or hate any big company: they aren’t people, they’re just behemoths. And they produce some bad decisions, like constructing little fiefdoms around technologies that would be positive-sum if they were just well-documented, interoperable, and open.

TypeScript is great, and I appreciate it whenever I use it. Microsoft gave it away for free, which is also great. But the way that it tightly integrates in a custom way with Microsoft products, and has deprioritized developer-facing documentation and implementing standard interfaces that Microsoft also developed gives me flashbacks to the old Microsoft, the bad one.


On Sunday, May 5th, I received an email from a person claiming to have access to a massive leak of API documentation from inside Google’s Search division. The email further claimed that these leaked documents were confirmed as authentic by ex-Google employees, and that those ex-employees and others had shared additional, private information about Google’s search operations.

Many of their claims directly contradict public statements made by Googlers over the years, in particular the company’s repeated denial that click-centric user signals are employed, denial that subdomains are considered separately in rankings, denials of a sandbox for newer websites, denials that a domain’s age is collected or considered, and more.

Speaking of megacorporations doing things that trust the public’s trust and patience, this month had a big leak of documentation about Google Search.

I can see two sides of this issue:

  • Google Search is aggressively gamed by spammers, so if they reveal how things are ranked, then they will give bad actors an advantage. So public communications about Google’s algorithm shouldn’t be too extensive.
  • However, Google has made public claims about their algorithm and those appear to include, ahem, lies.

The degree to which Google reportedly uses data from Chrome users is also pretty scary. I guess I’ll try for the n’th time to switch to an alternative browser.


Watching / listening

I watched In Bruges, which had been on the list for a long time.

The only new music that popped up this month as Acetone, via Blank Forms, a tremendously hip living room concert series in Brooklyn that I occasionally visit.

Recently

Hello from sunny Brooklyn, where it’s suddenly summer. What’s new?

Over at the Val Town Blog, I wrote about how searching source code is a pretty hard problem. It was pretty well-received: I confirmed that yes, it’s a pretty hard problem. We’re really trying not to write a search engine, but it’s tempting, maybe just to tinker with Tantivy.

Me running a half marathon

This is a big year for running, so far. My first race of the year is complete - the Brooklyn Half Marathon. I ran 1:36:21 (7:21/mi pace) – a time that just squeaks past my previous personal best. Felt pretty good! My pacing was good until it wasn’t: need to work on endurance past the eleven mile mark.

I have two 5Ks lined up, but might try running another longer race, because beating my half marathon PR seems more achievable than beating my 5K PR, which I set in high school. I’m also hoping that New York doesn’t ramp up into high humidity and temperatures and make running a challenge, but that is probably unavoidable.

Eclipse

We went to see the solar eclipse within the totality - which meant Ohio. If you’re ever passing through Marion Ohio, I heavily endorse Shovel City Drinkery.

I’ve been listening to Mister Goblin’s new album - pretty good! No films to note in April: I watched a bunch and wasn’t impressed by any of them.


“I would say I’m not very good at selling myself,” he admits. “I grew up believing that real men, whatever real men are, don’t boast. Nowadays, everybody boasts. People will actually come up to you and tell you that they’re compassionate! But I don’t look at it like I was held back or that I should have been a superstar. Although it’s difficult for people to believe, being rich and famous never occurred to me in my plan. I realised by the time of my first album that I was not in the mainstream. So all I actually wanted was for my work to be useful. And For the Children made me realise that, well, the reason why you’re on the outside is because you’re actually trying to be useful.”

This article about Labi Siffre, who I discovered via Hot Sugar’s remix of Bless The Telephone:

Moreover, he said, “We have a great corporate welfare programme. Our users are the richest companies in the world. Indeed, we’ve enabled companies like Google to be created.”

From Bruce Perens on why Open Source has failed. (I’ve been saying this too)


Anyway, movies and music and articles aside, this is another time when the outside world needs to be mentioned. There’s not much I can say that hasn’t already been said on the topic, but the very least I’ll say is that the degree to which the US’s militarized police forces are being used against nonviolent protestors is appalling. It’s especially bad in New York, where the NYPD is unaccountable for its actions and has nearly unlimited funding and power. It shouldn’t be scary for people to go to nonviolent protests.

Recently

Reading

I don’t think you should focus on the failure of others, or even the success of others. What you do need to do—and what is surprisingly hard—is to define success for your own part of the world, and work towards that. Non-monetary success, because again, money lags.

I’ve always loved Paul Ford’s writing, and recently learned that he’s been writing short, punchy posts for the blog of his startup, Aboard. His cofounder, Rich Ziade, is also writing great stuff, with good humor - introducing himself as the other founder of Aboard.

This rally is so different because no one is beating around the bush anymore. It’s not about technology. It’s not about use cases or improving the world. It’s just, “More people buy, number go up.” The veil has been lifted and we all know it. It’s a momentum trade plain and simple.

Nick Maguilli and Joe Weisenthal wrote about how this crypto rally is emptier and more dada-esque than those before it. Nobody is even pretending to produce useful technology or an viable alternative financial system. I guess at least it’s honest, for a very narrow definition of that word.

Since we were looking at what would be left from a sale after taxes, higher taxes gave us more incentive to grow the business faster–employing more people and contributing more to the economy (and the government), so we could get to the magic after-tax number.

From Steve Roth’s account of his selling a company and how taxes affected his attitudes. I’ve been chatting with a friend or two about the idea of wealth taxes (I’m a big fan, see Capital and Triumph of Injustice).

Watching

I’ve really been enjoying Y Combinator’s ‘Dalton and Michael’ podcast-which-is-also-a-video-series. They cover a lot of the topics in startup that are matters of attitude and intentions, and they give pretty good advice, in my opinion. It’s delivered at a nice level of specificity – not so broad that they’re delivering platitudes, but they also aren’t relying on knowledge of specific companies and short-term trends.

Besides that I’m just watching different media reframed as midwest emo intros.

Listening

Adrianne Lenker’s new album, Bright Future, is so good.

So is the new ‘Forest Scenes’ from MIZU.

Elsewhere

I wrote a whole bunch on the micro blog this month, about Incentives, Running, the Remix web framework, Placemark.io, web pages and video games, and the S&P 500. Plus one post on the macro blog about Figma Plugins.

Figma Plugins

At the beginning of 2023, I released a Figma plugin called Placemark, which lets you create vector maps in Figma, the graphic design tool. Since then I’ve been maintaining that plugin for fun, and introduced another one, Placemark Globe.

They’ve been somewhat successful! The Placemark plugin has 11.3k users, according to Figma’s community site, and Placemark Globe has 1.5k users. The feedback loop for plugins is okay - you can see how many likes your plugin has received, and how many “users” there are, but no change-over-time statistics, so I built my own dashboard for the plugins using Observable.

Figma plugin statistics on Observable

But even with that, I don’t really know whether many people are actually using them. Maybe “users” means unique installations - it certainly doesn’t mean active users because the charts I’ve generated go “up only”, and I know that active user numbers are more volatile than that.

Sandboxing

I’m pretty fascinated by Figma plugins because of the challenges of sandboxing. Plugins are, by nature, third-party code that has access to a user’s documents, information, and to some extent, their computer. You want a plugin to be powerful, but safe.

Figma has a top-tier engineering team, and they struggled to make this work. They even made a big misstep by first implementing a solution based on Realms that was quickly found to be insecure.

Sandboxing is such an interesting topic because everyone wants it, but there are so few examples of it actually ever working. For example, when I was working on iD, the map editor for OpenStreetMap, we always had the challenge of creating a plugin architecture to rival JOSM, the more established rival which is a Java-based desktop app.

Sandboxing in Observable

Observable is a good example of real-world sandboxing in action. Mike had figured out basically the whole challenge before I got there: the architecture looks like:

  1. User code runs in an iframe with sandbox attributes. The top frame communicates with the iframe through postMessage.
  2. The iframe can communicate back up to the top frame, and user code could maliciously send its own messages (there is no “trusted communication channel”), so any messages from the iframe are limited in their power. Mostly the iframe just tells the top frame the dimensions of its contents.
  3. Each user has a wildcard subdomain that the iframe contents are hosted on, so that cookies can not conflict.

This got us surprisingly far - the Observable sandbox generally just worked, from a security perspective, but it suffered from some other problems. For example, if someone wrote an infinite loop in an Observable Notebook, it would spin the iframe process up to 100% CPU and they’d have to engage a “safe mode” version of the application in order to get rid of the infinite loop. Browser vendors have tinkered with this for a bit now, whether iframes are out of process, or shared with the top page, or maybe all iframes from a certain origin have their own process. It’s a complicated topic.

Sandboxing in Val Town

I wrote a long article about Val Town’s journey to sandboxing recently. In short, the product started off on Node.js’s vm module and wrappers around it, but quickly realized that there was no future to that approach: all of the attempts of sandboxing within a Node.js process were failing.

So, we switched to Deno, the project started by Ryan Dahl, the creator of Node.js. Deno has, from the very beginning, had a permissions model that lets you enable or disable a program’s access to resources. So finally you can do something like installing a module and catching it in the act before it tries to read from your /etc/passwd file, and then actually preventing it from doing so.

Val Town uses node-deno-vm to start up a separate Deno process, which exposes a WebSocket, receives user code, and runs it with Deno’s permissions model. There’s some overhead but it otherwise works really well.

Deno is extremely cool and has worked really well so far.

Sandboxing in Figma

Figma’s eventual solution to the sandboxing problem was to use QuickJS, which is a JavaScript engine that’s small and can be compiled to WASM. In effect, you can run a JavaScript engine in JavaScript with QuickJS.

So basically the plugin architecture runs part of your plugin in an iframe, where you display a UI, and part of it within QuickJS, where that code is able to actually read and write from your Figma document.

Now having written two Figma plugins, I can say that this works. The biggest issues that I’ve run into are debuggability and performance.

Figma crashing

JavaScript’s debugging story is just extremely good. Most of the time when something goes wrong in your code, you get a nice error message that specifies where it happened, and you can use the debugging tools to get more information. I wrote about this back in 2015.

When QuickJS encounters an issue in Figma, you get truly impenetrable errors. I’ve spent a lot of time just guessing what’s going wrong with my plugins, because all I have to go on is something like the stacktrace above.

It’s harder to quantify, but the performance of Figma plugins is also not great. They’ve recently launched dynamic loading, which should improve some performance at the edges, but my plugins still run slower than they feel like they should. Though, of course, I’m making geospatial plugins, and it’s easy to forget that geospatial data has its somewhat unique requirements on systems. Geospatial tools churn through a lot more data than most drawing tools.

Plugin architectures

I should reiterate how amazing it is that Figma has a plugin architecture that allows many people to author plugins. It is extremely rare for this to exist on a website. If I tried to name another website with somewhat freeform community plugins that ran on the frontend, I couldn’t.

I really wish it was easier to build this kind of thing! For all the talk about the web lacking a payments mechanism, we should pay more attention to the fact that the web lacks an extensibility mechanism: we basically have iframes as the only security primitive that enables plugin architectures, and they leave a lot to be desired. WebAssembly is the future (and has been the future for many years), but the story for distribution and debugging of WebAssembly code is still barely written.

Of course, sandboxing in general is a hard issue. There are some success stories - scripting video games in Lua is certainly one of them. The web would be much different and hopefully much better if normal websites were customizable and extensible.

The rest of the plugin authoring experience

Now that I’ve gotten my rant about sandboxing out of the way, what about the rest of the Figma plugin authoring flow?

It’s pretty good! Publishing new versions of Figma plugins is really seamless, just a few clicks, and it’s instantly on the community site. The success is very evident in the Figma Community site that has lots of content. There are lots of other plugins that target mapping, of various levels of quality.

The Placemark Plugin

Note: this post is about a bunch of different topics, as you can probably tell by now, which are tangentially related. I could edit them into something more cohesive, but I am writing for the fun of it and maybe reading this is fun too.

Screenshot of the Figma Plugin page

The Placemark Figma Plugin is by far the more advanced project. It pulls map data straight from Overpass Turbo, which is an API for OpenStreetMap data. This is pretty intentional, relative to the options:

  • Loading maps from a raster tile source would both produce static, raster maps that can’t be further styled, and would also introduce another layer of intellectual property: the styles of a provider like Mapbox or Maptiler are generally copyrighted.
  • Loading tiles from a vector tile source might be a good idea in the long run, but vector tiles are generally optimized for performance and lightness, not completeness. With my plugin currently, you can really get the whole OpenStreetMap data model if you want to, down to adding trees to the map.

So, loading from OpenStreetMap gives the plugin some extra power and simplicity, and it’s pretty clear that the only attribution required is the OpenStreetMap standard attribution, which the plugin adds by default (silence, trolls!)

It’s open source, so you can see how it does all of this. Basically, it implements a tiny static map rendering engine, with label placement, styling, some understanding of OpenStreetMap’s tagging scheme, and more. It uses d3’s implementation of the Mercator map projection, which doesn’t make much of a difference at the local scale.

The plugin has two big weaknesses: water and zoom levels.

Water, as rendered by the plugin

It’s pretty bad at rendering bodies of water. This is a really hard problem in the world of maps: let’s say that you’re rendering a map that shows some coastal town and the ocean is to the right. How do you know that the ocean is to the right? Have you downloaded the entire, enormous, ocean polygon? That’d dramatically slow down your rendering process. There are ways to do this efficiently which are pretty surprising and cool:

The direction the ways are drawn is very important! They must be drawn so that the land is on the left side and water on the right side of the way (when viewing in the direction of the way arrows). If you regard this as tracing around an area of land, e.g., an island, then the coastline way should be running counterclockwise. - from the OpenStreetMap wiki

However, I haven’t found the time to implement coastlines intelligently. It’s open source, so if you feel inspired, I am ready to merge the PR.

The other problem is simply zoom levels: to render a zoomed-out map, I’ll need to craft different Overpass Turbo queries so that the amount of data downloaded is more reasonable, and I haven’t done so yet.

The Placemark Globe Plugin

Screenshot of the Figma Placemark Globe Plugin page

The Placemark Globe plugin is way simpler: it just renders a globe. It doesn’t even render labels yet.

I think that the impetus for creating this was, the usual that “this doesn’t exist yet”, but also that things that are technically simple can still be useful. Someday I’ll find something that’s both simple, useful, and profitable!

This plugin uses d3 more heavily - really, it wouldn’t be possible without all the hard work from d3. The plugin component of it is translating SVG into Figma’s document model and styling system, which is just a bit different than SVG. And making all of that convenient. There are certainly many other ways of generating a vector globe and pulling it into Figma - this is just an easy one.

Because this shows borders, it uses the Visionscarto World Atlas project for data, a modified version of Natural Earth which shows some contentious borders in a more globally-accepted sense. There is a lot written about international borders in cartography that I won’t try to summarize here.

Plugin architecture

I used create-figma-plugin for the Globe plugin initially. I think it has some good patterns. There’s also some great resources for plugin development elsewhere.

Basically, I think I’ve decided that React is overkill for Figma plugins. Nearly any framework is overkill if you just have a few UI elements. Just write some HTML and JavaScript and don’t overthink it. I do wish that there was a standalone CSS framework for these, so that I can get that Figma aesthetic, and dark mode support, right off the bat.


Maintaining these Figma plugins has been pretty fun. It lets me scratch the itch of tinkering with new technology and it helps me keep a little presence in the world of maps, which I still like.

Recently

Busy month! In January, I wrote about the first four Val Town runtimes, and built a lot of features in Val Town.

I also hacked around enough to make Placemark Play available again, the “free-as-in-beer” Placemark UI. It still has some warts, but it’s there. Want to improve it? It’s open source, so you can!

Listening

I’ve been listening to this new-to-me CocoRosie album. I fear that this is millenial music through and through - they got popular because of the music blogs, and their sound is almost an in-joke. But, like the rest of their albums, this one has a few genuine bangers.

I’m late to the Oneohtrix Point Never fascination. I came to them like probably others have - their soundtrack score for Good time.

Watching

I’ve been watching Ozark, which is pretty good. It’s so intensely color-graded that my cheap TV had trouble rendering the dynamic range of those near-black tones. I also watched A Serious Man, which is a hit.

Reading

I read The Fund, Rob Copeland’s book about Bridgewater Capital. The book is 90% a story about personal squabbles and Bridgewater’s sociopathic management culture, and 10% about Bridgewater’s actual investment management performance and style – which is intentional, because the firm seemed to spend a lot more time on follies than its actual work. Pretty good book, could’ve been shorter. I suspect it’ll become a movie or a TV show, and I’d watch either.


Boy, I really didn’t like In The Shadow of Silicon Valley. The tech industry is responsible for so many ills of society - invasions of privacy, extractive gig-jobs, spreading disinformation, the list goes on. But people are just aching to blame them for San Francisco’s housing crisis, and that’s the one thing that they aren’t responsible for. Blame Diane Feinstein for downzoning the city. Blame Howard Jarvis for gutting the tax base and subsidizing rich homeowners. Blame Dean Preston for stifling housing supply, including fully-subsidized developments. Or in LA, Michael Weinstein for bankrolling NIMBY laws. There are villains on the left and right alike who have directly set up the conditions that are creating homelessness and increasing rents. There’s no sense in trying to string together some vibes-based theory of how tech is to blame.


I really enjoyed Brian Merchant’s Torching the Google Car, and didn’t enjoy Eric Newcomer’s opposing article in favor of self-driving cars. I do, though, like a lot of Eric Newcomer’s writing and have been a subscriber to his Substack in the past. And I also don’t universally like the content of Brian’s Blood in the Machine newsletter. So, in other words - let’s have a friendly conversation!

I think the gist of my feeling is this:

Self-driving cars have been over-promised and they’ve failed so far. I documented this in a visualization before: basically every car company promised to have a self-driving car by now. Everyone missed the mark, massively. They vastly underestimated the challenge of building such a thing, and all the macho “machine learning for self driving cars” engineers collected fat paychecks but didn’t create the thing they were paid to create.

No, the “self-driving cars” in San Francisco don’t count: they have remote drivers, who have to take over often, and they are only approved to operate in a small, highly-mapped area. They also aren’t production vehicles and haven’t met Level 5 qualifications. They are the mechanical turk: you can fool yourself into thinking there’s no guy operating the chessboard from within the suspiciously-large box below it, but the guy is there.

And now, having failed to produce a self-driving car using LIDAR, machine learning, cameras, high-resolution maps, these companies want permission to use our roads and pedestrians as training data. With all due respect, they aren’t very good at this. Why do they deserve to put people in danger?

Our streets are thoroughly political and we are so fucking tired of people dying because car companies and drivers get their way, every time. The things that safe-streets advocates have been talking about for years haven’t changed: the speed and size of cars needs to decrease. This is obvious. There is no discussion necessary. Cities that lower speed limits have fewer deaths. It has been working for Hoboken, which has reduced the city speed limit to 20mph and achieved zero pedestrian deaths in years. Bigger cars kill more. We know which streets are dangerous and how we’d fix them, but our leaders aren’t fixing them and people continue to die.

I don’t know. It’s tiring, there is only so long that you can shout and point at the things that are so obviously wrong and so clearly fixable, and be met with silence and backsliding. Cars are getting more dangerous for pedestrians and the National Transportation Safety Board is allowing it. Regulators from the NTSB are concerned, they say, but not concerned enough to do anything, because that responsibility falls in the hands of the NHTSA, which also doesn’t do anything. Thoughts and prayers to anyone not tall enough to be seen in front of your monster pickup truck.

And, yeah, I don’t know - maybe the two aren’t in conflict. But I must say, in conversations I’ve had, they are. Both car-fans and electeds argue that soon we don’t need safer streets or better public transit because self-driving cars will perfect the art of driving. And a suspicious number of people who talk about the urgency of pedestrian deaths as a reason to support self-driving cars are silent about the more basic reforms that could happen today. This includes Newcomer, who I hope is more vocal about the basics in the future.

Anyway, the thing with self-driving car companies is that they don’t need your tweets of approval, your supportive articles, your pro bono trolling in the replyguy trollcaves. They have lobbyists and money, and longstanding relationships with regulators. Money wins.

There’s no upside for safe streets advocates, nothing to sell. We’ve been saying the same thing for years. The only upside is that people would die less if better policies are implemented. Is that enough?

Recently

Dolphin in a school window

Well, I missed a Recently post on January 1st, so scratch any other resolutions, I’ll just live my life.

Reading

In loving memory of the square checkbox is the kind of UX rant I’m there for. Interfaces that have different behaviors should look different, and familiar styles are so valuable.

I wrote about Web Components and Jake Lazaroff wrote in response: “The Web Component Success Story”. I agree with his response 100%: it’d be lovely if we didn’t have to cart in a big framework just to create a tooltip, and it’d be great if maintainers didn’t need to write a version of a library for 5 different front-end frameworks. Maybe that’s where Web Components will fit in.

This post about modern CSS upgrades is a nice hit of optimism. My only addition is :has: the has selector has totally changed the things that are possible with CSS. I’m using the heck out of it.

Plus:

In books:

Swing Time was so good. I’m reading The Affordable City right now and it’s pretty good too, in, of course, a totally different way.

Watching

I watched 8 movies in January, somehow, but the only one that stuck with me was Poor Things. It’s fantastic. Delivers on every level. A romp.

I have, by the way, been making videos about Placemark and stuff. Here’s one, in a handy embed:

Making video content takes so long, and I’m afraid at every turn that it’s cringe. But it also seems like a good format for talking about visual things like Placemark and the Figma plugins I’ve been maintaining.

Video software is not great: ScreenFlow crashes, Descript crashes, Cleanshot is too minimal, Detail’s performance is pretty bad, OBS works but the interface looks open source. I’m using Descript right now, but planning on using OBS and/or DaVinci Resolve for the next video that I make.

Listening

The new album by The Smile (40% of Radiohead plus Tom Skinner) is awesome. I’ve been listening to this song all the time.

This song “Without” by Sampha is also spectacular, and the version in this Tiny Desk performance looks fun.

Elsewhere

I wrote about working hard and people seemed to like it!

Also, if you missed the post before - Placemark, the map editing tool that I wrote, is now open source. It has over 900 stars on GitHub! And some contributions already - including a Docker configuration! I really hope that it goes someplace. I’m tempted to throw a little time into it, to help with moving it to Maplibre. I don’t know if I’ll get the time to do a lot of development on it, but I’ll say that I’m absolutely going to spend the time to review and merge PRs promptly!

Work hard and take everything really seriously

Every few months on Twitter, there’s some dustup about work-life balance and whether it’s a good or bad idea to work hard when you’re young. Like most of these recurring debates, it has generated two opposite archetypes:

The anti-capitalist tells the young worker not to trust HR and not to buy into the idea of work as family. Your employment contract is the only thing that binds you to your job, and that can be terminated on either side. Arrive at 9, leave at 5. Prioritize the family.

The hustlebro tells you to wake up at 7am and get to work, and give it your all. Hustle, and earn as much as you can, build those connections. You can get work-life balance when you’re older, your early 20s are the time for making that cheddar and staying up till 1am.


In the short form, it’s hard to take a stance and not get grouped into either extreme. It’s also hard not to feel baited by someone who’s engagement-farming their social media presence by using time-tested bait questions.

This last time I responded something like:

work really hard and take everything very seriously

But I deleted it. A truism as an answer will lead people to all kinds of unintended conclusions about me and whatever I’m saying. I’ll need to use more words.

Wisdom is acquired by experience

I think the honest answer is that most people can’t gain perspective and moderation and maturity by reading someone’s advice online. The wise 35-year old dads on Twitter can follow their own advice about work-life boundaries because they’ve suffered the consequences. There’s no shortcut to perspective: you have to acquire it by experiencing bad things and suffering consequences.

Energy begets energy

I attribute a lot of my career path to my working really hard and caring a lot about things. I quickly internalized the lesson that a 9-5 job wouldn’t teach me enough, and wouldn’t give me all the intellectual stimulation or rigor that I wanted – so I worked longer hours, worked on side projects, hunted down my interests like a puppy chasing a squirrel.

The thing is, when you find a good thing to focus on, a thing to pour energy into, it can be positive-sum. It can give you energy in the rest of your life, give you a sense of purpose. The human body is not like a battery with a finite amount of energy. There are lots of things you can do, like exercise, learning, and practice, that can be rewarding and increase your ability. This is obvious, right?

If you have that thing that drives you, and that thing isn’t work and can never be work, then sure – get the lightest-duty job you can. Pour time into that thing. Maybe what you do at work is your main output, or part of your output, or just what you do for money.

Most jobs don’t give you time to learn

Many jobs, especially in technology, don’t have real, intentional, educational components. There is no time set-aside for learning, no time to practice, and no dedicated instructor.

It’s unlikely that what you learned in college fully prepared you for the job. It’s possible that you’ll have a wonderful mentor with lots of time to spare, but probably not.

I’ve worked with people who are smart enough to learn everything on the job, from 9-5. I’m not one of them. For me, to really understand something, I need to build it two or three times, write about it, use it incorrectly, and learn the consequences. Working hard meant playing around, having fun, but essentially playing with a lot of things that were not directly part of what I was paid to do at that time. This, honestly, worked out extremely well and some of those things led to jobs and opportunities that I never would have had otherwise. Writing this blog is one of those things.

Working hard on boring repetitive stuff is bad

Probably the biggest caveat to this whole post is that working hard in my experience was never working double-shifts or “hustling” for money or having multiple jobs. There are a million kinds of work that you simply don’t learn anything from, after a point. Thankfully, technology work is usually accretive, as are other sorts of knowledge-work.

Maybe you don’t want to do this, but I did

Maybe you don’t want to follow that path. That’s fine: not everyone is compelled by learning or intellectual rabbit-holes or exists in an industry where it’s pretty easy to self-educate. Or wants to “max out” their career. And it’s dangerous to generalize from a single experience. And it’s also dangerous to judge “a career” based on external appearances, which don’t tell you whether the person turned out to be happy, or rich. I haven’t maxed out either of those things, but I have few career regrets: I’ve always cared most about building useful things and learning and I think I’ve nearly maxed out those categories.

This is the answer to that question, of what advice could I have for someone in their early 20s. Well, that’s what I did – I worked pretty hard and was pretty unrestrained in pursuing interests. It worked out fine. Now that I’m older, my priorities have shifted slightly and I spend a little more time on other things, and am slowly becoming more balanced. But balance isn’t how I got here. Balance isn’t how a lot of the people I admire got to where they are now.

I’m all for moderation, but sometimes it seems
Moderation itself can be a kind of extreme - Andrew Bird

When your priorities shift, you’ll know

In the end, most people gain responsibilities. You’ll have a baby or a family member to take care of, or a thriving social life that demands more of your time. Your priorities will snap into place and you’ll realize that you care about new things. This is great. This will probably happen. But before you have those new responsibilities, you don’t have those new responsibilities. You have time to try and build a ‘rocket ship’ startup or chase down silly projects or learn a new instrument or run a thousand miles a year. Do that stuff. You don’t have to prematurely act like you’re older.


So, heed the warnings of those 30-somethings about burnout and workplace boundaries. And don’t work 24/7 on busywork for a startup if you’re not learning anything.

You can burn out by going too fast, or your flame can dim because you don’t let yourself spend silly amounts of time on silly projects to satisfy your intellectual curiosity. Beware of both outcomes: cultivate your enthusiasm for the things you want to hang onto.

It isn’t a revolutionary idea that people who are excellent in their fields often get there by trying really hard. If you can figure out the difference between busy-work that only benefits your employer, and the kind of work that makes you as a person feel like you’re making progress and becoming more skilled, then you’re ready to learn.

Placemark is now open source

Placemark is now open source! In short:

  • MIT license
  • TypeScript codebase
  • Contributions welcome

Placemark is the map editor software-as-a-service that I built for several years. It’s a website where you can import, create, edit, export, publish, and visualize geospatial data. I’m open sourcing it, so it will now be possible to run your own instance of the web application. You can see some of the things that Placemark can do in explainer YouTube videos, read the old marketing website that is now archived, and consult the blog that includes many details about features and technology choices.

If you want to learn about the open source codebase, I wrote quite a few blog posts about the architecture that are now archived in the docs repo. The README has been expanded, to some extent, with setup details.

I’d really love if folks tried out and made use of it. You can really do anything - use it as the foundation for your own application, pull parts into standalone modules, you name it.

→ Placemark repository


Details:

  • The public repository has a flat git history, to maximize security and keep my silly private commit messages out of the public web. I made 1,439 commits, 406,048++ 218,320– throughout the year. Adam Krebs contributed to the feature table element as well (3 commits, 570++ 279–)
  • It’s complicated. I know it’s a fairly complicated codebase, and also that it is need of an update to Next.js. It’s also built on Blitz, which, while I love it, is getting lapped by tools like tRPC, and could be replaced with them.
  • I’ll be moving more issues from the private repository to the public one over time.
  • The Placemark website is staying online as-is for a little while, until I can archive some pages that are hard to archive. Any advice for how to archive a Webflow site would be much appreciated: their options are really limited.
  • Have any other questions, or comments? Ask me. The discussions board is probably a good place to do that, if you have something private you need to ask, my email is on this site.
  • I’m doing great! Val Town is going really well, and I’m excited for Placemark’s new era. Don’t worry about me.

Year in Review

The last time I wrote a “year in review” post was 2017, and before that in 2012. Reading my old writing is nostalgic and horrific.

By the numbers, 2023 was pretty normal: I read around 20 books, ran around 400 miles. It’s funny how the statistics even out to the same numbers when, during the year, I think I’m in a reading drought or, like several months this year, hadn’t run in weeks.

What was the best?

van

I think that the best book in general that I read was Achieving Our Country by Richard Rorty. I think I’ve been politically shifting for a while now – not to the left or the right, but around questions of reform versus radicalism, unification versus schism. Rorty isn’t the last word on the matter, but reading him was inspiring because it opened my eyes to the other possibilities of how the left could organize and communicate. The best fiction book was Kindred. Octavia E. Butler writes books that are more vivid than any film.

I think my favorite film of the year was also, probably, the last one that I saw - The Favorite. Every Olivia Coleman performance gets me - even her brief role in The Bear, and I’m fully on board with the weird artistic vision of Yorgos Lanthimos.

What was 2023?

mushrooms

For tech, the main element was the unified shift from crypto to AI. I wrote about AI, and read a bit about AI. I don’t think it’s going to take over the world, or make everyone’s lives better, and I don’t think it’s a dud like crypto was.

If there’s anything, I think that crypto was a unifying moment for an ugly subculture in technology. The lazy indifference to substance and truth, the zero-sum scammer mindset. The insufferable cockiness that they’ll eventually be proven right. The broad-daylight connections to far-right conservative politics and ideology.

I hated crypto, and still do. Tech is about making something real and making the world better: crypto created nothing and made the world worse.

I like AI better, relatively. But I’m afraid that the subculture of crypto has permeated AI to some extent. The guaranteed eventuality of AI taking over, becoming better with every training, is the new edition of the guaranteed eventuality of hyper-bitcoinization. Anyone who doubts this is a luddite who is “ngmi,” in the lingo of crypto.

Hearkening back to Rorty, I think that I recognize millenarianism in many of these movements – the organization of a belief system around a coming fundamental reorganization of society. Whether it’s crypto people on the eventual fall of fiat currency and hyperinflation, or AI on the eventual overcoming of the mind, or Christians on the Second Coming, or Marxists on the eventual revolution. The more I experience, the less I believe in any kind of eventuality or assured destination.

Of course, it is useful to have a narrative, and an assured march toward progress or salvation is a good one. But we should remember that history isn’t some epic story. An innovation that seems obvious in hindsight can sit undiscovered for decades. Technology can go backwards, like how we forgot about Vitamin C and scurvy, or ancient concrete or iodide. Nothing is guaranteed, everything is intentional.

Anyway, I don’t know – AI is fine. It’s an improvement. I’m so tired of having to talk about it with friends and family and at work. I’ve lived through Web 2.0, the metaverse, crypto, chatbots, audio assistants, the sharing economy, VR, the mobile web, the internet of things, wearable technology. AI is another thing to put on the covers of magazines. My job hasn’t changed that much: designing and implementing technology is still hard and worthwhile. The reasons I got into it – that I love learning, understanding, solving problems – aren’t affected by the trends.

Besides that, what was 2023?

2023 was the first time I felt afraid to write anything about geopolitics. That fear has been validated a few times. So here’s where I would’ve written something but won’t.

New York

It’s dangerous to say given the global scenario, but for me, this was a pretty good year. Brooklyn has been a vastly better place for me to live than San Francisco was. My community is here, I love my neighborhood, and there is always more to discover. I’ve lived in DC and San Francisco before this. By the time I left DC, I had seen basically every corner of the city. The only remaining neighborhoods to discover were the bland city cottage streets of Spring Valley or Barnaby Woods. San Francisco too felt like a known quantity after a few years. I didn’t review all of the hills, but I saw most of the major ones.

New York is expansive in a way that’s hard to comprehend. Its population is 10x San Francisco, 12x DC. It’s 5x larger than DC, 6x larger than SF. The diversity and density is unlike anything in America. It’s a place I could live my whole life and still not know every neighborhood. There are pockets of it that look like suburbs, but most of the city is undeniably a city. It’s an incredible place to live.

bike

This year I really liked Pioneer Works, where I saw some great music. I started running the trails in the woods in Prospect Park. I used the heck out of Citi Bike, and got used to riding across the bridges into Manhattan. Found a bakery I like - La Bicyclette, and the ideal bar for the mid-30s crowd, Beer Witch. I joined The Whitney and MoMA and went a few times.

Work

At the end of 2022, I decided that I needed a job. Placemark had made an impact but plateaued at a certain revenue number, and I wanted to place another bet instead of doubling down. I joined Val Town, maintained Placemark, but announced its end in November.

Val Town has been great, and I’m excited for our 2024 plans. What one can hope for in startups is to solve a lot of interesting problems, and let none of them be interpersonal beefs. We’ve certainly had our share of meaty technical problems to solve at the core of the product, and trying to solve those at the same time as iterating fast on user-facing UI, branding, and social features. And it’s all been from a place that’s honestly a pretty darn good workplace. Anyone who has worked at very small companies (we’re 3) knows how hard it can be to have both.

I’m still in the midst of Placemark shutdown plans. Turning off services, filing for dissolution of the LLC, moving billing information around so I can close the bank account. I’ve been taking some related notes on the micro blog.

Is this the right time and place for a Placemark “post-mortem”? Probably not. I’ll just summarize: finding a profitable niche in which to launch a solo bootstrapped company, and then running that company, is hard work and really challenging mentally. I have no regrets making the decision to start it, or to shut it down, and I think when I try again, I’ll be at least 10% better.

In the process of all of this, I’ve seen every variation of company. The big companies whose CEOs wished they stayed small, and who are just waiting for a moment to exit. The bootstrapped companies on their third year of unprofitability. The bootstrapped company making six-figure profit that the founder is mostly just bored by and never talks about.

As my aunt Grace, who lived in the Ozarks, put it, “I get what I want, but I know what to want.” - The Joy of Being a Woman in Her 70s

If there’s one quote that I try to live by, it’s this one. Learning what actually is happiness for you, is success for you, is one of the most useful things you can do. The definition of success is not obvious or universal.

2024

See you there. I’ll probably have a normal post on January 1.

Homeownership

Most people I know fit into one of two camps: they either want to buy a house and they can’t, or they’ve bought a house. The desire to own ones own home is almost universal in the people I know in the US. It’s even stronger for folks who live outside of major cities. And people for whom the “security” part of homeownership rings stronger - who grew up in instability or in countries where physical goods are preferred to financial instruments for savings.

I don’t want to buy a house. Maybe I’ll need to, but I can’t help but think that the milestone is vastly overrated in public imagination and there are problems with it on a personal and societal level.

Economics

Houses are non-diversified, illiquid holdings that make up too large a percentage of people’s total invested assets.

Your neighborhood, your city, even your state could hit a snag that causes home values to decrease. I’ve lived in neighborhoods that seemed like they were on the upswing, only to see them stagnate (in terms of value) for years. You wouldn’t put 80% of your investments into a company with one office in one town, but people make the same concentration decision with housing.

The risk of housing is obscured by its illiquidity. You only know what your house is worth when you sell it, and you only do that rarely. So even though that price might be shifting rapidly, it makes less of a mental impact than seeing a chart of some stock or bond fluctuating in value.

Homeowners over-invest in their own homes. Your buyer’s agent is paid a percentage of the home price, so they are incentivized to recommend bigger and more expensive houses. The illiquidity of housing means that you can’t easily upsize to a house with another bedroom, so you’re pushed to buy a bigger house than you need right now and to “grow into it.” People with more expensive homes then go on to invest less in other assets.

Homes are illiquid: you can’t easily and cheaply buy and sell them. The transaction costs are enormous: realtor fees at 5-6% of the home value are just the starting point. The real estate industry’s blatant collusion is finally the subject of a lawsuit, but there’s no knowing when, or if, the industry’s fees will decrease.

In comparison, there are plenty of liquid things you can buy. Even with the dust-up around payment for order flow, stocks are cheaper to buy and sell than they’ve ever been. A recent analysis showed that the hidden price of “free” trading is 0.07% at TD Ameritrade, 0.23% at Fidelity, 0.31% at Robinhood, and so on. Low numbers. And instant: you can buy or sell most of these things any time between 9:30am and 4pm on most days.

Stocks aren’t perfect, and neither are other financial instruments, but no other thing you buy is nearly as inefficient and haphazard to buy and sell as a house.

Homes also have countless phantom costs that aren’t included in most people’s calculations: everything from taxes, to replacing a roof, to the time it takes to do house upkeep. As they saying goes, rent is the most you’ll pay, whereas a mortgage is the baseline.

When I bring up these issues to my tired friends who just want me to stop talking and relax, they often say that, well - they don’t think of housing as investment. They wish it wasn’t treated as investment. Unfortunately, housing is more of a financialized good than anything else, and there’s no way to interact with it differently. It’s hard and rare to buy a house with the mechanics of a broker. Most people are going to use a mortgage - which is a highly leveraged asset tied in with government and private industry backing. As I like to say, the 30 year mortgage is an intrinsically toxic product.

Homeownership is not a social good

A lot of logic around homeownership centers around the idea that homeowners are invested in their communities. Homeownership is, in the words of a million realtors, an investment in your community. We assume that homeowners are going to be better “eyes on the street” for when things to wrong, and for them to take the initiative to improve their blocks.

It’s hard to quantify these good feelings and positive vibes. It is possible to quantify other things.

In the UK, even among homeowners, Millennials are less conservative than previous generations, and show no sign of following the old trend. pic.twitter.com/yKXsGbYEYZ

— John Burn-Murdoch (@jburnmurdoch) December 30, 2022

Buying a house makes even liberal homeowners as opposed to local development as conservative ones.

Political turnout for issues between renters and homeowners

The gap can be pretty big: one study showed that 75% of renters supported new housing being built in their area, while only 51% of homeowners did.

The availability of homes and mortgages has a long history of overt racism at every level. But it’s remarkable that even in an article about how this system has failed so many Americans, we still have to say that homeownership is “an undeniable part of the American dream.” I’m a big fan of that Stafford Beer quote: the purpose of a system is what it does. The purpose of the real estate industry, until recently, or until now, or now, has been to further segregation. Let’s not judge it based on what it has failed to do.

The refrain that homeownership is investment in community, or participation in the American dream, is so ingrained in culture, that so too is its inverse: that renters aren’t. It is suspiciously convenient that richer people so happen to also be morally superior. And it’s especially troubling that in major cities where homeownership rates are low – 33% in New York City, 38% in San Francisco – public office is invariably held by homeowners.

The current homeownership norms are shaped by racist post-WWII government subsidies and explicit anti-leftism

America’s current homeownership rates are part of a post-WWII push. In 1900, 46.5% owned homes - now it’s around 66%. This is due in part to suburban sprawl, but also due to the GI Bill, which subsidized the mortgages for 20% of all new homes after the war, for soldiers, particularly for white soldiers.

The push to own homes seems even stronger amongst my more leftist friends, understandably because of the rapaciousness of landlords and the allure of “exiting” from part of capitalism. But the boosterism around homeownership that created our current environment was explicitly and loudly capitalist and anti-radical:

From a Washington Post column in 1919 (from the linked article):

Widespread and successful home owning activities in the United States this spring would do more to alleviate social unrest and build a bulwark against the encroachments of bolshevism than any other single development.

From an organization of realtors:

Socialism and communism do not take root in the ranks of those who have their feet firmly embedded in the soil of America through homeownership.

Who else is saying this?

Ramit Sethi is a standout for talking about how to have financial security without focusing on homeownership. Georgism, and The Henry George Program, and its very entertaining host, are also not afraid to call out some of the contradictions of homeownership bias.

What do you do instead?

I rent. For me, it’s much cheaper to rent than to buy in New York, and in many other places. I invest the difference in boring diversified investments, Bogleheads style.

But what about in general? Well, we could start by correcting some of the parts of society that we’ve tilted toward homeownership. It would make homeownership less of a “sweet deal” for some, but would also reduce the volatility and risk in buying a home if it’s less of a sophisticated investment.

That means chipping away at the mortgage income deduction, which has always been a regressive subsidy to the rich. (Update March 25, 2024: finally people are starting to realize this and advocate for its end) It seems politically impossible, but crazier things have happened, and countries like Germany don’t have any such laws.

Public ownership, if it was architected the right way, could reinvent some of the benefits of ownership in ways that benefit more people also also eliminate some of the worst risks. What if paying for you own housing invested you in a diversified set of houses instead of just one? And there is so much to learn from housing in Vienna. Key quote from that article:

Vienna invites us to envision a world in which homeownership isn’t the only way to secure a certain future — and what our lives might look like as a result.

Also, embracing land value taxes could help reduce the speculative aspect of the real estate industry.

To replace the “wealth-building” aspect of homeownership, we already have some solutions, like the growth of retirement plans and automatic investing. We could, and should, have a renewed social safety net, too. These diversified alternatives would be much less risky than gambling it all on a specific piece of land.

Why are leftists so into homeownership?

But what we need is a politics that cares more about renters, and a culture that is less painfully normative about homeownership. Especially for those on the left, I want people to rethink the uncritical acceptance of homeownership as a goal.

Why are leftists so uncritical of the financialization of homes? They’re allergic to investing in banks and equities, but happy to co-invest with a big bank in order to leverage a home purchase, which will in turn create a mortgage product that can be resold on the other side?

Why doesn’t class analysis lead them to prioritize the needs of poor renters over rich homeowners, to chip away at the laws, like Prop 13 and the Mortgage Income Deduction, that explicitly subsidize homeowners? In fact, why are renters in cities - people always renting “luxury condos” - viewed as a rich outsiders, when the statistics don’t back that up?

Why isn’t it worrying that homeownership has been proudly talked up as a strategy to entrench conservatism and fight communism. And isn’t it worrying that it seems to do just that - to increase voter turnout and shift voting behavior in a conservative direction?

Renting should be better

I think that a lot of well-meaning people view the struggle of renters as a struggle to become homeowners. So they focus on turning renters into mortgage-holders. They want to subsidize demand and subsidize the “first home purchase.”

Renting itself should be better. Renters should have more stability, more rights, and more options. Renting forever should be a reasonable option for most people, as it is in some countries.

Caveats:

  • I know that homeownership is a good vibe and you can paint the walls and stuff.
  • I know that there are plenty of anecdotes about great success. There are also anecdotes about picking lucky stocks, but that nobody considers that a sage retirement strategy.
  • Homes are “hard goods” in a sense that feels better than stocks, and is less icky and feels less financialized. I understand those vibes. They are, though, just as intertwined with big banks and real estate developers and government backing and the violence of the protection of private property as any stock.
  • Yes, mortgages are an effective form of forced savings. But so is Social Security, and we should bring the same behavioral-economics innovation to other, better kinds of investments.
  • The vacancy argument is debunked.
  • No, hedge funds and private equity did not ruin the housing market.

Recently

Tim Hecker performing at Pioneer Works

I saw Tim Hecker at Pioneer Works, and was astounded by the opener, Mizu. Bought the album as soon as I got home. It is, crudely explained, like if Zoë Keating dialed up the synths and pedals and rhythm, and it was also a remarkable live show.

Reading

I love shopping! I do. I love commerce — the dance of it, the etiquette. I love it as buyer and seller both. I love considering alternatives, and I love being considered. I love settling on favorites. I love stumbling across surprises.

Am I simply bourgeois? Yes, and I’ll wave that flag proudly. This is a big part of my politics: which is not a politics of “free markets” or “free trade”, but rather of systems that can support commerce and craft at every level, especially the smallest and most careful.

From Robin Sloan’s gift guide, this short passage struck me. Because I’ve really always felt the opposite: averse to talking about money, negotiating buying and selling. The tendency was ingrained early and has been hard to shake. It’s refreshing to read this, then - of someone who not only doesn’t dread the thing that you do, but enjoys it. Maybe it’ll be me, someday.

I have the kind of brain that erases everything that passes, almost immediately, like that dustpan-and-brush dog in Disney’s Alice in Wonderland sweeping up the path as he progresses along it. I never know what I was doing on what date, or how old I was when this or that happened–and I like it that way. I feel when I am very old and my brain “goes” it won’t feel so very different from the life I live now, in this miasma of non-memory, which, though it infuriates my nearest and earest, must suit me somehow, as I can’t seem, even by acts of will, to change it.

From Zadie Smith’s Feel Free. I love this passage too, for the opposite reason as Sloan’s – this is me. And I’ve long seen writers as otherworldy for their ability to remember so much. Their memoirs have realistic-sounding quotes from conversations they had years ago. Of course they’re interpolating, but the even my friends can remember the names of their teachers, of minor characters in our social scene in high school, and to me it’s all a blur. It was a relief, an affirmation, to read Zadie writing this.

Elsewhere:

  • Nick Magguilli wrote about sequence of returns risk. This might be finance content that puts your brain to sleep, but I think it’s a great example of applied statistics: if you have an average 10% long-term return but high volatility, the amount that you can safely pull from your investments is well below 10%, because in “down” years, that 10% is actually a much higher percentage.
  • Kasey Klimes on Land Value Taxes and Inclusionary Zoning is a great read. It was fun meeting Kasey this month and ranting at each other about Georgism.

Good ideas versus vibes

Something I’ve been encountering time and time again is the difficulty of getting both “good vibes” and “good ideas” in the same movement.

For example, fighting greedy housing developers has great vibes, a clear-cut enemy, lots of likeable compatriots, potential for good visuals. Sometimes it’s correct – developers are no saints, and they’re sometimes the bad guys – but a lot of the time it’s wrong. Fighting new development no matter what is the essence of NIMBYism.

YIMBYism often has bad vibes: we have to deal with loud, often-wrong twitter personas like Matt Yglesias speaking for the movement. There’s a lot of “well-actually” corrections and gesturing toward charts and numbers. But, most of the time it’s right. Every time you look at recent history, building housing has led to more housing, and not building housing has led to more homelessness.

Inclusionary zoning is the perfect encapsulation of the vibes-correctness spectrum, and that’s why it makes everyone mad. Basically, it’s a requirement placed on developers by local governments that requires them to create some affordable units in new ‘market rate’ housing. The basic principle is that some level between 10-30% of units being affordable at some percentage of local adjusted median income. You set the percentage too low and there isn’t enough affordable housing as “the market will bear”, you set it too high and developers won’t build because they can’t make enough profit to justify it. I think there’s something about this – that it’s based on some percentage that’s always less than 100%, some AMI that always seems too high, such that I’ve never anyone write about inclusionary zoning in a positive way. In places where developers can pay into a fund instead of building units, that’s seen as buying their way out.


I see this dynamic play out in a lot of contexts. For example, as you can read everywhere, everyone hates the Biden economy, but it’s pretty hard to tell why. There’s an enormous amount of disinformation on TikTok and elsewhere with wacky economic theories that play into this feeling. Which is why I was kind of fascinated when Biden tweeted this:

Let me be clear to any corporation that hasn’t brought their prices back down even as inflation has come down: It’s time to stop the price gouging. Give American consumers a break.

If there’s anything with great vibes and bad ideas, it’s this. Obviously, it’d be nice for prices to decrease, but the critique is obvious: when inflation slows, prices stop increasing. For prices to decrease overall, you need deflation, which has all kinds of bad effects: I haven’t seen any competent observer ever advocate for deflation.

He met a lot of opposition for this obviously-not-quite-right take, but is this the right vibe, a necessary evil to get people on his side? Maybe?

Elsewhere

So, I wrote up about shutting down Placemark soon, and have gotten a lot of nice emails about it. Thank you, and sorry for taking many days to respond to those emails. I’m working on open sourcing it and all of the other administrava. None of it is fun, but I’m excited about the next phase of things.

I’ve already started on the docs, which are now open source, and the videos, whcih are on the Internet Archive. I should put the videos on YouTube! I think I’ve been foolish to ignore the power of YouTube all these years.

My channel has almost nothing on it besides this clip from a year ago of me attempting to use Filecoin and failing. I watched it now and checked the Filecoin site again, and the “Store your data” button now links to DeStor, which has a “Get Started” button that links to a contact us form. So much funding, still not possible to buy Filecoin and upload cat.jpg.

On another note, I’ve been open-sourcing things under Val Town. The angle is to open source things that we write that are non-obvious, annoying to figure out, and common issues. So, integrating CodeMirror and TypeScript, and converting exported Notion docs to more conventional Markdown.

❌