Projects
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
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
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
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
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
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.
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
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
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.
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
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.
Scripts
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
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.
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.
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.
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
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
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
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
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.
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.
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.
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
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
A pair of Tampermonkey userscripts that strip distracting feeds from the browser: redirecting away from Instagram Explore/Reels and continuously removing YouTube Shorts sections.
Configs
A LazyVim-based Neovim configuration with custom fuzzy mark/buffer-jump plugins (snacks-mark, snacks-jump) and a hand-tuned Catppuccin Mocha colorscheme.
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.
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.
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.
Tokyo Night theme for eza, covering file kinds, permissions, size units, and multiple stylings.