All projects

CrowHub.

A local marketplace where a listing becomes a reservation, a payment, and a QR-confirmed pickup. Live in Edmonton and Calgary.

Live

Overview

CrowHub connects local buyers and sellers through listings, reservations, card payments, messaging, and QR-based pickup confirmation. Sellers get AI-written listings from photos, a store page, pickup windows, and subscription plans. Buyers reserve an item, pay online or at the door, and scan to confirm the handoff. I designed it, built it, shipped it, and run it.

My role

Founder, product, and engineering. I took CrowHub from solution design through implementation, testing, deployment, and ongoing operation. I used coding agents extensively for implementation and tests, and personally owned the architecture, the security review, production behaviour, and every release decision.

The problem

Local commerce needs more than a product catalogue. A reservation has to hold inventory for a limited window, payment has to reconcile with the provider, and pickup has to give both parties a clear, verifiable outcome. Most local marketplaces stop at the listing and leave the hard part to a text thread.

The solution

A Next.js storefront backed by a separate .NET 10 API with explicit order state transitions, PostgreSQL persistence, Stripe Connect payment orchestration for sellers, and QR-token pickup confirmation. Hosted background services handle reservation expiry, reminders, notifications, and AI listing analysis outside the request path.

System architectureCrowHub
CrowHub architectureThe Next.js storefront calls the .NET 10 Web API. The API integrates PostgreSQL, .NET hosted background services, AWS S3 and SES, and Stripe Connect.Next.js storefront.NET 10 Web APIPostgreSQLHosted servicesAWS S3 / SESStripe Connect
Application architecture.NET 10 Web API

Engineering decisions

Give the domain its own API boundary

The Next.js storefront calls a separate .NET API. Marketplace transitions and payment rules live in the backend, and the interface can evolve independently. The cost is a second deployment boundary to operate, which I accepted for the clarity it buys.

Treat payment events as external facts

The webhook handler verifies Stripe signatures before processing anything. Event claiming and duplicate handling are explicit, and every payment event reconciles provider state with local order state rather than assuming they agree.

Release inventory carefully

The expiry sweeper cancels outstanding payment intents before releasing inventory, and skips orders whose payments already succeeded or cannot be safely resolved. Expiry and payment race each other, and the sweeper is written to lose that race safely.

Move recurring work out of requests

.NET hosted services handle reservation expiry, payment-method expiry, notifications, and listing analysis with cancellation-aware processing, so interactive requests stay fast and background failures are isolated.

Key capabilities

Seller onboarding and listings

Seller registration, image uploads, AI-assisted listing generation from photos, store pages, and tiered subscription plans.

Reservations and payments

Time-boxed inventory reservations, Stripe payment flows with connected seller accounts, pay-online or pay-at-pickup, and signed webhook handling.

QR pickup confirmation

A QR token ties the digital order to the physical handoff. The seller scans, the card is charged, and both sides see the outcome.

Messaging and operations

Buyer-seller conversations, notifications, admin endpoints, and cleanup services that keep inventory and orders consistent.

The hard parts

  • Payment and inventory are separate systems, and success at the payment provider can arrive before the API records it.
  • Abandoned reservations need cleanup without cancelling a completed payment or releasing inventory early.
  • Agent-generated code ships only after architectural review, behavioural tests, and watching it behave in production.

Outcomes and links

  • Live and operating in two cities, with real sellers, listings, and pickups.
  • One codebase covers the full listing-to-reservation-to-payment-to-pickup workflow, including the edge cases where those steps disagree.
  • A working demonstration of how I run AI-assisted delivery: agents implement, I review, test, and own the release.

The source repository is private. Happy to walk through the code in an interview.

Let’s build something
meaningful.

I’m looking for an Engineering Manager role where I can grow a team, own delivery, and keep a platform reliable while it changes.

Calgary, Alberta · Remote across Canada