I'm an independent software engineer. I build applications and developer tools, investigate technical problems, and help get systems working reliably. At eBay, I spent eleven years shipping buying, advertising and charity features. That included rebuilding the public charity site in Node.js and taking a redesigned bidding flow to production. Lately I've also been working on AI agents and the tools they use.
About
On this page: at a glance, experience (the eBay record), contact, off hours.
How I set up projects for Claude Code
I build tools and project instructions that help me work with Claude Code. My project files give a new session context about the work. Skills describe goals and constraints, leaving the session room to work out the implementation. I keep experimenting with how much structure helps and where it gets in the way.
In the March 2026 ShopForge account , I rewrote seven core skill files from 6,163 to 1,613 lines, a 74% reduction in instructions. The files describe intent and quality checks rather than prescribing every step. The agent stores lessons from operational failures and can use them in later listing work; a person still approves publication. The early results show that memory working, but do not establish a quality or sales improvement trend.
How I check what I publish
I built a review process for my writing, with separate checks for facts, technical claims, editing, and the rendered page. It helps me catch errors before publishing, though I've also had to correct findings afterward. I trace claims to primary sources and compare metrics with the underlying data. One investigation led me to correct advice about Cowork that was pointing people toward wrong fixes .
Concrete example: my verified reference for multi-agent Claude Code development cites 50 claims against primary sources. I caught 4 errors in my own draft during the verification pass. I've also written about why agents can't evaluate their own work , backed by NeurIPS and ICLR research. If the output matters, I'd rather find my own mistakes than let a customer find them.
Finding root causes in undocumented tools
When something breaks and there's no documentation, I trace the root cause through log files, undocumented APIs, and system internals, then publish the fix. I've diagnosed Anthropic's Cowork startup freeze , its file upload failure , and 6 distinct VM failure modes hiding behind one generic error. I've filed issues upstream on Google's Gemini SDK (silent parameter stripping, no error message) and Anthropic's GitHub issue tracker.
I reverse-engineered Cowork's undocumented session format from 146 files and mapped where it actually stores conversations across 195 sessions, including cost data for individual sessions.
At a Glance
| Experience | More than a decade as a software engineer, including eleven years at eBay on consumer-facing web flows and the services behind them. |
|---|---|
| Current Focus | AI system architecture, multi-agent orchestration, and MCP protocol tooling, design through deployment. |
| Primary Stack | TypeScript, Python, React, Node.js, SQLite, MCP SDK, Claude Code. |
| Working Style | AI-paired development, automated checks and a separate review before merging. |
| Open Source | Published MCP API Bridge starter kit and Bryce Labs Toolkit; contributed a proposed fix to the MCP Python SDK. |
- Experience
- More than a decade as a software engineer, including eleven years at eBay on consumer-facing web flows and the services behind them.
- Current Focus
- AI system architecture, multi-agent orchestration, and MCP protocol tooling, design through deployment.
- Primary Stack
- TypeScript, Python, React, Node.js, SQLite, MCP SDK, Claude Code.
- Working Style
- AI-paired development, automated checks and a separate review before merging.
- Open Source
- Published MCP API Bridge starter kit and Bryce Labs Toolkit; contributed a proposed fix to the MCP Python SDK.
Selected Work
What I've built, with a status on each, is on the Work page .
Connect
Off hours
- Reading: every audiobook I've finished, with notes on a few. The reading list →
- Art: a gallery of my digital work. The gallery →
Experience
Role by role, newest first.
- Jan 2025 - NowIndependentSoftware Developer
I build applications, developer tools and AI systems, independently and for clients. I use Claude Code for AI-paired development and publish source or technical accounts of my own work where I can.
Selected independent work:
- Client: Akaya. Engagement details remain confidential.
- Command. A shared kit of rules, skills and guard hooks for project sessions. The September 11, 2026 account records day one of a seven-day trial with the earlier dispatcher off; the trial tests whether the kit can carry useful work with less separate coordination.
- ShopForge. An agent for preparing Etsy listings, with memory that stores lessons from operational failures and uses them in later work. A person approves publication. The project account includes the May 2026 status check and the initial ten-day results.
- Bryce Labs Toolkit. Claude Code plugin suite including spec-driven development, session history mining, and cross-platform skill management. Installable from marketplace.
- MCP API Bridge. A released starter kit for adapting a REST API into a Model Context Protocol (MCP) server, with a working example, public source and tests.
- Shopify TYOS Migrator. Automated migration of Shopify tracking pixels to the Customer Events API across 8 ad platforms with pixel parity validation.
My workflow uses pull requests, automated checks and a separate review before merging. The working-method account records the tools and measurements from that stage of the work.
- Jul 2013 - Dec 2024eBaySoftware Engineer 2 → Member of Technical Staff 2 (a senior engineering level)
At eBay I rebuilt the public eBay for Charity website, replacing a Python application with a new Node.js site that launched in 2017, and ran its releases through 2018 and the seller dashboard’s through 2019. In early 2022 I took a redesign of the item page’s bidding flow to production behind an experiment switch, and in 2023 rebuilt the Promoted Listings promote flow inside the listing tool so it could carry the dynamic ad rate option eBay announced that June. Around those, I cut releases, carried platform upgrades, closed security findings, and did the accessibility and localisation work a flow shipped on every eBay marketplace needs. The linked charity site has continued to evolve since my work on it.
Teams and surfaces
Years Team What shipped 2022 to 2024 Ads The Promoted Listings promote flow inside the listing tool, rebuilt to carry dynamic ad rate 2020 to 2022 View Item and Buying Experience The bidding-flow redesign on the item page; Best Offer inside eBay Messages 2020 Android Charity search in the Android listing flow, moved off a legacy endpoint and rebuilt 2016 to 2019 eBay for Charity charity.ebay.com rebuilt and launched in 2017; charity filters in the public Browse API; the seller dashboard restructured in 2019 2015 to 2016 View Item and front-end tooling Mobile item-page sections on the Node.js rewrite; the eBay for Charity option in the listing flow, built twice 2013 to 2015 Mobile Web Much of the checkout page, when the whole mobile site was one codebase Ads, 2022 to 2024
What shipped
- Promote-flow rebuild. Rebuilt the Promoted Listings promote flow inside the listing tool as a new application with one fewer service hop, streaming backend responses into the page, then shipped the dynamic ad rate option through it (an ad rate eBay adjusts daily toward its suggested rate, under a cap the seller sets) and retired the legacy path.
- Embedded in the listing page. Replaced an iframe in the listing page with a server-streamed embed, which first meant upgrading the build toolchain and UI framework across the shared seller-tool layouts and components it depended on.
- Campaign dashboard. Shipped the campaign-dashboard changes a Promoted Listings rollout needed: a listing-format column and filter, click tracking, and feature flags for a staged ramp.
- Platform upgrades. Ran the Node.js, TypeScript, design-system, and test-runner upgrades across four Ads applications and the shared seller-tool component library.
- Marketplace correctness. Marketplace labels, plural rules, decimal formatting, and tooltip placement across languages and marketplaces, plus a production fix for sellers whose session expired mid-submit.
- Promoted Listings Advanced. Started folding Promoted Listings Advanced into the same promote flow in August 2023.
View Item and Buying Experience, 2020 to 2022
What shipped
- Bidding-flow redesign. Took a redesign of the item page’s place-bid experience from platform preparation in late 2021 to production configuration in early 2022, gated by an experiment so it could be switched on for a treatment group and fall back to the old flow if the experiment lookup failed.
- Best Offer in Messages. Put the Best Offer flow (eBay’s make-an-offer feature) inside eBay Messages, so a seller can answer a buyer with an offer without leaving the conversation. Getting there meant restructuring the Best Offer application into a monorepo with its own proxy, end-to-end tests, and a wrapper that streams its HTML into another page.
- Bid history. Replaced a legacy bid history layer with a standalone mobile-web page that works for signed-out visitors, built on a shared card component I wrote for it.
- Legacy migration. Moved the item page’s bid and watch-list actions off an older platform one path at a time, and removed the bid fallbacks that still pointed at it.
- Accessibility and compliance. A screen-reader and keyboard sweep of the bidding layer, including a Safari-specific fix, plus the interstitials required for restricted items, adult items, and German pharmacy listings.
- Releases and upgrades. Cut the numbered releases for both the bidding and Best Offer applications and carried their framework, Node.js, and security-library upgrades.
Android, 2020
What shipped
- Charity search in the listing flow. Moved the eBay Android app’s charity search off a legacy endpoint, rebuilt its results list as a paged list, and fixed the bugs that surfaced with it.
eBay for Charity, 2016 to 2019
What shipped
- Site rebuild. Replaced the Python-era public site with a new Node.js site on Marko, eBay’s own front-end framework. I authored the new repository’s changes from its first pull request through its first production releases in spring 2017, kept the old site’s image URLs working while it was decommissioned, ran its release train through 2018, and kept shipping fixes to it until the end of 2019. The linked public site has continued to evolve since that work.
- Public API. Added charity filters to eBay’s public Browse API, so a developer can search for items benefiting a given charity or restrict results to charity items only, with acceptance tests and error handling for the US and UK marketplaces.
- Charity picker for the listing tool. In 2018 built a reusable, embeddable charity search that a newer listing flow opens in a pop-up and talks back to through a controlled cross-origin callback.
- Seller dashboard. Shipped a new invoice screen with self-serve donation cancellation in 2019, including a revert and re-land of the first release, on top of a restructured dashboard with a testable service layer and a new PayPal sign-in flow.
- Search backends. Tuned relevance in the Java services behind charity search so exact-name matches rank higher, fixed unbounded per-request thread creation that was exhausting memory, upgraded the framework, and added load tests.
- Security follow-through. Closed security findings from scans and a penetration test in the code: CSRF validation, https enforcement, an enforced content security policy, and rate limiting.
View Item and front-end tooling, 2015 to 2016
What shipped
- Item page rewrite. On the Node.js rewrite of the item page, delivered the mobile shipping, payments, returns, about-item, and charity sections, wired them to live backend data, and set up the linting, coverage, and CI jobs the repository ran on.
- Component generator. Contributed to eBay’s internal scaffolding tool for Marko UI components, from its file structure and test fixtures through its 1.0 release.
- Charity in the listing flow. Added the donate-a-share-to-charity option to the consumer listing flow, worked through five weeks of fixes to ship it, then rebuilt it on the successor listing flow later that year.
Mobile Web, 2013 to 2015
This is where I started. I built much of the checkout page back when the whole mobile site was a single codebase.
How I worked
- Cut the numbered releases for the charity site and dashboard and for the bidding and Best Offer applications, from 2017 to 2022.
- Followed security findings through to fixes: static and dynamic scans, penetration tests, and library advisories.
- Treated accessibility and localisation as part of done: VoiceOver and Safari quirks, US and UK wording, French plural rules, German decimal formatting.
- Made coverage honest, removing test excludes even when the reported number dropped.
- Fixed platform libraries at the source when they broke my applications, and filed reproducible reports when I could not.
- Worked outside my own team when the work needed it: the public Browse API, the Android app, eBay Messages, and another team’s tooling.
- Jun 2012 - Jun 2013Enterprise SoftwareSoftware Developer
I built payments and decision-analytics software for regulated industries: transaction processing, risk assessment, and decision support.