[1]. What the project is "TA-ATS is an Applicant Tracking System. It's built as microservices: a Next.js frontend, a FastAPI gateway, a Django backend, and a separate auth_mcp service that handles authentication and MFA centrally." [2] The pieces (point at the top row) Frontend (Next.js, :3000) — the UI the user sees. Gateway (FastAPI, :8000) — single entry point; forwards every API call to the backend. Backend (Django, :8002) — all business logic + data. auth_mcp (:9000) — a reusable auth service: verifies passwords and runs MFA. Slide 3 — The two databases (point at bottom row) ats_main — the app's data: users, jobs, clients, candidates, menus, roles. ats_mcp_db — auth_mcp's own store: mcp_users (password mirror) + mfa_users (MFA state). "They're isolated — the backend never touches the MCP's DB; they talk only through MCP tool calls." [4] — Why a separate auth_mcp? "Authentication and MFA are centralized in one service, so any project can plug into the same login/MFA logic. The MCP never stores plain passwords — only hashes — and it owns the MFA policy (email OTP / authenticator)." [5]— Login flow (walk the 6 numbered steps on the diagram) User enters email + password. Frontend → Gateway → Backend. Backend asks auth_mcp to verify the password. If MFA is on, auth_mcp emails/checks the OTP. Backend issues JWT tokens → dashboard loads. The sidebar menu is permission-filtered — users only see what they're allowed to. [6] — Key features to highlight Role & permission system (Groups + permissions) — admin-managed via UI. Dynamic, DB-driven sidebar — menus stored in DB, filtered per user. Forgot/Reset password via email OTP (3-step). Password policy (expiry) + password history. Velzon-themed professional UI (light, Poppins, indigo). Slide 7 — How to run it (the demo) "Start order: PostgreSQL → MCP (9000) → Backend (8002) → Gateway (8000) → Frontend (3000), or just double-click run.bat. Then open http://localhost:3000." =========================================================== Project Run =========================================================== [1].MCP Start (port 9000) cd E:\xampp\htdocs\python\auth_mcp .\venv\Scripts\python.exe server.py [2] Backend (port 8002) cd E:\xampp\htdocs\python\TA-ATS-interns\backend .\venv\Scripts\python.exe manage.py runserver 8002 [3]. Gateway (port 8000) cd E:\xampp\htdocs\python\TA-ATS-interns\gateway .\venv\Scripts\python.exe -m uvicorn app.main:app --port 8000 [4]. Frontend (port 3000) cd E:\xampp\htdocs\python\TA-ATS-interns\frontend npm run dev =========================================================== Git ignore : =========================================================== cd E:\xampp\htdocs\TA-ATS git add .gitignore git commit -m "Add .gitignore; untrack secrets, venv, node_modules, pycache, build artifacts" ========================================================== TA-ATS PROJECT — WHAT WE BUILT & PACKAGES USED ========================================================== Location: E:\xampp\htdocs\TA-ATS Old project preserved in: BACKUP\ ---------------------------------------------------------- ARCHITECTURE (4 services) ---------------------------------------------------------- Browser -> Frontend (3000) -> Gateway (8000) -> Backend (8002) -> PostgreSQL | v MCP (9000) [for MFA] Service Tech Port Job ------- ---- ---- --- frontend/ Next.js 16 3000 The website (login, dashboard) - what users see gateway/ FastAPI 8000 Single front door - forwards all /api/* to Django backend/ Django + DRF 8002 ALL APIs, database, login, roles, business logic mcp/ FastMCP 9000 MFA tool service (generate secret, QR, verify code) PostgreSQL - 5432 Database (ats_main) ---------------------------------------------------------- WHAT WE DID (step by step) ---------------------------------------------------------- 1. Created folder structure (backend, gateway, mcp, database, docs, frontend) 2. BACKEND (Django + PostgreSQL): - Created Django project "config" + 8 apps (users, authentication, audit_logs, dashboard, candidates, jobs, interviews, reports) - Custom User model (login by EMAIL, with roles + MFA fields) - Split settings: base.py / dev.py / prod.py - core/ folder: responses, exceptions, permissions, pagination, utils - Connected PostgreSQL database "ats_main" - Built login API (JWT), account lockout (5 fails), audit logging - Created admin user: kunal.verma@indovisionservices.in / Admin@123 3. MCP SERVICE (FastMCP): - Auth tools: generate_mfa_secret, get_provisioning_uri, verify_mfa_code, extract_resume_data - Django delegates all MFA/TOTP to this service - Removed old insecure backdoor code (098765) 4. GATEWAY (FastAPI): - Thin proxy: forwards every /api/* request to Django - Adds rate-limiting, logging, CORS - Frontend talks ONLY to this gateway 5. FRONTEND (Next.js 16): - Login page (with MFA code step) - Dashboard (shows profile + enable/disable MFA with QR code) - Route guard (proxy.ts) protecting /dashboard - API client -> calls gateway 6. Created run.bat (one double-click starts all 4 services) ---------------------------------------------------------- PACKAGES USED (per service) ---------------------------------------------------------- BACKEND (Django) -- pip django web framework djangorestframework REST API framework djangorestframework-simplejwt JWT login tokens (access + refresh) django-cors-headers allow frontend (3000) to call backend psycopg2-binary PostgreSQL database driver python-dotenv read .env file pyotp MFA / TOTP codes qrcode[pil] MFA QR code image Pillow image support (for QR) fastmcp client to call the MCP service (django.contrib.auth -> built into Django: password hashing) GATEWAY (FastAPI) -- pip fastapi API framework uvicorn the server that runs FastAPI httpx forwards requests to Django pydantic-settings reads .env config python-dotenv read .env file MCP SERVICE -- pip fastmcp MCP tool-service framework pyotp TOTP secret + code verify pdfminer.six read PDF resumes python-docx read DOCX resumes FRONTEND (Next.js) -- npm next React framework react / react-dom UI library tailwindcss styling typescript typed JavaScript js-cookie store login token in cookies ---------------------------------------------------------- LOGIN - which package does what ---------------------------------------------------------- djangorestframework -> the login API endpoint django.contrib.auth -> checks the password djangorestframework-simplejwt -> creates the JWT login token fastmcp -> MCP service -> verifies the MFA code ---------------------------------------------------------- KEY RULES (how to work) ---------------------------------------------------------- - ALL APIs are created in DJANGO (models + serializers + views + urls) - The MODEL is written ONCE and shared by: * Django admin panel (register with 1 line in admin.py) * The API (used by the frontend) - FastAPI gateway forwards new APIs AUTOMATICALLY (no changes needed) - Frontend (Next.js) only builds the screens and calls the APIs - SUPER ADMIN -> Django panel http://localhost:8002/admin/ (manage data) - App users -> Frontend http://localhost:3000/login (use the app) ---------------------------------------------------------- HOW TO RUN (4 terminals, in order) ---------------------------------------------------------- 1) MCP: cd E:\xampp\htdocs\TA-ATS\mcp .\venv\Scripts\python.exe server.py 2) Backend: cd E:\xampp\htdocs\TA-ATS\backend .\venv\Scripts\activate python manage.py runserver 8002 3) Gateway: cd E:\xampp\htdocs\TA-ATS\gateway .\venv\Scripts\activate uvicorn app.main:app --reload --port 8000 4) Frontend: cd E:\xampp\htdocs\TA-ATS\frontend npm run dev OR just double-click: run.bat Then open: http://localhost:3000 Login: admin@indovisionservices.in / Admin@123 ---------------------------------------------------------- URLs ---------------------------------------------------------- Frontend (app) http://localhost:3000 Gateway health http://localhost:8000/health Backend health http://localhost:8002/health/ Django admin panel http://localhost:8002/admin/ ========================================================== => Why we are using TanStack table instead of DataTable (01/07/2026) | Feature | TanStack Table | DataTable | | ------------- | --------------------------- | ------------------ | | Table logic | ✅ | ✅ | | UI included | ❌ | ✅ | | Sorting | ✅ Logic | ✅ Ready | | Filtering | ✅ Logic | ✅ Ready | | Pagination | ✅ Logic | ✅ Ready | | Styling | ❌ | ✅ | | Custom design | ✅ | Sometimes limited | | Framework | React, Next.js, Vue adapters | Depends on library | =>Implemented the react-select library across the application to provide searchable dropdowns with support for both single-select and multi-select fields, improving usability and user experience. (Siddhi) 08/07/2026 (Team Discussion-> Siddhi, Alok Sir, Dinesh Sir, Lakshit) 1)Under questions for JD -> show labels (eg- Ques-> what is your name, Ans-> my name is Joe) -> 2)Cancel button isn't working under JD -> working 3)Under "created by" of JD section -> replace emails by names of the people -> 4)When we click on one candidate individually then their profile should open in new tab -> 5)Complete application should be responsive -> 6)When we are notifying candidates via email then there should be a field of "cc(multiple emails with help of comma)" just like outlook -> 7)Under one job ID we should be able to select multiple candidates -> ek button hona chahiye assigned recruiters k under (assign candidate) 8)we should be able to notify multiple candidates -> 9) Candidate Filters-> a) Experience (it should only take positive numbers) , b)Annual salary c) selecting multiple city and states d)start and end date e)multiple selection for skills f)exp (dropdown 0-50) month and year f)preferred location g)designation h)education i)diversity 11)Under JD we should be able to select muliple candidates for same job and they should be displayed in a proper format(name, location, exp, skills, notice period) -> 13-07-2026(Team discussion -> Rajiv Sir, Dinesh Sir, Alok Sir, Lakshit, Siddhi) 1)A column should be there for writing the status in front of every module in docs - DONE 2) Update the docs for dashboard 3)when we click on "users" from the dashboard we should be redirected to the new tab - DONE 4)If we create a role with an existing name , then a proper toast message should appear - DONE 5)Dashboard should display that how many jobs are open, close , people selected etc (basically data related to jobs for better user experience) 6)Clone JD feature - DONE 7)There should be a dashboard for each role(ex:- recruiter, HR etc) so that data related to that role should be displayed - DONE 8)"Ans" under ques/ans tab of JD - DONE 9) there should be a sample template to upload Ques/ans under JD and we should be able to further add/upload the file - DONE 10)there should be company level login and user level login so that we will be able to create and post jd according to what we have loggedin 11)preview button should be there after uploading resume - DONE 12)a person can switch profiles without logging out if he has multiple profiles 13) under assign candidates -> only candidates related to that jd should display , no extra candidates should be suggested 14)server side pagination should be there - DONE 15)Under edit candidate profile -> it's name should be there so that we get to know that who's profile we are editing 16)Reach out max candidates via telegram, instagram, linkedin, naukri, facebook, whatsapp etc (candidate sourcing and shortlisting are main priority ) 17)under notify candidates different templates should be there 14-07-2026 (ALok sir, Siddhi, Lakshit, Kunal Sir) 1)candidate login- resume isn't parsing data properly - use llm , if llm isn't working you have to capture the data otherwise too - Siddhi 2)Add dropdown in annual CTC - Siddhi 3)Add master data under notice period - Lakshit 4)use astrick (*) for required fields - Lakshit 5) if the user is facing any issue they should be notified in a toast - Lakshit 6)candidate login - the jd's aren't appearing under JD tab - Lakshit 7) Remove MFA tab from candidate dashboard - Lakshit 8) remove save option from JD details - Lakshit 15-07-2026(Alok Sir, Siddhi, Lakshit) 1)For large amount of data use pagination and data tables - Lakshit - DONE 2)Use collapsable on dashboard - Lakshit- DONE 3)Increase width of the candidate profile form - Siddhi - DONE 4)use a span under select candidates and mention that it is a list of all candidates, also when a candidate is removed from a particular JD then he should be shown under all candidates list - Siddhi - DONE 5)if a particular field is empty and the user proceeds without filling that field then a proper message should be shown that which field is missing - Lakshit - DONE 6)make gender and current address required under candidate's profile - Lakshit - DONE 7)don't let the user type key skills, (call from master data) - Lakshit - DONE 8)Under JD keep the title same of the doc he uploads and what he manually change - Siddhi - DONE 9)under candidate dashboard-> JD -> when he clicks apply then show a pop up of JD details and a confirmation pop up for apply - Lakshit - DONE 10)icons next to profile - Lakshit - DONE 11)make apis for annual ctc, notice period, language, duration, technology used in projects - Lakshit - DONE 12)fix dropdown of annual ctc and total experience - Lakshit - DONE 18-07-2026(Rishi Sir, Rajiv Sir, Alok Sir, Dinesh Sir,Kunal Sir, Anugrah Sir,Lakshit, Siddhi):- 1)create dummy data for testing and login credentials should be displayed on the page - DONE - Siddhi 2) Everything should be filterable (on the basis of job ID, company name, experience, salary, clients etc) - Siddhi 3)full phone number should not be displayed (only display last 3 digits) - Alok Sir 4) on whichever module we are getting notified then these notifications should be configurable 5)until we implement AI calling, we should be able to trigger candidate with questions and they should be able to answer them 6)Remove loaders - only refresh the rightside, the leftside bar menu should not be refreshed - DONE - Siddhi 7)super admin just after login can do anything and everything - DONE - Siddhi 8)under create user -> create master data for department(make api for this), and these department should be populated under create user 9)use "new" GIF whenever a new JD has created and sent to approval to hiring manager - DONE 10)add notification when we reject/approve any JD to the person who has created that JD 11)when we are uploading any JD - don't populate ques/ans under JD description - DONE - Siddhi 12)under send approve popup , there should be a dropdown in which we can see how many hiring managers are available and there should be checkboxes to select them and sen JD for approval - DONE - Lakshit 13)when we approve or reject a JD then reject and approve button should not load together - DONE - Lakshit 14)once we reject a JD there should be a option to approve it again - Lakshit 15)when a hiring manager approves a JD it's status should be published - DONE - Lakshit 16)when a JD is in draft then the option to publish should not be there - DONE - Siddhi 17)when we create a user - some fields should be required - DONE - Siddhi 24/07/2026 1)under send approve -> once you have sent a jd for approval we should be able to send it again to some other people too - DONE - Lakshit 2)we should be able to unassign a JD to a Hiring manager (discussion) 3)Project manager should be able to see that to how many hiring manager has he sent a JD(cound of Hiringmanagers to which JD has been sent)- Lakshit - DONE 4)Jd attachment is not visible - Chirag - DONE 5)If a JD has been assigned to 2 hiring manager, and if it is approved by A then B should be shown that it was approved by B - Lakshit 6) post preview -> JD desc is not in proper format - DONE - Siddhi - DONE 7)If a JD is published then don't allow user to change it's details , and remove "save changes" button in this case 8)Hide Emp ID from add user - DONE - Siddhi - DONE 9)contact number should be 10digits -> under candidates popup - DONE - Siddhi 10)Edit profile -> preview resume should be There - Chirag- DONE 11)Recruiter rank premission issue - Lakshit(29-07-2026)- Done 12)Leftside bar should show those tabs only which we have permission of (under all) - Lakshit - Done 13)there should be a link to unsubsribe to the emails candidate is receiving 15)In candidates table add 2 columns - tele_id, wtsp_id 17)Job ID should be encrypted everywhere - Done - Alok Sir 18)show already applied when a candidate has applied for a job - DONE - Siddhi 28/07/2026 1)filter based on JOB,skills - how many jobs in data (how many jobs in data science etc) - Siddhi - DONE 2)if a person creates JD without adding ques/ans and tries to submit it then he should be asked that do they want to add q&a if they say yes then they should be redirectedto q&a page - DONE - Siddhi 3)after creation of JD the user should be redirected to send approve page 4)login page - toast error on live site - DONE - Siddhi 5)under JD view - edit button should be there - DONE- Siddhi 6)star mark mobile no. **** don't show full no. DPDP - Alok Sir - DONE 7)Add more dummy data -Alok Sir - DONE 8)filter based on job profile, how many jobs in data science, data entry, python etc - Siddhi - DONE 9)filter based on skill, ctc range - Siddhi - DONE 10)there should be option to share candidates list if multiple recruiters are working on same JD. Once it is enabled then one recuriter can see other recruiter's candidates list and if it is disabled then can't see other recruiter candidates list in pipeline 11)sidebar taking too much time to load - Siddhi - DONE 12)recruiter should be able to quick view in morning points Jd, screened JD, pipeline candidates. Show action points - Lakshit - DONE 13)TA manager can see recruiter wise work - Lakshit - DONE 29-07-2026 1)after candidate screening we get let's say 100 candidates then we have to send mail to only top 10 candidates according to a particular JD , then after Ai screening only top candidates will be sent mail, we hv to create checkboxes in front of candidates(after AI screening) then check & uncheck according to what we have sent mail - Lakshit - DONE 2) create a table candidate history for storing history of candidates resume in JSON format - Siddhi 3) add name of JD with Job Description Viewer - Siddhi - DONE 31-07-2026(Lakshit, Dinesh Sir) 1)In Recruiter dashboard add the per JDs Filter change the all dashboard according to JD - Lakshit 2)add in recruiter on hold , closed JD show in dashboard / per JD opening remove status and how many candidate are left according to opening/ shortlisting Candidate reject logs - Lakshit 31-07-2026 MOM(Rishi Sir, Dinesh Sir, Alok Sir, Kunal Sir, Abhishek, Lakshit, Siddhi) 1)Under(recruiter, project manager, hiring manager) dashboard Action points should be of different color and in top right corner - Lakshit- DONE - 31-07-2026 2)AGENT FOR EFFICIENCY:- i) we have to create an agent which will trigger emails to the (recruiter, project manager, hiring manager) in the morning for summarizing their action points ii)Agent will see the dependencies too and will report that that which dependency needs to be unblocked for performing the tasks iii)On weekly/daily basis this agent will generate a trend plot for the progress -> how many new job/ companies/openings etc have joined/created iv)Give insights to the executive leadership on fine tuning the recruitement metrics Team Discussion (31-07-2026)(Dinesh Sir, Alok Sir, Kunal Sir, Abhishek, Lakshit, Siddhi) 3)under candidates details the phone number should be masked- (optional) 4)under login history email should be masked - Siddhi - DONE - 31-07-2026 5)Before sending any mail there should be an option to preview that mail and it should be editable too - Siddhi - DONE -31-07-2026 6)when a JD comes for approval then under review there should be option to view it's attachment - Siddhi - DONE - 01-08-2026 7)Source should be displayed which will tell that which candidate is coming from which source - Lakshit 8)Score appears zero when there is no valid score under AI screening - Siddhi - DONE - 31-07-2026 9)the newly created jobs should display on the top of the job listings - Siddhi - DONE - 31-07-2026 10)Permissions for groups and master data fixed - Siddhi - DONE - 31-07-2026 Discussion with (Recruiter Teams) (05-08-2026) 1)Hiring manager can edit JD in every stages . 2)as a candidate upload a resume suggested the JD according to resume /cv . 3)candidate can not apply if there skills is not match the JD . 4)candidate can match all the details and skills like 90% then they can apply ,not only some key point and selected 5)do encrypted email , no on inactive candidate 6)Report management silder not open in live ATS. 7)we apply and know the role and there responsibalities and there hierarchy . Meeting on 06-08-2026 1)dolibar customer show in ats and show only currenty login person customers. 2)Once JD approved & assign to recruiter then notify to project manager. 3) system should auto show candidate based on JD . 4)Don't use naukri so increase our ats database. 5)Implement one whatsapp number and email that direct land there resume and cv in our ats . 6)Every night run agent & will analiysis candidates & Hiring. 7)assessment with hunar . 8) add logo of indovisionservices in our ATS . 9) Training document of ATS . 10) Compare with naukri & IT Source take there all good features in our ats . 11)In ATS Database when we create JD according to JD show the candidate and rank them . 06-08-2026 1)when a hiring manager approves a JD and assigns recruiter to it then a notification should be trigerred to the project manager too that which recruiters have been assigned to that particular JD