Projects

Featured work and shipped artifacts.

Featured projects

These are the three portfolio projects I’m building next. As they ship, each project will clickable to view.

B1 — Contract Summarizer

In progress

PDF intake + Anthropic API + FastAPI backend. Focus: prompt design, file handling, structured legal output.

Python FastAPI Anthropic API

B2 — Legal RAG App

Planned

Vector search over legal documents + Q&A interface. Focus: chunking strategy, retrieval accuracy, grounded answers.

Python ChromaDB LlamaIndex

B3 — PL tool with a web UI

Planned

A small developer tool to visualize/inspect program structure (AST/types/steps).

OCaml Web UI Tooling

2025 UB Hackathon Project

A shipped hackathon project: community-driven vending machine map + real-time updates.

VendMe — Community Vending Machine Map

A progressive web app for the UB community to find vending machines and see what’s stocked, powered by photo uploads, points, and moderation.

Hackathon React Flask MongoDB Docker PWA DigitalOcean
Project visuals
VendMe project logo
VendMe app screenshot 1 VendMe app screenshot 2
What it does
  • Shows vending machine locations and stocked items with a real-time map.
  • Users upload photos to keep inventory info up to date.
  • Points system incentivizes contributions; reporting/moderation keeps the platform clean.
How we built it
  • React frontend + Flask backend + MongoDB database.
  • Containerized with Docker and deployed (production hosting).
  • Auth rules: browsing is open; contributing actions require login.

Research case study

Artifacts from my programming languages research: poster + a compiler verification tool (AST visualisation).

Pirouette — Poster + AST Visualisation

Research artifacts from my Pirouette work: a poster overview + an example output from my DOT-based AST generator.

OCaml Type Inference Unification Choreographic Programming Compiler Tooling Graphviz DOT PL Research
DOT-generated AST (example)
DOT-generated AST visualization for a Pirouette snippet Open AST image
Example input (Pirouette snippet)
y := if P1.(3>5)
   then P1[L] ~> P2;
          P2.5
     else P1[R] ~> P2;
          P2.9;