Here's a quick Obsidian tip. I've written quite a bit of lengthy prose in Obsidian then revised it, and when the work is broken across multiple sittings, it's easy to lose my place in a document. All the more so on a mobile device where the scroll sometimes resets unpredictably in large notes. I used to mark my place with some sequence of symbols, such as // , then search for that to find where I…
I wrote about some local-only web apps I made and how they differ from local-first software that synchronizes data across devices. Often, local-first software is about documents. That's certainly the case for the specialized diagramming tools I've been creating. They allow exporting and importing YAML files, but it's cumbersome for those files to be the primary means of managing documents, since…
From Why I Won't Read LLM Authored Fiction by Chris McCormick : I don't want to read a novel where most of the words are written by an LLM, even if a human designed the novel at a high level. It feels gross. I think this is the reason. The statistical profile of LLM writing is close to the normal. That's literally how LLMs work. They sample from a distribution that captures a median way of…
Last week I wrote about a few local-only web apps I've made recently. Since I don't have a server to persist data in the cloud, they're all static sites that can export and import YAML data. A downloaded YAML file can be reloaded later to restore the app's state, or you can transfer a file to another device and load it up there. Exploring this local-centric model of state management led me to the…
Doing front-end development over the last couple of months, I've been reminded to test web apps in Safari. It exhibits some surprising bugs. Here are two I encountered recently. foreignObjects The first was in Causation , my simple cause-and-effect diagrammer. It renders everything in an SVG, and makes the text in nodes editable by embedding HTML using foreignObject . Turns out Safari has multiple…
Over the last few months I've created a handful of local-only web apps for my own use and for family members. They're designed for somewhat specific needs that only occasionally arise, but those needs supplied an excuse to play more seriously with Christian Johansen 's suite of ClojureScript libraries, namely Replicant , Portfolio , Nexus , m1p , Lookup , and Dataspex , which I appreciate for…
In the previous post I shared a couple small scripts I use with Git. I automate a lot of the repetition in my development workflow to make tasks not just easier but also more reliable. Automation encodes knowledge. Scripts give me a place to capture things I learn. Below are descriptions of several scripts I use on a daily basis. Most of my scripts aren't portable. They're tailored to the specific…
I've written about various practices I have when writing or reviewing code, from splitting branches using diff files and drafting pull requests locally to reviewing code locally and documenting exploratory testing . It's not always easy going those extra miles, so I try to make it as simple, reliable, and fun as possible by automating whatever I can. Here are two scripts I often use, both of which…
An old oak in my yard fell a few weeks ago, and after I cleared the brush my kids volunteered to help rake up twigs and bark. My six year-old declared the job somewhat difficult, to which my three year-old replied, "It's not hard for me." I was a bit snappish and couldn't let that braggadocio go uncorrected, so I told him, "It's easy for you because you're not doing anything, you're just telling…
Back in 2013 I learned about sketchnoting in a workshop at Midwest UX, and as someone who always doodled in my notes, giving meaning to the doodles felt like an obvious innovation I had overlooked, like putting wheels on luggage. After a few months' practice, I captured some brief tips . Since then, I've sketchnoted presentations from Agile Conf, local software meetups, company retreats,…