<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:webfeeds="http://webfeeds.org/rss/1.0">
  <channel>
    <title>macwright.com</title>
    <description>JavaScript, math, maps, etc</description>		
    <link>https://macwright.com</link>
    <atom:link href="https://macwright.com/rss.xml" rel="self" type="application/rss+xml" />
    <webfeeds:accentColor>00588F</webfeeds:accentColor>
    <webfeeds:icon>https://macwright.com/css/logo-simple.svg</webfeeds:icon>
    
    <item>
      <title>Recently 2024</title>
      <dc:creator>Tom MacWright</dc:creator>
      <description>&lt;p&gt;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!&lt;/p&gt;

&lt;h2 id=&quot;running&quot;&gt;Running&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-12-15-recently-citystrides.png&quot; alt=&quot;CityStrides&quot; /&gt;&lt;/p&gt;

&lt;p&gt;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 &lt;a href=&quot;https://pptc.org/summer5k&quot;&gt;5K series&lt;/a&gt; was run at the peak of summer, with multiple races at over 85°F.&lt;/p&gt;

&lt;p&gt;I learned the value of good lightweight running gear: &lt;a href=&quot;https://www.bakline.nyc/&quot;&gt;Bakline&lt;/a&gt;’s singlets and &lt;a href=&quot;https://goodr.com/&quot;&gt;Goodr sunglasses&lt;/a&gt; were super helpful in getting me through the summer.&lt;/p&gt;

&lt;h2 id=&quot;work&quot;&gt;Work&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-12-15-recently-val-town-office.jpeg&quot; alt=&quot;Val Town office&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.val.town/&quot;&gt;Val Town&lt;/a&gt; raised &lt;a href=&quot;https://blog.val.town/blog/seed/&quot;&gt;a seed round&lt;/a&gt; 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 &lt;a href=&quot;https://en.wikipedia.org/wiki/Cgroups&quot;&gt;cgroups&lt;/a&gt; and low-level worker scheduling, and a lot of UX-in work, just trying to make it a pleasant tool.&lt;/p&gt;

&lt;p&gt;Frankly, with every product I’ve worked on, I’ve never had a feeling that it was &lt;em&gt;good enough&lt;/em&gt;, 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.&lt;/p&gt;

&lt;h2 id=&quot;new-york&quot;&gt;New York&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-12-15-recently-new-york-scale-model-at-the-queens-museum.jpeg&quot; alt=&quot;New York scale model at the Queens Museum&quot; /&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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 &lt;em&gt;want to be&lt;/em&gt;, not because they have to, shapes so much of what makes it great.&lt;/p&gt;

&lt;h2 id=&quot;other-metrics&quot;&gt;Other ‘metrics’&lt;/h2&gt;

&lt;p&gt;Relative to my &lt;a href=&quot;https://macwright.com/2012/02/15/minute&quot;&gt;old level obsession&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-12-15-recently-reading.png&quot; alt=&quot;Reading&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That said, this was a lackluster year for reading: just &lt;a href=&quot;https://observablehq.com/@tmcw/books-per-year&quot;&gt;18 books so far&lt;/a&gt;. 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.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-12-15-recently-films.png&quot; alt=&quot;Films&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Whereas this was a banner year for &lt;a href=&quot;https://letterboxd.com/tmcw/stats/&quot;&gt;watching movies&lt;/a&gt;: not great! Next year, I want to flip these results. Of everything I saw, &lt;a href=&quot;https://letterboxd.com/film/kinds-of-kindness/&quot;&gt;Kinds of Kindness&lt;/a&gt; will probably stick with me the most.&lt;/p&gt;

&lt;h2 id=&quot;placemark&quot;&gt;Placemark&lt;/h2&gt;

&lt;p&gt;It seems like a decade ago that I &lt;a href=&quot;https://macwright.com/2024/01/19/placemark-oss&quot;&gt;released Placemark as open source software&lt;/a&gt;, 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 &lt;em&gt;use&lt;/em&gt; maps persistently have the feeling that it couldn’t be &lt;em&gt;that&lt;/em&gt; complicated, which means that few users convert into contributors.&lt;/p&gt;

&lt;p&gt;There are a few prominent efforts chasing similar goals as Placemark: &lt;a href=&quot;https://atlas.co/&quot;&gt;Atlas.co&lt;/a&gt; is aiming to be an all-in-one editing/analysis platform, &lt;a href=&quot;https://felt.com/&quot;&gt;Felt&lt;/a&gt; a cloud-native GIS platform, and then there are plenty of &lt;a href=&quot;https://www.indiehackers.com/&quot;&gt;indiehackers&lt;/a&gt;-style projects. I hope these projects take off!&lt;/p&gt;

&lt;h2 id=&quot;figma-plugins&quot;&gt;Figma plugins&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-03-29-figma-plugins-figma-plugin-statistics-on-observable.png&quot; alt=&quot;Placemark Figma Plugins&quot; /&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;The most energy into those plugins this year, unfortunately, was when someone noticed that the dataset I was using - &lt;a href=&quot;https://www.naturalearthdata.com/&quot;&gt;Natural Earth&lt;/a&gt; – marked Crimea as part of Russia. Which obviously: &lt;em&gt;I don’t draw the countries in datasets&lt;/em&gt;, but it’s a reasonable thing to point out (but to assume that the author is malicious was a real downer, again, like, &lt;em&gt;I don’t draw the countries&lt;/em&gt;). This decision from Natural Earth’s maintainer is &lt;a href=&quot;https://github.com/nvkelso/natural-earth-vector/issues?q=is%3Aissue+is%3Aopen+crimea&quot;&gt;heavily discussed&lt;/a&gt; and they aren’t planning on changing it, so I switched to &lt;a href=&quot;https://github.com/visionscarto/world-atlas&quot;&gt;world-atlas&lt;/a&gt;, which doesn’t have that problem.&lt;/p&gt;

&lt;p&gt;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 &lt;em&gt;label priority&lt;/em&gt; 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.&lt;/p&gt;

&lt;h2 id=&quot;other-projects&quot;&gt;Other projects&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-06-02-freeform-chart-of-mortgage-discounts.png&quot; alt=&quot;Obsidian Freeform&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I released &lt;a href=&quot;https://macwright.com/2024/06/02/freeform&quot;&gt;Obsidian Freeform&lt;/a&gt;, 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.&lt;/p&gt;

&lt;h2 id=&quot;elsewhere-recently&quot;&gt;Elsewhere recently&lt;/h2&gt;

&lt;p&gt;I’ve been writing a bit:
Recently I’ve &lt;a href=&quot;https://blog.val.town/blog/devstats/&quot;&gt;written about dependency bloat and a developer analytics tool we built at Val Town&lt;/a&gt;, and started writing some &lt;a href=&quot;https://observablehq.com/d/8e978837f56432be&quot;&gt;supplementary documentation for Observable Plot&lt;/a&gt; about parts of its API that I think are unintuitive. On the micro blog, I wrote about &lt;a href=&quot;https://macwright.com/2024/11/20/not-using-copilot&quot;&gt;not using GitHub Copilot&lt;/a&gt; and how &lt;a href=&quot;https://macwright.com/2024/12/03/i-want-brands&quot;&gt;brands should make a comeback&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;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 &lt;a href=&quot;https://github.com/paulirish/lite-youtube-embed&quot;&gt;lite-youtube-embed&lt;/a&gt; to make pages load faster. I’m still running &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;, like I have been for the last decade, and it works great.&lt;/p&gt;

&lt;p&gt;Oh, and I’ve basically stopped using Twitter and am only on &lt;a href=&quot;https://mastodon.social/@tmcw&quot;&gt;Mastodon&lt;/a&gt; and &lt;a href=&quot;https://bsky.app/profile/macwright.com&quot;&gt;Bluesky&lt;/a&gt;. Bluesky more than Mastodon recently because it seems like it’s doing a better job at attracting a more diverse community.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;I’m looking forward to 2025, to cycling a lot more and a new phase of startup-building. See you in the new year.&lt;/p&gt;
</description>
      <pubDate>Sun, 15 Dec 2024 00:00:00 +0000</pubDate>
      <link>https://macwright.com/2024/12/15/recently.html</link>
      <guid isPermaLink="true">https://macwright.com/2024/12/15/recently.html</guid>
    </item>
    
    <item>
      <title>Bandcamp wrapped</title>
      <dc:creator>Tom MacWright</dc:creator>
      <description>&lt;p&gt;I still &lt;a href=&quot;https://macwright.com/2020/01/27/my-music-library&quot;&gt;use Bandcamp almost exclusively to buy music&lt;/a&gt;, 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.&lt;/p&gt;

&lt;p&gt;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 &lt;a href=&quot;https://www.bandcampunited.org/&quot;&gt;recognized as a union&lt;/a&gt;.
Times are changing and Bandcamp is no longer a lovely indie company,
but it’s still a heck of a lot better than Spotify.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://tmcw-bandcampwrapped.web.val.run/&quot;&gt;&lt;img src=&quot;/images/2024-12-06-bandcamp-wrapped-bandcamp-wrapped.png&quot; alt=&quot;Bandcamp wrapped&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;People (who?) are sharing their ‘Spotify wrapped’ auto-generated compilations
and I wanted the same, for my Bandcamp purchases, so I &lt;a href=&quot;https://tmcw-bandcampwrapped.web.val.run/&quot;&gt;built it on Val Town&lt;/a&gt;. You can create your own! Or &lt;a href=&quot;https://www.val.town/v/tmcw/bandcampWrapped&quot;&gt;edit the code of the tool that generates them&lt;/a&gt;. Because of API
limitations – really, the absence of an API – it requires you to copy &amp;amp; paste
content from your purchases page, but isn’t copy-and-paste really a kind of
API?&lt;/p&gt;

&lt;p&gt;Anyway:&lt;/p&gt;

&lt;style&gt;
#grid {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 20px;
}

#grid img {
  border: 1px solid #000;
}

@media (max-width: 640px) {
  #grid {
    grid-template-columns: 1fr 1fr;
  }
}
&lt;/style&gt;

&lt;hr /&gt;

