Skip to content

Scraping the web with OpenAI

One of the really interesting LLM use cases is extracting structured data from unstructured data. In the old days (6mo ago), extracting structured data from web pages required custom xpath or css selectors for each website that constantly broke as the host changed their page structure. For instance, extracting the price of a house on redfin. This is why Plaid (and similar competitors) break so often: many of their integrations "screen scrape" which means they need a team of people updating xpath and css selectors on various bank sites (TreasuryDirect, for example, is broken constantly). I built a open source database of venture capital firms that used this approach to extract team member information from each firm…

Continue Reading

Git Completions & Tooling on the Command Line

I enjoy tuning my terminal environment. I’ve recently learned tmux, switched to zsh, and constantly incrementally improve my personal dotfiles. I’ve put together a stack of tools for working with git on the command line. I find this much faster than working in a GUI. Here’s what I use: git-fuzzy for generating commits (git patch is especially useful here) forgit for switching branches, viewing logs, stash list, git fixup, etc git (aliased as g) for misc git commands (like cherry-pick, etc) with a handful of config customization custom functions and aliases for various shortcuts, including interacting with the gh-cli command However, one piece of the puzzle for me wasn’t working properly: tab completions on the core git command…

Continue Reading

Bye Stripe, on to the Next Adventure

I sold my bootstrapped startup to Stripe and I’ve worked for them for a couple of years. It’s an amazing company. I learned a tremendous amount and worked with some amazing people. However, the pull to build something new—especially with the massive improvements in AL/ML—was too strong, and I’ve decided to move on and build another technology company. I’m going to blog about the lessons I’ve learned from Stripe—both good and bad—in the coming weeks. I’m looking forward to the constant challenges that building and running a startup brings (including doing this with multiple young kids)…

Continue Reading

Improve motivation and focus with small contexts

I’ve known for years that uncategorized message queues scramble my brain. I think I’m more sensitive to this than most. For instance, a list of unanswered texts from random groups of people (friends, work contacts, randoms, etc) feels exhausting/overwhelming. I’m not sure where to start, and it feels like the amount of effort needed to get to zero is too much. I’m tempted to avoid answering (and often do!) and move on to something else that feels more discrete that I can check off a list. I know intellectually that if I just start answering messages I’ll get through the list, and without too much effort…

Continue Reading

Learning tmux

I’ve tried tmux before for about a day at a time and promptly forgot about it and never learned how it worked deeply. However, a friend recently reminded me about tmux’s copy mode and I was intrigued. I had the time to dig in and try to retrain my muscle memory around it. I use VS Code for my editor, but otherwise, I’m a very terminal-oriented developer. I love interactive REPLs and find that CLI tools generally allow you to move faster than GUI equivalents. Something that always frustrated me about my development loop was the need to put my hands on the mouse in order to interact (select/copy/find/etc) with the contents of my terminal screen…

Continue Reading

Book Notes: Selfish Reasons to Have More Kids

This was a book recommended to me by some folks at work, and has been popular on tech twitter. I have more kids than the average person (4), and we’ve chosen to have them closer together than most; the title caught my attention. Below is my summary & thoughts on the book! I hesitate to write anything about parenting, there are so many strong opinions, there’s no perfect right answer, and I’m always learning and changing my views. Follow the data Brian (author) uses a lot of twin studies, mostly from 1st world middle-class families with no major trauma (which he calls out as a caveat), to support his arguments. The basic argument he’s making that if you are a middle-class family in a first-world country, his findings apply to you…

Continue Reading

2022 Goal Retrospective

I’ve been doing retrospectives on my yearly goals for a while now. Here’s my review of last year’s goals and my thoughts about what I can change in this years goals. (as an aside, I’ve been working on open sourcing some of the templates we use as a family to plan out our life—if you are interested in taking a look while I refine them, drop me an email.) What Worked I started using Streaks this year to track key habits I wanted to maintain or start. For well-structured habits, this worked. I had a daily recurring p1 task on todoist to track habits on Streaks and that was effective at keeping me looking at it daily…

Continue Reading

Fixing Word Navigation in ZSH

Moving to zsh from bash has been a great quality of life improvement. However, there is one thing that has driven me nuts that I have not been able to figure out: customizing the word boundary definition. I’m using zsh 5.9 and have a lot of plugins. forward-word ,backward-word , and the kill variants were the main widgets that I use. I used bindkey to determine these functions. After some investigation, it seems like these widgets are controlled via zstyle ':zle:*' configuration. You can dump configuration via zstyle -L You can determine what underlying zsh function is used by a widget via zle -lL…

Continue Reading

Advanced Text Editing Using Karabiner & macOS KeyBindings

I’ve always wanted some of the fancy keybindings I have in VS Code across my entire macOS experience. Additionally, ever since I discovered back/forward for code navigation in VS Code I wanted to bind my mouse keys to these shortcuts. I ended up digging into Karabiner and the native macOS keybindings. Here are my notes! Most of the resulting code is here. macOS Keybindings Here are some notes about what I learned about this hidden macOS feature: There are a set of special commands that control the native cocoa text system. You can combine these commands and tie them to keyboard shortcuts, but they only work in apps that use the native cocoa text system (not Chrome, for example!)…

Continue Reading

Learning Swift Development for macOS by Building a Website Blocker

I loved Focus App. It blocked websites and apps on a schedule. But, years ago it started glitching out: sucking up tons of ram and freezing my computer. They didn’t fix the bug and I abandoned using it and instead switched to a host-based blocking system which has served me well. However, there are some issues with the host-based approach: I can’t block specific URLs, only hosts (focus app couldn’t do this either) I can’t set a schedule I can’t block apps If I remove a host it will not automatically get blocked unless I sleep and wake the computer Sleepwatcher (cli tool) is dead and requires some manual set up to get working…

Continue Reading