PeerHelp
Buy from seniors. Sell to juniors.
The problem PeerHelp solves
College students overpay every semester — not because affordable resources don't exist, but because there's no reliable way to find them.
The book you need is sitting on a shelf two floors up, owned by a senior who'd sell it for a third of the bookstore price. The person who aced your exact course would happily tutor you for ₹200/hr. The notes for next week's exam already exist — someone in your department typed them up last year. None of this reaches you, because the only infrastructure connecting students is a chaotic mix of WhatsApp groups that go stale, hostel notice boards nobody reads, and word-of-mouth that stops at your friend circle.
PeerHelp fixes the handoff.
- Textbook & study material marketplace — buy, sell, or rent books, notes, PYQs, and lab gear from verified peers on your own campus. An ISBN barcode scanner auto-fills book details in seconds.
- Peer tutoring directory — find seniors or batchmates who teach your exact subject, at a fraction of coaching centre prices, in-person or online.
- Campus-local by design — listings surface hostel, department, and year metadata so a meetup is a 5-minute walk, not a logistics puzzle.
- Verified-student-only — college email OTP or document review keeps the platform closed to outsiders, so you're always transacting with someone you can actually find and hold accountable.
- Full deal lifecycle — from request to meetup to completion, with bilateral ratings, in-app messaging, and real-time notifications at every step.
- No middleman fees, no payment processing — PeerHelp is purely the directory and reputation layer. Cash changes hands in person; the platform just makes the match obvious.
For students on a tight budget, this turns the seniors graduating above them into a resource library — and turns their own old textbooks into cash.
Challenges we ran into
Challenges I ran into
1. Serverless rate limiting that actually holds
The first naive attempt used an in-memory counter. It worked fine locally and then failed completely on Vercel — every cold start reset the counter to zero, making the OTP endpoint trivially spammable. The fix was to move throttle state into a dedicated rate_limit_attempts Postgres table: every attempt writes a row; every check counts rows in a sliding time window. Now a cold start can't reset your counter because the counter was never in memory to begin with.
2. The partial-lock problem on accepted deals
Once a buyer accepts a deal, the seller shouldn't be able to retroactively change the title, price, or condition — those are what the buyer agreed to. But the seller legitimately needs to update pickup logistics (hostel, department, description). A blanket immutable-after-accept rule would break real usage.
The API route now enforces a field-level freeze: a hardcoded LOCKED_FIELDS set is checked on every PATCH. Any attempt to mutate a locked field on an accepted or completed deal returns HTTP 423 with a lockedFields payload listing exactly which fields are frozen. The UI disables those inputs and shows an amber warning banner — the seller sees the reason, not just a generic error.
5. ISBN barcode scanning on mobile
@zxing/browser works well on desktop webcams. On mobile browsers it needs explicit facingMode: environment to use the rear camera instead of the selfie camera — something not obvious from the docs. Without it, scanning a barcode pointed away from you while staring at your own face in the viewfinder is a poor experience. A secondary issue: some mobile browsers throttle camera permissions aggressively after a denied prompt, so the fallback UX (manual ISBN entry) needed to be prominent, not buried.
Technologies used