&lt;div id=&quot;grid&quot;&gt;&lt;div&gt;&lt;a href=&quot;https://bigthief.bandcamp.com/album/vampire-empire-born-for-loving-you&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a3035108427_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://bigthief.bandcamp.com/album/vampire-empire-born-for-loving-you&quot;&gt;&lt;strong&gt;Vampire Empire / Born For Loving You&lt;/strong&gt;&lt;span&gt; by Big Thief&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://poolboysband.bandcamp.com/album/patterns&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a2194929674_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://poolboysband.bandcamp.com/album/patterns&quot;&gt;&lt;strong&gt;Patterns&lt;/strong&gt;&lt;span&gt; by Pool Boys&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://yasminwilliams.bandcamp.com/album/acadia&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a1101017398_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://yasminwilliams.bandcamp.com/album/acadia&quot;&gt;&lt;strong&gt;Acadia&lt;/strong&gt;&lt;span&gt; by Yasmin Williams&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://floatingpoints.bandcamp.com/album/cascade&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a3720949005_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://floatingpoints.bandcamp.com/album/cascade&quot;&gt;&lt;strong&gt;Cascade&lt;/strong&gt;&lt;span&gt; by Floating Points&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://darwindeez.bandcamp.com/album/of-course-i-still-love-you&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a1471544844_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://darwindeez.bandcamp.com/album/of-course-i-still-love-you&quot;&gt;&lt;strong&gt;of course i still love you&lt;/strong&gt;&lt;span&gt; by Darwin Deez (pre-order)&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://iammizu.bandcamp.com/album/4-2-3&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a2954557406_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://iammizu.bandcamp.com/album/4-2-3&quot;&gt;&lt;strong&gt;4 | 2 | 3&lt;/strong&gt;&lt;span&gt; by MIZU&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://rosielowe.bandcamp.com/album/son&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a1460378669_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://rosielowe.bandcamp.com/album/son&quot;&gt;&lt;strong&gt;Son&lt;/strong&gt;&lt;span&gt; by Rosie Lowe &amp;amp; Duval Timothy&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://magdalenabay.bandcamp.com/album/imaginal-disk&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a3108453833_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://magdalenabay.bandcamp.com/album/imaginal-disk&quot;&gt;&lt;strong&gt;Imaginal Disk&lt;/strong&gt;&lt;span&gt; by Magdalena Bay&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://dirtyprojectors.bandcamp.com/album/dirty-projectors&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a3233463179_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://dirtyprojectors.bandcamp.com/album/dirty-projectors&quot;&gt;&lt;strong&gt;Dirty Projectors&lt;/strong&gt;&lt;span&gt; by Dirty Projectors&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://justine-electra.bandcamp.com/album/green-disco&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a0816555818_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://justine-electra.bandcamp.com/album/green-disco&quot;&gt;&lt;strong&gt;Green Disco&lt;/strong&gt;&lt;span&gt; by Justine Electra&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://daedelusmusic.bandcamp.com/album/daedalus&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a0700742145_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://daedelusmusic.bandcamp.com/album/daedalus&quot;&gt;&lt;strong&gt;Daedalus&lt;/strong&gt;&lt;span&gt; by Daedelus&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://malblum.bandcamp.com/album/you-look-a-lot-like-me-2016&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a0634789397_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://malblum.bandcamp.com/album/you-look-a-lot-like-me-2016&quot;&gt;&lt;strong&gt;You Look A Lot Like Me (2016)&lt;/strong&gt;&lt;span&gt; by Mal Blum&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://cailinpitt.bandcamp.com/track/big-city-boys&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a0054518305_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://cailinpitt.bandcamp.com/track/big-city-boys&quot;&gt;&lt;strong&gt;Big City Boys&lt;/strong&gt;&lt;span&gt; by Cailin Pitt&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://floatingpoints.bandcamp.com/album/promises&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a2975740667_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://floatingpoints.bandcamp.com/album/promises&quot;&gt;&lt;strong&gt;Promises&lt;/strong&gt;&lt;span&gt; by Floating Points, Pharoah Sanders &amp;amp; The London Symphony Orchestra&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://photay.bandcamp.com/album/windswept&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a2306649302_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://photay.bandcamp.com/album/windswept&quot;&gt;&lt;strong&gt;Windswept&lt;/strong&gt;&lt;span&gt; by Photay&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://jessiemaehemphill.bandcamp.com/album/jessie-mae-hemphill&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a1222718648_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://jessiemaehemphill.bandcamp.com/album/jessie-mae-hemphill&quot;&gt;&lt;strong&gt;Jessie Mae Hemphill&lt;/strong&gt;&lt;span&gt; by Jessie Mae Hemphill&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://ishmaelensemble.bandcamp.com/album/rituals&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a0550824302_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://ishmaelensemble.bandcamp.com/album/rituals&quot;&gt;&lt;strong&gt;Rituals&lt;/strong&gt;&lt;span&gt; by Ishmael Ensemble&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://acetone1992.bandcamp.com/album/1992-2001&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a2674321849_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://acetone1992.bandcamp.com/album/1992-2001&quot;&gt;&lt;strong&gt;1992 - 2001&lt;/strong&gt;&lt;span&gt; by Acetone&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://cloudnothings.bandcamp.com/album/final-summer&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a0489838356_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://cloudnothings.bandcamp.com/album/final-summer&quot;&gt;&lt;strong&gt;Final Summer&lt;/strong&gt;&lt;span&gt; by Cloud Nothings&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://adriannelenker.bandcamp.com/album/bright-future&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a2431419636_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://adriannelenker.bandcamp.com/album/bright-future&quot;&gt;&lt;strong&gt;Bright Future&lt;/strong&gt;&lt;span&gt; by Adrianne Lenker&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://xiuxiu.bandcamp.com/album/la-for-t-2024&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a1251930251_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://xiuxiu.bandcamp.com/album/la-for-t-2024&quot;&gt;&lt;strong&gt;La For​ê​t (2024)&lt;/strong&gt;&lt;span&gt; by Xiu Xiu&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mistergoblin.bandcamp.com/album/frog-poems&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a3056448167_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://mistergoblin.bandcamp.com/album/frog-poems&quot;&gt;&lt;strong&gt;Frog Poems&lt;/strong&gt;&lt;span&gt; by Mister Goblin&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://agriculturemusic.bandcamp.com/album/living-is-easy&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a0701980643_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://agriculturemusic.bandcamp.com/album/living-is-easy&quot;&gt;&lt;strong&gt;Living is Easy&lt;/strong&gt;&lt;span&gt; by Agriculture&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://oneohtrixpointnever.bandcamp.com/album/again&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a4277554650_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://oneohtrixpointnever.bandcamp.com/album/again&quot;&gt;&lt;strong&gt;Again&lt;/strong&gt;&lt;span&gt; by Oneohtrix Point Never&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://cocorosiemusic.bandcamp.com/album/put-the-shine-on&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a2772633643_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://cocorosiemusic.bandcamp.com/album/put-the-shine-on&quot;&gt;&lt;strong&gt;Put The Shine On&lt;/strong&gt;&lt;span&gt; by CocoRosie&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://benlevingroup.bandcamp.com/album/the-light-is-on-you-return&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a0269871847_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://benlevingroup.bandcamp.com/album/the-light-is-on-you-return&quot;&gt;&lt;strong&gt;The Light Is On You Return&lt;/strong&gt;&lt;span&gt; by Ben Levin&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://magdalenabay.bandcamp.com/album/mercurial-world&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a0154029397_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://magdalenabay.bandcamp.com/album/mercurial-world&quot;&gt;&lt;strong&gt;Mercurial World&lt;/strong&gt;&lt;span&gt; by Magdalena Bay&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://glitterboxrecordings.bandcamp.com/album/burn-it-down&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a3748396916_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://glitterboxrecordings.bandcamp.com/album/burn-it-down&quot;&gt;&lt;strong&gt;Burn It Down&lt;/strong&gt;&lt;span&gt; by Lovebirds&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://nonameraps.bandcamp.com/album/room-25&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a1836574169_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://nonameraps.bandcamp.com/album/room-25&quot;&gt;&lt;strong&gt;Room 25&lt;/strong&gt;&lt;span&gt; by Noname&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://thesmile.bandcamp.com/album/wall-of-eyes&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a1933083795_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://thesmile.bandcamp.com/album/wall-of-eyes&quot;&gt;&lt;strong&gt;Wall Of Eyes&lt;/strong&gt;&lt;span&gt; by The Smile&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://iammizu.bandcamp.com/album/forest-scenes&quot;&gt;&lt;img src=&quot;https://f4.bcbits.com/img/a0926046986_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://iammizu.bandcamp.com/album/forest-scenes&quot;&gt;&lt;strong&gt;Forest Scenes&lt;/strong&gt;&lt;span&gt; by MIZU&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;It was apparently a big year for instrumental, electronic, minimalist music.
The only ‘rock’ album that hooked me was &lt;em&gt;Wall of Eyes&lt;/em&gt;, and the only pop
album that made an impact was &lt;em&gt;Imaginal Disk&lt;/em&gt; - the fuzzy &lt;a href=&quot;https://magdalenabay.bandcamp.com/track/image&quot;&gt;outro of Image&lt;/a&gt; is something I keep re-listening to.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Buy some music! Listen to it repeatedly, and put it in your MP3 player!&lt;/p&gt;
</description>
      <pubDate>Fri, 06 Dec 2024 00:00:00 +0000</pubDate>
      <link>https://macwright.com/2024/12/06/bandcamp-wrapped.html</link>
      <guid isPermaLink="true">https://macwright.com/2024/12/06/bandcamp-wrapped.html</guid>
    </item>
    
    <item>
      <title>Recently: Cycling and Autumn</title>
      <dc:creator>Tom MacWright</dc:creator>
      <description>&lt;p&gt;I haven’t been posting much to the ‘main blog’ recently, but I have been keeping the &lt;a href=&quot;https://macwright.com/micro/&quot;&gt;micro blog&lt;/a&gt; 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 &lt;em&gt;bad&lt;/em&gt; to have multiple “Recently” headings in the blog listing, so I’ll give them short subtitles from now on.&lt;/p&gt;

&lt;p&gt;Anyway, what’s up? October was all right. At &lt;a href=&quot;https://www.val.town/&quot;&gt;Val Town&lt;/a&gt;, we spent a lot of time interviewing job candidates and improving the AI assistant, &lt;a href=&quot;https://www.val.town/townie&quot;&gt;Townie&lt;/a&gt;. 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.&lt;/p&gt;

&lt;h3 id=&quot;cycling&quot;&gt;Cycling&lt;/h3&gt;

