Studio
Writing
Travel
- Taiwan
- Wintermission
- Bali
- Penang
- Singapore
- The Philippines
- Vietnam
- Korea
- Georgia
- Israel
- Bosnia and Herzegovina
- Serbia
- London
- Scotland Roadtrip
- Part I: Aberdeen, British Royalty, and Expensive Castles
- Part II: Inverness, Loch Ness, and Booking-less
- Part III: Isle of Skye
- Part IV: Oban, Fingal’s Cave, and Car Troubles
- Part V: Glasgow Terminus
- Edinburgh
- Paris
- Lyon
- Aix-en-Provence
- Montpellier
- Slovenia
- Croatia
- Crete
- Naxos
- Athens
- Seattle in May
- Madrid
- Basque Country
- Peneda-Gerês National Park
- Douro Valley
- Córdoba
- Granada
- Nerja
- Málaga
- Seville
- Porto
- Lisbon
- Washington, D.C.
Design
- The Power of Lists
- Misclicking Live Search
- Who Has Been Speaking?
- Force Click for Layer Selection
- Fixing Mobile Page Layouts
- Don't Justify Web Text
Programming
- Building an ECS in TypeScript
- What is an ECS?
- Why build an ECS? Why TypeScript?
- A TypesScript ECS in 99 Lines of Code
- Tests
- Deeper Dive: Entities
- Deeper Dive: Components
- Dirty Component Optimization
- Aspects
- Deeper Dive: Systems
- Sparking Joy with Python
Creating & Thinking
- Cultural Wisdom
- Appropriate Quality
- Creative Reading
- Use Examples
- Deeply Knowing
- Creative Friction
- Paralysis
Health
Projects
weatherspread FallgateSoftware
My helper scripts, configs, and instructions for setting up new environments.
I think dotfiles (named because they often start with a dot, like .bashrc
) are a fun window into someone’s work environment. (And probably a time capsule of when they started working with unix-esque systems.) My favorite trick is to name custom scripts starting with a comma.
A simple Desktop-only app for calorie counting and meal planning.
I wrote this to use it myself. You can read much more about it in my post on Calorie Counting × Meal Planning.
A tiny tool to find git repositories on your computer and tell you if any are dirty or unpushed.
I wrote this to use it myself. Over time, it’s also expanded to check other directories on your computer for any files that aren’t expected, and offer to delete them. These two functionalities are part of an effort to have things backed up at all times, so a hard drive failing is no big deal.
My helper functions for python.
I add this tiny library as a dependency to all my projects. It contains little functions I kept writing over and over. There’s very little here—probably a positive testament to Python—but I like the idea of having a personal helper library so much I couldn’t resist including it.
You might also be interested in checking out my research software.
Sketches
Blog
In Praise And Critique of Digital Gardens My Media Snapshot Sleeper Train to Sapa Blank Screen Manifesto Get the Picture Just Moving and Making Climate and Schedule Infrastructure Writing vs Blogging Rewrites and replants Hot The Distant Rumble of Change Smaller Postsµblog
Latest: May 17, 2023
Fake diary entries in a language textbook are surreal when you think about it a bit. You have an adult human going about their day and then writing about it using pre-preschool-level grammar.
Garage
The garage is an experiment in "working with the garage door up." These evolving notes are written for me but posted publicly here. Read more in What is the garage?
- Image transition test page
- Reflections on Maintenance
- On WaniKani
- Sidenote test page
- Templating Languages Considered Harmful
- 3D Notebook
- About: Restructuring my 3D notes
- MagicaVoxel: Importing
- MagicaVoxel: Layer vs Outline
- MagicaVoxel: Project Objects to Ground
- MagicaVoxel: Shaders
- MagicaVoxel: Terrain
- Study: Chicken
- Study: Ocean Floor
- Study: Ryu (BoF III)
- Study: Ryu (BoF III): II
- Three.js: Cube confusion
- Topic: Colors
- Topic: Level of detail
- Topic: Lighting
- Topic: Projections
- Image layout test page
- Image lazy load test page
- Speeding up my website
- Lastpass Lockout
- Site Design Refresh 2022
- Big Header Design
- Website Redesigns
- Google's and Facebook's Software
- When Lists Don't Work
- New tech time budget
- Producing lots of work
- On Neon White
- Mo Photos Mo Problems
- Image scroll test page
- Image size test page
- WebP test page
- Small communities
- Spectators
- City maps with prettymaps
- Mandelbrot
- Shader stress test
- Pixi.js graphics stress test
- Generative voxel world editor
- Ways of looking
- Bézier basics
- Personal infrastructure graveyard
- Benefits of creating prototypes that fail
- Video game graveyard
- Website graveyard
- Critiquing Internet use
- Does k-means on an image's colors make a good palette?
- Reducing creative friction: starting a new project
- Spirit of discovery
- Simulation: Basic street
- Animating SVGs from Sketch with anime.js
- Stupid things I do constantly in Python
- Creation and virality
- Causes and conditions
- Omitting negative results precludes thinking in reverse
- Thinking in reverse
- Summer 2021 website goals
- Working blocks
- Working process
- Deciding and following
- Deeper ideas in pocket
- Notes on fragment shaders and p5.js
- Teachers are responsible for multiple perspectives
- Tension between discovery and intentional creation
- Home base feeling
- Tiny naming woes
- What is the garage?