Independent iOS Apps

An image of multiple iPhone renders displaying several different configurations of Pixellate Camera. They are all rendered in only 4 colors, with dithering to display additional color depth. Some of the viewfinder images include: An interstate with cars driving towards the camera, a cat looking curious, an arid tree on a rocky landscape, and a campfire.

Pixellate Camera

Camera app that recreates the Game Boy Camera aesthetic from 1998, with full metadata and GPS support. Supports importing photos and custom color selections.

iOS
Mar. 2025 - present
An image of Point To: Custom Compass running on an iPhone and Apple Watch. One is pointing towards Los Angeles, and the other pointing towards Big Sur. They are rendered floating on top of a background depicting a coastline.

Point To: Custom Compass

A compass that points wherever you want. Syncs custom locations between iPhone and Apple Watch for standalone use. Started as a personal tool, ended up adopted by the Northeast Rail Feed Association for aligning radio antennas.

iOS iPadOS watchOS
Feb. 2024 - present
Recall: Moving Gallery Screenshot. It shows a picture of a valley within a VisionOS app window, superimposed over a living room.

Recall: Moving Gallery

An app that shows random Live Photos and videos from your library. Built to surface unexpected memories you forgot you had.

iOS iPadOS macOS visionOS
Jun. 2025 - present

Open Source

Godot Engine

Godot Engine ⧉ is a free and open-source game engine used to create 2D and 3D games across all major platforms. It has received donations from Microsoft, Meta Reality Labs, Epic Games, Mozilla, and JetBrains. Parts of its code have been used by Tesla, Sega, and Electronic Arts.

8-Year-Old Daylight Saving Bug

Fixed OS.​get_time_zone_info() returning incorrect UTC offset on Windows during DST. The implementation didn't account for DaylightBias—e.g., Mountain Daylight Time returned -420 minutes (UTC-7) instead of -360 (UTC-6). Bug existed since the initial Win32 implementation in 2014. Required understanding the Windows timezone API's distinction between standard and daylight bias values, fixed by applying the correct values.


Before my change, "Is it currently daylight saving time?" was hard coded to "No" on Windows.

iOS/Android App Lifecycle Notifications

Implemented NOTIFICATION_​APPLICATION_​PAUSED and NOTIFICATION_​APPLICATION_​RESUMED on iOS by wiring Godot's MainLoop to application​Did​Enter​Background / application​Will​Enter​Foreground UIKit delegates. Also exposed NOTIFICATION_​APPLICATION_​FOCUS_​IN/OUT on both platforms for consistency. Enables reliable autosave within iOS's 5-second background execution window.

iOS Gesture Bar Settings

Added project settings for iOS status bar visibility (prefers​StatusBar​Hidden), home indicator hiding, and edge gesture deferral (preferred​Screen​Edges​Deferring​System​Gestures). The "double-swipe" protection used by commercial games. Previously required engine recompilation to change. Implemented by exposing UI​View​Controller preference overrides through Godot's iOS display layer.

iOS "ProMotion" (120Hz) Display Support

Enabled ProMotion refresh rates above 60Hz on iOS by removing the hardcoded 60fps CADisplayLink cap in godot_view.mm, and setting CA​Disable​Minimum​Frame​Duration​On​Phone in the export plist. Apple requires both the plist key and explicit frame duration configuration. Affects iPad Pro (2018+), iPhone 13 Pro (and newer), iPhone 17 (and newer).

Bug Fixes

  • Fixed Display​Server.​screen_​get_​refresh_​rate() returning 120Hz on ProMotion devices even when Low Power Mode throttles to 60Hz. (#85026)
  • Fixed 2-year-old bug where MovieWriter recorded incorrect resolution/aspect ratio when using Window Size Override with Viewport stretch mode. Output was being captured from the wrong render target dimensions. (#104334)

Godot 3.x Legacy Support

Backported iOS interface controls, ProMotion support, and mobile lifecycle notifications from 4.x to 3.x, enabling legacy projects to use modern features without migrating. Required adapting implementations to 3.x's different display server architecture.

Projects

An image of Sentry Rewind. It is displaying a forward facing view of a car driving on an interstate during the day.

Sentry Rewind

A desktop app for viewing Tesla dashcam footage, with synchronized 6-camera playback, a calendar view, and a map view. Works with any Tesla-formatted USB drive.

macOS Windows
Apr. 2026
A picture of a Nintendo Switch 2 on a desk showing Tomodachi Life: Living the Dream's image editor. A Raspberry Pi Pico with a small screen and buttons attached is plugged into the bottom USB port. An image of an octopus is being drawn on the Switch 2 by the Pico, which is displaying a thumbnail and progress bar.

Printing The Dream

A tool for importing images into Tomodachi Life: Living the Dream. A Raspberry Pi Pico emulates a wired controller to draw images in the in-game custom item creator.

Reverse engineered how to send fastest inputs without game's cursor losing tracking. Works on Switch 1 and Switch 2. Zero console modification required.

Apr. 2026 - May 2026

TRMNL Plugins

Widgets/"recipes" I've built for the TRMNL ⧉ ambient e-ink displays.

An image depicting the project, a TRMNL display widget. It is a monochrome interface depicting a map and schedules of departing times for both directions between Seattle, WA and Bainbridge Island, WA.

Washington State Ferries

Pulls real time data from the WSDOT Rest API including daily schedule, ship locations, cancellations, and service alerts. Supports every active ferry route, customizable on install.

I designed custom tooling for creating map images, validation of UX for various API states, and fitting into TRMNL's file size and bandwidth limitations.

Apr. 2026 - May 2026
An image depicting the project, a TRMNL display widget. It is a monochrome interface advising whether to open or close windows for overnight cooling, with simplified temperature and humidity readings.

Window Season

For climates that usually lack air conditioning, a schedule of when to open your windows for cooling. Uses Open-Meteo's feels-like (apparent) temperature so humidity and wind are factored in. Also handles rain and AQI.

May 2026

Experiments

A screenshot of the GeoJSON Polygon Drawer tool. A Safari window shows a map of the Seattle area with two hand-drawn polygons outlining Mercer Island and Vashon Island. A floating toolbar on the left has buttons for New polygon, Rectangle, and Scissor tools. A sidebar on the right displays the resulting GeoJSON coordinates.

GeoJSON Polygon Drawer

A small browser tool I built when working on TRMNL WSF. Allows drawing polygons on a map and exporting them as GeoJSON. Supports polygon, rectangle, and scissor tools, with keyboard shortcuts and direct copy/download.

May 2026
An image depicting PhotoStat showing the statistics of the user's library. It is set to a mode showing total images taken per year. There is a breakdown on each bar between Live Photos, static photos, and videos.

PhotoStat

A small project that can show stats of how many photos the user has taken by months or years, accessing iCloud Photos on macOS.

Aug. 2025 - present
A picture showing a Live Activity counting down the minimum and maximum delivery time for a Dominos pizza order, displayed both on the iPhone lock screen and in the Dynamic Island.

Live Activity for Dominos Pizza

An experiment in generating an iOS live activity for Dominos Pizza, which works on actual orders when a phone number is entered.

Note: In early 2026, Dominos finally implemented this function into their official app!

Feb. 2024
A macOS window displaying inputs and outputs of the Base4096 algorithm across three columns: two columns of encoded Unicode characters and a generated noise image, with buttons to generate a random image, gradient image, or decode an image.

Base4096

An experiment in data compression for when character count matters more than total bytes. Useful for sending small pieces of data on character-capped platforms such as Twitter/X and Discord.

Feb. 2025
← Back to home