&lt;p&gt;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 &lt;em&gt;cycling&lt;/em&gt; is on the mind. We just rode the &lt;a href=&quot;https://aqueduct.org/&quot;&gt;Old Croton Aqueduct&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-11-03-recently-osage-orange.jpeg&quot; alt=&quot;Osage orange&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We rode past some &lt;a href=&quot;https://en.wikipedia.org/wiki/Maclura_pomifera&quot;&gt;osage orange&lt;/a&gt; trees with their funky-looking and inedible fruit the size of large grapefruits.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-11-03-recently-lyndhurst-estate.jpeg&quot; alt=&quot;Lyndhurst estate&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The trail passed right next to the &lt;a href=&quot;https://en.wikipedia.org/wiki/Lyndhurst_%28mansion%29&quot;&gt;Lyndhurst Estate&lt;/a&gt;, which was owned by a series of rich and powerful people, including &lt;a href=&quot;https://en.wikipedia.org/wiki/Jay_Gould&quot;&gt;Jay Gould&lt;/a&gt;, who is especially hated. Upstate, a lot of the attractions are like this, other big historic houses.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-11-03-recently-oca.jpeg&quot; alt=&quot;OCA&quot; /&gt;&lt;/p&gt;

&lt;p&gt;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 &lt;a href=&quot;https://aqueduct.org/frequently-asked-questions#bikes&quot;&gt;bikes are explicitly permitted&lt;/a&gt;, locals seemed a little surprised by our presence, even though we were ringing bells, going slow, and making lots of space.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3 id=&quot;micro&quot;&gt;Micro&lt;/h3&gt;

&lt;p&gt;I wrote a lot on the microblog this month: about &lt;a href=&quot;https://macwright.com/2024/10/25/arc-browser&quot;&gt;the Arc browser’s recent news that it’ll be abandoned&lt;/a&gt;, &lt;a href=&quot;https://macwright.com/2024/10/19/reddit-is-my-wc-reference-point&quot;&gt;Reddit adopting Web Components&lt;/a&gt;, &lt;a href=&quot;https://macwright.com/2024/10/16/domain-second-thoughts&quot;&gt;domain squatting&lt;/a&gt;, &lt;a href=&quot;https://macwright.com/2024/10/14/bikeshare-notes&quot;&gt;Python datascience tech&lt;/a&gt;, and &lt;a href=&quot;https://macwright.com/2024/10/25/good-software-knip&quot;&gt;Knip, a tool for finding dead code in TypeScript systems&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;content&quot;&gt;Content&lt;/h3&gt;

&lt;p&gt;I watched a bunch of films, which are on &lt;a href=&quot;https://letterboxd.com/tmcw/&quot;&gt;my Letterboxd&lt;/a&gt;, and the only new album on my rotation is Yasmin Williams’s Acadia:&lt;/p&gt;

&lt;iframe style=&quot;border: 0; width: 100%; height: 120px;&quot; src=&quot;https://bandcamp.com/EmbeddedPlayer/album=322085466/size=large/bgcol=ffffff/linkcol=333333/tracklist=false/artwork=small/track=2871100432/transparent=true/&quot; seamless=&quot;&quot;&gt;&lt;a href=&quot;https://yasminwilliams.bandcamp.com/album/acadia&quot;&gt;Acadia by Yasmin Williams&lt;/a&gt;&lt;/iframe&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;script src=&quot;/scripts/lite-yt-embed.js&quot;&gt;&lt;/script&gt;

&lt;link rel=&quot;stylesheet&quot; href=&quot;/scripts/lite-yt-embed.css&quot; /&gt;

&lt;lite-youtube videoid=&quot;Kj_Ah4JO8D4&quot;&gt;&lt;/lite-youtube&gt;

&lt;p&gt;&lt;em&gt;And that’s it for this month! I’ll write a full-fledged blog post one of these days.&lt;/em&gt;&lt;/p&gt;
</description>
      <pubDate>Sun, 03 Nov 2024 00:00:00 +0000</pubDate>
      <link>https://macwright.com/2024/11/03/recently.html</link>
      <guid isPermaLink="true">https://macwright.com/2024/11/03/recently.html</guid>
    </item>
    
    <item>
      <title>Recently</title>
      <dc:creator>Tom MacWright</dc:creator>
      <description>&lt;p&gt;&lt;img src=&quot;/images/2024-10-01-recently-apples.jpeg&quot; alt=&quot;Apples&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;reading&quot;&gt;Reading&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://www.newyorker.com/culture/the-weekend-essay/why-ai-isnt-going-to-make-art&quot;&gt;Ted Chiang’s article about AI&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;I read a lot of articles about the &lt;a href=&quot;https://www.techdirt.com/2024/09/05/second-circuit-says-libraries-disincentivize-authors-to-write-books-by-lending-them-for-free/&quot;&gt;Internet Archive lawsuit&lt;/a&gt; in September. The &lt;a href=&quot;https://www.theverge.com/2024/9/4/24235958/internet-archive-loses-appeal-ebook-lending&quot;&gt;Verge&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;Exciting month for New Yorkers, obviously, with the mayor getting indicted. I’m feeling thankful for the New York media ecosystem: with &lt;a href=&quot;https://hellgatenyc.com/tag/eric-adams&quot;&gt;Hell Gate&lt;/a&gt; and &lt;a href=&quot;https://www.thecity.nyc/&quot;&gt;The City&lt;/a&gt;, we have really good local, independent journalism. It’s both deep - &lt;a href=&quot;https://tableofsuccess.hellgatenyc.com/&quot;&gt;Hell Gate’s Table of Success&lt;/a&gt; is an incredible reference for Adams’s corrupt circle of friends - and &lt;a href=&quot;https://hellgatenyc.com/most-brazen-lie-eric-adams-allegedly-told-prosecutors/&quot;&gt;punchy&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;watching&quot;&gt;Watching&lt;/h2&gt;

&lt;p&gt;I guess I watched a lot of movies this month? The big hit was &lt;a href=&quot;https://letterboxd.com/film/death-becomes-her/&quot;&gt;Death Becomes Her&lt;/a&gt;, which is an absolute classic - my favorite kind of film, ‘a romp.’ &lt;a href=&quot;https://letterboxd.com/film/beetlejuice/&quot;&gt;Beetlejuice&lt;/a&gt; was just okay, surprisingly.&lt;/p&gt;

&lt;p&gt;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&amp;amp;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:&lt;/p&gt;

&lt;script src=&quot;/scripts/lite-yt-embed.js&quot;&gt;&lt;/script&gt;

&lt;link rel=&quot;stylesheet&quot; href=&quot;/scripts/lite-yt-embed.css&quot; /&gt;

&lt;lite-youtube videoid=&quot;eRgulZiX7No&quot;&gt;&lt;/lite-youtube&gt;

&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=22x_EzzZqK0&amp;amp;list=LL&amp;amp;index=4&amp;amp;t=446s&quot;&gt;Tim Fitzwater&lt;/a&gt; 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 &lt;em&gt;especially&lt;/em&gt; 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 &amp;amp; bike plans with streetview. You can’t do streetview on bike trails usually, because Google &lt;del&gt;sucks at making maps for non-drivers&lt;/del&gt; doesn’t have data there.&lt;/p&gt;

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

&lt;p&gt;&lt;img src=&quot;/images/2024-10-01-recently-park.jpeg&quot; alt=&quot;Park&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Had a really great ride this month - after biking through Long Island in August, we wanted to experience some &lt;em&gt;good&lt;/em&gt; bicycle infrastructure, so the Shore Parkway and Jamaica Bay Greenway hit the spot. This photo is from Brooklyn! &lt;a href=&quot;https://en.wikipedia.org/wiki/Shirley_Chisholm_State_Park&quot;&gt;Shirley Chisholm State Park&lt;/a&gt; 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.&lt;/p&gt;

&lt;h2 id=&quot;listening&quot;&gt;Listening&lt;/h2&gt;

&lt;p&gt;Pretty decent month for music, too!&lt;/p&gt;

&lt;iframe style=&quot;border: 0; width: 100%; height: 42px;&quot; src=&quot;https://bandcamp.com/EmbeddedPlayer/album=2413275144/size=small/bgcol=ffffff/linkcol=333333/track=4245631880/transparent=true/&quot; seamless=&quot;&quot;&gt;&lt;a href=&quot;https://duvaltimothy.bandcamp.com/album/son&quot;&gt;Son by Rosie Lowe &amp;amp; Duval Timothy&lt;/a&gt;&lt;/iframe&gt;

&lt;p&gt;I heard this at the place where I get my hair cut. A good sign.&lt;/p&gt;

&lt;iframe style=&quot;border: 0; width: 100%; height: 42px;&quot; src=&quot;https://bandcamp.com/EmbeddedPlayer/album=1204527868/size=small/bgcol=ffffff/linkcol=333333/track=932290507/transparent=true/&quot; seamless=&quot;&quot;&gt;&lt;a href=&quot;https://floatingpoints.bandcamp.com/album/cascade&quot;&gt;Cascade by Floating Points&lt;/a&gt;&lt;/iframe&gt;

&lt;p&gt;Great new electronic music - this has been powering my focus at work recently.&lt;/p&gt;

&lt;lite-youtube videoid=&quot;sdQqgVzex_w&quot;&gt;&lt;/lite-youtube&gt;

&lt;p&gt;I had thought incorrectly that Death From Above stopped playing music a while ago. Happy to learn that I was wrong and this album - &lt;a href=&quot;https://en.wikipedia.org/wiki/Outrage!_Is_Now&quot;&gt;Outrage! Is Now&lt;/a&gt; exists.&lt;/p&gt;

&lt;h2 id=&quot;elsewhere&quot;&gt;Elsewhere&lt;/h2&gt;

&lt;p&gt;In the micro blog, I wrote about &lt;a href=&quot;https://macwright.com/2024/09/19/the-extra-rules-of-hooks&quot;&gt;React&lt;/a&gt;, &lt;a href=&quot;https://macwright.com/2024/09/09/syncing-iterm-light-dark-neovim&quot;&gt;syncing light and dark mode in Neovim&lt;/a&gt;, &lt;a href=&quot;https://macwright.com/2024/09/15/cryptos-missing-plateau-of-productivity&quot;&gt;Crypto’s missing plateau of productivity&lt;/a&gt; and &lt;a href=&quot;https://macwright.com/2024/09/16/the-good-nyc-cycling&quot;&gt;NYC cycling paths&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Tue, 01 Oct 2024 00:00:00 +0000</pubDate>
      <link>https://macwright.com/2024/10/01/recently.html</link>
      <guid isPermaLink="true">https://macwright.com/2024/10/01/recently.html</guid>
    </item>
    
    <item>
      <title>Recently</title>
      <dc:creator>Tom MacWright</dc:creator>
      <description>&lt;h2 id=&quot;reading&quot;&gt;Reading&lt;/h2&gt;

