{"id":48789625,"url":"https://github.com/srivilliamsai/resume-ecosystem-node","last_synced_at":"2026-04-13T19:31:59.188Z","repository":{"id":319820444,"uuid":"1079669242","full_name":"srivilliamsai/resume-ecosystem-node","owner":"srivilliamsai","description":"Next-gen Resume \u0026 Career Ecosystem — auto-generating verified, dynamic resumes from real achievements (internships, courses, hackathons, projects). Built with scalable Node.js microservices, Kafka, Prisma, PostgreSQL \u0026 Redis.","archived":false,"fork":false,"pushed_at":"2026-03-26T07:24:42.000Z","size":496,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-26T14:29:23.823Z","etag":null,"topics":["docker","edtech","fastify","kafka","kubernetes","microservices","node-js","postgresql","prisma","redis","resume-builder","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/srivilliamsai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-20T07:45:08.000Z","updated_at":"2026-03-26T07:24:46.000Z","dependencies_parsed_at":"2025-10-20T11:20:02.730Z","dependency_job_id":"cdcdad49-a0d8-47b1-b89d-b8e33a182f3b","html_url":"https://github.com/srivilliamsai/resume-ecosystem-node","commit_stats":null,"previous_names":["srivilliamsai/resume-ecosystem-node"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/srivilliamsai/resume-ecosystem-node","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srivilliamsai%2Fresume-ecosystem-node","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srivilliamsai%2Fresume-ecosystem-node/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srivilliamsai%2Fresume-ecosystem-node/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srivilliamsai%2Fresume-ecosystem-node/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/srivilliamsai","download_url":"https://codeload.github.com/srivilliamsai/resume-ecosystem-node/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/srivilliamsai%2Fresume-ecosystem-node/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31768636,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T15:25:13.801Z","status":"ssl_error","status_checked_at":"2026-04-13T15:25:09.162Z","response_time":93,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["docker","edtech","fastify","kafka","kubernetes","microservices","node-js","postgresql","prisma","redis","resume-builder","typescript"],"created_at":"2026-04-13T19:31:58.381Z","updated_at":"2026-04-13T19:31:59.160Z","avatar_url":"https://github.com/srivilliamsai.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🧠 Resume Ecosystem – Intelligent Resume \u0026 Career Platform\n\n### 🚀 Node.js | Kafka | Postgres | Redis | Microservices | Prisma | Docker\n\nA next-generation **Resume Building \u0026 Career Ecosystem** that automatically builds **dynamic, verified resumes** from real achievements — internships, hackathons, online courses, and projects — and updates them in real-time as users complete new activities.\n\n---\n\n## 📘 Table of Contents\n\n1. [Overview](#overview)\n2. [Quick Demo](#quick-demo)\n3. [Architecture](#architecture)\n4. [Tech Stack](#tech-stack)\n5. [Microservices](#microservices)\n6. [Data Flow](#data-flow)\n7. [Business Logic](#business-logic)\n8. [Folder Structure](#folder-structure)\n9. [Installation](#installation)\n10. [Running the System](#running-the-system)\n11. [API Endpoints](#api-endpoints)\n12. [Events \u0026 Topics](#events--topics)\n13. [Testing](#testing)\n14. [Environment Variables](#environment-variables)\n15. [Troubleshooting](#troubleshooting)\n16. [Future Enhancements](#future-enhancements)\n\n---\n\n## 🧩 Overview\n\n**Goal:**\nTo create a connected backend that integrates multiple sub-platforms — Internship Platforms, Hackathon Platforms, Online Learning Systems, and Project Verification Modules — into a unified ecosystem where verified achievements automatically update a student’s professional resume.\n\n**Key Features**\n\n* Auto-generated verified resumes (real-time updates)\n* API gateway for unified routing\n* JWT-based authentication\n* Kafka-driven event system\n* Postgres-backed persistence with Prisma ORM\n* Redis caching and rate-limiting\n* Resume versioning and ranking logic\n* PDF rendering service\n* Integration with GitHub, Coursera, and other platforms\n\n---\n\n## 🚀 Quick Demo (60 seconds)\n\nGet a fully working resume ecosystem with real data in one command:\n\n```bash\nnpm run demo\n```\n\nThen open http://localhost:5173 and log in with any demo account:\n\n| Name | Email | Password | Resume Score |\n|------|-------|----------|--------------|\n| Arjun Sharma (CS Student) | arjun@demo.com | demo1234 | 87/100 |\n| Priya Nair (Bootcamp Grad) | priya@demo.com | demo1234 | 72/100 |\n| Rahul Mehta (Senior Dev) | rahul@demo.com | demo1234 | 95/100 |\n\n### 📸 Screenshots\n\u003e Run `npm run demo` to see the full UI live.\n\n```\n+-------------------------------------------------------------+\n|  RESUME ECOSYSTEM DASHBOARD                        [Logout] |\n|                                                             |\n|  Welcome back, Arjun!                                       |\n|  Resume Score: 87/100 (Top 10%)                             |\n|                                                             |\n|  [ Recent Activities ]                                      |\n|  ---------------------------------------------------------  |\n|  • Google Summer of Code 2024          [VERIFIED]  +15 pts  |\n|  • AWS Solutions Architect             [VERIFIED]  +10 pts  |\n|  • Smart India Hackathon Finalist      [VERIFIED]  +12 pts  |\n|                                                             |\n|  [ Your Resume ]                                            |\n|  ---------------------------------------------------------  |\n|  [View PDF]  [Share Link]  [History]                        |\n|                                                             |\n+-------------------------------------------------------------+\n```\n\n---\n\n## 🏗️ Architecture\n\n```\nIntegration → Activity → Verification → Resume → Notification → File Renderer\n                       ↘ Auth \u0026 JWT Gateway ↗\n```\n\n* **Event-driven microservice architecture** (loosely coupled)\n* Communication via **Kafka** topics\n* Shared utilities via **common-lib**\n* Each service is independently deployable and testable\n\n---\n\n## ⚙️ Tech Stack\n\n| Layer | Technology |\n| :--- | :--- |\n| **Frontend** | **React 18**, **TypeScript**, **TailwindCSS**, **Vite** |\n| **Backend** | **Node.js 20+**, **Fastify**, **Express** |\n| **Database** | **PostgreSQL** (via Supabase or Local Docker) |\n| **ORM** | **Prisma** (Schema-driven data access) |\n| **Messaging** | **Kafka** (Event-driven architecture) |\n| **Cache** | **Redis** (Rate limiting \u0026 caching) |\n| **Auth** | **JWT** (Stateless authentication) |\n| **Docs** | **Swagger / OpenAPI** |\n| **Infrastructure** | **Docker Compose** |\n\n---\n\n## 🧱 Microservices\n\n| Service | Port | Responsibility |\n| :--- | :--- | :--- |\n| **web-app** | `5173` | Modern React Frontend Dashboard |\n| **api-gateway** | `4000` | Central router, CORS, JWT pass-through |\n| **auth-service** | `4010` | User registration, login, JWT issuance |\n| **activity-service** | `4020` | Manage internships, courses, hackathons |\n| **verification-service** | `4030` | Verify authenticity (hash/signature) |\n| **resume-service** | `4040` | Build, rank, and version resumes |\n| **integration-service** | `4050` | Connect external APIs (GitHub, LinkedIn) |\n| **notification-service** | `4060` | Email \u0026 WebSocket notifications |\n| **file-service** | `4070` | Render resume PDFs |\n\n---\n\n---\n\n## 🔄 Data Flow\n\n1. **User adds an activity** →\n   `activity.created` event emitted.\n\n2. **Verification service** listens →\n   validates authenticity → emits `activity.verified`.\n\n3. **Resume service** consumes verified event →\n   rebuilds and re-scores resume → emits `resume.version.published`.\n\n4. **Notification service** consumes publish event →\n   notifies user via email/WS.\n\n5. **File service** allows rendering of the latest resume as PDF.\n\n---\n\n## 🧠 Business Logic\n\n### 1. Activity Deduplication\n\nDetect duplicate entries using **Jaccard similarity** between titles:\n\n```\nsimilarity = |tokensA ∩ tokensB| / |tokensA ∪ tokensB|\n```\n\nIf ≥ 0.7 → reject as duplicate (HTTP 409).\n\n### 2. Verification Cache\n\nLRU cache of recent 1000 verifications to avoid redundant checks.\n\n### 3. Resume Ranking\n\nEach activity contributes to resume score:\n\n```\nscore = base*0.5 + (trust/100)*0.3 + ln(1+impact)*0.2 + 5*exp(-daysSinceEnd/365)\n```\n\nTop-K selection per section.\n\n### 4. Event Topics\n\n* `activity.created`\n* `activity.verified`\n* `resume.version.published`\n* `integration.webhook.received`\n\n---\n\n## 📂 Folder Structure\n\n```\nresume-ecosystem/\n├── package.json\n├── .env.example\n├── docker/\n│   └── docker-compose.yml\n├── common-lib/\n│   ├── src/index.ts\n│   └── package.json\n└── services/\n    ├── api-gateway/\n    ├── auth-service/\n    ├── activity-service/\n    ├── verification-service/\n    ├── resume-service/\n    ├── integration-service/\n    ├── notification-service/\n    └── file-service/\n```\n\n---\n\n## ⚡ Installation\n\n### Prerequisites\n\n* Node.js ≥ 20\n* Docker \u0026 Docker Compose\n* npm / pnpm\n\n### 1. Clone Repository\n\n```bash\ngit clone https://github.com/srivilliamsai/resume-ecosystem-node.git\ncd resume-ecosystem-node\n```\n\n### 2. Install Dependencies\n\n```bash\nnpm install\n```\n\n### 3. Start Infrastructure (Database \u0026 Kafka)\n\n```bash\nnpm run docker:up\n```\n\u003e Wait 10-15 seconds for containers to initialize.\n\n### 4. Initialize Database\n\n```bash\nnpm run db:push\nnpm run seed  # (Optional: Populates demo data)\n```\n\n### 5. Run Full Stack (Frontend + Backend)\n\n```bash\nnpm run dev\n```\n\n---\n\n## 🌐 Access Points\n\n| Application | URL |\n| :--- | :--- |\n| **Frontend Dashboard** | [http://localhost:5173](http://localhost:5173) |\n| **API Documentation** | [http://localhost:4000/docs](http://localhost:4000/docs) |\n| **Kafka UI** | [http://localhost:8080](http://localhost:8080) |\n| **Prisma Studio** | `npx prisma studio` |\n\n---\n\n### Auth Service\n\n| Method | Endpoint         | Description                |\n| ------ | ---------------- | -------------------------- |\n| POST   | `/auth/register` | Register new user          |\n| POST   | `/auth/token`    | Issue JWT token            |\n| GET    | `/auth/me`       | Return logged-in user info |\n\n### Activity Service\n\n| Method | Endpoint          | Description         |\n| ------ | ----------------- | ------------------- |\n| POST   | `/activities`     | Create activity     |\n| GET    | `/activities`     | List all activities |\n| GET    | `/activities/:id` | Get single activity |\n\n### Verification Service\n\n| POST | `/verify/:activityId/hash` | Hash verification |\n| GET | `/verify/status/:activityId` | Get status |\n\n### Resume Service\n\n| GET | `/resume/me` | Current resume |\n| POST | `/resume/rebuild` | Force rebuild |\n| GET | `/resume/versions` | Resume history |\n\n### File Service\n\n| POST | `/render` | Render resume PDF |\n\n---\n\n## 📡 Events \u0026 Topics\n\n| Topic                          | Producer             | Consumer             | Description               |\n| ------------------------------ | -------------------- | -------------------- | ------------------------- |\n| `activity.created`             | Activity Service     | Verification Service | Triggers verification     |\n| `activity.verified`            | Verification Service | Resume Service       | Rebuild resume            |\n| `resume.version.published`     | Resume Service       | Notification Service | Notify user               |\n| `integration.webhook.received` | Integration Service  | Activity Service     | Add new external activity |\n\n---\n\n## 🧪 Testing\n\n### Run All Tests\n\n```bash\nnpm test\n```\n\n### Key Test Suites\n\n* Unit Tests (Jest/Vitest)\n* Integration Tests (Testcontainers for Kafka/Postgres)\n* E2E Tests (Supertest on Gateway)\n\n---\n\n## ⚙️ Environment Variables\n\n📄 `.env.example`\n\n```\n# Common\nNODE_ENV=development\nJWT_SECRET=supersecret\n\n# Database\nDB_HOST=localhost\nDB_PORT=5432\nDB_USER=root\nDB_PASS=root\nDB_NAME=resume_db\n\n# Kafka\nKAFKA_BROKERS=localhost:9092\nKAFKA_CLIENT_ID=resume-ecosystem\n\n# Redis\nREDIS_HOST=localhost\nREDIS_PORT=6379\n\n# Ports\nAUTH_PORT=4010\nACTIVITY_PORT=4020\nVERIFY_PORT=4030\nRESUME_PORT=4040\nINTEGRATION_PORT=4050\nNOTIFY_PORT=4060\nFILE_PORT=4070\n```\n\n---\n\n## 🧰 Troubleshooting\n\n| Issue                   | Cause                         | Fix                         |\n| ----------------------- | ----------------------------- | --------------------------- |\n| Kafka connection failed | Broker not running            | `docker compose up -d`      |\n| Port conflict           | Existing service on same port | Change port in `.env`       |\n| Database not reachable  | Wrong credentials             | Check `.env` or Docker logs |\n| Resume not updating     | Kafka consumer group stuck    | Restart resume-service      |\n| PDF not rendering       | Puppeteer missing             | Reinstall dependencies      |\n\n---\n\n## 🧭 Roadmap\n\n- [x] **Frontend:** React + Tailwind Dashboard\n- [x] **Backend:** 8 Microservices Architecture\n- [x] **Messaging:** Kafka Event Pipeline\n- [x] **Database:** PostgreSQL + Prisma Schema\n- [ ] **Auth:** OAuth 2.0 (Google/GitHub/LinkedIn)\n- [ ] **Deployment:** Docker \u0026 Kubernetes Helm Charts\n- [ ] **AI:** Resume Scoring \u0026 Suggestion Engine\n\n## 🤝 Contributing\n\nContributions are welcome! Please open an issue first to discuss what you would like to change.\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)\n3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)\n4. Push to the Branch (`git push origin feature/AmazingFeature`)\n5. Open a Pull Request\n\n## 📄 License\n\nDistributed under the MIT License. See `LICENSE` for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrivilliamsai%2Fresume-ecosystem-node","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsrivilliamsai%2Fresume-ecosystem-node","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrivilliamsai%2Fresume-ecosystem-node/lists"}