A QR-verified peer-to-peer marketplace that connects households in Uganda with buyers who repair or repurpose broken and unused electronics — backed by secure escrow payments and a green-impact engine that calculates the CO₂ emissions each reused device avoids.

Unused and broken electronics pile up in Ugandan households with nowhere structured to go. Existing classifieds platforms let people list a device, but they do nothing to verify a physical handover, protect either side's money, or capture the environmental value of keeping a device in circulation instead of the landfill.
The goal was to make handing a device to a stranger feel safe — and to make the environmental payoff of doing so visible.
I worked on building a marketplace where sellers and buyers exchange devices with a cryptographic QR handover check, funds held in escrow until that handover is confirmed, and a live estimate of the CO₂ emissions avoided by not manufacturing a new device.
The system supports Sellers, Buyers, and Admins, with each role scoped to exactly what it needs and nothing more.
Registers an end-of-life device through a KYC-gated form, reviews buyer interest, and generates a cryptographic QR code tied to the listing for handover.
Browses the public marketplace, expresses interest in a device, then scans the seller's QR code at pickup to confirm the handover and release escrow.
Approves seller KYC, resolves payment disputes, and monitors platform-wide green impact data across every listing.
The hard problem wasn't the UI — it was making a stranger comfortable handing a device to another stranger. Two mechanisms solved that: cryptographic QR handover verification, and a 7-day escrow window that only releases funds once the handover is confirmed.

Buyers scan a tokenized QR code at physical handover, which verifies the device and triggers the escrow release.
Optional image slot: add a marketplace or impact-dashboard screenshot here.
Role-based auth for Sellers, Buyers, and Admins; seller KYC verification; listing creation with multi-image upload; buyer interest and approval flow; QR-based handover verification; 7-day escrow payments with dispute resolution; and an automated CO₂ savings calculation generated for every listed device.
These features mattered because trust, not features, was the real product — the QR verification and escrow exist specifically to answer "would I actually hand my broken laptop to this person?"
The handover flow had to keep QR verification, escrow, and payment release in the correct order even when users retried a request or arrived with an outdated screen.
I traced inconsistent payment states to a flow that trusted the frontend's current step instead of checking the listing and escrow state on the server.
The fix moved the transition guard into the API and made the operation idempotent. Repeated scans now return the existing result instead of advancing the transaction twice.
React 19 on Vite drives the three role-based dashboards and QR scan/generate flows. Flask 3.0 exposes a JWT-authenticated REST API with role-based access control. PostgreSQL, via SQLAlchemy, enforces the listing, payment, and escrow state machine with strict enums so a transaction can never skip a step.
Building GreenTag pushed me past CRUD thinking. The real engineering problem lived in the state machine — listing, interest, QR verification, escrow, release — and in turning an abstract CO₂ calculation into something a non-technical seller would actually trust. It was also my first time shipping a full Flask and SQLAlchemy backend end-to-end, from RBAC decorators to a UUID-based schema designed to resist enumeration.