&lt;p&gt;Since last time, I read a few books: &lt;a href=&quot;https://macwright.com/2024/08/07/sea-of-tranquility&quot;&gt;Sea of Tranquility&lt;/a&gt;, a &lt;a href=&quot;https://www.bklynlibrary.org/support/brooklyn-eagles&quot;&gt;book club&lt;/a&gt; book, &lt;a href=&quot;https://macwright.com/2024/08/11/doppelganger&quot;&gt;Doppelganger&lt;/a&gt;, the new Naomi Klein, and &lt;a href=&quot;https://macwright.com/2024/08/18/manywhere&quot;&gt;Manywhere&lt;/a&gt;, a collection of short stories.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2 id=&quot;listening&quot;&gt;Listening&lt;/h2&gt;

&lt;p&gt;I’ve been listening to a lot of &lt;a href=&quot;https://www.malblum.com/&quot;&gt;Mal Blum&lt;/a&gt;, 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.&lt;/p&gt;

&lt;iframe style=&quot;border: 0; width: 100%; height: 120px;&quot; src=&quot;https://bandcamp.com/EmbeddedPlayer/album=2729633935/size=large/bgcol=ffffff/linkcol=333333/tracklist=false/artwork=small/track=78269933/transparent=true/&quot; seamless=&quot;&quot;&gt;&lt;a href=&quot;https://malblum.bandcamp.com/album/you-look-a-lot-like-me-2016&quot;&gt;You Look A Lot Like Me (2016) by Mal Blum&lt;/a&gt;&lt;/iframe&gt;

&lt;p&gt;New Daedalus album! It’s perfect!&lt;/p&gt;

&lt;iframe style=&quot;border: 0; width: 100%; height: 120px;&quot; src=&quot;https://bandcamp.com/EmbeddedPlayer/album=1595675864/size=large/bgcol=ffffff/linkcol=333333/tracklist=false/artwork=small/transparent=true/&quot; seamless=&quot;&quot;&gt;&lt;a href=&quot;https://daedelusmusic.bandcamp.com/album/daedalus&quot;&gt;Daedalus by Daedelus&lt;/a&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;watching&quot;&gt;Watching&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://letterboxd.com/film/death-becomes-her/&quot;&gt;Death Becomes Her&lt;/a&gt; is such a classic
early-90s romp of a film.&lt;/p&gt;

&lt;script src=&quot;/scripts/lite-yt-embed.js&quot;&gt;&lt;/script&gt;

&lt;link rel=&quot;stylesheet&quot; href=&quot;/scripts/lite-yt-embed.css&quot; /&gt;

&lt;lite-youtube videoid=&quot;7EuKibmlll4&quot;&gt;&lt;/lite-youtube&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;I’m also not a video gamer by any stretch of the imagination, but I picked up &lt;a href=&quot;https://en.wikipedia.org/wiki/No_Man%27s_Sky&quot;&gt;No Man’s Sky&lt;/a&gt;, 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, &lt;a href=&quot;https://en.wikipedia.org/wiki/Cyberpunk_2077&quot;&gt;Cyberpunk 2077&lt;/a&gt;, 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.&lt;/p&gt;

&lt;h2 id=&quot;elsewhere&quot;&gt;Elsewhere&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://val.town/&quot;&gt;Val Town&lt;/a&gt; started &lt;a href=&quot;https://blog.val.town/blog/oss/&quot;&gt;funding more open source software&lt;/a&gt;, 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, &lt;a href=&quot;https://laravel-news.com/laravel-raises-57-million-series-a&quot;&gt;Laravel, the PHP framework, raised $57M in a Series A round&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-09-03-recently-ride-to-patchogue.png&quot; alt=&quot;Ride to Patchogue&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We rode to Patchogue - terminating around &lt;a href=&quot;https://en.wikipedia.org/wiki/Blue_Point_Brewing_Company&quot;&gt;Blue Point Brewing Company&lt;/a&gt;. 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&amp;amp;O, or &lt;a href=&quot;https://bikepacking.com/&quot;&gt;a bikepacking&lt;/a&gt; trail for future trips.&lt;/p&gt;
</description>
      <pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate>
      <link>https://macwright.com/2024/09/05/recently.html</link>
      <guid isPermaLink="true">https://macwright.com/2024/09/05/recently.html</guid>
    </item>
    
    <item>
      <title>Recently</title>
      <dc:creator>Tom MacWright</dc:creator>
      <description>&lt;p&gt;I skipped &lt;em&gt;Recently&lt;/em&gt; last month. This one’s even more
of a grab-bag than usual!&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;the-video-element-and-browser-abstractions&quot;&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element and browser abstractions&lt;/h3&gt;

&lt;p&gt;I was reading &lt;a href=&quot;https://web.archive.org/web/20230205201150/https://ivan.sanchezortega.es/politics/2020/09/01/mapml-essay-part4-thumbs-up-for-document-accesibility.html&quot;&gt;Iván Sánchez Ortega’s thoughts on maps4html&lt;/a&gt;
(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 &lt;a href=&quot;https://gist.github.com/tmcw/c17eec41deaec8f8f7b3d8bd38420a27&quot;&gt;I am as well&lt;/a&gt;.
But this section really got me thinking:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;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 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;object&amp;gt;&lt;/code&gt; inside
an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;embed&amp;gt;&lt;/code&gt; with a MJPG fallback in the form of a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;img&amp;gt;&lt;/code&gt;)
was quite abismal (sic). A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element back then made sense.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;So let’s fast-forward ten years, and see what &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;video&amp;gt;&lt;/code&gt; has
really brought us. For me, three things spring to mind:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
  &lt;li&gt;Chunked video&lt;/li&gt;
  &lt;li&gt;DRM (in the form of EME).&lt;/li&gt;
  &lt;li&gt;Consistent UI, then inconsistent UI back again.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;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 &lt;a href=&quot;https://www.are.na/tom-macwright/subtitles-1528478762&quot;&gt;love to do&lt;/a&gt;.
There are good tools for &lt;a href=&quot;https://github.com/ytdl-org/youtube-dl&quot;&gt;downloading YouTube videos&lt;/a&gt;,
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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Maps are what the &lt;a href=&quot;https://github.com/Maps4HTML&quot;&gt;maps4html&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;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?&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;leverage&quot;&gt;Leverage&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This &lt;a href=&quot;https://www.lynalden.com/most-investments-are-bad/&quot;&gt;blog post from Lyn Alden&lt;/a&gt;
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.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a good point that I never stop mentioning – mortgages are
complicated and risky investments. Sometimes not as risky for the borrower
but &lt;a href=&quot;https://byrnehobart.medium.com/the-30-year-mortgage-is-an-intrinsically-toxic-product-200c901746a&quot;&gt;always risky&lt;/a&gt;).&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;beos--haiku&quot;&gt;BeOS &amp;amp; Haiku&lt;/h3&gt;

&lt;p&gt;I love the BeOS and Haiku icons and designs?
They really are something. I’ve always had a love for the
&lt;a href=&quot;https://guidebookgallery.org/screenshots/macos80&quot;&gt;Mac OS 8&lt;/a&gt; look,
but &lt;a href=&quot;https://guidebookgallery.org/screenshots/beos5&quot;&gt;BeOS&lt;/a&gt; is just
beautiful: it has some of the strong colors of Windows, but used in a
different way. And the icons…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-08-01-recently-beos-icons.png&quot; alt=&quot;BeOS icons&quot; style=&quot;image-rendering:pixelated;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;From &lt;a href=&quot;https://guidebookgallery.org/guis/beos&quot;&gt;guidebookgallery.org&lt;/a&gt;.
By the way: did you know about the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering&quot;&gt;image-rendering: pixelated&lt;/a&gt; CSS option?&lt;/p&gt;

&lt;p&gt;And then look at &lt;a href=&quot;https://discuss.haiku-os.org/t/post-your-haiku-screenshot/3064?page=4&quot;&gt;the icons from Haiku&lt;/a&gt;, the successor to BeOS:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-08-01-recently-haikuos-icons.png&quot; alt=&quot;HaikuOS icons&quot; /&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;bikes-are-electric-now&quot;&gt;Bikes are electric now&lt;/h3&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Disc brakes replaced V-brakes, even for some road bikes&lt;/li&gt;
  &lt;li&gt;Tubeless tires replaced tires with tubes for most bikes&lt;/li&gt;
  &lt;li&gt;Wheels got bigger and most mountain bikes are 29ers or above&lt;/li&gt;
&lt;/ul&gt;

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

&lt;script src=&quot;/scripts/lite-yt-embed.js&quot;&gt;&lt;/script&gt;

&lt;link rel=&quot;stylesheet&quot; href=&quot;/scripts/lite-yt-embed.css&quot; /&gt;

&lt;lite-youtube videoid=&quot;lbMxzruQiug&quot;&gt;&lt;/lite-youtube&gt;

&lt;p&gt;The weird
new thing is &lt;em&gt;electronic shifting&lt;/em&gt;, 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.&lt;/p&gt;

&lt;p&gt;It’s nice to see though, from some ‘bike influencers’, a
&lt;a href=&quot;https://www.youtube.com/watch?v=CAV9XvzB0eQ&quot;&gt;pushback&lt;/a&gt; and
some people even going back to &lt;a href=&quot;https://www.youtube.com/watch?v=CqMyvObJqnk&quot;&gt;non-indexed shifters&lt;/a&gt;
so they can use any kind of mech drivetrain.&lt;/p&gt;

&lt;p&gt;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 &lt;a href=&quot;https://bikepacking.com/&quot;&gt;bikepacking&lt;/a&gt; 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.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;running&quot;&gt;Running&lt;/h3&gt;

&lt;p&gt;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 &lt;em&gt;singlets&lt;/em&gt; for helping me survive the heat. I
picked up a &lt;a href=&quot;https://www.bakline.nyc/&quot;&gt;Bakline&lt;/a&gt; one and
have been impressed. I see &lt;a href=&quot;https://www.tracksmith.com/&quot;&gt;Tracksmith&lt;/a&gt;
gear constantly, and it’s good too, but I fear that some of these
running brands are getting a ‘fashion brand’ markup.&lt;/p&gt;

