Inspired by the vision of GoodMatter, founded by Saswat.
GoodMatter is a Node.js/Express REST API that connects startups and investors. It handles authentication with JWT + refresh token rotation, startup profile and pitch deck management via Cloudinary, and a deal flow system driven by a Finite State Machine for clean state transitions.
| Technology | |
|---|---|
| Runtime | Node.js |
| Framework | Express.js |
| Database | MongoDB + Mongoose |
| Auth | JWT (jsonwebtoken), bcrypt, crypto |
| Validation | Zod |
| File Storage | Cloudinary |
| Email / OTP | Nodemailer |
| Config | dotenv |
Base URL: http://localhost:5000/api/v1
| Method | Route | Description |
|---|---|---|
POST |
/signup |
Register a new user, sends OTP to email |
POST |
/verify-email |
Verify OTP and activate account |
POST |
/login |
Login, returns access token + refresh token cookie |
POST |
/logout |
Invalidate refresh token |
POST |
/resend-otp |
Resend OTP to registered email |
POST |
/refresh-token |
Issue new access token, rotates refresh token |
| Method | Route | Description |
|---|---|---|
GET |
/me |
Get authenticated startup's profile |
POST |
/ |
Create startup profile |
PATCH |
/ |
Update startup profile |
POST |
/pitch-deck |
Upload PDF pitch deck (replaces existing) |
DELETE |
/pitch-deck |
Delete pitch deck |
| Method | Route | Role | Description |
|---|---|---|---|
GET |
/startups |
investor | Browse startups with filters & pagination |
POST |
/ |
investor | Send a deal offer to a startup |
GET |
/me |
investor | View all deals initiated by this investor |
PATCH |
/:dealId/withdraw |
investor | Withdraw a pending offer |
GET |
/startup |
startup | View all deals received |
PATCH |
/:dealId/accept |
startup | Accept a pending deal |
PATCH |
/:dealId/reject |
startup | Reject a pending deal |
💛 Shoutout to Saswat, founder of GoodMatter, for the inspiration behind this project.