Skip to main content

Projects

GitHub Projects

Recent personal projects — tools, games, and experiments. Full repo list: here.

NoobRL

NoobRL

A traditional turn-based roguelike dungeon crawler written in 100% Python using the tcod library. Dungeons are procedurally generated, and the codebase uses a component-based entity architecture with JSON-driven content for monsters, items, and enchantments. Includes equipment and consumable systems, character leveling and progression, full save/load support, and spatial audio. A work in progress with a long roadmap ahead.

snow-crash

snow-crash

A cyberpunk-themed TUI chat client for locally-running Ollama models. Features token-by-token streaming, chat history persistence in YAML/Markdown, LaTeX-to-Unicode math rendering, collapsible markdown sections, and a retro-futuristic animated interface with rainbow effects. Written in Python.

black-oracle

black-oracle

A local RAG (Retrieval-Augmented Generation) system for querying an Obsidian vault using a locally-run LLM — all data stays on-device. An offline Dagster pipeline ingests and chunks markdown notes, embeds them with HuggingFace MiniLM-L6-v2, and stores them in ChromaDB. A Textual TUI provides a multi-turn chat interface with source previews, backed by Ollama (llama3) for inference and FastAPI for the query layer.

snappy

snappy

A terminal UI for browsing and administering Btrfs snapshots via Snapper, built with Python Textual. Presents a multi-tab interface — one tab per Snapper configuration — with lazy loading so only the active tab initializes on startup. Supports cross-snapshot file search, snapshot size analysis, intuitive browse navigation, and direct deletion, all without leaving the terminal.

prospero

prospero

A command-line tool for personal financial planning, with specific support for Canadian (Ontario) tax scenarios. Tracks portfolio holdings with live prices and gain/loss reporting, projects net worth annually to identify FIRE readiness, and manages adjusted cost basis (ACB) for RSUs. Also computes income tax using current Ontario rates, with FX caching via Bank of Canada rates. Data is stored locally in human-editable TOML config.

loc-delta

loc-delta

A CLI that reports lines-of-code statistics across all your GitHub repositories, broken down by day into lines added, changed, and deleted. Change counts are computed as min(additions, deletions) per file, giving a cleaner picture than raw diff numbers. Covers a configurable lookback window (default: 7 days) and supports querying stats for any GitHub user via a read-only personal access token.

GitHub activity

GitHub contribution graph

Grad School Research

Work from my PhD at the Dynamic Graphics Project lab, University of Toronto. Focused on motion planning for physically-simulated agents — robots, cars, bikes — and character animation.

Motion Planning with Viability Filtering

Motion Planning with Viability Filtering

Exploits knowledge of an agent's viability to prune non-viable trajectories during planning, significantly accelerating sampling-based motion planners for dynamic agents such as cars and bikes. Presented at ICRA 2007.

RRT-Blossom

RRT-Blossom

A variation on Rapidly-exploring Random Trees designed for highly constrained environments. Uses a flood-fill-like mechanism to escape local minima that defeat standard RRT. Presented at ICRA 2006.

Viability Envelopes

Viability Envelopes

A numerical method for keeping a dynamic system's state within a safe region of state-space by constraining control inputs while preserving controllability. Demonstrated on rocket landing, car navigation, and bike balancing. ICRA 2004.

Grasp-Based Motion Planning for Character Animation

Grasp-Based Motion Planning for Character Animation

Automates character animation by treating designated handholds and footholds as geometric constraints, combining posture heuristics and gradient descent to produce natural-looking locomotion for walking, swinging, climbing, and crawling.

Discovery of an "Optimal" Metric

Discovery of an "Optimal" Metric

Learns an empirically-derived distance metric that outperforms the standard L₂ metric for steering dynamic agents in motion planning, by observing path arc lengths during exploration.

Capturing Metrics Using Octrees

Capturing Metrics Using Octrees

An efficient octree-based representation of metric functions with trilinear interpolation and adaptive refinement, used to capture complex automotive motion metrics.

Landmark-Based Motion Planning for Bikes

Landmark-Based Motion Planning for Bikes

A local motion planner for a bicycle agent using a robust path-following controller that exploits the relationship between lean angle, steering angle, and centrifugal force for balancing and navigation.

Sketch-Based Motion Planning

Sketch-Based Motion Planning

Constructs motion plans for nonholonomic car-like vehicles by sequencing known motion primitives ("sketches") with their corresponding controllers, using backtracking to explore alternate sequences.

Decision Surfaces via Opposing NN Pairs

Decision Surfaces via Opposing NN Pairs

Captures viability envelope boundaries using pairs of opposite-class samples placed near the decision surface, exploiting the observation that these surfaces have low local curvature.

Better NN-Based Decision Surfaces

Better NN-Based Decision Surfaces

Improves neural-network decision surface quality through sample filtering and adaptive density sampling, concentrating samples near the boundary where accuracy matters most.

Auto-Discovery of Viability Envelopes

Auto-Discovery of Viability Envelopes

Automatically discovers viability envelope regions using black-box system dynamics, via random exploration, graph construction, and Tarjan's algorithm for finding strongly connected components.