Projects I've shipped, prototyped, or led, each one built around a constraint that ruled out the easy answer.
Assistive benefits coverage chat
Self-serve coverage answers grounded in structured rules, with graceful fallback to human support.
"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.
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.
When an employee asks a question like, “How much massage therapy is left?” the system:
The prototype is built with privacy, reversibility, and auditability as non-negotiable constraints:
AI_CHAT_ENABLED) allows instant rollback to human-only flows.Rails 7 + Stimulus.js
Chat interface with streaming messages and ticket feedback
Ruby on Rails 7, sqlite3
SupportService, AiService, function executors, JSON benefit rules
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.
"Suggestions-only conflict checks that make intake faster and more defensible."
Manual conflict checks often burn 30–60 minutes per new client and are inconsistent to document. That slows intake completion, weakens trust, and makes it harder for firms to prove that conflicts were checked properly.
This prototype explores a low-blast-radius way to move conflict-hint surfacing from minutes to seconds, make documented clearance the default via an attached log, and keep humans firmly in the loop.
A safe, suggestions-only conflict-check assistant that runs on intake, surfaces ranked matches for reviewer decision, and writes an immutable audit log. It is feature-flagged, reversible, and avoids schema changes, so it can plug into Clio-style intake without destabilizing existing workflows.
When a new intake is submitted, the service:
The posture is strictly assistive: the system never hard-blocks intake, and all suggestions and logs respect existing matter and user permissions (ethical walls).
The design focuses on speeding review without creating new risk:
CONFLICT_COLLECTOR_ENABLED for instant rollback.Plain JavaScript + Rails 7
Simple, focused behaviors without a heavy frontend framework.
Rails 7
Rails 7 handling both server rendering and client delivery.
SQLite3
Lightweight relational store for the prototype and local development.
✅ Project Status: Prototype Complete
Built to show how legal practice platforms could add an assistive, reversible conflict-check layer that speeds intake, raises documented clearance rates, and strengthens defensibility without blocking workflows.
Suggestions-only conflict assist
Ranked conflict hints, reviewer decisions, and immutable logs, behind a feature flag for instant rollback.
AI-powered task management
Reducing decision fatigue through intelligent planning
Coming Soon • Full-Stack Developer
"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.
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.
React Native (Expo)
Cross-platform, native performance
Supabase
Auth, PostgreSQL, Edge functions
OpenAI GPT-4o
Langchain-lite, custom memory
🚧 Project Status: In Development
Currently building the MVP with focus on core AI integration and user experience.
Experimentation Platform • Full-Stack & AI Engineer
"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.
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.
When you run an extraction experiment, the system:
When you evaluate prompts instead of full documents, the system:
The harness is built so a surprising number can be traced back to a document, a prompt, and a dollar amount:
Django templates + server-rendered workflow
Document upload/processing, ground-truth annotation, experiment configuration, run results
Django 6.1, SQLite / PostgreSQL
Versioned corpora, experiment executor, evaluation engine, CLI reports (evaluation_report, cost_report, compare_runs)
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.
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.
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.
"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.
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.
When you point it at a project:
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).update.sh reports which initialized projects are missing or drifted vs the payload; you choose what to write back with --skills-only.Built so agent infrastructure stays portable, auditable, and non-destructive:
.ai-init-backup/.update.sh reports only; nothing silently overwrites destinations.skills.json).Bash (POSIX) + Make
init.sh / update.sh, dry-run, conflict modes, YAML init log
Markdown skills + AGENT.md template
Interview skill, TDD ticket flow, commit/PR skills, design-pattern helpers
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.
"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.
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.
When you open a challenge like Employee Report Creator or File Storage Manager, the workflow is:
_with_errors file and hunt for SRP, OCP, LSP, ISP, and DIP issues yourself._with_fixes reference and study alternative valid designs.The pedagogy is built around struggle first, answers second:
C#, Ruby, Python (JS supported for generation)
Realistic domains: reporting, authentication, file storage
Cursor Agent Skills + project AGENT.md
Challenge generation, mentor-style review, spoiler-aware guidance
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.
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.
Software Development Consultant • Cryptocurrency Accounting Platform
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.
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.
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.
Next.js, React
NestJS, Node.js, PostgreSQL, Prisma
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.
Crypto accounting, posted to the real ledger
Deterministic period-end posting to QuickBooks and Xero, with full source traceability and duplicate protection.
Embedded Full-Stack Software Developer • Button Inc. for the BC Government
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.
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.
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.
React, TypeScript
Node.js, Express, Knex, PostgreSQL
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.
Secure data-access workflows for the public sector
Role-based permissions and request traceability inside a self-serve portal for BC Government data submissions.
Embedded Lead Developer
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.
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 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.
Embedded Lead Developer
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.
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 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.
If the problem is messy and the constraint is real (not hypothetical, not "nice to have"), that's my kind of work.