Welcome! I work on malleable software: computing environments where anyone can adapt their software to meet their needs with minimal friction. To see what that means to me, read this essay or listen to this interview.

I'm also tinkering with AI-assisted programming, which I think can help usher in a new era of personal software tools, help programmers have more fun, and create new interaction patterns for working with software.

I currently work at Notion. Previously I was a senior researcher at the independent research lab Ink & Switch, and I did a PhD in HCI at MIT advised by Daniel Jackson. Earlier in my career I did design and engineering at startups. My core skill is designing and prototyping environments for thinking.

You can reach me via email. I enjoy hearing from people making cool stuff! I also do a bit of startup advising for companies related to my work.

If you'd like to hear occasional updates on my work, you can subscribe to my email newsletter or follow via RSS.

Malleable Software

Embark New!

Dynamic documents for travel planning

Potluck

Dynamic documents as personal software

Wildcard

Customize a web app with a spreadsheet

Programming Interfaces

Margin Notes

Automatic code docs w/ recorded examples from runtime

TodoMVC Vis

Visualizing the internal behavior of TodoMVC in Redux

JSON Sheets

A reactive programming environment for building GUIs

Writing

Code like a surgeon
AI as teleportation
Enough AI copilots! We need AI HUDs
Is chat a good UI for AI? A Socratic dialogue
Stevens: a hackable AI assistant using a single SQLite table and a handful of cron jobs
Avoid the nightmare bicycle
AI-generated tools can make programming more fun
Your pie doesn't need to be original (unless you claim it so)
7 books that stood the test of time in 2023
Codifying a ChatGPT workflow into a malleable GUI
Malleable software in the age of LLMs
ChatGPT as muse, not oracle
Fuzzy API composition: querying NBA stats with GPT-3 + Statmuse + Langchain
For your next side project, make a browser extension
Dynamic documents // LLMs + end-user programming
Bring Your Own Client
How tweet threads cured my writer's block: Twitter as a medium for sketching
Foam: Software as Curation
Climate art, hacking Autodesk, and other funemployment projects
Browser extensions are underrated: the promise of hackable software
Adding tail call optimization to a Lisp interpreter in Ruby
ENHANCE!: Upscaling images CSI-style with generative adversarial neural networks
No Redis Needed: building a Postgres-backed recommendation engine for Rails
The Virtual Cafe: a better way to hang out remotely
Building Waze for the Boston subway: my first adventure in civic hacking
2014: A year in review with iPhone pedometer data

Interviews

Dialectic Podcast: Software You Can Shape
Metamuse Podcast: Bring your own client
Metamuse Podcast: Dynamic documents
Superorganizers Newsletter: on research tools/process

Contact me

Please reach out if you're interested in chatting about ideas, or if I might be able to help you in some way. You can contact me via email or on Twitter.

Subscribe

I periodically write about programming tools, end-user programming, and software design. To get updates about new posts:

The Archive... (older work less immediately relevant to my current interests)

Local-First Software

Riffle

Building data-centric apps with a reactive relational database

Peritext

A CRDT for rich text, to enable async collaborative writing

Cambria

Better cross-app data compatibility using bidirectional lenses

Programming interface explorations

ladybug

A Ruby debugger backend for the Chrome Dev Tools UI

Experiments in Dynamicland

Exploring in the dynamic medium

Conference Talks

Dynamic Documents as Personal Software (Causal Islands 2023)

A vision for dynamic documents + AI

ENHANCE! (BangBangCon 2017)

Explaining Generative Adversarial Neural Networks using CSI

Ruby, A Family History (RailsConf 2018)

Exploring how Ruby was influenced by Lisp, Smalltalk, and Perl

Deep Learning: an Introduction (BostonRB)

An introduction to deep learning techniques for Ruby developers

Other software projects

classroulette

Making online course catalogs skimmable and serendipitous

simple_recommender

User recommendations for Rails apps, using Postgres

Postgres BSON

Extending PostgreSQL with faster JSON queries

Data visualization / NLP

Panorama Free Response Analytics

Using NLP to help educators understand survey feedback

News context sidebar

Automatically providing background context about news articles

Pedometer data analysis

Analyzing a year of data from my smartphone step counter

Hardware / Electrical Engineering

Autonomous quadcopter

A sonar-based obstacle avoidance system for a quadcopter

Laser scanning

An algorithm for efficiently determining object orientation with a cheap laser scanner

Bulldogs Racing

Embedded software for a gas-electric hybrid racecar