Featured Projects

Projects I've shipped, prototyped, or led, each one built around a constraint that ruled out the easy answer.

Benefits Coverage Assistant

Assistive benefits coverage chat

Self-serve coverage answers grounded in structured rules, with graceful fallback to human support.

Benefits Coverage Assistant

Prototype MVP • Full-Stack & AI Engineer

The Mission

"Safe, assistive coverage answers that build trust instead of tickets."

Today, employee benefits are under-used because people do not know what is covered, how much is left, or where to look. That confusion turns into avoidable HR tickets, slower claim submission, and weak perceived value, which hurts activation and renewals in a new market. In Canada, getting a coverage answer wrong is not just a user experience bug; it erodes trust and bumps into provincial compliance and PHI privacy risk.

This prototype explores a low-risk way for Canadian benefits platforms to increase employee engagement while keeping admins out of the help-desk role and staying inside strict compliance boundaries.

The Solution

A Ruby on Rails 7 assistant that adds an assistive-only benefits chat interface on top of structured coverage rules and balance data. It uses AI for intent classification, executes strongly-typed “function” calls to fetch the right rules and balances, and gracefully falls back to human support tickets when confidence is low or AI is disabled.

How It Works

When an employee asks a question like, “How much massage therapy is left?” the system:

  • Determines intent using a mix of pattern matching and AI classification.
  • Dispatches to executor functions that fetch coverage rules and balances from structured data.
  • Generates natural-language responses that cite specific limits, rules, and disclaimers.
  • Falls back to support ticket creation if AI is disabled, fails, or confidence is below threshold.

Safety & Compliance

The prototype is built with privacy, reversibility, and auditability as non-negotiable constraints:

  • PII redaction (names, phones, emails) is applied before any external AI call.
  • A feature flag (AI_CHAT_ENABLED) allows instant rollback to human-only flows.

Tech Stack

Frontend

Rails 7 + Stimulus.js

Chat interface with streaming messages and ticket feedback

Backend

Ruby on Rails 7, sqlite3

SupportService, AiService, function executors, JSON benefit rules

AI & Safety

OpenAI API + Feature Flags

Intent classification, guarded responses, PII redaction, audit logging

✅ Project Status: Prototype Complete

Built as a portfolio MVP to show how Canadian benefits platforms could introduce an assistive, auditable coverage chat that increases self-serve resolution while maintaining strict privacy and compliance.

Coming Soon

AI-powered task management

Reducing decision fatigue through intelligent planning

AI SMART To-Do List

Coming Soon • Full-Stack Developer

The Mission

"Clarity without chaos. Turn intention into action."

This app helps thoughtful, high-performing individuals turn their goals into focused daily action using AI assistance and minimal interface friction. The mission is to reduce decision fatigue and increase execution through intelligent daily planning grounded in SMART goals.

The Solution

A React Native (Expo) mobile app with AI-powered task management, featuring OpenAI GPT-4o integration for intelligent planning and Supabase backend for seamless data management.

The app includes custom memory layers to track user's SMART goals & task history, with token budgeting middleware to keep AI costs low while maintaining intelligent assistance.

Tech Stack

Frontend

React Native (Expo)

Cross-platform, native performance

Backend

Supabase

Auth, PostgreSQL, Edge functions

AI Engine

OpenAI GPT-4o

Langchain-lite, custom memory

🚧 Project Status: In Development

Currently building the MVP with focus on core AI integration and user experience.

Document Extraction Harness

Experimentation Platform • Full-Stack & AI Engineer

The Mission

"Don't bet a product on extraction quality you haven't measured."

High-value document workflows — pulling obligations, dates, parties, and limits out of PDFs — assume you can extract the right facts and know where they came from. Those assumptions are expensive if they're wrong. Most AI-over-documents demos look plausible in a chat window and fall apart when you ask: which facts did it miss, which citations are fake, and what did that run cost?

This project is not a scaled-down product. It is a measurement instrument: a local Django harness that runs controlled experiments on real PDFs so architecture, model, prompt, and processing choices are made with evidence instead of guesswork.

The Solution

A Django 6 test harness that treats extraction as an experiment, not a feature. You freeze a corpus, annotate the facts you already know are in the documents, then run the same files through different AI models, prompts, schemas, and processing strategies. The system scores each run against that ground truth, reports precision/recall/F1 plus provenance accuracy, and breaks down token usage, latency, and cost — including cost per correct fact.

A separate prompt-evaluation module isolates prompt design from full-document extraction. It generates and compares prompt variations against a large set of test cases and a scoring rubric. That work made a concrete lesson unavoidable: small wording changes can produce drastically better results, but only if you can measure them.

How It Works

