Projects

Focus Suite

Live BraveFill WindowFocus AppFocus

Three tiny resident macOS hotkey daemons for fast window and app switching — BraveFill snaps Brave windows onto an external display, WindowFocus jumps to named browser windows by number, and AppFocus focuses or launches apps by hotkey. Each is a single Swift file wrapped in a minimal .app bundle.

  • Swift
  • Carbon API
  • Accessibility API

GeoMap

Live GitHub

A narrative travel gallery site built on two years of personal location data, pairing trip journal entries with four analytical map views — walking-route playback, city footprint hulls, a 24-hour SVG rhythm clock, and hotel walking-reach isochrones computed live from routing data.

  • Leaflet.js
  • OSRM API
  • JavaScript

Vocapture

GitHub

A CLI running on a Raspberry Pi 5 that turns reading physical books into flashcards: type a word, the Pi photographs the page, OCRs the sentence, sends it to Claude for a context-correct definition, and syncs the result to Anki.

  • Python
  • OpenCV
  • Tesseract OCR
  • Anthropic API

NotesVim

GitHub

Bring Obsidian's Vim mode to Apple Notes — runs the same codemirror-vim engine headlessly and drives it through the macOS Accessibility API, so motions, operators, macros, and commands work exactly as they do in Obsidian.

  • Swift
  • JavaScript
  • Accessibility API

ChronoMap

GitHub

A zero-install DataviewJS script for Obsidian that plots notes on an interactive Leaflet map and connects them chronologically using coord/date frontmatter, styled to match Obsidian's native graph view.

  • JavaScript
  • DataviewJS
  • Leaflet.js

Rummy

GitHub

A single-player Rummy card game built in Godot, playing a full draw/meld/discard round against a computer opponent on a stylized 2.5D table. Built as a minigame at UQCS Hackathon 2026.

  • Godot
  • GDScript

Definition Harvester

GitHub

A Chrome extension that scans every Google search tab open in the window, pulls each word's AI Overview definition out via a four-tier extraction fallback (highlight marks, manual selection, regex parsing, classic dictionary cards), and exports the harvested set to CSV, Google Sheets, or Anki for spaced-repetition study.

  • JavaScript
  • Chrome Extension APIs
  • AnkiConnect

Hermes

GitHub

A personal automation agent built on Nous Research's Hermes Agent CLI, running eight scheduled cron jobs that deliver daily news, market, tech, Thailand, and Australia briefs — five narrated as spoken audio — to Discord and log permanent copies to an Obsidian vault, plus a message-triggered feature that turns any Discord message into a journal to-do or kanban card.

  • Shell
  • Hermes Agent
  • OpenRouter
  • Discord API

Birdboard (UQCS Hackathon)

GitHub

A physical-controller arcade compilation built in Godot for UQCS Hackathon 2026, chaining six minigames — coin-collecting mazes, a 3D liminal-space maze with timed-puzzle loot chests, a hand-tracked Flappy Bird clone, and a keypad-driven poker duel — behind custom Arduino hardware: a joystick, a membrane keypad, and an ultrasonic distance sensor.

  • Godot
  • GDScript
  • Arduino
  • C++

CampusConnect

GitHub

A mobile app built for a university course that centralizes campus events and timetables, with schedule sharing, clash filtering, and recommendations based on free time, interests, and club memberships.

  • React Native
  • Expo
  • TypeScript

BombParty CLI

GitHub

A single-player terminal recreation of jklm.fun's BombParty — type a word containing the given letter chunk before the timer runs out, validated against a ~370k-word English dictionary.

  • Python

Dashboards

FinanceDash

GitHub

An offline-first personal finance dashboard that imports CSV/XLSX transaction exports and visualizes income, expenses, and category breakdowns entirely client-side — no server, no cloud, data stored only in browser local storage.

  • React
  • Tailwind CSS
  • Recharts

Market Dashboard

Live GitHub

A single-page market dashboard aggregating live TradingView widgets — ticker tapes, a sector heatmap, forex cross rates, and an interactive stock chart — with no backend of its own.

  • TradingView Embed API
  • JavaScript

Scripts

Vimari-IMproved

GitHub

A personal fork of Vimari, a Vim-style keyboard navigation extension for Safari — replaces upstream's choppy, repeated-call scroll animation with a single time-based one, fixing stalls on pages with smooth-scroll CSS and infinite feeds.

  • JavaScript
  • Swift
  • Safari Web Extension

pdf2vault

GitHub

