I’ve spent more than 20 years building software and websites, with design and the work people need to do shaping the technical decisions.
I help engineers take ownership of their work, including the decisions around it. We work through priorities and dependencies with other teams, and I stay involved in implementation.
I also build independent products. They keep me working through the implementation details, starting with something a person needs to do.
I set direction and stay involved in getting the work out.
JumpCloud
Website Manager · Sep 2020–present
I lead web engineering and conversion rate optimization at JumpCloud. I coach engineers and help them take technical ownership, with quarterly priorities shaped alongside Marketing, Product and RevOps. My work includes Pardot-to-Marketo integration and Vue modernization. I also introduced AI workflows for the team.
TrainingPeaks / Peaksware
Senior Software Engineer / Full Stack Developer Feb 2019–Sep 2020
I refactored a content API using AWS Lambda with Node.js and GraphQL. I extended headless WordPress with React and Gatsby, and contributed reusable web components and automated tests.
Building since 2002
2002 onward
More than two decades building websites and software, including the integrations and operational work needed to keep them running.
Clear priorities help a team deliver. The product still has to solve a problem.
Here’s the work, including the choices behind it. Some projects are in production. Others are prototypes or internal builds, with their status noted below.
Web engineering leadership
At JumpCloud, I balance modernization with growth work. I set priorities and develop technical ownership while staying involved in delivery.
I built TIbot to connect team intake with delivery in Slack and Jira. It checks for duplicates and protects updates, with approvals for guarded changes.
I built PolyshOS to connect public booking with the work salon staff do around an appointment. My work covers the web application and API, background worker and native clients.
Web/API/worker production · Native internal testing
A website has to work for the team behind it, too.
Illustrated feature studies: platform architecture / PageInsights collection and findings.
A website needs to serve visitors while giving the people running it a system they can maintain.
I’m Website Manager at JumpCloud, leading web engineering and conversion work. I coach engineers and help them take technical ownership. Alongside setting priorities, I stay involved in implementation, including Vue modernization and Pardot-to-Marketo integration, reusable components and the systems behind content and measurement.
At TrainingPeaks, I helped refactor a content API using AWS with Node.js and GraphQL. I also extended headless WordPress with React and Gatsby, and worked on reusable components and automated tests.
My work
I set technical direction and build alongside the team. I also develop engineers and plan delivery with other teams.
Where it stands
Current web leadership at JumpCloud. Delivered platform work at TrainingPeaks.
Illustrated feature studies: TIbot coordination and approvals / workflow learning and baseline evaluation.
I build agents around the work they need to do and the decisions that still belong to people.
My specialist workflows cover intake and audits, then planning, engineering, security and delivery. TIbot connects that work in Slack and Jira through webhooks and schedules. It checks for duplicates, protects updates and asks for approval where needed. Reusable skills carry the work into implementation and review, with a handoff when it’s ready.
I’m developing Agent Workflow Learning to test instruction changes against what happened during execution. PageInsights is separate. It looks at where visitors encounter friction on a page.
TIbot & orchestration
Built and in use. Public overview of team workflows.
Workflow learning
In development. Tests changes to instructions and workflows without training model weights.
PageInsights
Built and tested in isolated WordPress. Staging and live use remain unverified.
Experimentation
Architecture and technical spike covering variants and goals, along with consent and reporting.
Search with sources. Booking with conflict checks.
Illustrated feature studies: hybrid retrieval and source grounding / calendar availability and booking reliability.
Search needs to lead back to source material. Booking needs to account for what’s already on the calendar.
For House of Destiny, I built a WordPress search beta using OpenAI embeddings and Supabase vector retrieval alongside keyword matching. Summaries draw on source material that visitors can inspect. The application also includes filters and caching, with analytics around search.
I also built a scheduling system that connects Google Calendar and iCloud CalDAV. It handles availability across time zones and creates meetings, with locks and request identifiers to track requests. Conflict checks and recovery handle the cases where booking gets less straightforward.
AI search
Delivered beta. Migration to the main target site remains unverified.
Scheduling
Live integration across Google Calendar and iCloud.
My work
I designed retrieval and built the applications, including the integration architecture and the checks around delivery.
Illustrated feature studies: build identity, modifications and QR sharing / event operations, judging and offline work.
Bilt:Spec keeps a vehicle’s history and modifications with its photos and the story behind the build.
Build profiles bring together modifications and dyno results, with photography and QR sharing. I also built event workflows for organizers, including judging and offline support.
My work
I set product direction and built across the web and native apps, including their shared contracts.
Built with
React and TypeScript, Expo / React Native, PHP and MySQL.
Where it stands
Delivered web releases and internal TestFlight builds.
Social publishing workflows
CrossPost
Publishing has a lot of edge cases.
Illustrated feature studies: ordered media and preparation / delivery states and publication boundaries.
CrossPost handles media transfers between social platforms, including the platform rules that complicate them.
I built OAuth connections and ordered carousels, with JPEG normalization and optional FFmpeg processing before chunked TikTok uploads. The application uses R2 for media storage. Diagnostic history and delivery states help explain a failed transfer.
My work
I designed the workflow and built the platform integrations in PHP and JavaScript.
Delivery and publication
Delivery to a platform inbox is tracked separately from actual publication.
Where it stands
Web deployed. Live end-to-end posting and public adoption have not been independently verified.
Salon operations
PolyshOS
The business behind the appointment.
Illustrated feature studies: staff scheduling and appointments / shared data model and operational clients.
PolyshOS connects salon booking with staff calendars and waitlists, including the operational work around each appointment.
The platform supports multiple tenants and role-based permissions. Its web application and API share a data model with the background worker. A native SwiftUI companion is in development.
My work
I designed the product and system architecture. I built the web application and API, background worker and native application.
Built with
Next.js, Fastify, PostgreSQL, Drizzle and SwiftUI.
Where it stands
Web and API in production. Native app in internal testing.
Local-first dictation
Mumbl
Dictate without leaving your work.
Illustrated feature studies: local recognition and focused-app insertion / guarded cleanup, dictionary and fallbacks.
Mumbl puts locally recognized speech into the work you’re already doing, with limits on how cleanup can change the text.
I built Mumbl in SwiftUI for macOS and iOS. It has a compact HUD and keyboard workflows, with a personal dictionary. Recognition options include Apple Speech and optional Parakeet Core ML, plus WhisperKit.
My work
I designed and built the native apps, including speech integration and the dictionary. I also built cleanup workflows with limits on what they can change.
Design choice
Recognition runs locally first. Cleanup has explicit limits to preserve what the speaker meant.
Where it stands
Delivered notarized macOS releases and internal iOS TestFlight builds.
How I workDecisions, tests and ownership
Choose the work. Check what ships.
When implementation gets faster, choosing what to build still needs care.
Start with the problemPriorities
I balance growth work and modernization with reliability and technical debt. A roadmap needs to reflect the team’s capacity and who will own delivery.
For a product, I start with what someone needs to do. That might be finding a source or booking an appointment. With Mumbl, it’s dictating without losing your place.
Give AI a defined jobContext & scope
My workflows carry discovery and planning into implementation. Testing and release are part of that work. Each specialist gets a defined task and the context for it, with clear ownership when work runs in parallel.
Approvals and guarded updates keep consequential decisions with people.
Check the result separatelyReview & release
Before work advances, I require evidence that it’s complete and an independent review. A working prototype helps test an idea. Getting it ready for production also requires testing and an owner, with a way to recover if something goes wrong.
I describe prototypes and isolated tests by what they establish. They answer narrower questions than a production rollout.
Revisit the methodLearning
I’m developing a framework that records execution reviews and feedback. It compares proposed instruction changes against a baseline before a decision to adopt or roll back.
The framework tests whether workflow changes help. It does not train model weights.