The Problem with Traditional Marketplaces
Every marketplace works the same way: sellers list products, buyers scroll through thousands of listings hoping to find what they need at the right price.
I wanted to flip this model. What if buyers posted what they wanted and sellers competed to offer the best deal?
That's WTB.land - a reverse marketplace (WTB = Want To Buy).
How It Works
- Buyer posts a request - "I want a MacBook Pro M3, budget $1500, like-new condition"
- Sellers browse requests and submit offers with price and description
- All offers are public - sellers compete, highest bid gets a TOP BID badge
- Buyer picks the best deal - chat with sellers, compare offers, done
The Tech Stack
- Backend: .NET 10 (ASP.NET Core MVC + gRPC)
- Database: SQLite (yes, really)
- Frontend: Vanilla JavaScript SPA (~1800 lines, no React/Vue/Angular)
- Protocol: gRPC-Web over protobuf (not REST/JSON)
- CSS: Tailwind CSS 3.4
- Deploy: Single binary on a $7/month Hetzner VPS
Why gRPC-Web Instead of REST?
Binary protobuf is ~30% smaller than JSON. I wrote a 98-line custom gRPC-Web transport that handles binary framing over XHR. No code generation on the client - protobuf.js parses the .proto file at runtime.
Why Vanilla JS Instead of React?
The entire SPA is 1800 lines. It does pushState routing, SSR hydration, lazy loading, and real-time chat polling. Adding React would have tripled the bundle size for zero benefit.
Why SQLite?
For a young marketplace with hundreds of requests, SQLite is perfect. Single file, zero config, instant backups.
SEO: The Hard Part
A JavaScript SPA is invisible to search engines by default. My solution: hybrid SSR + SPA architecture.
- Server renders full HTML with SEO content (meta tags, JSON-LD, Open Graph)
- Client JS hydrates from server-injected JSON - no duplicate API call
- Subsequent navigation uses pushState + gRPC calls
Result: Google PageSpeed 100/100 on mobile and desktop.
Try It
WTB.land is live and free. 26 categories, built-in chat, no fees. 60-90ms response times on a single-core VPS.
Have you built anything with gRPC-Web? I'd love to hear your thoughts.
Top comments (0)