I'm a software developer based in New Hampshire with six years of experience building production systems at the intersection of software and physical hardware. I started my career at Turbocam International as a CNC machine operator making aerospace components, and moved into software a year later — a path that still shapes how I think about every system I build.

Most of my work lives close to the metal: Automated manufacturing cells, PLC communication layers, hardware audit services, data pipelines that keep aircraft parts traceable. I've also built the tools that sit above that layer — orchestration platforms, ERP integrations, internal quality management systems — and a homelab's worth of personal projects that keep the learning going outside of work hours.

I care about accurate, maintainable software that actually solves the problem in front of it. I'm drawn to companies where the software has real consequences — where a bug doesn't just throw an exception, it stops a machine.

Portfolio

  • Haas Automation Cell API — Lights-Out Cell Integration with International Partner

    2025
    • Professional
    • Automation
    • Full stack

    An ASP.NET Core HTTP API that exposes a request/poll interface to a Haas CNC controller for part sign-off, serial number retrieval, laser marking, and CMM measurements. The API handles the actual integration with the Keyence laser marker and Wenzel CMM on the server side, keeping hardware details off the controller. A containerized dummy API with a mock HTML UI was shipped to Haas Automation in Germany so their engineers could develop and test controller logic months before the physical machine arrived in the US.

    Motivation

    The business unit ordered an externally developed automated cell without involving the software team. Haas engineers in Germany needed a stable API contract to build against while the production version was still being designed — and the proprietary production code could not be shared.

    Challenge

    The scope was larger than initially described: beyond part sign-off and serial number retrieval, the API would need to directly command a Keyence laser marker and poll a Wenzel CMM for measurement results — hardware integrations that had to be negotiated and designed mid-project. Simultaneously, the Haas team in Germany needed something to develop against immediately, with no access to any of Turbocam's real infrastructure or data.

    Solution

    A minimal dummy API was built that matched the exact OpenAPI spec of the production version endpoint-for-endpoint, with Bearer authentication wired in identically. A lightweight HTML mock UI let the Haas developer simulate state changes on the CMM and laser marker — triggering the same async polling flow their controller would use in production. The whole thing was containerized into a single Docker image and emailed to Germany. On the production side, the layered architecture from the Keyence laser cell was extended: the laser marker communication library was reused as-is, and a new integration layer was added to command the Wenzel CMM and surface its results through the same request/poll API pattern the Haas controller expected.

    Outcome

    When the machine arrived in the US, integration was completed in roughly a day. Architectural improvements back-ported cleanly to the previous cell generation, validated by existing unit tests with no regressions.

    • C#
    • ASP.NET Core
    • REST
    • Bearer authentication
    • OpenAPI / Swagger
    • Docker
    • Containerized API distribution
    • Keyence Laser Marker
    • Wenzel CMM integration
  • Keyence Laser Marker Cell — Aerospace Traceability & Audit System

    2025
    • Professional
    • Automation
    • Hardware integration

    A traceability and audit server application that verifies laser marker parameters against a locked specification sheet, drives a PLC handshake, retrieves serial number queues from a production API, and records a complete time-stamped parameter history for every part marked — providing comprehensive parameter traceability for aerospace customers.

    Motivation

    A major aerospace customer imposed strict requirements: laser parameters must be verified before and after every mark, with a full history linkable to individual part serial numbers. Existing systems were failing, isolated, and nearly impossible to maintain — a significant compliance and audit risk.

    Challenge

    Keyence provided no .NET SDK, leaving the documented TCP wire protocol as the only integration path. At the same time, the software and Automation teams operated on completely different development timelines — waiting for the physical cell to be ready before testing any server logic was not an option.

    Solution

    The TCP protocol was implemented from Keyence's communication manual as a parameterized template engine: a method accepts a message template and a parameter dictionary, interpolates values into the wire format, sends to the UTF-8 TCP stream, and parses responses back out by matching against a corresponding response template. This made implementing the full command set fast and nearly bug-free. To decouple development from the physical cell, a software-in-the-loop (SIL) testing approach was built using C# source generators: generated stub classes mirrored the real PLC's tag interface, letting the full control logic be exercised against a simulated PLC in unit and integration tests. State transitions, fault paths, handshake sequences, and timeout behavior were all validated from the test harness long before any hardware was available — and the same stubs were swapped for live PLC clients in production with no changes to the control code. When the real machine was first connected, the software worked correctly within a single day.

    Outcome

    Significantly improved traceability, resolved the failures caused by legacy systems, and built enough customer trust to justify a second identical cell and a follow-on automated cell project. Audit logs reliably correlate laser parameters to individual parts for any future quality investigation.

    • C#
    • ASP.NET Core
    • libplctag
    • TCP socket programming
    • Custom protocol implementation (Keyence)
    • JSON Schema
    • EF Core
    • SQL Server
    • OpenTelemetry
    • Grafana
    • Software-in-the-loop (SIL) testing
    • C# Source Generators
    • Layered architecture
  • WipUpRev — High-Throughput Blueprint Revision Migration Service

    2025
    • Professional
    • Data pipeline

    A parallelized data transformation pipeline that migrated hundreds of thousands of aerospace inspection records from one drawing revision to another using a graph-based specification mapping algorithm. The project protected millions of dollars of at-risk inventory and a critical customer relationship.

    Motivation

    A top aerospace customer mandated that all parts conform to a specific drawing revision by a hard deadline. The business unit had millions of dollars of stock inspected to older revisions. Failure to meet the requirement would have seriously damaged the company's most important customer relationship.

    Challenge

    The naive approach — a lookup table mapping old features to new ones — broke down almost immediately. Bubble numbers changed between revisions, measurement types changed, some features had no equivalent in the new revision, some previously in-tolerance parts became out-of-tolerance on the new rev, and some new features had no historical data at all. No single heuristic could cover the space. Throughput was also a hard constraint: hundreds of thousands of parts needed to be processed under a tight deadline.

    Solution

    A graph-based specification map was designed in close collaboration with a senior Quality Engineer: each feature at each revision is a node, and edges encode the transformation rules between them. A breadth-first walk of the graph from any starting feature determines the exact sequence of changes needed to reach every corresponding feature on the target revision, including cases where features split, merge, or disappear. The processing pipeline was built on C# TPL Dataflow for parallel execution, with IAsyncEnumerable feeding parts in asynchronously. Workers hit only production APIs with no direct database access, which meant the process could be scaled horizontally by spinning up additional instances — critical for hitting throughput targets on the initial run of over a hundred thousand parts.

    Outcome

    Launched on time. Millions of dollars of at-risk inventory was protected and the customer relationship was maintained. The scalable architecture supported the project's next phase with minimal rework.

    • C#
    • Graph algorithms (BFS)
    • TPL Dataflow
    • IAsyncEnumerable
    • ASP.NET Core
    • OpenTelemetry
    • PowerBI integration
    • CSV sharding
    • Horizontal scaling
    • Parallel pipeline architecture
  • AWS Receipt Processing & Personal Finance Service

    2023
    • Personal
    • Full stack
    • DevOps & infra

    A personal finance application that uses AWS Textract to extract line-item data from receipt images stored in S3, triggers processing via a Python Lambda, and surfaces the structured data through an ASP.NET Core + GraphQL API backed by PostgreSQL — running in a self-managed Raspberry Pi k3s homelab.

    Motivation

    Built to gain hands-on AWS and Kubernetes experience outside of work while solving a real personal need. The goal was to integrate multiple async data sources — bank OFX exports, manually uploaded receipts, and Textract OCR results — into a single coherent financial data model.

    Challenge

    Three async data paths needed to converge into one consistent model: S3 event triggers firing Lambda functions, Textract jobs completing asynchronously, and OFX bank export files parsed on a separate schedule. IAM scoping and S3 event configuration both had failure modes that weren't obvious until they happened.

    Solution

    IAM roles were scoped tightly per service rather than using a single broad key, which forced explicit reasoning about each data path's permissions and made misconfiguration easy to spot. S3 event notifications trigger a Python Lambda that launches Textract and stores the parsed output. The homelab side runs on a two-node Raspberry Pi k3s cluster: a Cloud Native PG cluster for persistence, a Helm-deployed Grafana/Prometheus stack for visibility, and Redis for the finance app — all managed via Kustomize.

    Outcome

    Fully operational in a two-node homelab. Provided the practical AWS and Kubernetes fluency that now informs professional architectural decisions.

    • AWS (S3, Lambda, Textract, IAM)
    • Python
    • ASP.NET Core
    • GraphQL
    • PostgreSQL
    • Docker
    • k3s
    • Helm
    • Redis
    • Grafana / Prometheus
    • ofxparse
  • IoT LoRa Remote Control System

    2023
    • Personal
    • Hardware integration

    An end-to-end IoT remote control system using MQTT and LoRa radio. A CircuitPython Feather M4 bridge device polls Adafruit IO for state changes and relays commands over 915 MHz LoRa (RFM9x) to a remote receiver that actuates a physical load.

    Motivation

    Needed reliable wireless control over a long distance where WiFi was not viable. The project was also a deliberate exercise in implementing the full IoT stack from cloud broker down to the RF physical layer.

    Challenge

    Packet framing, error handling, and status feedback had to be implemented in CircuitPython, where available memory is measured in kilobytes and standard library support is minimal. The bridge device also had to maintain a reliable SSL WiFi connection to Adafruit IO while simultaneously managing the LoRa radio link — two very different communication stacks running on a microcontroller.

    Solution

    A simple fixed-length packet format was designed for the LoRa link that could be parsed with minimal memory allocation. The Feather M4 runs a tight polling loop: check Adafruit IO for state changes over SSL, encode any change into a LoRa packet, transmit, and wait for an acknowledgment from the receiver before updating the broker.

    Outcome

    The system worked as intended. The project deepened practical knowledge of the full IoT stack in a way directly applicable to robotics and automation work.

    • CircuitPython
    • MQTT (Adafruit IO, Mosquitto)
    • LoRa (RFM9x, 915 MHz)
    • WiFi / SSL
    • NeoPixel status indication
    • Packet framing
    • Embedded systems design
  • Automato — Low-Code Automation Orchestration Platform

    2022
    • Professional
    • Automation
    • Hardware integration

    A visual, low-code workflow designer that coordinates messaging between modular hardware and software plugins. Allows automation engineers to wire up PLC signals, camera inspections, and custom actions through a drag-and-drop UI — replacing three hard-coded application variants with a single, flexible platform.

    Motivation

    The Automation group requested three separate variants of an existing camera inspection app. Maintaining three codebases was unsustainable for a small team. Drawing on experience with hardware integration and modular software design, the goal was a plugin-based orchestration engine — one that would let automation engineers modify process logic in seconds without a code deployment.

    Challenge

    The runtime needed to be genuinely expressive: Routines required conditional branching, scoped variables, and inline math/string expressions — enough power to replace real code without requiring users to write any.

    Solution

    A lightweight AST expression parser was built from scratch, supporting basic math with correct operator precedence and string interpolation against the active Data Context. The Data Context itself uses a hierarchical parent-scope lookup — similar to lexical closures — so variables declared at the application level are accessible inside Routines, while Routine-scoped variables stay isolated. Together these gave the workflow designer the expressive power of a simple scripting language without any external dependency.

    Outcome

    Supports automated production of aluminum impellers across the facility. Process changes by automation engineers now take seconds instead of days. The plugin architecture was reused directly in the Haas Automation cell project with no structural changes.

    • C#
    • WPF
    • libplctag
    • Allen-Bradley PLC / CIP
    • Plugin architecture
    • AST expression parser
    • Event-driven architecture
    • XML configuration
    • Windows API
  • CognexParser Fleet — Multi-Station Camera Inspection Plugin

    2022
    • Professional
    • Automation
    • Hardware integration

    An Automato plugin that consumes pass/fail results from Cognex InSight camera jobs via the SDK, coordinating inspection outcomes across multiple station configurations — single-station, dual-side, and fully automated lights-out cells — through one configurable codebase.

    Motivation

    CognexParser was a monolithic app with no integration points. Three different cell configurations needed to be served without maintaining three separate codebases. Refactoring it into an Automato plugin was the path to covering all variants from one deployable.

    Challenge

    The plugin had to handle single-camera, dual-station, and future multi-camera configurations. Each station needed to reliably open full-screen on a specific physical monitor — a requirement that had to survive reboots, display order changes, and varying hardware setups across different cells.

    Solution

    Windows APIs were used to query live display geometry at runtime. The settings pane renders a diagram of the detected monitors; clicking one assigns a station to it. That assignment is persisted in the plugin configuration so the station always opens full-screen on the correct display, regardless of how the OS enumerates monitors on startup. Multi-camera multiplexing was also built in as a latent capability — the configuration model supports it without surfacing complexity to users who don't need it.

    Outcome

    One plugin configuration covers all known cell variants in production. Latent multi-camera support is built in, ready for future cycle-time improvements without a code change.

    • C#
    • Cognex InSight SDK
    • WPF
    • Windows multi-monitor API
    • Plugin interface design
    • Event-driven messaging
    • Dynamic capability advertisement
    • Configuration serialization
  • ToolBossParser — ERP Integration & Automated Reporting Service

    2022
    • Professional
    • Data pipeline

    A scheduled Windows service that ingests daily CSV exports from inventory management kiosks, validates and imports the data, uploads each line item to Epicor cloud ERP through a multi-step pipeline, and emails styled HTML summary reports to finance and shipping managers — saving roughly 10 hours of manual work per week.

    Motivation

    Finance staff were manually copying data between inventory kiosk reports and ERP forms every day — an error-prone, time-consuming process with no audit trail.

    Challenge

    Each ERP upload required multiple sequential API calls per line item: part lookup, job lookup, inventory prefetch, and a bin transfer to complete the tooling-to-job assignment. An initial deep-call-stack design — where each step internally called the next — produced enormous, nearly unreadable stack traces when any step failed, making errors nearly impossible to attribute or debug.

    Solution

    The call stack was flattened into a pipeline architecture: each ERP step became a discrete class that received a line item object, performed one operation, appended a result status, and returned. The orchestrator passed each item through the stages in sequence and collected failures without any step knowing about the others. This made the failure surface immediately obvious and the code straightforward to extend. Per-item state and a full retry history were persisted in SQLite, with filename-to-datetime parsing used to detect and skip already-processed files without a separate tracking table.

    Outcome

    Deployed across multiple buildings. Up to 10 hours of manual labor saved per week. The daily HTML report became a cornerstone of several managers' workflows.

    • C#
    • EF Core
    • SQLite
    • REST / Epicor API
    • Pipeline architecture
    • Liquid templating
    • HTML email generation
    • Regex
    • Windows Server
    • Structured error handling