&lt;p&gt;It’s hard to compete with DC and San Francisco as running cities.
The DC region is &lt;a href=&quot;https://www.washingtonpost.com/dc-md-va/2024/07/25/arlington-dc-fittest-cities/&quot;&gt;the ‘fittest’ in the country&lt;/a&gt;
there are great trails in Rock Creek Park and super wide
sidewalks in some neighborhoods.
San Francisco has &lt;a href=&quot;https://macwright.com/hills/&quot;&gt;spectacular hills&lt;/a&gt;
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.&lt;/p&gt;

&lt;p&gt;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 &lt;a href=&quot;https://www.parkrun.us/crissyfield/&quot;&gt;free weekly 5k called Park Run&lt;/a&gt;
(part of a global network of events), but it was cancelled in 2020.
Brooklyn doesn’t have a Park Run, but it has the &lt;a href=&quot;https://runsignup.com/Race/NY/Brooklyn/AlGoldsteinSummerSpeedSeries&quot;&gt;Al Goldstein&lt;/a&gt;
race series, which is about $15, competitive, and well-run.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-08-01-recently-citystrides.png&quot; alt=&quot;CityStrides&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’ve competed 10.24% of Brooklyn so far on
&lt;a href=&quot;https://citystrides.com/&quot;&gt;CityStrides&lt;/a&gt;: progress has stalled
because I’ve been just running Prospect Park loops over
and over again to get in shape for 5ks.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;listening&quot;&gt;Listening&lt;/h2&gt;

&lt;iframe style=&quot;border: 0; width: 100%; height: 120px;&quot; src=&quot;https://bandcamp.com/EmbeddedPlayer/album=550085996/size=large/bgcol=ffffff/linkcol=333333/tracklist=false/artwork=small/track=962985204/transparent=true/&quot; seamless=&quot;&quot;&gt;&lt;a href=&quot;https://mississippirecords.bandcamp.com/album/jessie-mae-hemphill&quot;&gt;Jessie Mae Hemphill by Jessie Mae Hemphill&lt;/a&gt;&lt;/iframe&gt;

&lt;p&gt;I started listening to brat but was disappointed. The biggest
find of the last few months has been &lt;a href=&quot;https://en.wikipedia.org/wiki/Jessie_Mae_Hemphill&quot;&gt;Jessie Mae Hemphill&lt;/a&gt;,
who I embarrassingly discovered because her song ‘Tell Me You Love Me’
came on the rotation in a Chipotle.&lt;/p&gt;

&lt;h2 id=&quot;reading&quot;&gt;Reading&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Oh man&lt;/em&gt;, &lt;a href=&quot;https://macwright.com/2024/07/07/world-beyond-your-head&quot;&gt;The World Beyond Your Head&lt;/a&gt; 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.&lt;/p&gt;

&lt;h2 id=&quot;watching&quot;&gt;Watching&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Kinds_of_Kindness&quot;&gt;Kinds of Kindness&lt;/a&gt; was great:
I’ve now watched &lt;a href=&quot;https://letterboxd.com/director/yorgos-lanthimos/&quot;&gt;29% of Yorgos Lanthimos&lt;/a&gt;
films and love his style.&lt;/p&gt;
</description>
      <pubDate>Thu, 01 Aug 2024 00:00:00 +0000</pubDate>
      <link>https://macwright.com/2024/08/01/recently.html</link>
      <guid isPermaLink="true">https://macwright.com/2024/08/01/recently.html</guid>
    </item>
    
    <item>
      <title>Reverse engineering a day’s worth of websites</title>
      <dc:creator>Tom MacWright</dc:creator>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;meta name=generator&lt;/code&gt; 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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The websites&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#fastmail&quot;&gt;Fastmail&lt;/a&gt;: custom framework ‘Overture’, custom protocols&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#kagi&quot;&gt;Kagi&lt;/a&gt;: Vanilla JavaScript&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#github&quot;&gt;GitHub&lt;/a&gt;: Ruby on Rails + React + Web Components&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#linear&quot;&gt;Linear&lt;/a&gt;: React + the kitchen sink&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#discord&quot;&gt;Discord&lt;/a&gt;: React&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#sentry&quot;&gt;Sentry&lt;/a&gt;: React (open source)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#obsidian&quot;&gt;Obsidian&lt;/a&gt;: Vanilla JavaScript + CodeMirror customized to the hilt&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#signal&quot;&gt;Signal&lt;/a&gt;: React (open source)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#reddit&quot;&gt;Reddit&lt;/a&gt;: Web Components&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#lichess&quot;&gt;Lichess&lt;/a&gt;: Snabbdom&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;fastmail&quot;&gt;Fastmail&lt;/h2&gt;

&lt;p&gt;I’ve used &lt;a href=&quot;https://www.fastmail.com/&quot;&gt;Fastmail&lt;/a&gt; for &lt;a href=&quot;https://macwright.com/2018/04/26/leaving-google&quot;&gt;six years&lt;/a&gt; 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 &lt;a href=&quot;https://union.place/@fastmailunited&quot;&gt;laid of 60% of the bargaining unit of a union that attempted to get a contract&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Fastmail’s architecture is pretty cool! They have their own frontend framework called &lt;a href=&quot;https://github.com/fastmail/overture&quot;&gt;Overture&lt;/a&gt;, their own rich text editor called &lt;a href=&quot;https://github.com/fastmail/Squire&quot;&gt;Squire&lt;/a&gt;, and they are the main authors of &lt;a href=&quot;https://jmap.io/&quot;&gt;jmap&lt;/a&gt;, a standard that aims to be the successor to IMAP/POP, but contains a lot of interesting batch query ideas.&lt;/p&gt;

&lt;p&gt;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 &amp;amp; responses.&lt;/p&gt;

&lt;h2 id=&quot;kagi&quot;&gt;Kagi&lt;/h2&gt;

&lt;p&gt;I’ve been using &lt;a href=&quot;https://kagi.com/&quot;&gt;Kagi&lt;/a&gt; as a Google alternative for searching. It’s pretty great. There are &lt;a href=&quot;https://d-shoot.net/kagi.html&quot;&gt;reasons to doubt them&lt;/a&gt;, but the pros outweigh the cons for me, and it is not easy to find a high-quality search engine.&lt;/p&gt;

&lt;p&gt;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 &lt;a href=&quot;https://floating-ui.com/&quot;&gt;floating-ui&lt;/a&gt;, the excellent library for positioning floating elements like tooltips and popovers, that might become unnecessary because the &lt;a href=&quot;https://developer.chrome.com/blog/anchor-positioning-api&quot;&gt;CSS anchor spec will provide that functionality at the platform level&lt;/a&gt; but for now is an absolute godsend and we use it at &lt;a href=&quot;https://www.val.town/&quot;&gt;Val Town&lt;/a&gt; because both &lt;a href=&quot;https://www.radix-ui.com/primitives/docs/components/tooltip&quot;&gt;Radix&lt;/a&gt; and &lt;a href=&quot;https://github.com/tailwindlabs/headlessui&quot;&gt;Headlessui&lt;/a&gt; use floating-ui to solve some of the positioning math for them.&lt;/p&gt;

&lt;h2 id=&quot;github&quot;&gt;GitHub&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;GitHub is famously a &lt;a href=&quot;https://rubyonrails.org/&quot;&gt;Ruby on Rails&lt;/a&gt; shop, and they used to really embrace that style of frontend experience: they published a &lt;a href=&quot;https://github.com/github/github-elements&quot;&gt;set of web components&lt;/a&gt; which were extremely good quality, powered a lot of UI using HTML fundamentals - &lt;a href=&quot;https://github.com/muan/details-on-details&quot;&gt;muan’s writing about the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;details&amp;gt;&lt;/code&gt; element is a classic of the genre&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;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&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;GET https://github.com/users/tmcwe/hovercard…
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;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 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@&lt;/code&gt; in a text field - the list of autocomplete options were genuine HTML returned in an HTTP response. &lt;a href=&quot;https://htmx.org/&quot;&gt;htmx&lt;/a&gt; is re-popularizing this pattern, but GitHub was doing it with web components and the Rails patterns now known under the &lt;a href=&quot;https://hotwired.dev/&quot;&gt;hotwired.dev&lt;/a&gt; project group.&lt;/p&gt;

&lt;p&gt;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 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;details&amp;gt;&lt;/code&gt; element, which brings me joy.&lt;/p&gt;

&lt;h2 id=&quot;linear&quot;&gt;Linear&lt;/h2&gt;

&lt;p&gt;We’ve been managing our tasks with &lt;a href=&quot;https://linear.app/&quot;&gt;Linear&lt;/a&gt;. 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.&lt;/p&gt;

&lt;p&gt;But there’s no denying that Linear is a work of art when it comes to engineering. I’ve studied the &lt;a href=&quot;https://www.youtube.com/watch?v=WxK11RsLqp4&amp;amp;t=2175s&quot;&gt;videos about how Linear implemented&lt;/a&gt; sync and &lt;a href=&quot;https://www.youtube.com/watch?v=Wo2m3jaJixU&quot;&gt;scaled it&lt;/a&gt; in depth for when I was trying to build my own sync system. They heavily use &lt;a href=&quot;https://github.com/mobxjs/mobx&quot;&gt;MobX&lt;/a&gt;, a state management system based on Observables (not to be confused with &lt;a href=&quot;https://observablehq.com/&quot;&gt;Observable&lt;/a&gt;). Using computed and reactive state has never felt right to me so I’ve stuck with systems like &lt;a href=&quot;https://jotai.org/&quot;&gt;Jotai&lt;/a&gt;, 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.&lt;/p&gt;

&lt;p&gt;Linear is a &lt;a href=&quot;https://react.dev/&quot;&gt;React&lt;/a&gt; app, and quite a big one.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;They use &lt;a href=&quot;https://prosemirror.net/&quot;&gt;Prosemirror&lt;/a&gt; for editing text - the other library from &lt;a href=&quot;https://marijnhaverbeke.nl/&quot;&gt;Marijn&lt;/a&gt;, who also wrote &lt;a href=&quot;https://codemirror.net/&quot;&gt;CodeMirror&lt;/a&gt;. He is a hero of the internet.&lt;/li&gt;
  &lt;li&gt;They use &lt;a href=&quot;https://nivo.rocks/&quot;&gt;Nivo&lt;/a&gt; for data visualization components, like those line/area charts of cycle progress.&lt;/li&gt;
  &lt;li&gt;They use &lt;a href=&quot;https://sentry.io/&quot;&gt;Sentry&lt;/a&gt; for catching and tracking bugs, &lt;a href=&quot;https://react-spring.dev/docs&quot;&gt;react-spring&lt;/a&gt; for animation, and &lt;a href=&quot;https://en.wikipedia.org/wiki/GraphQL&quot;&gt;GraphQL&lt;/a&gt; for querying remote data.&lt;/li&gt;
  &lt;li&gt;I think that Linear is using &lt;a href=&quot;https://popper.js.org/docs/v2/tutorial/&quot;&gt;Popper&lt;/a&gt; predecessor to floating-ui, for its right-click menus and the like.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;discord&quot;&gt;Discord&lt;/h2&gt;

