· apps · recruit · hiring
The Recruit App: Your Applicant Tracking System Inside Gato
Inside gato’s Recruit app: an applicant tracking system designed for hiring teams who want a real ATS without the enterprise tax.
Great companies are built by great people. We help you find them.
The Recruit app in Gato is a full applicant-tracking system (ATS) built into the platform. It’s designed for the hiring pipeline: job postings, candidate pipelines with drag-and-drop stages, candidate profiles with notes and interviews, talent pool, and analytics — all with the same glass-morphism UI and microservice-ready architecture as the rest of Gato.
This post walks through what the app does, how it’s built, and how it’s maintained with the help of the project’s AI agents.
What the Recruit App Does
The app is built as a view-based experience with clear separation of concerns:
- Pipeline — CandidatePipeline: kanban-style board for the selected job. Stages (e.g. Applied → Screen → Interview → Offer) with CandidateCards; drag candidates between stages. Select a job from the list to see its pipeline; add candidates to the current job or create new ones.
- Jobs — JobList: all job postings. Create job (NewJobModal), open JobDetailModal for full detail and edit. Job fields: title, department, location (onsite/remote/hybrid), employment type (full-time, part-time, contract, internship), description, requirements, responsibilities, salary range, skills, experience, education, benefits, status (draft, open, paused, closed, filled), priority (low, medium, high, urgent), hiring deadline. Calendar integration: set a hiring deadline, “Add to Calendar” (syncs via calendarIntegrationService), “View in Calendar” opens the Calendar app to the linked event.
- Candidates — Create candidate (NewCandidateModal); open CandidateDetailModal for full profile. Contact info (name, email, phone, location, LinkedIn, current title, company) is editable. Activity log, interviews, scorecards live in candidateDetailService. Add/remove from talent pool from the detail modal (“In Talent Pool” state).
- Talent pool — TalentPoolPanel: list of talent-pool candidates; add from candidate detail, remove from candidate detail. Tags and notes supported.
- Analytics — AnalyticsDashboard: pipeline metrics (e.g. time-to-hire, conversion by stage).
- Pipeline management — Per-job pipelines with customizable stages (NewStageModal). Each job gets a default pipeline on creation; stages hold candidates and support drag-and-drop.
Candidates are linked to a job and a stage; pipelines are per-job. Jobs have rich metadata (deadline, status, openings, filled count). The app receives onOpenCalendarEvent from App so “View in Calendar” can open the Calendar tab to the linked job-deadline event.
Architecture: Microservice-Ready and Agent-Aware
The Recruit app follows Gato’s app-per-directory pattern and is built so the UI doesn’t depend on where data lives.
- Components — CandidatePipeline, CandidateCard, CandidateDetailModal, JobList, JobDetailModal, NewJobModal, NewCandidateModal, NewStageModal, TalentPoolPanel, AnalyticsDashboard.
- Services — recruitService.js handles jobs, pipelines, stages, candidates, talent pool, sources, interviews, scorecards. It uses direct localStorage (not storageService) with keys:
gatoRecruitJobs,gatoRecruitPipelines,gatoRecruitCandidates,gatoRecruitTalentPool,gatoRecruitSources,gatoRecruitInterviews,gatoRecruitScorecards. candidateDetailService.js handles rich candidate detail blobs, notes, and activity log with keys likegatoRecruitCandidateDetails,gatoRecruitCandidateNotes,gatoRecruitCandidateActivities. All service methods return a consistent{ success, data?, error? }shape. Replacing with a real API means swapping these service implementations; components stay unchanged. - Storage — Currently localStorage-only; BRAIN and data-schemas document the keys and entity shapes so a future migration to storageService or an API backend is straightforward.
So: today it’s a rich client with local persistence; tomorrow the same components can talk to an ATS microservice by replacing the service layer.
The SCOUT Agent: Who Maintains This
The Recruit app has a dedicated dir agent named SCOUT — the “Recruiting Specialist” in Gato’s AI consulting firm.
- Codename: SCOUT
- Workspace:
src/apps/recruit/dir_agent/ - Character: People-oriented, process-driven, and invested in the hiring pipeline. SCOUT knows recruiting is a funnel — from job posting to screening to interview to offer — and every stage has drop-off. They build tools that help hiring managers move candidates through the pipeline efficiently while treating every applicant with respect.
SCOUT’s goals (from the agent character file) are:
- Job posting creation and management.
- Candidate pipeline with customizable stages.
- Candidate profiles with resume, notes, and interview history.
- Interview scheduling integration.
- Pipeline analytics (time-to-hire, conversion rates).
- Candidate data import (CSV, LinkedIn).
- Job-candidate matching and search.
- Collaborative hiring (multiple reviewers).
SCOUT works with PULSE (CRM) on shared contact patterns, TEMPO (Calendar) for interview scheduling and job-deadline events, FLOW (Import/Export) for candidate data import, and QUILL (Doc) for offer letter generation. Calendar integration is first-class: job deadlines can sync to Calendar, and the app can open the Calendar tab to the linked event via onOpenCalendarEvent.
The agent’s memory lives in markdown under src/apps/recruit/dir_agent/: a BRAIN.md (directory map, storage flow, recruitService vs candidateDetailService, TEMPO integration), data-schemas.md (storage keys, Job/Candidate/Pipeline/Stage/Talent pool schemas, relationships, validation), ux-training.md (key flows and components), plus changelogs and topic docs. When SCOUT “levels up,” they re-scan the codebase, refresh BRAIN and data-schemas, update UX training, and document findings so the next iteration — or a future fine-tuned model — can pick up where they left off.
Key Flows (From UX Training)
The dir agent’s UX training doc summarizes the main user journeys:
- Job management: Create/edit job (NewJobModal, JobDetailModal), set hiring deadline, optionally add deadline to Calendar (TEMPO), view in Calendar.
- Pipeline: Per-job stages, drag candidates between stages, view pipeline in CandidatePipeline.
- Candidate: Add candidate (NewCandidateModal), open CandidateDetailModal — view/edit contact info, add/remove from talent pool, activity log, interviews, scorecards.
- Talent pool: TalentPoolPanel; add from candidate detail; remove from candidate detail with “In Talent Pool” state.
- Analytics: AnalyticsDashboard for pipeline metrics.
So the blog you’re reading is aligned with the same flows the agents use when they reason about the app.
Tests and How to Run Them
The Recruit app follows the same service contract as other Gato apps ({ success, data?, error? }). The full test suite is run with:
npm test
Adding integration tests for recruit (e.g. job CRUD, pipeline moves, talent pool) under test/ is straightforward and recommended as the app evolves.
Summary
The Recruit app in Gato is a full-featured applicant-tracking system: job postings with rich metadata, per-job candidate pipelines with drag-and-drop stages, candidate profiles with contact info and activity, talent pool, and analytics, plus calendar integration for job deadlines. It’s built with a clear service boundary (recruitService, candidateDetailService) and documented storage and schemas so it can stay in the UI layer while the backend evolves from localStorage to a real API. The SCOUT agent owns the recruit app directory, keeps BRAIN, data-schemas, and UX training up to date, and documents everything so that both humans and future AI iterations can work on it with full context.
SCOUT finds the talent that builds the future.
Sources: ai_agents/app_agents/SCOUT.md, src/apps/recruit/dir_agent/BRAIN.md, src/apps/recruit/dir_agent/ux-training.md, src/apps/recruit/dir_agent/data-schemas.md, src/apps/recruit/index.jsx, src/apps/recruit/services/recruitService.js, and the Gato README.