Patrick Gaskin

Software engineering student interested in systems development, backend development, Linux systems administration, cybersecurity, reverse engineering, and a bit of networking.

Experienced in Go, C, C++, JavaScript, TypeScript, and Bash. Familiar with C++, Python, Java, ARMv7 assembly, Terraform, and Ansible. Learning ARM64 assembly and Rust.

Very experienced with Linux (desktop, embedded, and server) and Android, but also have some knowledge of Windows.

Contact

Open-Source

Windy Live Wallpaper

  • Android
  • Java
  • Rust
  • WebGPU
  • Weather
  • Reverse Engineering

Android live wallpaper visualizing local wind patterns. Based on the shaders from the original Pixel 2017 live wallpaper, but with up-to-date wind data (the official one was last updated in 2019), more themes, permission fixes for newer Android versions, lower power consumption, and other fixes. The Java code has been completely rewritten from scratch; only the shaders are based on the original APK.

The custom backend which generates the wind vector field textures is written in Go and uses the NOAA GFS forecast data.

Ottawa Recreation Schedules

  • Go
  • HTML
  • CSS
  • TypeScript
  • Scraping

Scraper, dataset, and website for City of Ottawa recreation schedules.

The official site splits the schedule data across hundreds of facility pages, and does not provide any way to quickly filter across facilities. I wrote a robust scraper by hand to collect the hand-written schedule data and turn it into a structured dataset, which is now also used by many other projects. I put a lot of work into ensuring the data is complete and unambiguous, and it frequently catches typos, which I've been reporting.

I also created a website which provides unique features to efficiently browse the schedules. There's a chronological list of upcoming activities (which also incorporates the freeform cancellations and schedule changes where parseable), a filterable map, filterable schedules on a single page, activity pages with an overview of facilities and times, and advanced search.

Queen's University ARC Schedules

  • Go
  • HTML
  • CSS
  • File Formats

Innosoft Fusion is a recreation facility management software suite used by many universities in North America. The official white-labeled app (Fusion Go) provides schedule information, cancellations, and notifications for drop-in events, but does not provide an overview of an activity. Moreover, the official swim schedule is often outdated, and never includes cancellations or excluded dates.

The data comes from the HTTP requests the official app makes, and the schedule generation is powered by a custom algorithm to generate the best schedule by combining event dates/times optimally based on metrics like the number of exceptions, the number of exclusions, the duration, the most common times, and so on.

To ensure correctness, there are comprehensive unit tests ensuring the schedule accurately represents the events from the source data. There are also tests to ensure the optimal schedule is generated from complex combinations of activity dates.

I chose to make this highly configurable to allow it to be used for other universities too. The color scheme is dynamically generated using the Material Design 3 Color Utilities. For efficiency, there are multiple layers of caching.

wasm2go-based library bindings

  • Go
  • WebAssembly
  • C/C++
  • Rust

I've created high-quality idiomatic bindings for various libraries transpiled to Go using wasm2go.

While creating these bindings, I've also put a lot of work into supply-chain security and ensuring the builds are reproducible.

Along the way, I've also made various contributions and bugfixes to wasm2go including DWARF support and fixing optimizer bugs.

asslcapture

  • Go
  • eBPF

Capture system-wide Conscrypt/BoringSSL TLS traffic on Android using eBPF.

This is a non-intrusive alternative to injecting root certs and generally works more reliably, but requires root and a modern kernel.

push-signed-commits

  • TypeScript

Create verified/signed commits as bots or GitHub Actions. Available as a CLI, GitHub Action, or library.

This one is MUCH more robust than the alternatives, and it has a strong focus on supply chain security.

Lithium EPUB Reader Patches

  • Go
  • Smali
  • Android
  • Reverse Engineering
  • Java
  • JavaScript

Patches for the Lithium EPUB Reader app adding an offline dictionary, custom fonts, additional progress information, series metadata support, support for inverted rotation, and more.

The custom Android app patching functionality is written in Go and uses apktool to decompile APKs and provides abstractions to safely modify resources and smali (i.e., dalvik/java bytecode).

The dictionary is implemented as a script injected into the reader webview, but will work fine in an ordinary web browser too. The dictionary code is written in modern JavaScript and is optimized for performance, while still being relatively memory-efficient. The binary dictionary files are generated other dictionary sources, including the Project Gutenberg's Webster's 1913 Unabridged Dictionary. The frontend JavaScript uses Shadow DOM to isolate the dictionary from the book content.

Android VNC Viewer Patches

  • Smali
  • Android
  • Reverse Engineering
  • Java

Patches for the RealVNC Viewer app to fix bugs and improve usability.

As of 4.7.0.51044, this includes: making the gigantic distracting connection toolbar FAB invisible when inactive, allowing more than the first 4 connections to be pinned to the home screen, adding key repeat support to the extension keyboard (e.g., arrow keys), and fixing missing key presses when rapidly pressing buttons on the extension keyboard.

Qt Resource Extraction

  • Go
  • Python
  • Qt
  • C++
  • File Formats
  • Reverse Engineering
  • Library

Library and tools to extract embedded resources from Qt 5.13 binaries and RCC files. Supports localized resources.

To automatically determine the offsets for ARMv7 binaries, Unicorn is used to emulate the initialization functions and extract the offsets.

Innosoft Fusion iCalendar Feed

  • Go
  • JavaScript
  • iCalendar
  • File Formats

Innosoft Fusion is a recreation facility management software suite used by many universities in North America. The official white-labeled app (Fusion Go) provides schedule information, cancellations, and notifications for drop-in events, but does not provide a way to integrate this with external calendar software.

Based on the app's HTTP requests and data models, I implemented an API to provide the drop-in event information and notifications as an iCalendar feed or JSON, including support for inferring recurrence rules for events, and ensuring compatibility across clients including Outlook/Exchange, Apple Calendar, ICSx5, and Google Calendar.

For convenience, events can be filtered by various categories with wildcard support, and subscribing the calendar is as simple as pasting the link into the calendar application (replacing html with ics if not auto-detected).

Microsoft Edge Dictionary Parser

  • Go
  • Reverse Engineering
  • File Formats
  • Library

Library to parse offline dictionary files from Microsoft Edge's Immersive Reader.

Essentially, the dictionaries are stored as a sqlite3 database containing two tables: a mapping of terms to one or more shard/word indexes, and a mapping of shards to blobs. The gzipped blobs contain a binary header followed by a sequence of headers and entry JSON.

Chrome Bookmarks

  • Go
  • File Formats
  • Data Recovery
  • Library

Library and tools for parsing and exporting Chrome bookmarks. Includes a simple file carving utility.

cmus

I've contributed features and bugfixes to the cmus music player including greatly improved mouse support and relocatable playlists/libraries.