&lt;p&gt;My team at work uses &lt;a href=&quot;https://discord.com/&quot;&gt;Discord&lt;/a&gt; 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 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA&quot;&gt;ARIA accessibility&lt;/a&gt; attributes. Good job, folks!&lt;/p&gt;

&lt;p&gt;Discord is famously an &lt;a href=&quot;https://elixir-lang.org/blog/2020/10/08/real-time-communication-at-scale-with-elixir-at-discord/&quot;&gt;Elixir shop&lt;/a&gt; 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 &lt;a href=&quot;https://en.wikipedia.org/wiki/Erlang_%28programming_language%29#Usage&quot;&gt;WhatsApp success story&lt;/a&gt;. There is a lot of very fancy WebSocket-based binary-encoding streaming happening under the hood for Discord.&lt;/p&gt;

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

&lt;ul&gt;
  &lt;li&gt;Discord is still using &lt;a href=&quot;https://webpack.js.org/&quot;&gt;webpack&lt;/a&gt;, 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.&lt;/li&gt;
  &lt;li&gt;Discord is using React, and surprisingly has a bunch of &lt;a href=&quot;https://legacy.reactjs.org/docs/components-and-props.html&quot;&gt;class components&lt;/a&gt;! 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.&lt;/li&gt;
  &lt;li&gt;They use &lt;a href=&quot;https://airbnb.io/lottie/#/&quot;&gt;Lottie&lt;/a&gt;, a library that lets you render animated graphics exported from After Effects, and &lt;a href=&quot;https://github.com/react-dnd/react-dnd&quot;&gt;react-dnd&lt;/a&gt; for drag &amp;amp; drop. They also have &lt;a href=&quot;https://immutable-js.com/&quot;&gt;Immutable-JS&lt;/a&gt; in the bundle, a library that I used heavily back in &lt;a href=&quot;https://www.mapbox.com/mapbox-studio&quot;&gt;Mapbox Studio&lt;/a&gt; but probably wouldn’t use today because it has a pretty high overhead and a costly learning curve for the rest of the team.&lt;/li&gt;
  &lt;li&gt;Like Linear, there’s &lt;a href=&quot;https://sentry.io/&quot;&gt;Sentry&lt;/a&gt; for catching and tracking bugs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;sentry&quot;&gt;Sentry&lt;/h2&gt;

&lt;p&gt;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 &lt;a href=&quot;https://github.com/getsentry/sentry&quot;&gt;open source!&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;obsidian&quot;&gt;&lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://macwright.com/2024/06/16/how-i-use-obsidian&quot;&gt;I use Obsidian quite a lot&lt;/a&gt;. 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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Like Linear and Discord, Obsidian works as an embedded webview: it’s using
&lt;a href=&quot;https://www.electronjs.org/&quot;&gt;Electron&lt;/a&gt; as a wrapper.&lt;/p&gt;

&lt;p&gt;The main editing view of Obsidian is powered by &lt;a href=&quot;https://codemirror.net/&quot;&gt;CodeMirror&lt;/a&gt;,
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.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;They have a bit of technical debt (if I can call it that) in continued use
of &lt;a href=&quot;https://momentjs.com/&quot;&gt;Moment&lt;/a&gt;, a JavaScript library for parsing and manipulating
dates, which is pretty thoroughly deprecated.&lt;/li&gt;
  &lt;li&gt;They use &lt;a href=&quot;https://github.com/mixmark-io/turndown&quot;&gt;turndown&lt;/a&gt; to convert pasted
HTML content into Markdown.&lt;/li&gt;
  &lt;li&gt;They use &lt;a href=&quot;https://github.com/mathjax/MathJax&quot;&gt;MathJAX&lt;/a&gt; for embedded &lt;a href=&quot;https://www.latex-project.org/&quot;&gt;LaTeX&lt;/a&gt;
math equation support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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!&lt;/p&gt;

&lt;h2 id=&quot;signal&quot;&gt;Signal&lt;/h2&gt;

&lt;p&gt;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 &lt;a href=&quot;https://ssd.eff.org/&quot;&gt;pretty good&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Signal macOS app is yet another website in an electron
wrapper. It doesn’t require any reverse-engineering because
&lt;a href=&quot;https://github.com/signalapp/Signal-Desktop&quot;&gt;it’s open source&lt;/a&gt;.
The app is yet another React application, that uses &lt;a href=&quot;https://redux.js.org/&quot;&gt;Redux&lt;/a&gt; to manage state,
some bits of &lt;a href=&quot;https://react-spectrum.adobe.com/react-aria/&quot;&gt;react-aria&lt;/a&gt;
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.&lt;/p&gt;

&lt;h2 id=&quot;reddit&quot;&gt;Reddit&lt;/h2&gt;

&lt;p&gt;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 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_components&quot;&gt;Web Components&lt;/a&gt;
and custom elements. I’ve been writing about
&lt;a href=&quot;https://macwright.com/2024/01/24/on-web-components&quot;&gt;the lack of web components success stories&lt;/a&gt;, 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.&lt;/p&gt;

&lt;p&gt;They’re using &lt;a href=&quot;https://lit.dev/&quot;&gt;lit-html&lt;/a&gt; for templating,
and a custom set of components that they seem to call ‘shreddit’
internally.&lt;/p&gt;

&lt;h2 id=&quot;lichess&quot;&gt;Lichess&lt;/h2&gt;

&lt;p&gt;My other distraction is &lt;a href=&quot;https://lichess.org/&quot;&gt;Lichess&lt;/a&gt;. I play
a lot of chess. My rating has plummeted but I’m getting it back.&lt;/p&gt;

&lt;p&gt;No mystery here - &lt;a href=&quot;https://lichess.org/source&quot;&gt;Lichess is open source&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;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 &lt;a href=&quot;https://github.com/snabbdom/snabbdom&quot;&gt;snabbdom&lt;/a&gt;
to build frontend components.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;takeaways&quot;&gt;Takeaways&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;For these kinds of web-applications, React is pretty common!&lt;/li&gt;
  &lt;li&gt;All applications have a bit of technical debt.&lt;/li&gt;
  &lt;li&gt;Two of my favorite applications had weird stacks (Fastmail and Lichess)&lt;/li&gt;
  &lt;li&gt;Long-lived websites like GitHub are more likely to have mixed stacks&lt;/li&gt;
  &lt;li&gt;Reddit is the first example of a Web Component-based site that I use&lt;/li&gt;
  &lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
</description>
      <pubDate>Tue, 30 Jul 2024 00:00:00 +0000</pubDate>
      <link>https://macwright.com/2024/07/30/reverse-engineer-a-day.html</link>
      <guid isPermaLink="true">https://macwright.com/2024/07/30/reverse-engineer-a-day.html</guid>
    </item>
    
    <item>
      <title>Obsidian Freeform</title>
      <dc:creator>Tom MacWright</dc:creator>
      <description>&lt;p&gt;&lt;em&gt;Prefer video? You can also &lt;a href=&quot;https://www.youtube.com/watch?v=7LhMavEpNSE&quot;&gt;watch an intro video that I recorded for this on YouTube&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://obsidian.md/plugins?id=freeform&quot;&gt;Obsidian Freeform&lt;/a&gt; is an extremely
small &lt;a href=&quot;https://obsidian.md&quot;&gt;Obsidian&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;For example, I recently learned about the availability of &lt;em&gt;mortgage discounts&lt;/em&gt;
from some banks in exchange for having a high balance. I am
&lt;a href=&quot;https://macwright.com/2023/12/21/homeownership&quot;&gt;not buying a house&lt;/a&gt;, 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:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-06-02-freeform-chart-of-mortgage-discounts.png&quot; alt=&quot;Chart of mortgage discounts&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It seems like mortgage discounts are mostly &lt;a href=&quot;https://www.reddit.com/r/fatFIRE/comments/q7od36/brokerage_mortgage_discounts/&quot;&gt;a bad idea&lt;/a&gt;, but now I at least have a quick visual
reference for how they work across multiple banks.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The font I’m using in that screenshot is &lt;a href=&quot;https://github.com/iaolo/iA-Fonts&quot;&gt;iA Writer Quattro&lt;/a&gt;,
and the theme is &lt;a href=&quot;https://github.com/kepano/obsidian-minimal&quot;&gt;minimal&lt;/a&gt;,
both of which I learned about from &lt;a href=&quot;https://www.everydayobsidian.com&quot;&gt;Everyday Obsidian&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;/h3&gt;

&lt;p&gt;The code is &lt;a href=&quot;https://github.com/tmcw/obsidian-freeform/blob/6ec2e0e391650cdad8a89399b2d1c0420f5643d7/main.js&quot;&gt;small enough to read in a few minutes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Obsidian Freeform adds a new code block type to Obsidian, tagged with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;freeform&lt;/code&gt;.
Here’s the simplest possible block:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;```freeform
display(1);
```
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When this block is displayed, it creates an iframe in your Obsidian document
and injects the code &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;display(1)&lt;/code&gt; into it via a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import&quot;&gt;dynamic import&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why inject the code as a dynamic import? Because I want to make it possible to use
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;import&lt;/code&gt; within your custom code to import modules, and import &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#description&quot;&gt;needs to be top-level&lt;/a&gt;. In practice,
this detail shouldn’t matter to you.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The display method comes from
&lt;a href=&quot;https://github.com/observablehq/inspector&quot;&gt;observablehq/inspector&lt;/a&gt;, which is
added to the global namespace as &lt;strong&gt;display&lt;/strong&gt;, just like how it works
&lt;a href=&quot;https://observablehq.com/framework/javascript#display(value)&quot;&gt;in Observable Framework&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;There is no &lt;a href=&quot;https://observablehq.com/framework/javascript#implicit-display&quot;&gt;implicit display&lt;/a&gt;
in Obsidian Freeform, and while it provides a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;width&lt;/code&gt; 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.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;example-making-charts-with-observable-plot&quot;&gt;Example: Making charts with Observable Plot&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-06-02-freeform-observable-plot-example-of-a-house.png&quot; alt=&quot;Observable Plot example of a house&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can recreate a lot of &lt;a href=&quot;https://observablehq.com&quot;&gt;Observable&lt;/a&gt; examples in Freeform.
Generally, the gap between the two is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plot&lt;/strong&gt; isn’t available globally. You have to import it from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jsdelivr&lt;/code&gt; like:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Plot&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;https://cdn.jsdelivr.net/npm/@observablehq/plot@0.6/+esm&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But then you’re basically good to go, as long as you remember:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It’s just JavaScript, not Observable-flavored JavaScript, so you
need to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;let&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;const&lt;/code&gt; in front of variables.&lt;/li&gt;
  &lt;li&gt;There’s no implicit display, so you need to call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;display()&lt;/code&gt;