When you run an extraction experiment, the system:

  • Processes PDFs into pages and text regions with bounding boxes (PyMuPDF), then freezes them into an immutable corpus snapshot.
  • Uses your approved annotations — expected facts plus quoted evidence — as the scoring key.
  • Extracts facts through a chosen strategy: whole-document, section-based, two-pass, or hybrid (deterministic extractors plus the model).
  • Calls OpenAI, Anthropic, or Gemini through a shared adapter layer, with versioned prompts and JSON schemas.
  • Matches extracted facts to ground truth with deterministic scoring (not an LLM-as-judge), including source/provenance checks (page and region overlap).
  • Writes an evaluation report and a cost/performance report for that run, so you can compare strategies on quality and spend.

Prompt Evaluation

When you evaluate prompts instead of full documents, the system:

  • Loads a frozen set of test cases (input text + expected JSON output).
  • Renders prompt variations (direct instruction, chain-of-thought, few-shot, and other tweaks).
  • Scores each variation with a weighted rubric and pluggable scorers.
  • Reports average/median score, success rate, and timing so you pick a prompt before paying for a full corpus run.

Rigor & Traceability

The harness is built so a surprising number can be traced back to a document, a prompt, and a dollar amount:

  • Every run snapshots corpus, annotations, model, strategy, prompt, and schema so experiments are reproducible.
  • Facts are graded against human-authored ground truth, with diagnostics when metrics collapse (the usual culprit: missing evidence links).
  • Provenance is scored, not assumed — citations have to land on the right page/region.
  • Token-level instrumentation records historical pricing, latency percentiles, retries, and cost per correct fact.
  • Adjacent sandboxes test questions a production system will hit next: how to represent extracted relationships, multi-tenant authorization patterns, and where document data actually flows for Canadian residency analysis (technical evidence, not legal certification).

Tech Stack

Frontend

Django templates + server-rendered workflow

Document upload/processing, ground-truth annotation, experiment configuration, run results

Backend

Django 6.1, SQLite / PostgreSQL

Versioned corpora, experiment executor, evaluation engine, CLI reports (evaluation_report, cost_report, compare_runs)

AI & Evaluation

OpenAI, Anthropic, Gemini adapters

Processing strategies, Pydantic/JSON schemas, deterministic matchers, prompt A/B rubrics, cost instrumentation

✅ Project Status: Harness Complete

Built as a portfolio-scale experimentation platform to show how document-AI decisions should be made: freeze the files, write the facts you expect, change one variable at a time, and keep the evaluation report and the invoice in the same conversation.

Document Extraction Harness

Measured PDF extraction and prompt evaluation

Swap models, strategies, and prompts. Grade extractions against your own ground truth. Get an evaluation report and a cost breakdown — not a vibe check.

Reusable AI Infrastructure

AI coding-agent setup that travels with the repo

Interview-driven setup that installs a project-specific AGENT.md, portable agent skills, and shared process docs — committed into the target repo so collaborators and cloud agents work without depending on this tool.

Reusable AI Infrastructure

CLI Tool • Full-Stack & AI Engineer

The Mission

"Give every project the same disciplined agent workflow — without baking one stack's habits into another."

Coding agents are powerful, but most projects start from scratch: a half-written AGENTS.md, one-off prompts, and skills that hardcode pytest, npm, or cargo. That inconsistency slows onboarding, breaks when a teammate uses a different IDE, and fails in cloud agents that never saw your local setup. The result is fragile AI assistance — useful for the author, unreliable for the team.

Reusable AI Infrastructure explores a low-friction way to turn "how I work with agents" into stack-agnostic infrastructure that lives inside each repo.

The Solution

A Bash + Markdown initializer that interviews you about a target project, drafts a project-specific AGENT.md from a template, and copies a curated payload of agent skills and dev-process docs into that repo. Skills stay domain-neutral: they read commands from AGENT.md instead of hardcoding a stack. Copies are real files, not symlinks, so the destination is self-contained after setup.

How It Works

When you point it at a project:

  • An init-project skill inspects the repo, interviews you about purpose and stack, and drafts AGENT.md.
  • init.sh copies skills, conventions, and process docs into .cursor/skills and .claude/skills, with safe conflict modes (abort, skip, overwrite + backup).
  • Skills cover the full delivery loop: brainstorming, ticket implementation with TDD, commits, PR descriptions, opening PRs, and keeping AGENT.md current.
  • update.sh reports which initialized projects are missing or drifted vs the payload; you choose what to write back with --skills-only.

Design Constraints

