Don Goodman-Wilson


Account management webapp link

Screenhero provided an account management webapp that allowed users to set up paid subscriptions to the Screenhero service, pay for other users’ subscriptions, view invoices, and otherwise configure their Screenhero profile. I was entirely responsible for the technical architecture and engineering work, and worked closely with the design team on the visual design and UX. I chose to build the backend in Ruby with a combination of Sinatra and Grape, and the frontend as a single page app using Ractive.js.

Billing and finance system link

In tandem with the account management webapp, I also architected and built Screenhero’s billing and finance systems, which included a very early Slack chatbot to report major financial events (large purchases) and daily summaries of financial activity (MRR, churn) to the team.

Public API link

An API that allowed third parties to initiate screen sharing sessions, it was effectively a remote control for the desktop app’s UI. I was entirely responsible for the architecture, design, and implementation, including API security and the necessary modifications to our desktop clients. The backend was implemented in a delightful stack including Ruby/Grape and Erlang/ejabberd, which communicated using XMLRPC with the desktop clients.

Mac desktop realtime video rendering pipeline link

Screenhero is screen sharing that is optimized for latency. I was responsible for ensuring that incoming frames are rendered as quickly as possible. I implemented a zero-latency buffering scheme, that fed packets to ffmpeg for decoding, and an OpenCL workflow that allowed us to render directly from the generated YUV frames that was far more efficient that decoding the YUV frames on the CPU.

Mouse and keyboard drivers link

As my first task as Screenhero, I refactored the keyboard and mouse drivers. At a very low level, Screenhero modifies, and in some cases completely overrides, the USB input system on Mac. I refactored our drivers to support international keyboards, and the mouse drivers to accurately reflect the user’s designated acceleration curves so that virtual input devices driven by remote users looked and behaved just like locally attached input devices.