if you want to display something.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;example-loading-data-from-dataview&quot;&gt;Example: Loading data from Dataview&lt;/h3&gt;

&lt;p&gt;I use the fantastic &lt;a href=&quot;https://blacksmithgu.github.io/obsidian-dataview/&quot;&gt;Dataview Obsidian plugin&lt;/a&gt;
to do things like show charts of all the electronics I have in my house and which
batteries they require.&lt;/p&gt;

&lt;p&gt;Because the Obsidian context is available via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window.top&lt;/code&gt; in Obsidian Freeform,
I can access the Dataview JavaScript API:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-06-02-freeform-things-i-own-cost-vs-when-i-bought-them.png&quot; alt=&quot;Things I own cost vs when I bought them&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Plot&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;https://cdn.jsdelivr.net/npm/@observablehq/plot@0.6/+esm&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;items&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;dataview&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;api&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`table price, purchased, color
from &quot;03 Stuff&quot;
where price and sold = undefined
sort purchased desc`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;mapped&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;values&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;toMillis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()),&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nf&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Plot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mapped&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;plot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;No, I don’t think &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window.top.app.plugins.plugins.dataview.api&lt;/code&gt; is a graceful,
beautiful line of code, but it works and it’s explicit.&lt;/p&gt;

&lt;h3 id=&quot;example-loading-data-from-a-table&quot;&gt;Example: Loading data from a table&lt;/h3&gt;

&lt;p&gt;One of my few complaints with Obsidian is that it doesn’t &lt;a href=&quot;https://github.com/obsidianmd/obsidian-api/issues/84&quot;&gt;expose its own Markdown parser&lt;/a&gt;
and the internal syntax tree for its CodeMirror instance tree is
&lt;a href=&quot;https://forum.obsidian.md/t/using-a-decoration-instead-of-a-markdown-code-block-postprocessor/79718&quot;&gt;oddly structured and undocumented&lt;/a&gt;. So it’s tough for a plugin to interact
with notes in a structured way.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-06-02-freeform-parsing-a-table.png&quot; alt=&quot;Parsing a table&quot; /&gt;&lt;/p&gt;

&lt;p&gt;But Freeform makes this &lt;del&gt;easy&lt;/del&gt; 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:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;unified&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;https://esm.sh/unified?bundle&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;remarkGfm&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;https://esm.sh/remark-gfm?bundle&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;toString&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;https://esm.sh/mdast-util-to-string?bundle&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;remarkParse&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;https://esm.sh/remark-parse@11?bundle&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;remarkFrontmatter&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;https://esm.sh/remark-frontmatter?bundle&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;selectAll&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;https://esm.sh/unist-util-select?bundle&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;autoType&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;https://esm.sh/d3-dsv&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;md&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;workspace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;activeEditor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;editor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getDoc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;unified&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;remarkParse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;remarkGfm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;remarkFrontmatter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;md&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;selectAll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;header&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;rows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;autoType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;fromEntries&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;header&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])));&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;nf&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I think this is pretty cool. The magic ingredients here are totally free
access to NPM modules like &lt;a href=&quot;https://remark.js.org&quot;&gt;remark&lt;/a&gt;, 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.&lt;/p&gt;

&lt;p&gt;The plugin is basically those things and not much more, but it adds up to a lot.&lt;/p&gt;

&lt;h2 id=&quot;annoyance-the-edit-cycle&quot;&gt;Annoyance: the edit cycle&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;I wish that this plugin used a &lt;a href=&quot;https://forum.obsidian.md/t/using-a-decoration-instead-of-a-markdown-code-block-postprocessor/79718&quot;&gt;Decoration instead of a markdown code block processor&lt;/a&gt;: 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 &lt;a href=&quot;https://help.obsidian.md/Editing+and+formatting/Obsidian+Flavored+Markdown&quot;&gt;Obsidian flavored Markdown&lt;/a&gt; will play with these parsers.&lt;/p&gt;

&lt;h2 id=&quot;missing-reactive-blocks-and-shared-variables&quot;&gt;Missing: Reactive blocks and shared variables&lt;/h2&gt;

&lt;p&gt;You can technically set variables in one block using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window.top.foo = 1&lt;/code&gt; 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.&lt;/p&gt;

&lt;p&gt;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 &lt;a href=&quot;https://github.com/tmcw/obsidian-freeform/issues/8&quot;&gt;an idea of response caching&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;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.”&lt;/p&gt;

&lt;p&gt;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 &lt;a href=&quot;https://github.com/tldraw/signia&quot;&gt;a reactive signals module like signia&lt;/a&gt;
for them and put them in userspace.&lt;/p&gt;

&lt;h2 id=&quot;caveats-security&quot;&gt;Caveats: Security&lt;/h2&gt;

&lt;p&gt;As some of these examples demonstrate, you can reach up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window.top&lt;/code&gt; and access
APIs from Obsidian. This is super powerful: it enables access to the Dataview
API, lets you access Obsidian’s own APIs.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;I think that a separate-origin version of this plugin is possible in which &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window.top&lt;/code&gt;
is inaccessible, which would give a different power / security tradeoff.&lt;/p&gt;

&lt;h2 id=&quot;caveats-just-javascript&quot;&gt;Caveats: Just JavaScript&lt;/h2&gt;

&lt;p&gt;There are more accessible ways to create charts in Obsidian, like the
&lt;a href=&quot;https://charts.phib.ro/Meta/Charts/Charts+Documentation&quot;&gt;Charts plugin&lt;/a&gt;. There is
basically no abstraction in using Freeform, so it requires knowledge of JavaScript.&lt;/p&gt;

&lt;h2 id=&quot;how-does-this-compare-to-dataviewjs-blocks&quot;&gt;How does this compare to DataviewJS blocks?&lt;/h2&gt;

&lt;p&gt;I love the Dataview plugin, and it has a &lt;a href=&quot;https://blacksmithgu.github.io/obsidian-dataview/api/intro/&quot;&gt;codeblock way to run JavaScript code,
including access to its API&lt;/a&gt;.
How is Freeform different?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;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.&lt;/li&gt;
  &lt;li&gt;dataviewjs runs via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eval&lt;/code&gt;, whereas Freeform runs code via a dynamic &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;import()&lt;/code&gt;,
so you can use ES module &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;import&lt;/code&gt; statements to pull in new modules in Freeform,
whereas you can’t in dataviewjs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window.top.app.plugins.plugins.dataview.api&lt;/code&gt;
variable reference and deal with the fact that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Date&lt;/code&gt; objects have separate
prototype identities when transferred between frame contexts.&lt;/p&gt;

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

&lt;hr /&gt;

&lt;p&gt;You can &lt;a href=&quot;https://obsidian.md/plugins?id=freeform&quot;&gt;install Freeform in Obsidian&lt;/a&gt;,
and here’s &lt;a href=&quot;https://github.com/tmcw/obsidian-freeform&quot;&gt;a link to the GitHub repo for the plugin!&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Sun, 02 Jun 2024 00:00:00 +0000</pubDate>
      <link>https://macwright.com/2024/06/02/freeform.html</link>
      <guid isPermaLink="true">https://macwright.com/2024/06/02/freeform.html</guid>
    </item>
    
    <item>
      <title>Recently</title>
      <dc:creator>Tom MacWright</dc:creator>
      <description>&lt;p&gt;If you’re reading this on &lt;a href=&quot;https://macwright.com&quot;&gt;macwright.com&lt;/a&gt;,
you might have noticed that the website got a very slight upgrade
this month. I’ve been publishing a lot of content in the
&lt;a href=&quot;https://macwright.com/micro&quot;&gt;/micro/&lt;/a&gt; section, and I update
my &lt;a href=&quot;https://macwright.com/reading/&quot;&gt;/reading/&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;I do have a few proper blog posts in the queue - I’ve written
a tiny &lt;a href=&quot;https://x.com/tmcw/status/1795576345642365117&quot;&gt;Obsidian plugin&lt;/a&gt;
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
&lt;a href=&quot;https://www.val.town/&quot;&gt;Val Town&lt;/a&gt; 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 &lt;a href=&quot;https://blog.val.town/blog/migrating-from-supabase/&quot;&gt;a big migration&lt;/a&gt;,
I’m not trying to get a reputation slagging off other startups.&lt;/p&gt;

&lt;p&gt;So: what happened in May? I made my way to &lt;a href=&quot;https://2024.satsummit.io/&quot;&gt;SatSummit&lt;/a&gt;, a conference in DC held
by my first employer, &lt;a href=&quot;https://developmentseed.org/&quot;&gt;Development Seed&lt;/a&gt;, which
is absolutely thriving now: working on big projects with a big
team. They’re still &lt;a href=&quot;https://developmentseed.org/community/&quot;&gt;building in the open&lt;/a&gt;, 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.&lt;/p&gt;

&lt;p&gt;In New York, Val Town &lt;a href=&quot;https://blog.val.town/blog/val-town-newsletter-17/&quot;&gt;has grown the team&lt;/a&gt;
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.&lt;/p&gt;

&lt;h2 id=&quot;reading&quot;&gt;Reading&lt;/h2&gt;

&lt;p&gt;I had to declare &lt;a href=&quot;https://www.instapaper.com/&quot;&gt;Instapaper&lt;/a&gt; bankruptcy again:
I just don’t have the time to read everything on the internet. Still, found
some nice words:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From &lt;a href=&quot;https://www.staygrounded.online/p/future-grandmasters-of-the-attention&quot;&gt;Future Grandmasters of the Attention Game&lt;/a&gt;. 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.&lt;/p&gt;

&lt;p&gt;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.”&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you only read one thing about “generative AI”, make it
this &lt;a href=&quot;https://www.wired.com/story/generative-ai-totally-shameless/&quot;&gt;Paul Ford piece on Wired&lt;/a&gt;, which I think perfectly
captures the feeling of chatting with a GPT.&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://www.construction-physics.com/p/what-makes-housing-so-expensive&quot;&gt;Construction Physics talks about the cost of a new home&lt;/a&gt;.
The punchline to its statement about land cost is that in major cities,
the land cost &lt;em&gt;is&lt;/em&gt; the main component of homes. In San Jose,
the most expensive and mediocre place on Planet Earth, land accounts
for 80% of costs.&lt;/p&gt;

&lt;p&gt;It’s well-understood at this point that most of the YIMBY movement
is talking about building in major cities, not in minor suburbs.
&lt;a href=&quot;https://www.strongtowns.org/&quot;&gt;Strong Towns&lt;/a&gt; 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 - &lt;a href=&quot;https://en.wikipedia.org/wiki/Rural_areas_in_the_United_States&quot;&gt;not many people live out there&lt;/a&gt; and zoning
isn’t a big problem.&lt;/p&gt;

&lt;p&gt;Part of the implicit sentiment that should be stated clearly is that
&lt;strong&gt;encouraging housing in cities is important because more people
should live in cities because suburbs are dramatically
worse for the environment&lt;/strong&gt;.
There are &lt;a href=&quot;https://www.nytimes.com/interactive/2022/12/13/climate/climate-footprint-map-neighborhood.html&quot;&gt;plenty of maps&lt;/a&gt; and &lt;a href=&quot;https://theconversation.com/suburban-living-the-worst-for-carbon-emissions-new-research-149332&quot;&gt;studies&lt;/a&gt;
proving this out.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;the-typescript-situation&quot;&gt;The TypeScript situation&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I complained a bit about the TypeScript / LSP state of the art, and
&lt;a href=&quot;https://ghuntley.com/fracture/&quot;&gt;Geoffrey Huntley&lt;/a&gt;’s article got linked.
It’s pretty related.&lt;/p&gt;

&lt;p&gt;For context, because this is a bit of inside baseball:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Programming languages usually require some “editor tooling” like
autocomplete, linting, jumping from one symbol to another, and so on.&lt;/li&gt;
  &lt;li&gt;Microsoft invented the &lt;a href=&quot;https://microsoft.github.io/language-server-protocol/&quot;&gt;Language Server Protocol&lt;/a&gt; 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.&lt;/li&gt;
  &lt;li&gt;Microsoft also invented &lt;a href=&quot;https://www.typescriptlang.org/&quot;&gt;TypeScript&lt;/a&gt;, a quite good programming language that I’ve used quite a lot.&lt;/li&gt;
  &lt;li&gt;Microsoft also created &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt;, a code editor that I don’t like but everyone else does and that’s fine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.”&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/microsoft/TypeScript/issues/39459&quot;&gt;They didn’t&lt;/a&gt;. If you’ve
used TypeScript with another editor, you’ve probably been using
the &lt;a href=&quot;https://github.com/typescript-language-server/typescript-language-server&quot;&gt;typescript-language-server&lt;/a&gt; project, which was maintained by
&lt;a href=&quot;https://www.typefox.io/&quot;&gt;TypeFox&lt;/a&gt; and is now just maintained by
enthusiasts. But, it doesn’t work that well, so there are
projects like &lt;a href=&quot;https://github.com/pmizio/typescript-tools.nvim&quot;&gt;typescript-tools.nvim&lt;/a&gt;, &lt;a href=&quot;https://github.com/yioneko/vtsls&quot;&gt;vtsls&lt;/a&gt;, which try to integrate
with TypeScript the same way that VS Code does, or extensions
that straight-up &lt;a href=&quot;https://github.com/neoclide/coc-tsserver&quot;&gt;fork the VS Code code&lt;/a&gt; to try to make it work with other editors.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;I’m less familiar with the Python ecosystem but reportedly something
similar is happening there too - &lt;a href=&quot;https://devblogs.microsoft.com/python/announcing-pylance-fast-feature-rich-language-support-for-python-in-visual-studio-code/&quot;&gt;Pylance&lt;/a&gt; integrates tightly with VS Code and has advanced features, but
it’s a &lt;a href=&quot;https://github.com/microsoft/pylance-release&quot;&gt;proprietary extension with a “documentation and releases” repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, I notice this scenario because I use &lt;a href=&quot;https://neovim.io/&quot;&gt;neovim&lt;/a&gt; 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 &lt;a href=&quot;https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API&quot;&gt;saddest, least-maintained Wiki page&lt;/a&gt; of barebones documentation,
whereas things would just work, if I were to give up and use
VS Code locally and Monaco in the application.&lt;/p&gt;

&lt;p&gt;It is what it is – a nerdy childhood of following the &lt;a href=&quot;https://en.wikipedia.org/wiki/United_States_v._Microsoft_Corp.&quot;&gt;Microsoft
antitrust cases&lt;/a&gt;
and an adulthood of reading about &lt;a href=&quot;https://macwright.com/2020/08/21/capital&quot;&gt;the excesses of capital&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;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 &lt;em&gt;that Microsoft also developed&lt;/em&gt; gives me flashbacks
to the old Microsoft, the bad one.&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;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.&lt;/p&gt;

  &lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Speaking of megacorporations doing things that trust the public’s
trust and patience, this month had a &lt;a href=&quot;https://sparktoro.com/blog/an-anonymous-source-shared-thousands-of-leaked-google-search-api-documents-with-me-everyone-in-seo-should-see-them/&quot;&gt;big leak of documentation
about Google Search&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I can see two sides of this issue:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;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.&lt;/li&gt;
  &lt;li&gt;However, Google has made public claims about their algorithm and those appear to include, ahem, lies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;watching--listening&quot;&gt;Watching / listening&lt;/h3&gt;

&lt;p&gt;I watched &lt;a href=&quot;https://letterboxd.com/film/in-bruges/&quot;&gt;In Bruges&lt;/a&gt;, which had
been on the list for a long time.&lt;/p&gt;

&lt;iframe style=&quot;border: 0; width: 100%; height: 120px;&quot; src=&quot;https://bandcamp.com/EmbeddedPlayer/album=466244919/size=large/bgcol=ffffff/linkcol=333333/tracklist=false/artwork=small/transparent=true/&quot; seamless=&quot;&quot;&gt;&lt;a href=&quot;https://acetone1992.bandcamp.com/album/1992-2001&quot;&gt;1992 - 2001 by Acetone&lt;/a&gt;&lt;/iframe&gt;

&lt;p&gt;The only new music that popped up this month as Acetone, via
&lt;a href=&quot;https://www.blankforms.org/&quot;&gt;Blank Forms&lt;/a&gt;, a tremendously hip
living room concert series in Brooklyn that I occasionally
visit.&lt;/p&gt;
</description>
      <pubDate>Sat, 01 Jun 2024 00:00:00 +0000</pubDate>
      <link>https://macwright.com/2024/06/01/recently.html</link>
      <guid isPermaLink="true">https://macwright.com/2024/06/01/recently.html</guid>
    </item>
    
    <item>
      <title>Recently</title>
      <dc:creator>Tom MacWright</dc:creator>
      <description>&lt;p&gt;Hello from sunny Brooklyn, where it’s suddenly summer. What’s new?&lt;/p&gt;

&lt;p&gt;Over at the &lt;a href=&quot;https://blog.val.town/blog/search-notes/&quot;&gt;Val Town Blog, I wrote about how searching source code is a pretty
hard problem&lt;/a&gt;. 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 &lt;a href=&quot;https://github.com/quickwit-oss/tantivy&quot;&gt;Tantivy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-05-01-recently-me-running-a-half-marathon.jpeg&quot; alt=&quot;Me running a half marathon&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is a big year for running, so far. My first race of the year is
complete - the Brooklyn Half Marathon. I ran &lt;a href=&quot;https://nycruns.com/race-results?race=nycruns-brooklyn-half-marathon-2024&amp;amp;result=1490409&quot;&gt;1:36:21&lt;/a&gt; (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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-05-01-recently-eclipse.jpeg&quot; alt=&quot;Eclipse&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We went to see the &lt;a href=&quot;https://en.wikipedia.org/wiki/Solar_eclipse_of_April_8,_2024&quot;&gt;solar eclipse&lt;/a&gt; within the totality - which meant Ohio.
If you’re ever passing through Marion Ohio, I heavily endorse
&lt;a href=&quot;https://shovelcitydrinkery.com/&quot;&gt;Shovel City Drinkery&lt;/a&gt;.&lt;/p&gt;

&lt;iframe style=&quot;border: 0; width: 100%; height: 120px;&quot; src=&quot;https://bandcamp.com/EmbeddedPlayer/album=154454894/size=large/bgcol=ffffff/linkcol=333333/tracklist=false/artwork=small/track=2108833377/transparent=true/&quot; seamless=&quot;&quot;&gt;&lt;a href=&quot;https://mistergoblin.bandcamp.com/album/frog-poems&quot;&gt;Frog Poems by Mister Goblin&lt;/a&gt;&lt;/iframe&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;hr /&gt;

&lt;blockquote&gt;
  &lt;p&gt;“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.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://www.theguardian.com/music/2022/jan/31/i-had-the-perfect-life-then-both-my-husbands-died-singer-labi-siffre-on-love-loss-and-happiness&quot;&gt;This article about Labi Siffre&lt;/a&gt;, who I
discovered via &lt;a href=&quot;https://hotsugar.bandcamp.com/track/labi-siffre-bless-the-telephone-hot-sugar-edit&quot;&gt;Hot Sugar’s remix&lt;/a&gt; of Bless The Telephone:&lt;/p&gt;

&lt;script src=&quot;/scripts/lite-yt-embed.js&quot;&gt;&lt;/script&gt;

&lt;link rel=&quot;stylesheet&quot; href=&quot;/scripts/lite-yt-embed.css&quot; /&gt;

&lt;lite-youtube videoid=&quot;XMMP-T3EF8s&quot;&gt;&lt;/lite-youtube&gt;

&lt;blockquote&gt;
  &lt;p&gt;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.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From &lt;a href=&quot;https://www.thestack.technology/open-source-pioneer-perens-says-time-for-post-open/&quot;&gt;Bruce Perens&lt;/a&gt; on why Open Source has failed. (I’ve been saying this too)&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;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.&lt;/p&gt;
</description>
      <pubDate>Wed, 01 May 2024 00:00:00 +0000</pubDate>
      <link>https://macwright.com/2024/05/01/recently.html</link>
      <guid isPermaLink="true">https://macwright.com/2024/05/01/recently.html</guid>
    </item>
    
  </channel>
</rss>
