Zachary Coleman

Apps, tools, and open-source software.

Selected work

I build apps, make tools for creative projects, and contribute to Godot. Sometimes that involves ferry schedules. Sometimes it involves making a Nintendo Switch draw pictures.

Aweigh’s Coupeville to Port Townsend schedule, showing a delayed ferry, a low-tide cancellation, and remaining vehicle spaces.

Aweigh

iPhone & Apple Watch · On the App Store

Know which ferry to catch on Washington State Ferries, the largest ferry system in the US. Live schedules, vessel positions, and capacity, organized around the trip you’re making.

App Store
Pixellate Camera on iPhone, with four-color photos of a cat, mountains, and traffic, plus camera controls and a palette editor.

Pixellate Camera

Photography in four colors

A live four-color camera inspired by the Game Boy Camera. Adjust contrast and brightness, make your own palettes, or apply the same dithering to photos you already have. Export pixel-perfect images for Game Boy projects or larger copies for your photo library.

App Store
Printing the Dream setup: a Nintendo Switch 2ß displaying a red-and-blue octopus drawing, connected by USB to a small controller board.

Printing the Dream

Drawing on Nintendo Switch

Draws imported images in Tomodachi Life: Living the Dream on Switch 1 and 2, without modifying the console. A desktop converter matches the game’s palette and plans brush strokes and fills. A Raspberry Pi Pico then draws the picture by sending controller inputs over USB.

GitHub

More apps and tools

Window Season widgets show when to open or close the windows; the Apple Watch app reports “Too warm.”Window Season widgets show when to open or close the windows; the Apple Watch app reports “Too warm.”

Uses feels-like temperature, rain, and air quality to decide when opening the windows will cool your home. One decision engine powers the iPhone and Apple Watch apps, plus nine widget and complication families that update from a cached forecast.

Point To on iPhone and Apple Watch, with compass arrows pointing toward Mount Rainier, 131.2 miles away.Point To on iPhone and Apple Watch, with compass arrows pointing toward Mount Rainier, 131.2 miles away.

A compass that points to places you choose, with saved locations synced between iPhone and Apple Watch. Built as a personal tool, it is also used by the Northeast Rail Feed Association to align radio antennas.

Washington State Ferries on TRMNL, with a San Juan Islands vessel map beside sailing schedules for Anacortes and Friday Harbor.Washington State Ferries on TRMNL, with a San Juan Islands vessel map beside sailing schedules for Anacortes and Friday Harbor.

Live vessel positions and complete schedules for every Washington State Ferries route, designed for an e-ink display. Each screen is rendered remotely with no client runtime and kept under 100 KiB. The experiment that grew into Aweigh.

San Francisco Bay Ambient Map on TRMNL, with fog shading and temperature labels for the Mission, Daly City, and Walnut Creek.San Francisco Bay Ambient Map on TRMNL, with fog shading and temperature labels for the Mission, Daly City, and Walnut Creek.

Draws the live marine layer over a full-screen map of San Francisco Bay using the HRRR weather model. Optional terrain, neighborhood conditions, and warmest and coolest spots turn changing weather into e-ink cartography.

Contributing to Godot.

Godot Engine (opens in a new tab) is a free and open-source engine used to ship 2D and 3D games on every major platform. I have 10 merged pull requests in its core engine, primarily improving Apple platform support across both current and legacy releases.

An eight-year Windows daylight saving bug

Pull request #59223 (opens in a new tab)

For eight years, Godot's Windows port reported that daylight saving time was always off. Its timezone API could also return an offset one hour wrong while daylight saving time was active.

Technical detail

OS.​get_date() hard-coded its dst field to false on Windows, while OS.​get_time_zone_info() ignored the Windows API's separate daylight and standard bias values. Mountain Daylight Time, for example, reported -420 minutes (UTC-7) instead of -360 (UTC-6). The fix selects the active Windows timezone state and applies its corresponding bias.

Reliable app lifecycle events on mobile

Pull request #85100 (opens in a new tab)

Godot games on iOS did not receive the pause and resume events needed to save state when the app entered the background. Added those signals on iOS and consistent focus events across iOS and Android.

Technical detail

Wired Godot's MainLoop to UIKit's application​Did​Enter​Background and application​Will​Enter​Foreground delegates, emitting NOTIFICATION_​APPLICATION_​PAUSED and NOTIFICATION_​APPLICATION_​RESUMED. Also added matching focus notifications on iOS and Android. The documentation warns developers that iOS allows roughly five seconds to finish work triggered by the pause signal.

120Hz support for iPhone and iPad

Pull request #68044 (opens in a new tab)

Godot capped iOS exports at 60 frames per second even on ProMotion devices. Added a project setting that lets games use 120Hz without maintaining a custom engine build.

Technical detail

Added display/​window/​ios/​allow_​high_​refresh_​rate, used it to configure CADisplayLink for 120fps, and added CA​Disable​Minimum​Frame​Duration​On​Phone to the exported app's property list. Apple requires both the display-link configuration and property-list opt-in.

Native iOS interface controls as project settings

Pull request #67322 (opens in a new tab)

Full-screen iOS games need control over the status bar and system-edge gestures. Exposed both as Godot project settings, including the two-swipe protection that prevents players from leaving a game accidentally.

Technical detail

Added display/​window/​ios/​hide_​status_​bar and display/​window/​ios/​suppress_​ui_​gesture. The iOS view controller reads them through prefers​StatusBar​Hidden and preferred​Screen​Edges​Deferring​System​Gestures, replacing behavior that had previously been hard-coded in the engine.

Accurate refresh-rate reporting in Low Power Mode

Pull request #85026 (opens in a new tab)

iOS can reduce a 120Hz display to 60Hz in Low Power Mode, but Godot kept reporting the hardware maximum. Corrected the value so games could pace rendering against the screen's active limit.

Technical detail

Display​Server.​screen_​get_​refresh_​rate() returned UIScreen.​maximum​Frames​Per​Second unconditionally. The iOS display server now checks NS​Process​Info.​low​Power​Mode​Enabled and reports 60Hz while the system limit is active.

The built-in recorder exported the wrong resolution

Pull request #104334 (opens in a new tab)

Combining two ordinary display settings could make Godot's built-in recorder export the wrong resolution and aspect ratio. Fixed it to record the project's viewport instead of the operating-system window.

Technical detail

MovieWriter::​begin() initialized its output with the window dimensions even though Viewport stretch mode renders at the configured viewport size. It now selects viewport_​width and viewport_​height before calling write_​begin(), so recorded output matches the game's render target.

Many teams still ship on Godot 3.x and cannot adopt a new engine major version just to gain platform support. Backported four iOS improvements so those projects received the same features and correctness fixes without migrating.

Technical detail

Ported the interface controls, ProMotion support, lifecycle notifications, and Low Power Mode refresh-rate fix to the older OSIPhone and display-layer architecture. The four backports were merged into Godot's maintained 3.x branch.

More projects.