A dependency-free Node.js script that rasterizes a lecture PDF into right-sized per-page PNGs via Poppler's pdftoppm and writes an Obsidian note embedding every slide in order — replacing a manual screenshot-and-paste workflow, with sequential filenames and safe re-runs.

  • Node.js
  • Poppler

toc

GitHub

A command-line tool that adds, removes, and lists PDF outline entries directly in the file — Markdown-style nesting, page-order insertion, re-parenting of children on removal — so the table of contents shows up in Preview, Skim, Acrobat, and every other PDF reader's sidebar.

  • Python
  • pikepdf
  • qpdf

Obsidian Clipper

GitHub

Clipping templates for the Obsidian Web Clipper extension that turn GitHub repos, Goodreads books, and YouTube videos into structured notes by targeting page DOMs via stable data-testid hooks.

  • Obsidian Web Clipper
  • JSON

Obsidian Template

GitHub

A collection of Obsidian scripts and templates for managing university coursework — a DataviewJS dashboard that recursively maps a note's full connected subgraph, a Gantt chart plotting reading progress across the year and much more.

  • Obsidian
  • DataviewJS
  • Templater
  • Excalidraw

Brave Move

GitHub

A Chrome extension that moves the selected tab(s) to another named Brave window and follows them there — paired with a tiny Swift native-messaging host that reads window names via Brave's AppleScript dictionary.

  • JavaScript
  • Chrome Extension APIs
  • Swift
  • AppleScript

Window Switch

GitHub

A resident macOS tool that makes Option+` toggle between an app's two most recently used windows, the way Cmd+Tab toggles between apps — catching the key with a CGEventTap and ordering windows via the window server.

  • Swift
  • CGEventTap
  • Accessibility API

Tab Range Select

GitHub

A tiny Brave/Chromium extension that selects multiple tabs from the keyboard — the current tab anchors the selection, and each keypress grows or shrinks it by one tab, like Shift+arrow in a text box.

  • JavaScript
  • Chrome Extension APIs

Obsidian Open

GitHub

A yazi opener script that jumps a markdown file straight into its owning Obsidian vault — resolving symlinks to the real file, then handing off to the Mononote plugin to focus an already-open tab instead of duplicating it.

  • Shell
  • yazi
  • Obsidian

linkedin2md

GitHub

Converts a LinkedIn data export into one markdown file per profile category — picking a layout per CSV's shape (flat fields, bullet list, or one section per entry), skipping media/activity noise and private contact files by default, and preserving your text verbatim.

  • Python

Notes Image

GitHub

A one-command fix for pasting browser images into Apple Notes — browsers copy a picture alongside an HTML link, so this strips the clipboard down to just the picture before you paste.

  • Shell

BraveFocus Shortcut

GitHub

A macOS Shortcuts / AppleScript script that focuses Brave Browser windows by title using Cmd+Shift+1–9 — the no-compile predecessor to the Swift-based WindowFocus.

  • AppleScript
  • macOS Shortcuts

Vocab Apps Script

GitHub

A Google Apps Script toolkit adding custom Sheets functions for dictionary lookups — definitions, synonyms, phonetics, and part of speech — pulled live from the Free Dictionary API. Later evolved into Vocapture.

  • Google Apps Script
  • JavaScript

TamperMonkey Distraction Util

GitHub

A pair of Tampermonkey userscripts that strip distracting feeds from the browser: redirecting away from Instagram Explore/Reels and continuously removing YouTube Shorts sections.

  • JavaScript
  • Tampermonkey

Configs

nvim

GitHub

A LazyVim-based Neovim configuration with custom fuzzy mark/buffer-jump plugins (snacks-mark, snacks-jump) and a hand-tuned Catppuccin Mocha colorscheme.

  • Lua
  • Neovim
  • LazyVim

dotfiles

GitHub

Zsh and Vim dotfiles: vi-mode keybindings, a git-aware prompt showing command timing and exit status, eza-based ls aliases, and a yazi wrapper that moves the shell to wherever you navigated to.

  • Zsh
  • Vim

tmux

GitHub

A tmux configuration with vim-style pane navigation, fzf-powered popups for jumping between windows and sessions by recency, and a minimal custom status bar.

  • tmux
  • fzf

yazi

GitHub

A yazi file manager configuration with a custom folder-sorting plugin, a Nord flavor, and a shell script for copying bracket-containing paths in a Zsh-queryable form.

  • Lua
  • Yazi

eza

GitHub

Tokyo Night theme for eza, covering file kinds, permissions, size units, and multiple stylings.

  • eza
  • YAML