Software developer with five years of experience building web, mobile and backend applications. My work includes restaurant ordering and payments, document extraction, and search tools used by retail staff.
Experience
Software Developer, AI & Automation
March 2025 – Present
Above Ground Art Supplies · Toronto, ON
Independent art-supply retailer, two Toronto locations
- Built a Python invoice extraction tool using LLMs and pdfplumber, developed against 80 vendor formats and since run on 130+ without per-vendor templates, saving purchasing and finance approximately 40 hours a month.
- Built a React knowledge base used daily by 30+ staff, combining keyword and vector retrieval in PostgreSQL/pgvector with source citations in each answer.
- Built React tools for procurement pricing and payroll reconciliation, using prior-year margins for quotes and flagging payroll anomalies for review.
Technical details: extraction and search
AI Invoice Extraction
- Purchasing and finance use the application in their regular invoice workflow. It replaces manual entry and saves approximately 40 hours a month.
- The LLM identifies invoice structure and pdfplumber extracts numeric values. This separates layout interpretation from the numeric checks used to validate the output.
- A second model pass and independent parsing re-check extracted values, with line amounts and quantities checked against document totals. Confidence is measured before and after the retry to decide whether the second pass resolved the disagreement or the field should be flagged. About 3% of line items reach human review, and corrections made there are added to the validation set, so later changes are tested against cases that were previously wrong.
- Developed and validated against approximately 80 vendor formats, with 130+ distinct layouts processed in production since, none of them needing a template of their own.
- The desktop client provides progress tracking, CSV export and processing on worker threads. Errors are reported per invoice so one failed document does not stop a batch.
Inventory Knowledge Base
- Keyword matching handles exact product codes and brand names. Vector similarity handles descriptive questions and paraphrases.
- PostgreSQL with pgvector stores documents and embeddings. Retrieval combines normalized keyword and vector scores using a weighted sum, tuned on logged staff questions and synthetic variants.
- Recall is measured on queries logged after tuning, so the evaluation set is held out by time rather than by sampling. On those queries the expected product ranked first for 84%, in the top five for 92%, and in the top ten for 96%.
- Retrieval covers vendor product guides, the live inventory catalogue and internal training and policy documents.
- Answers cite page ranges in vendor guides or clauses in store policies. Internal document dates are shown, and policy answers link to the full document.
- Staff can browse by category, ask follow-up questions and revisit previous conversations. Queries are scoped to the store where they work.
- Product comparisons use tables; procedures use numbered steps. Product answers include the stocking department from the inventory data.
- Question history supplies real queries for retrieval tuning, with synthetic variants adding alternative phrasings. Because the log keeps growing, each round of tuning is measured against questions asked after it — the product supplies its own held-out set.
- Responses include thumbs-up/down feedback. Procedures requiring a manager’s decision tell staff to escalate.
Software Developer
August 2021 – February 2025
NextGen Kitchens · Vancouver, BC (Remote)
White-label restaurant commerce platform; 20+ restaurant brands
- Built the MVP of a restaurant commerce platform used by 20+ brands across iOS, Android, web, kiosk and POS, using React Native, React, Node.js and GCP.
- Co-designed a backend rebuild with one other engineer and drove the migration, consolidating order processing, payment fees and disbursements while moving restaurants across in stages.
- Implemented both channel and POS APIs with Deliverect to reach 40+ POS systems, plus a direct Square integration for menu synchronization and bidirectional order flow.
- Implemented Stripe and Square payments, including card-present terminals, Apple Pay and Google Pay, with Stripe Connect splitting payments across restaurant brands in a single order.
- Migrated the application to TypeScript, improved startup performance with Hermes and lazy loading, and maintained Jest tests, Crashlytics monitoring and on-call support.
Technical details: migration and integrations
The new order module handled creation, payment and status through a shared interface for Stripe, Square, Deliverect and DoorDash. Both versions ran alongside each other during migration; restaurants moved individually and a conversion script backfilled their order history.
White-Label Restaurant Commerce Platform
- A shared React Native and React codebase serves iOS, Android, web, kiosk and POS. Branding is configured per restaurant; platform-specific files handle differences in kiosk and web screens.
- Branded apps and kiosks send orders to restaurant POS systems. Orders from external channels return to the platform dashboard for reporting and invoicing.
- Implemented Deliverect channel and POS APIs, including catalogue updates, order acknowledgements and availability controls, working with Deliverect’s team. The hub provides access to 40+ POS systems.
- Integrated Square directly using per-restaurant OAuth, catalogue synchronization, order APIs and Square Loyalty. Firestore and GCP Cloud Functions support real-time updates and webhook processing.
- Implemented Stripe Terminal and Square hardware payments alongside web and mobile checkout, including Apple Pay and Google Pay.
- Integrated DoorDash Drive with JWT authentication, store provisioning, delivery quotes at checkout and status webhooks for tracking and notifications.
- Used Stripe Connect to split payments when one order contained items from multiple restaurant brands.
- Built loyalty, rewards, gift cards and referrals, along with discounts supporting redemption limits and minimum spending requirements.
- Added receipt printing from kiosk and POS applications to Star and Epson hardware.
nextgenkitchens.comAndroid appiOS appNext Eats iOSWeb app
Personal projects
Fennel
2026
A macOS voice assistant with local speech recognition, language-model inference and speech synthesis. Built with SwiftUI and a bundled Python runtime, with tools for reminders, calendar events, web search and image generation.
fennel.gardenGitHub
Implementation details
- The SwiftUI application and Python/MLX backend ship in one macOS bundle. Models download on first use with user approval. Source code is available under GPL-3.0.
- Swift handles audio capture, echo cancellation and playback. Python handles the models. The processes communicate over a local WebSocket with defined audio and control messages.
- The voice pipeline combines Silero VAD, Whisper recognition, streaming inference and Kokoro synthesis. Prefix-cache reuse reduces repeated prompt processing; barge-in support lets the user interrupt a response.
- Automated compatibility checks verify that supported models load, respond to a conversation and render tool definitions. These checks gate the supported-model list.
- Fourteen tools support actions such as creating reminders and calendar events through EventKit, running Shortcuts, searching the web and generating images. Inference and speech processing run locally; web search and other network-dependent tools contact external services.
- SQLite stores cross-session memory with full-text and vector retrieval. Rolling summaries keep the conversation context bounded.
- The BERT encoder producing the vectors is written directly against MLX, around 120 lines loading bge-small-en-v1.5 weights with CLS pooling and L2 normalisation. An off-the-shelf embedding library would have added mlx-vlm, opencv and uvicorn to the bundle. Encoder output is checked against the PyTorch reference implementation, and retrieval falls back to keyword search if the encoder is unavailable.
- Image-generation models load when needed. The application can unload the language model to free memory before generating an image.
Harvest Rush
2025-2026
A multiplayer game built with Expo/React Native and a Node.js WebSocket server. Clients send player input; the server simulates movement, collisions and scoring. Load-tested to 160 concurrent players across lobbies on one VM.
harvestrush.fennel.gardenGitHub
Implementation details
- The Node.js/TypeScript server owns movement, collisions, hits and pickups on a 60ms tick. Clients send input rather than final positions or scores, limiting opportunities to manipulate game state.
- Player and projectile positions are sent each tick. Crops and power-ups use add/remove events. Lobbies admit up to 40 real players, with additional lobbies created as needed.
- Client interpolation separates rendering from the network tick. Spatial-grid indexing limits proximity checks to nearby entities, and distance-based detail reduces rendering work. Load-tested to 160 concurrent players across lobbies on one small VM.
- Touch controls include a joystick and a fire-anywhere gesture. Camera framing and zoom adapt to the viewport.
- Sprites use palette-indexed matrices rendered as SVG at runtime, allowing character colours to change without separate image files.
- PostHog links client and server analytics. Firestore security rules allow public leaderboard reads and restrict writes to the server.
- The game server runs on Fly.io and the client on Firebase Hosting. Server credentials remain separate from public client configuration.
Interactive 3D Portfolio
2026
A Sims-inspired portfolio built with three.js and HTML. Visitors can explore the house or open every portfolio section directly from the navigation, using touch or keyboard controls.
Implementation details
- Furniture and scenery are assembled from simple geometry at runtime. Character textures provide detail without downloading scene models.
- Grid-based pathfinding routes characters around furniture. Waypoint smoothing removes unnecessary turns, and clearance checks prevent characters becoming trapped between obstacles.
- Procedural character animation coordinates hips, knees and ankles with each stride, with separate poses for activities such as cooking, reading and painting.
- Web Audio synthesizes the background music, character voices and sound effects without downloaded audio tracks.
- HTML panels sit above the WebGL canvas. World labels follow their objects, while portfolio navigation provides direct access to the same information.
- The application uses ES modules and a static build script. Node tests cover navigation, interactions and other logic that runs without a browser.
Earlier projects
Custom Search Engine
2020
A Java search application using Apache Nutch to crawl articles and MongoDB to store the index. Results are ranked by weighted term matches and displayed in a desktop client.
GitHub
Technical skills
LanguagesTypeScript · JavaScript · Python · SQL · Swift
AI & LLMLLM APIs (OpenAI, Anthropic) · RAG · hybrid retrieval · vector search · pgvector · embeddings · LLM tool calling · structured outputs · Whisper · MLX
FrontendReact · Next.js · React Native · Expo · Zustand · HTML5/CSS3
BackendNode.js · FastAPI · REST API design · WebSockets · GCP Cloud Functions
Data & CloudPostgreSQL · Firestore · SQLite · MySQL · GCP · Firebase · Fly.io · Docker
PracticeGit · CI/CD · Jest · Crashlytics · on-call incident response
IntegrationsStripe (Connect, Terminal) · Square (Payments, Terminal) · Apple Pay · Google Pay · Twilio · SendGrid · DoorDash Drive · Deliverect
Education
Bachelor of Science, Computer Science
June 2020
Toronto Metropolitan University (formerly Ryerson) · Toronto, ON — Distinction · Dean's List 2019 & 2020 · GPA 3.6/4.0