The hiring OS we will actually run.
Loom replaces TalentRecruit with one codebase: a shared RPO instance for many companies, and isolated single-company deploys. Recruiters add jobs. A job board is how candidates apply.
Central RPO
One instance, many client companies. Jobs are owned by a company. Talent pool is instance-wide, with consent when a person is reused.
Isolated clients
Same image. Own Postgres, branding, WhatsApp, hostname. Exactly one company. No data crosses instances.
Job board
Internal dashboard to publish. Public listings to apply. Not a no-code career-site CMS in v1.
What we already decided
- We are an RPO firm. One central instance holds many client companies. Isolated instances exist for clients who need their own DB and branding — those contain a single company.
- Same application code for every deploy. Tenancy is config, not a fork.
- Market: India-first, multi-country ready. DPDP now; GDPR-shaped fields from day one.
- Jobs: Internal teams create and manage jobs in the dashboard. The Job Board dashboard publishes listings and powers the public apply flow.
- AI: copilot, not autopilot. Parse, rank, draft, summarize. No ERIKA-style bot interviews in v1.
Instance model
flowchart LR
subgraph code [Same Docker image]
App[Loom app]
end
subgraph rpo [Central RPO instance]
RpoDb[(Postgres: many companies)]
RpoBoard[Job board: all clients or per-client]
end
subgraph iso [Isolated client instance]
IsoDb[(Postgres: one company)]
IsoBoard[Job board: that company only]
end
App --> rpo
App --> iso
INSTANCE_MODE=rpo or single. The data model always has organizations. In single mode the switcher is hidden.
Decisions, frozen
Change these in the repo when the product changes — not only in chat.
Business
| Decision | Choice |
|---|---|
| What we are | RPO firm that also deploys isolated ATS instances for some clients |
| Central deploy | One shared instance, many companies inside it |
| Isolated deploys | One company per instance, own DB / branding / secrets |
| Code | Same application image for every instance |
| Market | India-first, then a few other countries (UK/SEA) |
| Compliance now | DPDP now; GDPR-shaped fields so we do not rework later |
How work enters the system
| Decision | Choice |
|---|---|
| Who creates jobs | Internal teams / recruiters, in the dashboard |
| Public intake | Job Board dashboard + public job board + apply pages |
| Not v1 | TalentRecruit-style no-code multi-page career site builder |
| Not v1 | One-click posting to Naukri / LinkedIn / Indeed (model so it can plug in) |
Day-1 capabilities
Taken from what we actually depend on in TalentRecruit:
- Job requisitions, approvals, JD templates / job library
- Resume parsing, duplicate detection, talent pool search
- Pipeline / stages / recruiter candidate tracking
- Hiring manager portal (review, feedback, approvals)
- Multi-client RPO: companies, job ownership, submissions to client HMs
- Dashboards and reports
- Campus / high-volume bulk hiring
- Offer letters, e-sign, joining-doc checklist
- Assessments / AI screening as copilot + knockouts + third-party tools
- Interview scheduling + calendar + scorecards
- Email + WhatsApp templates
- Employee referrals and IJP
Explicitly not day-1: vendor portal, BGV, full career-site builder, job-board aggregator search.
Four products in one app
If a screen tries to be all four, it has failed. Recruiters run hiring from dashboards; candidates apply on a job board.
| Person | Where they work | What they need |
|---|---|---|
| Recruiter | Recruiter OS | Speed: add jobs, publish, parse CVs, move pipeline, message, schedule |
| TA lead / RPO manager | Dashboards | Funnel, time-to-hire, recruiter load, client-company health |
| Hiring manager | HM portal | Review shortlists, score, approve. No sourcing UI |
| Employee | Light portal | Refer someone, apply to IJP |
| Candidate | Public job board | Find a role, apply, see status |
| Instance admin | Settings | Users, branding, pipelines, templates, WhatsApp/email, DPDP |
Jobs and the job board
This is the spine. Recruiters create jobs. Publishing is a separate dashboard. Candidates never edit requisitions.
flowchart TD
Recruiter[Recruiter] --> JobsDash[Jobs dashboard]
JobsDash --> Draft[Draft / pending approval]
Draft --> Approved[Approved job]
Approved --> BoardDash[Job Board dashboard]
BoardDash --> Public[Public listing + apply]
Public --> App[Application]
Recruiter --> Upload[Bulk CV / email ingest]
Upload --> Pool[Talent pool]
Pool --> App
App --> Pipeline[Job pipeline]
Pipeline --> HM[Hiring manager review]
Jobs dashboard
- New job from blank, template, clone, or AI-assisted JD.
- Company (required in RPO), department, location, employment type, openings, confidential flag.
- India fields: CTC band, notice-period expectation, work mode.
- Approval chain before the job is live internally.
- Confidential jobs never hit the public board.
Job Board dashboard
- Publish / pause / close. Preview, slug, SEO, card vs full page.
- Apply form: resume, knockouts, custom fields per job.
- Per-listing funnel: views → applies → screened → interview → offer.
- Never bury Publish inside a 12-tab job edit form.
What this is not (v1)
- A staffing ERP (billing, timesheets, contractor CRM).
- An autonomous AI recruiter.
- A replacement for Naukri as a sourcing UI.
- An HRIS / 90-day onboarding suite.
TalentRecruit, mapped
Every capability we researched. Recommendations match the August 2026 interview. Filter this list; accept or strike items in docs/FEATURES.md as the product evolves.
TalentRecruit sells an end-to-end suite (ERIKA + GAIA Autopilot). We do not clone that surface. We clone the jobs RPO recruiters and client HMs actually do, then add a job board.
1. Workforce planning and budgeting
| Feature | Recommendation | Notes |
|---|---|---|
| Manpower plan / headcount budget vs hired | Later | Useful for enterprise TA; RPO can live without it in v1 |
| Budgeted vs non-budgeted reqs | Later | Can be a flag on the job |
| Demand forecasting | Skip | Spreadsheet / BI until we have years of data |
2. Job requisition management
| Feature | Recommendation | Notes |
|---|---|---|
| Create job in recruiter dashboard | Keep v1 | Primary intake for roles |
| JD templates / job library | Keep v1 | You use this today |
| Clone / one-click duplicate | Keep v1 | Campus + repeat RPO roles |
| Approval workflow | Keep v1 | |
| AI-assisted JD from a prompt | Keep v1.5 | Copilot; recruiter edits |
| JD parse (paste a doc → fields) | Later | Nice, not blocking |
| Custom req forms per company / hiring type | Keep v1 | Permanent vs contract vs intern |
| Confidential job flag | Keep v1 | Hidden from board, search, unauthorized reports |
| Assign recruiters, HMs, panel | Keep v1 | |
| Configurable stages per job or company | Keep v1 | |
| Employment types (FTE, contract, intern, campus) | Keep v1 |
3. Career site vs job board
TalentRecruit’s Career Site Builder is a no-code branded microsite. Loom ships a job board instead.
| Feature | Recommendation | Notes |
|---|---|---|
| Job Board dashboard (publish, pause, apply form, funnel) | Keep v1 | Asked for explicitly |
| Public job list + job page + apply | Keep v1 | Candidates enter here |
| Per-company branding (logo, color, domain) | Keep v1 | Isolated instances especially |
| Combined RPO board + /{companySlug} | Keep v1 | See Decisions |
| Knockout / screening questions on apply | Keep v1 | |
| Scheduled go-live for a posting | Later | |
| No-code multi-page culture/CMS site | Later | TA should not be webmasters in v1 |
| AI chatbot on the career site | Skip | Conflicts with copilot-not-autopilot |
| Multilingual career CMS | Later | Start English; add a language later |
4. Job distribution (external boards)
TalentRecruit: one-click post to Naukri, LinkedIn, Indeed, and PortalRecruit unified search.
| Feature | Recommendation | Notes |
|---|---|---|
| Shareable job link / WhatsApp / LinkedIn share | Keep v1 | Free, high value |
| One-click Naukri / LinkedIn / Indeed post | Later | Model job_postings so this is an adapter |
| PortalRecruit-style unified board search | Later | Expensive; recruiters still use Naukri UI |
| Google for Jobs / IndexNow on our board | Keep v1 | Cheap SEO win |
5. Sourcing, referrals, IJP
| Feature | Recommendation | Notes |
|---|---|---|
| Internal talent pool search (boolean + filters) | Keep v1 | |
| Employee referral portal | Keep v1.5 | Day-1 need; can follow core pipeline |
| Referral tracking / bonus status field | Keep v1.5 | |
| IJP (employees apply to internal jobs) | Keep v1.5 | |
| AI auto-source from pool when a job opens | Later | Copilot suggested matches is enough |
| Internal mobility recommendations | Later |
6. Candidate database (ATS core)
| Feature | Recommendation | Notes |
|---|---|---|
| Resume parse (PDF/DOC/DOCX) | Keep v1 | |
| Duplicate detection + merge | Keep v1 | |
| Candidate 360 | Keep v1 | |
| Pipeline / kanban + table | Keep v1 | |
| Bulk actions | Keep v1 | |
| Notes, tags, @mentions | Keep v1 | |
| Custom fields per org | Keep v1 | |
| Email-in / bulk CV upload | Keep v1 | RPO + campus |
| Source tracking on every application | Keep v1 | |
| Do-not-contact / GDPR-DPDP hold | Keep v1 |
7. RPO / multi-client
TalentRecruit corporate is one-company; their agency SKU adds CRM. We are hybrid.
| Feature | Recommendation | Notes |
|---|---|---|
| Many companies in one instance | Keep v1 | RPO mode |
| Isolated one-company instance | Keep v1 | Same code |
| Job owned by a company | Keep v1 | |
| Recruiter membership per company | Keep v1 | |
| Submission to client hiring managers | Keep v1 | Unit of RPO work |
| Instance-wide talent pool with audit | Keep v1 | Consent when reusing across clients |
| Client-facing HM login per company | Keep v1 | |
| Vendor portal (external agencies submit CVs) | Later | Not marked day-1 |
| Client billing / invoice / margin | Skip | Not a staffing ERP |
8. Engagement (email, WhatsApp, voice, chatbot)
| Feature | Recommendation | Notes |
|---|---|---|
| Email templates + log on the person | Keep v1 | |
| WhatsApp templates + log | Keep v1 / v1.5 | India-first; land in v1 if API access is ready |
| SMS | Later | WhatsApp covers India |
| In-app chatbot / voice bot screening | Skip | ERIKA territory |
| Automated drip sequences | Later | Start with stage-change templates |
| Unsubscribe / WhatsApp opt-out | Keep v1 | Compliance |
9. Screening, matching, assessments, AI interviews
TalentRecruit: ERIKA matching, bot interviews, Teams/Meet summaries.
| Feature | Recommendation | Notes |
|---|---|---|
| Knockout questions | Keep v1 | |
| LLM rank / shortlist suggestion | Keep v1.5 | Recruiter decides |
| Explainable match reasons | Keep v1.5 | Trust |
| Third-party assessment links | Keep v1.5 | HackerRank, Testlify, etc. |
| Homegrown question bank + proctoring | Skip | |
| Conversational AI interviews | Later | Do not clone ERIKA in v1 |
| Voice bot calls | Skip | |
| Auto stage-move (GAIA Autopilot) | Skip | Dangerous in RPO |
| Interview question generator | Keep v1.5 | Copilot |
| Transcript summary from a recording URL | Later | Meet/Teams bots are their own product |
10. Interviews
| Feature | Recommendation | Notes |
|---|---|---|
| Schedule interview, panel, type | Keep v1.5 | Day-1 need; stack after pipeline if time-boxed |
| Scorecards | Keep v1 | Needed with HM portal |
| Calendar OAuth (Google, Microsoft) | Keep v1.5 | |
| Candidate self-select from slots | Keep v1.5 | |
| Reminders | Keep v1.5 | |
| Video interview vendor embed | Later | Zoom/Meet links as fields first |
11. Hiring manager portal
| Feature | Recommendation | Notes |
|---|---|---|
| HM home: waiting on you | Keep v1 | |
| Review submitted candidates | Keep v1 | |
| Scorecard + comment | Keep v1 | |
| Approve interview / offer | Keep v1 | |
| No access to talent pool / job board admin | Keep v1 | UX rule |
12. Offers, e-sign, onboarding
| Feature | Recommendation | Notes |
|---|---|---|
| Offer letter from template, approvals | Keep v1.5 | After pipeline |
| Compensation fields (CTC) | Keep v1.5 | |
| Candidate accept / decline | Keep v1.5 | |
| Upload signed PDF / simple accept token | Keep v1.5 | |
| Digio / Zoho Sign | Later | |
| Joining document checklist | Keep v1.5 | |
| Document library like TR onboarding | Later | |
| First-90-days onboarding / HRIS | Skip | Different product |
| Offer benchmarking (market salary AI) | Skip |
13. Background verification
| Feature | Recommendation | Notes |
|---|---|---|
| Native BGV marketplace | Later | Not marked day-1 |
| Status field + vendor link | Later | Cheap adapter later |
| Reusable verified identity | Later | TR differentiator; not ours yet |
14. Campus / high volume
TR customers praise bulk CV handling for GET/campus drives.
| Feature | Recommendation | Notes |
|---|---|---|
| Bulk CV upload | Keep v1 | |
| Drive / event object, college tag | Keep v1.5 | |
| Table-first pipeline (not only kanban) | Keep v1 | |
| Virtual assessment scheduling at scale | Later | Use assessment vendor |
| Registration microsite per drive | Later | Job board apply + source=campus may suffice |
15. Analytics
TalentRecruit claims 200+ reports. We will not.
| Feature | Recommendation | Notes |
|---|---|---|
| Funnel by job / company / recruiter | Keep v1 | |
| Time-to-hire, time-in-stage | Keep v1 | |
| Source of hire / apply | Keep v1 | |
| Recruiter load / SLA aging | Keep v1 | |
| Offer-to-join | Keep v1.5 | |
| Campus drive health | Keep v1.5 | |
| CSV export | Keep v1 | |
| 200 canned reports | Skip | |
| Predictive joining risk | Later |
16. Compliance, admin, platform
| Feature | Recommendation | Notes |
|---|---|---|
| Roles and permissions | Keep v1 | |
| Audit log | Keep v1 | |
| DPDP consent, retention, export/delete | Keep v1 | |
| Country privacy policy per org | Later | Start with instance + org text fields |
| SOC2/ISO program | Later | Process, not a feature flag |
| Custom fields, email templates, pipeline templates | Keep v1 | |
| API for partners | Later | tRPC first; REST when a vendor needs it |
| Mobile PWA for recruiters | Later | HM portal should already work on phones |
| Multi-currency / multi-country packages | Later | Fields exist; workflows later |
17. TalentRecruit items we skip as identity
| Feature | Recommendation | Notes |
|---|---|---|
| ERIKA as autonomous recruiter | Skip | Copilot only |
| GAIA Autopilot | Skip | |
| Staffing billing, invoicing, lead CRM | Skip | RPO ATS, not agency ERP |
| Employee handbook / HRIS-in-ATS | Skip | |
| Building our own assessment engine | Skip | Integrate |
Best UX for the people who live here
- Recruiters are primary. Density, keyboard, bulk actions, zero extra clicks to move a candidate.
- Hiring managers get less — not a dumbed-down recruiter UI. Their job is decide.
- Job board is a product, not a CSS theme on the ATS.
- RPO chrome is optional. Company switcher only in
rpomode. - India-shaped forms. CTC and notice period are normal fields.
Recruiter OS
Home is work, not vanity KPIs: aging pipeline, interviews today, HM feedback waiting. Command palette everywhere (⌘K). Keyboard: c create, / search.
Hiring manager portal
Home is “Waiting on you.” Scorecard + one comment. Submit is the only primary button. Must work on a phone. Recruiters stay desktop-class in v1.
Manager dashboards
About twelve charts that answer real questions — time-to-hire, funnel, source, recruiter load, offer-to-join — with CSV on every table. Drill: chart → job → pipeline.
v1, then close, then ecosystem
- v1 — hiring OS + job board Auth, orgs, jobs dashboard, publish/apply, parse, pipeline, HM review, RPO submissions, email, basic analytics, DPDP, Docker.
- v1.5 — communication and close WhatsApp, calendar, offers, referrals/IJP, campus drives, LLM copilot, assessment link-out.
- v2 — ecosystem Naukri/LinkedIn/Indeed publish, vendor portal, BGV, Digio/Zoho Sign, recruiter PWA, optional control plane.
First coding slice
Org + auth → jobs dashboard → job board publish/apply → parse + pipeline + HM review. That loop is already an ATS.
Same image, many instances
flowchart TB
subgraph image [loom Docker image]
Web[Next.js + tRPC]
Worker[BullMQ workers]
end
subgraph rpoInst [RPO instance]
RpoPg[(Postgres)]
RpoRedis[(Redis)]
end
subgraph clientInst [Isolated client]
IsoPg[(Postgres)]
IsoRedis[(Redis)]
end
image --> rpoInst
image --> clientInst
Each instance owns database, Redis, object storage, branding, email, WhatsApp, and OAuth apps. A control plane that provisions instances is not v1.
Tenancy rules
- Almost every business row has organization_id.
- single mode seeds exactly one organization and never shows a switcher.
- rpo mode: users see only companies they belong to, unless instance admin.
- Candidates in RPO are people at instance scope; applications are per job.
- No data crosses instances.
Core data model
| Entity | Notes |
|---|---|
| organizations | Client companies. One row in single mode. |
| users | Auth identity. |
| memberships | user × org × role (recruiter, hm, employee, admin). |
| jobs | Requisition. organization_id, status, confidential, pipeline_id. |
| job_approvals | Chain of approve/reject. |
| job_postings | Job-board publication: slug, visibility, apply schema, published_at. |
| pipelines / stages | Template per org or per job. |
| people | Talent-pool person (parsed CV, CTC, notice, locations). |
| applications | person × job, current stage, source. |
| submissions | RPO: application sent to client HMs. |
| files | Resume versions, offer PDFs, joining docs. |
| messages | Email/WhatsApp thread items. |
| interviews | Time, panel, scorecards. |
| offers | Comp, approvals, accept/decline, joining date. |
| audit_events | Who did what, including cross-company reuse in RPO. |
| consents | DPDP purpose, captured at apply or parse. |
One deploy for board and ATS
| Layer | Choice | Why |
|---|---|---|
| App | Next.js App Router + TypeScript | Public job board needs SEO; recruiter app is authenticated. One deploy. |
| API | tRPC | End-to-end types; matches meridien. |
| DB | Postgres, one database per instance | Isolation you asked for. |
| ORM | Drizzle | Migrations we control. |
| Auth | Better Auth | Self-hosted, org-friendly. |
| UI | Tailwind + Radix primitives | Custom visual language — not a generic purple dashboard. |
| Tables | TanStack Table + virtualizer | Campus dumps of thousands of CVs. |
| Recruiter speed | CmdK command palette | High-volume RPO. |
| Queue | Redis + BullMQ | Parse, email, WhatsApp, ranking, PDFs. |
| Files | S3-compatible (R2 / AWS / MinIO) | Resumes and offer letters. |
| SES or Resend per instance | Transactional templates. | |
| Meta Cloud API (Gupshup fallback) | India-first messaging. | |
| Parse / rank | LLM → structured JSON + Postgres FTS | Affinda later if parse quality lags. |
| Calendar | Google + Microsoft OAuth | Self-serve slots in-app. |
| E-sign v1 | Accept link + uploaded signed PDF | Digio / Zoho Sign later. |
| Observability | Sentry + structured logs | Per-instance DSN. |
| Package manager | pnpm | Same as other woven repos. |
Explicit non-choices
| Avoid | Reason |
|---|---|
| Mongo as source of truth | Hiring data is relational (job → application → interview → offer). |
| Prisma | Fine, but Drizzle is already in the Woven muscle memory. |
| Clerk / Auth0 as the only auth | Painful for many isolated instances and client SSO later. |
| Shared-schema multi-tenancy in one DB | Separate DBs per isolated client. RPO many-companies is inside one of those DBs. |
| Building a test-proctoring product | Integrate assessment vendors. |
| Kubernetes control plane on day one | Compose / one VM per instance until instance count hurts. |
India-first data, not India-only code: CTC, notice period, serving notice, work mode are first-class columns.