{"id":50565358,"url":"https://github.com/brijeshdevio/backend-starter","last_synced_at":"2026-06-04T14:01:16.902Z","repository":{"id":348726404,"uuid":"1199589108","full_name":"brijeshdevio/backend-starter","owner":"brijeshdevio","description":"A production-ready, highly secure backend template built with modern Node.js technologies.","archived":false,"fork":false,"pushed_at":"2026-04-26T11:45:34.000Z","size":218,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-26T13:23:11.647Z","etag":null,"topics":["express","jwt","postgresql","prisma"],"latest_commit_sha":null,"homepage":"https://backend-starter.brijeshdev.in/api","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brijeshdevio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-02T13:56:38.000Z","updated_at":"2026-04-26T11:45:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/brijeshdevio/backend-starter","commit_stats":null,"previous_names":["brijeshdevio/backend-template","brijeshdevio/backend-starter"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/brijeshdevio/backend-starter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brijeshdevio%2Fbackend-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brijeshdevio%2Fbackend-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brijeshdevio%2Fbackend-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brijeshdevio%2Fbackend-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brijeshdevio","download_url":"https://codeload.github.com/brijeshdevio/backend-starter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brijeshdevio%2Fbackend-starter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33907694,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-04T02:00:06.755Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["express","jwt","postgresql","prisma"],"created_at":"2026-06-04T14:01:15.616Z","updated_at":"2026-06-04T14:01:16.895Z","avatar_url":"https://github.com/brijeshdevio.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀 Production-ready Node.js Backend Starter\n\nA clean, minimal, and production-ready REST API starter built with **Express 5**, **TypeScript**, **Prisma**, and **PostgreSQL** — with auth, logging, validation, rate limiting, and a consistent response format out of the box.\n\n\u003e Skip the boilerplate. Start building features.\n\n---\n\n## ✨ What's Included\n\n| Feature          | Tech                         |\n| ---------------- | ---------------------------- |\n| Framework        | Express 5 + TypeScript       |\n| Database         | PostgreSQL via Prisma 7      |\n| Authentication   | JWT (jsonwebtoken)           |\n| Password Hashing | Argon2                       |\n| Validation       | Zod v4                       |\n| Logging          | Pino + pino-pretty           |\n| Security         | Helmet + CORS                |\n| Rate Limiting    | express-rate-limit           |\n| Response Format  | Custom `apiResponse` utility |\n\n---\n\n## 📁 Project Structure\n\n```\n├── .env.example\n├── .gitignore\n├── package.json\n├── pnpm-lock.yaml\n├── prisma.config.ts\n├── prisma\n│   ├── migrations\n│   │   ├── 20260424062803_init\n│   │   │   └── migration.sql\n│   └── schema.prisma\n├── src\n│   ├── app.ts\n│   ├── config\n│   │   └── env.ts\n│   ├── constants\n│   │   └── index.ts\n│   ├── lib\n│   │   ├── logger.ts\n│   │   └── prisma.ts\n│   ├── middleware\n│   │   ├── auth-guard.ts\n│   │   ├── error-handler.ts\n│   │   ├── rate-limit.ts\n│   │   ├── role-guard.ts\n│   │   └── validate.ts\n│   ├── modules\n│   │   ├── auth\n│   │   │   ├── auth.controller.ts\n│   │   │   ├── auth.routes.ts\n│   │   │   ├── auth.schema.ts\n│   │   │   └── auth.service.ts\n│   │   └── users\n│   │       ├── users.controller.ts\n│   │       ├── users.routes.ts\n│   │       ├── users.schema.ts\n│   │       └── users.service.ts\n│   ├── routes\n│   │   └── index.ts\n│   ├── server.ts\n│   ├── types\n│   │   └── express.d.ts\n│   └── utils\n│       ├── api-response.ts\n│       ├── cookie.ts\n│       └── error.ts\n├── tsconfig.json\n└── vercel.json\n```\n\n---\n\n## ⚡ Getting Started\n\n### 1. Clone \u0026 install\n\n```bash\ngit clone https://github.com/brijeshdevio/backend-starter.git\ncd backend-starter\nnpm install\n```\n\n### 2. Set up environment\n\n```bash\ncp .env.example .env\n```\n\nOpen `.env` and fill in your values:\n\n```env\nNODE_ENV=\"development\"\nPORT=3000\nDATABASE_URL=\"postgresql://user:password@localhost:5432/backend_starter?schema=public\"\nJWT_SECRET=\"your-secret-min-32-chars\"\nJWT_EXPIRES_IN=\"15m\"\nCLIENT_URL=\"http://localhost:5173\"\nLOG_LEVEL=\"info\"\n```\n\n### 3. Run database migrations\n\n```bash\nnpx prisma migrate dev --name init\nnpx prisma generate\n```\n\n### 4. Start the dev server\n\n```bash\nnpm run dev\n```\n\nServer starts at `http://localhost:3000`\n\n---\n\n## 📡 API Endpoints\n\nBase URL: `http://localhost:3000/api/v1`\n\n### Auth\n\n| Method | Endpoint         | Access  | Description           |\n| ------ | ---------------- | ------- | --------------------- |\n| `POST` | `/auth/register` | Public  | Create a new account  |\n| `POST` | `/auth/login`    | Public  | Login and receive JWT |\n| `POST` | `/auth/refresh`  | 🔒 Auth | Rotate refresh token  |\n| `POST` | `/auth/logout`   | 🔒 Auth | Logout                |\n| `GET`  | `/auth/me`       | 🔒 Auth | Get current user info |\n\n### Users\n\n| Method   | Endpoint     | Access   | Description                |\n| -------- | ------------ | -------- | -------------------------- |\n| `GET`    | `/users`     | 🔒 Admin | List all users (paginated) |\n| `GET`    | `/users/:id` | 🔒 Auth  | Get a user by ID           |\n| `PATCH`  | `/users/:id` | 🔒 Auth  | Update your own profile    |\n| `DELETE` | `/users/:id` | 🔒 Admin | Delete a user              |\n\n### System\n\n| Method | Endpoint  | Access | Description  |\n| ------ | --------- | ------ | ------------ |\n| `GET`  | `/health` | Public | Health check |\n\n---\n\n## 📦 Response Format\n\nEvery response follows a consistent shape:\n\n**Success**\n\n```json\n{\n  \"success\": true,\n  \"status\": 200,\n  \"message\": \"Users fetched\",\n  \"data\": {},\n  \"meta\": {\n    \"page\": 1,\n    \"limit\": 10,\n    \"total\": 42,\n    \"totalPages\": 5\n  }\n}\n```\n\n**Error**\n\n```json\n{\n  \"success\": false,\n  \"status\": 401,\n  \"message\": \"Invalid credentials\"\n}\n```\n\n**Validation Error (Zod)**\n\n```json\n{\n  \"success\": false,\n  \"status\": 400,\n  \"message\": \"Validation failed\",\n  \"errors\": {\n    \"email\": [\"Invalid email\"],\n    \"password\": [\"String must contain at least 8 character(s)\"]\n  }\n}\n```\n\n---\n\n## 🛡️ Auth Flow\n\n```\nPOST /auth/register  →  creates account, returns user\nPOST /auth/login     →  returns JWT (expires in 15m)\nPOST /auth/refresh   →  rotate refresh token\nPOST /auth/logout    →  logout and delete session\nGET  /auth/me        →  Authorization: Bearer \u003ctoken\u003e\n\n```\n\nPasswords are hashed with **Argon2** (more secure than bcrypt).  \nTokens are signed with `JWT_SECRET` and expire based on `JWT_EXPIRES_IN`.\n\n---\n\n## 🔒 Rate Limiting\n\n| Route               | Limit                 |\n| ------------------- | --------------------- |\n| All `/api/*` routes | 100 requests / 15 min |\n| `/auth/login`       | 10 requests / 15 min  |\n\nWhen the limit is exceeded:\n\n```json\n{\n  \"success\": false,\n  \"status\": 429,\n  \"message\": \"Too many requests, please try again later.\"\n}\n```\n\n---\n\n## 🧪 Testing the API\n\nYou can use [Postman](https://postman.com), [Insomnia](https://insomnia.rest), or `curl`:\n\n```bash\n# Register\ncurl -X POST http://localhost:3000/api/v1/auth/register \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"name\": \"Brijesh\", \"email\": \"brijesh@dev.in\", \"password\": \"Secure@123\"}'\n\n# Login\ncurl -X POST http://localhost:3000/api/v1/auth/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\": \"brijesh@dev.in\", \"password\": \"Secure@123\"}'\n\n# Get current user\ncurl http://localhost:3000/api/v1/auth/me \\\n  -H \"Authorization: Bearer \u003cyour_token\u003e\"\n```\n\n---\n\n## 📜 Available Scripts\n\n```bash\nnpm run dev       # Start dev server with hot reload (tsx watch)\nnpm run build     # Compile TypeScript to /dist\nnpm run start     # Run compiled production build\n```\n\n---\n\n## 🗄️ Database Schema\n\nManaged by Prisma. Edit `prisma/schema.prisma` to add your models.\n\n```bash\n# After editing schema.prisma:\nnpx prisma migrate dev --name your_migration_name\n```\n\nCurrent models: `User` (with `USER` / `ADMIN` roles)\n\n---\n\n## 🧱 Tech Versions\n\n| Package        | Version |\n| -------------- | ------- |\n| express        | ^5.2.1  |\n| typescript     | ^6.0.3  |\n| @prisma/client | ^7.8.0  |\n| zod            | ^4.3.6  |\n| argon2         | ^0.44.0 |\n| pino           | ^10.3.1 |\n| jsonwebtoken   | ^9.0.3  |\n\n---\n\n## 🗺️ What's Next\n\nThis starter is intentionally minimal. Extend it based on your project needs:\n\n- ✅ Refresh token rotation\n- [ ] Email verification\n- [ ] File uploads (Multer / S3)\n- [ ] Redis caching\n- [ ] Docker + docker-compose\n- [ ] GitHub Actions CI/CD\n- [ ] Stripe billing integration\n\n---\n\n## 📄 License\n\nMIT — free to use, fork, and build on.\n\n---\n\n\u003cp align=\"center\"\u003eBuilt by \u003ca href=\"https://github.com/brijeshdevio\"\u003e@brijeshdevio\u003c/a\u003e\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrijeshdevio%2Fbackend-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrijeshdevio%2Fbackend-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrijeshdevio%2Fbackend-starter/lists"}