Built so agent infrastructure stays portable, auditable, and non-destructive:

  • Domain-neutral payload — leak tests fail if stack-specific terms sneak into skills.
  • Conflict-safe installs — default abort; overwrite backs up to .ai-init-backup/.
  • Opt-in updates — update.sh reports only; nothing silently overwrites destinations.
  • Dual-tool install — same skills for Cursor and Claude Code from one registry (skills.json).

Tech Stack

Installer

Bash (POSIX) + Make

init.sh / update.sh, dry-run, conflict modes, YAML init log

Agent Layer

Markdown skills + AGENT.md template

Interview skill, TDD ticket flow, commit/PR skills, design-pattern helpers

Quality

Shell tests + ShellCheck

Registry-vs-payload checks, leak grep for domain terms, temp-repo isolation

✅ Project Status: Complete

Built as a personal tooling product to show how AI coding workflows can be packaged as reusable, stack-agnostic infrastructure — interview once, commit the result, and keep every project (and every agent) on the same process.

SOLID Principles Practice Lab

Learning Tool • Software Engineer

The Mission

"Build muscle memory for clean design—not just memorize the acronym."

Most developers can recite SRP, OCP, LSP, ISP, and DIP. Far fewer can spot those violations under real pressure, explain why they hurt, and refactor without breaking behavior. Tutorial blogs and slide decks leave a gap: you never struggle with messy, realistic code long enough for the patterns to stick. That shows up later as rigid classes, untestable modules, and costly rewrites when requirements change.

This project turns SOLID from theory into a repeatable practice loop—identify, refactor, compare, and get structured feedback—so design judgment becomes habit instead of trivia.

The Solution

A multi-language practice repository of timestamped challenges. Each challenge ships intentional SOLID antipatterns in a realistic domain (reports, auth, file storage), plus a reference fix. Cursor Agent Skills extend the loop: one skill scaffolds new challenges in Ruby, JavaScript, Python, or C#; another reviews your refactoring like a senior engineer—without inventing violations or spoiling the learning.

How It Works

When you open a challenge like Employee Report Creator or File Storage Manager, the workflow is:

  • Analyze the _with_errors file and hunt for SRP, OCP, LSP, ISP, and DIP issues yourself.
  • Refactor into your own solution, documenting why each change matters.
  • Compare against the _with_fixes reference and study alternative valid designs.
  • Optionally invoke the review skill for mentor-style feedback: what you fixed, what you missed, and what new issues the refactor introduced.

Learning Design

The pedagogy is built around struggle first, answers second:

  • AI assistance is instructed not to dump every violation immediately—guiding questions come before spoilers.
  • Challenges span Intermediate difficulty across C#, Ruby, and Python, with optional hint comments on some problems and “discover it yourself” on others.
  • Reference solutions and journey docs (including Mermaid before/after diagrams) reinforce the “why,” not just the rewrite.

Tech Stack

Languages

C#, Ruby, Python (JS supported for generation)

Realistic domains: reporting, authentication, file storage

Tooling

Cursor Agent Skills + project AGENT.md

Challenge generation, mentor-style review, spoiler-aware guidance

Docs & Structure

Markdown + Mermaid

Timestamped challenge dirs, README catalog, refactoring journey write-ups

✅ Project Status: Practice Toolkit Complete

Built as a portfolio learning lab to show how deliberate practice—and AI as a coach, not a cheat sheet—can turn SOLID principles into instincts you can apply on production code.

SOLID Principles Practice Lab

Hands-on design principle training

Deliberate practice challenges with intentional SOLID violations, multi-language reference solutions, and Cursor Agent Skills that generate new exercises and mentor your refactoring.

Tokenbooks

Software Development Consultant • Cryptocurrency Accounting Platform

The Problem

Tokenbooks is a cryptocurrency accounting platform: automated transaction ingestion, cost-basis tracking, double-entry accounting across blockchain and exchange activity. None of that is useful to an accountant unless it can get into QuickBooks or Xero, the general ledgers finance teams actually run on. Syncing every transaction continuously would turn a detailed crypto subledger into a firehose the external provider was never built to absorb.

The Solution

I built the connectivity layer first: OAuth 2.0 integrations with QuickBooks Online and Xero, spanning the Next.js app, the NestJS backend, and a dedicated accounting-integrations microservice, with portfolio-scoped connection state so the right tenant stays attached to the right authorization through every redirect.

On top of that, I worked on a period-end posting system instead of continuous sync: close a period, deterministically compile the source journal entries into balanced external documents, generate a preview an accountant has to approve, then post asynchronously with duplicate protection and full traceability back to the original Tokenbooks transactions. Tokenbooks stays the detailed subledger; QuickBooks and Xero get a smaller, deterministic summary they can actually hold.

Finding the bottleneck

