The Oregon Trail - Wear OS

    A native Kotlin reimplementation of the 1985 Apple II version of The Oregon Trail, built for the round screen and rotating crown of a Wear OS watch. It isn't an emulator - every screen, control, and piece of pixel art is original, drawn to fit a 1.2" circular display.

    The same code also compiles to WebAssembly and runs in a browser, where it simulates the watch rather than reflowing for a window: the mouse wheel turns the crown, the arrow keys steer the raft, and on a phone you drag it. Built for and tested on a Pixel Watch 2, and distributed as a signed APK you sideload yourself.

    Play it in a browser at webrender.net/oregon-trail-wear-os.

    Kotlin, Jetpack Compose, WebAssembly, Wear OS

    Source, APK releases & ADRs available on Github.

    reddit-map-posts-app

    A Devvit app that adds a new kind of post to a subreddit: a Map Post. The author drops pins on an interactive map and picks the area it frames; anyone scrolling past can read it, but only the author can edit it. Moderators can also publish an Index Post that lists every map on the subreddit.

    Most of the design work went into the fact that Reddit renders the same post twice - inline in the feed, where it gets a fixed slot and isn't allowed to respond to gestures, and full screen, where it owns the device. Both are the same page asking at load which one it is. The decisions behind that, and a dozen others, are written up as ADRs in the repo.

    TypeScript, Devvit, MapLibre, OpenFreeMap

    Source available on Github.

    watchopolis

    SimCity, on your wrist. Watchopolis is a Wear OS port of MicropolisCore - the open source release of the original SimCity Classic engine - running the same C++ simulation compiled through the Android NDK, with a new Kotlin and Compose UI built for a round screen.

    The interesting part of a port like this is the input model, since there is no room for a toolbar and no second hand to hold the device. The crown cycles through build tools, tap places, drag pans, double-tap steps through the zoom levels down to an overview, and triple-tap changes the game speed.

    Kotlin, Jetpack Compose, C++, Android NDK, Wear OS

    Source & build instructions available on Github.

    VisitingHawaiiBot

    r/VisitingHawaii gets the same questions asked constantly, and the answers are usually already sitting in a thread from six months ago. VisitingHawaiiBot watches for new posts and replies with links to the older discussions that actually cover the same ground.

    Rather than matching on keywords, it runs every post through OpenAI's embeddings API and searches for nearest neighbours in the resulting vector space, so it can tell that "where should we stay on the north shore" and "Haleiwa vs Turtle Bay" are the same question. Vectors are cached to a CSV dataset, so only genuinely new posts cost an API call.

    Python, OpenAI embeddings, Reddit API

    Source & setup instructions available on Github.

    Oahu Guide


    Shortly after moving to Oahu in 2018, I started putting together a guide to our favorite places for guests that would visit us. Originally, this took the form of a straightforward GDoc that I'd print out for folks. Over time, I added more formatting to the document, like a map with annotations. However, google docs was clunky for this purpose - every time I wanted to add a location to the map, I'd have to edit the custom map, take a screenshot with the right dimensions, and paste it into a page in the document. Most painfully, if I wanted the locations in the guide to be in a specific order, I'd have to adjust a bunch of the formatting to make everything flow nicely.

    Read more…

    slack-wordle

    Wordle for Slack! This slack bot downloads the official Wordle bundle from the official Wordle website and executes it in a VM, delivering the results directly to your slack client.

    Javascript, Node, Express, Slack bots

    Source & install instructions available on Github.

    synthwave-x-fluoromachine

    synthwave-x-fluoromachine is a fork of @robbowen's Synthwave '84 theme, merged with @fullerenedream's Fluoromachine theme for VSCode.

    CSS, VSCode extensions

    Source & install instructions available on Github.

    zoom-macos-global-mute

    Zoom's mute shortcut only works while Zoom is the frontmost window, which is exactly when you don't need it. If you are taking notes or reading code during a call, muting means finding the Zoom window first.

    This is a small Automator app that toggles Zoom's mute state no matter what has focus. Wrap it in a Quick Action, bind a system-wide shortcut to it in System Preferences, and mute works from anywhere.

    Automator, AppleScript, macOS

    Source & setup instructions available on Github.

    fictiv

    I've been working with Fictiv since 2018, first as a lead frontend developer; and since 2021, as an engineering manager. In my time there, I've led the launch of the multiple new products, as well as countless features for the user-facing, admin-facing, and computational geometry teams.

    In addition to my coding responsibilities, I've worked to mentor my fellow developers in best practices for modern frontend development and user experience. As an engineering manager, I have spun up several new development teams at the company, as well as taken existing teams and optimized their processes around productivity and developer wellbeing.

    I've been working with Fictiv in a fully-remote capacity since the beginning of 2019.

    React/Redux, GraphQL, Python, Ruby, AWS

    Visit fictiv.com »

    standup-helper


    At Disqus, teams meet for a daily standup to check-in and share the latest updates on projects and ask questions. Since we have a distributed team working across different time zones, having standup at a fixed time isn’t ideal. We experimented with a few standup bots for Slack but found that they didn’t provide enough context around what people were working on. Specifically, we wanted a better way to connect a developer’s update to the related Trello card(s).

    Read more…

subscribe via RSS