We moved to a house in Vancouver, which is pretty crazy if you know the local real estate market. Never thought I’d be able to afford an actual house in a central neighbourhood. As is my wont, I think a lot about the history+policy that led us here. I’m in a pocket of East Van that popped up overnight circa 1912 in a speculative building boom . Tons of cookie-cutter houses from Sears…
Unite Here Local 40 is a BC hospitality workers’ union: hotels, airports, food service. In 2026 they became one of the most active forces at Vancouver City Hall, and they’ve been pretty explicit that the goal is to affect the outcome of October’s election. The especially weird part is that they’re spending an enormous amount of time and money mostly opposing new hotels .…
It’s been quite a year. Here’s a grab bag of what stuck in my mind from 2025 and what’s coming next. Personal Stuff I started 2025 with a New Year’s resolution to deadlift 300lb. I hit 300 in the middle of the year, upped my resolution to 350lb, but only made it to 310lb. I’d like to hit 350 in 2026, but if I plateau and stay healthy I’m fine with that too. My…
Among people who do a lot of agent-assisted software development, there is some skepticism about whether MCP is useful: A quick experiment makes this clear: try completing a GitHub task with the GitHub MCP, then repeat it with the gh CLI tool. You’ll almost certainly find the latter uses context far more efficiently and you get to your intended results quicker. This is a fair criticism; in some…
Giving LLMs access to tools (which turns them into ✨agents✨ ) is an incredibly powerful way to give LLMs capabilities that go beyond generating text. But it’s important to think clearly about the costs and limitations of tool calling, and in particular, people should understand that calling a tool is many orders of magnitude more costly than calling a plain old function from code. There is…
The Model Context Protocol (MCP) is a pretty big deal these days. It’s become the de facto standard for giving LLMs access to tools that someone else wrote, which, of course, turns them into agents . But writing tools for a new MCP server is hard, and so people often propose auto-converting existing APIs into MCP tools ; typically using OpenAPI metadata ( 1 , 2 ). In my experience, this can…
I want to get something off my chest: attempts to keep the price of urban land down are not necessarily good. Many people in local politics place a high priority on keeping land prices down. For example, the new Vancouver councillor who opposed a church building apartments on their own land: Land values displace people. This will increase land values. …and then used that same reason to vote…
I had an odd experience with this website, and I’m finally writing it up. The short version: In August 2024 I wrote a blog post that documented how a local “independent journalist” had written for white nationalist websites. In October 2024 he filed a DMCA complaint with my host (Netlify). Netlify support rubber-stamped the complaint without giving me a reasonable way to appeal.…
Say you’re working on an agent ( a model using tools in a loop ). Furthermore, let’s say your agent uses the Model Context Protocol to populate its set of tools dynamically. This results in an interesting UX question: how should you show text tool results to the user of your agent? You could just show the raw text, but that’s a little unsatisfying when tool results are often…
This is a brief post about something that confused me a great deal when I started working with LLMs. Context Many LLM providers ( Anthropic , OpenAI , Google ) support “function calling”, AKA “tool use”. In a nutshell: When calling the provider’s chat completion APIs, you tell the model “if needed, I can run these specific functions for you.” The model…
I tried to use Automerge again, and failed. For those of you who aren’t familiar, Automerge is a neat library that helps with building collaborative and local-first applications. It’s pretty cool! I work on a collaborative notes application that does not handle concurrent edits very well, and Automerge is one of the main contenders for improving that situation. I gave Automerge a try…
I started strength training for the first time in January 2024, in my late 30s. I wish I’d started earlier, but it’s been a hugely positive change in my life. Some observations: Standing up straight is a lot easier; back muscles help with posture! Stability is cool. I’m noticeably better at tightening my core in daily life, balancing, etc. I can put much more power into specific…
After 13 years of daily Twitter usage, I bit the bullet and switched to Bluesky (urbanism stuff, mostly) and Mastodon (computer stuff) full time. I made friends on Twitter, I learned a lot, and I was part of a few communities that would not exist without Twitter. I’m proud of my small contributions to Vancouver urbanism over the years, and they mostly happened on Twitter or adjacent to it.…
It feels a bit early to be writing an update to something I wrote 1.5 months ago , but we live in interesting times. Shortly after writing that post, I started trying out Aider with Claude 3.5 Sonnet. Aider’s an open source Python CLI app that you run inside a Git repo with an OpenAI/Anthropic/whatever API key 1 . My Aider workflow I direct Aider toward a file or multiple files of interest…
This post has been temporarily taken down while I respond to a fraudulent DMCA complaint. The short version: I wrote a post about how Riley Donovan (a guy from Salt Spring Island who runs the “Dominion Review” and submits op-eds to many Canadian newspapers) used to contribute to the “Council of European Canadians” , a white nationalist website. He does not like this.…
I find LLMs to be pretty useful these days. I don’t consider myself to be on the frontier of LLM experimentation, but when I talk to (technical) people it sounds like my workflow is pretty uncommon, so I should probably write about it. LLM (the command-line tool) Simon Willison’s llm command-line tool is the primary way I use LLMs. I sometimes struggle to describe the appeal of llm to…
Been a while since the last update, I’ve been busy with the new job . Things have been going well! I went to New York in March for my first week at Datadog, which was a good way to start the job; I met other new joiners, met people on my team, saw a bit of the city. And the view from the office is alright: Datadog operates at a much larger scale than any company I’ve ever worked at,…
So, big news: I’m off to a new job at Datadog, working on their CoScreen screen sharing tool 😎. I’m gonna be working remotely from Vancouver, which will be interesting because I’ll be dogfooding CoScreen as I work on it. It’ll be good to work on native software again. It feels like the vast majority of jobs today operate at a level of abstraction where the OS doesn’t…
I reread Robin Sloan’s post about a “home-cooked” app , and it continues to resonate; there’s something special about writing software for very small audiences. In that vein, here’s something that my partner and I have been using since last year: We needed a solution for shared notes that works well across Android, iOS, and the (desktop) web… so I made one. We…
It’s been a good summer so far. Some things I’ve been up to: systemctl-tui I got annoyed that I couldn’t find a decent GUI for systemd services, so I built one : It was partially an excuse to experiment with ratatui for terminal UIs in Rust, and I think I like it quite a bit. ratatui gives you tools you need to do immediate-mode rendering efficiently, but the broad strokes of…
I recently participated in the Handmade Network Visibility Jam and built a tool that I’d been wanting for my own use : Escape Artist in action In a nutshell, Escape Artist shows ANSI escape sequences that are normally invisible. It’s kinda like View Source for the terminal; my hope is that it will be useful for anyone working on shells and terminal applications. Tech Stack Escape…
Here’s a pandemic project that I think turned out pretty well: An 18-piece map of Vancouver above my couch In 1954, Vancouver’s planning department put together a remarkable hand-coloured map showing the age of every building in the city. Thankfully for us, the Vancouver Archives made scans of the map available in impressively high resolution : Imagine how long it took to colour every…
I find working on my personal website to be soothing. It’s one of those never-ending projects in a good way, and I work on it in small bursts of energy whenever I have the time and inspiration. I’ve added a handful of new features in recent months and, uh, I’m sorry. Some of these features are an attempt to revisit the glory that was the Geocities-era web; you might have noticed…
I work on a command-line shell called Nushell (Nu for short) with some internet friends, and I think it’s pretty cool. To convince you that it’s cool (or at least worth a try), here’s a whirlwind tour. Basic Querying Let’s start by taking a look around the filesystem. We’ll use ls to take a look at the files in /usr/bin : We got an actual table back! It has columns!…
If you try to do any kind of analysis of Vancouver’s urban planning, you quickly run into a problem: An amusing map by Mike Feaver Vancouver has a lot of zoning districts. 895 of them, to be exact 1 . That works out to roughly 1 zoning district for every 740 residents; I hope you weren’t planning on reading every one. “Comprehensive Development” About 9/10 of those zoning…
For a long time, my mental model of urban planning was basically “there are written rules about what you can build, and to build something you just follow the rules.” Unfortunately, this is not an accurate way to think about Vancouver. I get alerts for new rezoning+development applications (using a small tool I wrote ), and this little snippet shows up over and over: …the…
Like many other people, I unexpectedly found myself stuck at home without much to do in early 2020. To stay sane, I set about answering a question I’d had for a while: what’s the deal with native GUI frameworks on Windows these days? It’s rarely obvious which of Microsoft’s several supported technologies is the best choice for a new project, and Windows doesn’t have…
Say you want to host some files in an S3 bucket, under your own custom subdomain with nice short HTTPS URLs. For example, you own foo.com and you want files to be accessible at URLs like https://files.foo.com/bar.txt . This is a lot more complex than it should be! It involves configuring 3 separate AWS services and I’m already forgetting the boring details, so let’s write them down for…
I’ve joined the Nushell core team. This doesn’t really change what I’m doing day-to-day, but it makes my work on Nu feel a little more official 🙂. SQLite Support This is the biggest feature I’ve implemented so far: I’m pretty proud of how this turned out; it’s very convenient to be able to browse SQLite databases in your shell and interact with them the same…
I’ve been using Rust full time for the last month and a bit while contributing to Nushell (more on that later). A lot has changed since I first tried Rust in 2019 and this is my first time working on a big Rust project. Here are some thoughts on the language while they’re still fresh in my head. Compile times and feedback loops Rust’s compile times are notoriously slow. Rust…
Big shout-outs to @reillywood , who managed cut the CI times for @nu_shell in half! If you do @rustlang and see your CI build times creeping up, you should give his fixes a look. Smarter test ordering and build caching makes a huge difference. — JT (@jntrnr) April 30, 2022 I recently spent a few days tuning Nushell’s GitHub Actions CI pipelines and it paid off: CI used to take about 30…
Nushell Nushell v0.60 is out , and it’s fantastic. This is the first Nu release where I made meaningful contributions (mostly to the website+documentation) and it feels like a good use of my sabbatical time. It’s been interesting figuring out how to sell+explain Nu succinctly; writing good public-facing documentation is hard! If you haven’t tried Nu, this is a great time to do…
“Work” I’ve been spending a lot of time writing Nushell documentation . The Nushell core team has been banging out new features rapidly and the documentation hasn’t always kept up; improving the documentation feels like a high-impact way to help out. Nushell’s got a big release coming up later this month and it has the potential to attract many new users. I want the…
I’m officially unemployed again 😎. In the interest of self-accountability, I’m going to try to document what I’m up to on my break; expect more frequent updates to this blog. HYTRADBOI I bought a ticket to Have You Tried Rubbing A Database On It? , which could loosely be described as a hipster database conference; lots of people using databases in unusual ways, not much in the…
I handed in my notice; my last day at work is next Wednesday. My employer for the last 2 years has been excellent to me, but I’ve been itching to try something new. I don’t have a new job lined up yet; I’m planning to use this time partially as a sabbatical, and partially to see what’s out there on the job market. A “serendipity break” during which I will…
.NET has been taking huge leaps and bounds in the last few years, and not everyone is aware of it! We’re now able to build small fast single-file .NET applications; this is arguably Go’s biggest strength, and now you can do it in C# and F# too. Meanwhile, the .NET community has been making excellent libraries to make console applications slick, polished, and easy to write. The…
I recently spent a bit of time messing around with the Postgres wire protocol. I’d like to build a library that lets any application accept connections as if it were a Postgres database; many database clients and databases speak the Postgres wire protocol , and it seems like a practical way to expose tabular data over the network. Implementing the protocol isn’t too bad; the docs…
I recently assembled a tool : It’s a helper for scripting in C#. It watches a directory with C# files for changes, and whenever a file changes it gets compiled into its own executable. You can install it as an always-on service, and it comes with an opinionated set of utilities to make scripting easier. Why? C# the language has recently become much more succinct ( top-level statements ,…
Here’s something I’ve been messing around with: Download here or get more info on the MinimalWebView and MaximalWebView repos. I’ll write more about these projects later!
I had a weird week back in October, and it all started when I posted this GitHub issue . What happened? The .NET team built a feature called Hot Reload for .NET 6, which would allow for code to be changed while an application is running. It was planned as a feature for all of .NET from the start: Our goal is to provide a consistent dev inner loop experience in .NET Core across all platforms,…
It’s been a while since my last update. I wrapped up my sabbatical, did a whole bunch of interviewing, and have since been working on some interesting spreadsheet-related problems at a new job . Oh, and there’s been a global pandemic on, it’s been weird. Anyway, I kept busy over the last year and a bit: Switched to Windows I switched to Windows full time, after a lifetime of Macs…
Robin Sloan’s post about “home-cooked” code has been making the rounds, and for good reason. It’s about highly personalized programs; when you build something purely for yourself or a small audience, it’s more like home cooking than industrial production. I really love the analogy, and it’s inspired me to write about one of my own “home-cooked”…
You might have already seen Jens von Bergmann’s interactive map of Vancouver which integrates a ton of different data sets. It’s really useful for looking up zoning, year of construction, tax data, and even the estimated amount of floor space in buildings. I find it essential for understanding the city. It has also has a great feature that many people don’t know about: the ability to filter data…
Bret Victor ’s talk Inventing on Principle ( video , transcript ) changed the way I think about computing in 2019. Inventing on Principle is partly about Bret’s guiding principle: “ Creators need an immediate connection to what they create. And what I mean by that is when you’re making something, if you make a change, or you make a decision, you need to see the effect of that…
I’ve been busy for the last month, and I completely forgot to update the blog. In no particular order, here’s what’s been occupying my time lately: Coworking I joined a coworking space in East Vancouver with a friend, and I’m working from there 3-4 days/week. It’s like an airy spacious café with fast internet and quiet space, I love it. I find that getting out of the…
Rust has a really powerful macro system . You can use it to do great things safely … or you can have fun with it and quickly prototype coding productivity features. I chose the latter. todo-macro is a procedural Rust macro that stops compiling after a user-specified deadline. It’s like TODO comments, but with teeth. It’s probably best explained with an example: Using todo-macro…
I’ve recently been building .NET Core back-end services that run on Linux. Linux .NET development is in an interesting place; it’s clearly the future of back-end .NET, but it’s still a little rough around the edges compared to our old friend .NET-on-Windows. Let’s dive into what you (an experienced Windows .NET developer or a .NET-curious Linux developer) need to know to…
Every now and then, I wonder “Is low-level programming still unpleasant?” Call it a morbid fascination, but I really did enjoy some aspects of working in C and C++; in particular, reasoning about low-level behaviour becomes a lot easier with fewer layers of abstraction on top of the metal. On the other hand: memory management and interoperability are hard, the C/C++ ecosystems have…
I recently started experimenting with building tooling for ETL systems. After many years of wrestling with ETL in industry, I had a few questions on my mind: Can we make common data issues quick to resolve? Can we make automated data transformations as easy to work with as spreadsheets? I think the answer to both questions is yes, but don’t take my word for it – you can try the prototype at…
I’m a big fan of Pulumi , and I’ve previously used it for cloud infrastructure. That’s their main selling point; Pulumi’s slogan is literally “Program the cloud.” Interestingly, Pulumi can also be used to manage on-premise infrastructure, including PostgreSQL databases. Let’s dive into the details. Pulumi basics Pulumi takes a declarative infrastructure…