One part of that compilation step got slow once journal-entry volume grew. The usual story. I built a small benchmark harness to see where the time actually went, found it in a Prisma findMany pulling the full entry set into Node to aggregate, and replaced it with a single PostgreSQL GROUP BY so the database did the aggregation instead of the app. Same diagnostic habit as everything else on this site: don't guess at the slow part, trace it, then fix the actual cause.

Tech Stack

Frontend

Next.js, React

Backend

NestJS, Node.js, PostgreSQL, Prisma

Integrations & Observability

QuickBooks Online, Xero, OpenTelemetry, SigNoz

🔧 Engagement ongoing via ClientFirstLabs, since January 2026

Note: Project summary shared in accordance with confidentiality requirements. Specific implementation details, business logic, and client-identifying information beyond what's listed here have been generalized or omitted.

Tokenbooks

Crypto accounting, posted to the real ledger

Deterministic period-end posting to QuickBooks and Xero, with full source traceability and duplicate protection.

BioHub Platform

Embedded Full-Stack Software Developer • Button Inc. for the BC Government

The Problem

Government data platforms carry a different kind of weight: who can see what, and whether you can prove it later. BioHub needed more reliable data-access workflows, clearer role-based permissions, and a traceable record of every access request, inside a self-serve portal built for submitting and managing public-sector data.

The Solution

I worked as an embedded full-stack developer on the Button Inc. team, building and refining features across the frontend, API, and routing layers, with test coverage built in rather than bolted on after. The focus was reliability: tighter role-based permissions, secure data-access workflows, and request traceability that holds up when someone asks who approved this, and when.

The Impact

A more reliable self-serve portal for managing data submissions, access requests, and the operational workflows around them, with fewer gaps between what the system allows and what it can actually account for.

Tech Stack

Frontend

React, TypeScript

Backend

Node.js, Express, Knex, PostgreSQL

Platform & Security

Keycloak, OpenAPI, JWT, AWS, Docker

Note: Project summary shared in accordance with confidentiality requirements

Specific implementation details, business logic, and client-identifying information have been generalized or omitted.

BioHub Platform

Secure data-access workflows for the public sector

Role-based permissions and request traceability inside a self-serve portal for BC Government data submissions.

Aspire Insurance Solutions Logo

Aspire Insurance Solutions

Embedded Lead Developer

The Problem

A U.S. insurance company was struggling with time-consuming manual processes for agent registration with carriers. Staff were spending approximately 90% of their time on repetitive administrative tasks, leaving little room for higher-value activities.

The Solution

I led the development of a Rails-based platform that automated the intricate carrier registration process. The solution included a suite of bots designed to handle complex DOM traversal and manipulation across deeply nested iFrames, allowing agents to commence policy sales without delay.

I also engineered internal tools such as a REPL for interactive testing and generators for scaffolding new bots, significantly reducing build times and enhancing the robustness of the automation suite.

Reliability mattered as much as speed: the platform ran test-driven with RSpec and GitHub Actions CI, held production error below 1%, and shipped on weekly releases while I mentored junior developers on the team.

The Impact

The Aspire platform eliminated roughly 90% of repetitive administrative tasks and cut operational costs by more than $100,000 a year. Staff moved off manual onboarding and onto higher-value work, and the team could trust the platform enough to lean on it for weekly releases instead of working around it.

Note: Project summary shared in accordance with NDA

Specific implementation details, business logic, and client-identifying information have been generalized or omitted.

Aspire Application Case Study
Wecasa Platform Case Study
Wecasa Logo

Wecasa Platform

Embedded Lead Developer

The Problem

Luxury vacation home co-ownership needed a solution to simplify and fairly manage booking among multiple owners. The existing system lacked transparency and equitable access, leading to conflicts and operational inefficiencies.

The Solution

I contributed to building a Rails-based platform that reimagines luxury vacation home co-ownership. I developed and implemented business rules for a transparent booking system that allocates vacation time fairly among co-owners, considering factors such as ownership percentage, seasonal demand, and cancellation history.

I also built a self-serve sandbox environment to facilitate user onboarding and enhanced data flow across internal tools and third-party systems, including AWS S3 and an admin dashboard built with Retool.

The Impact

The platform ensures equitable booking among multiple owners, streamlining operations and enhancing user experience. The self-serve sandbox cut support tickets by 60% and improved user activation: owners could configure and preview their own property features instead of filing a request and waiting. The enhanced data flow and DevOps improvements contributed to overall platform reliability and operational efficiency.

Note: Project summary shared in accordance with NDA

Specific implementation details, business logic, and client-identifying information have been generalized or omitted.

Want to work together?

If the problem is messy and the constraint is real (not hypothetical, not "nice to have"), that's my kind of work.