[{"data":1,"prerenderedAt":1751},["ShallowReactive",2],{"catalog-items":3},[4,43,212,272,356,375,465,564,583,629,677,732,775,794,836,855,905,957,1010,1071,1090,1144,1252,1316,1335,1416,1486,1559,1578,1643,1705],{"id":5,"title":6,"body":7,"competitors":34,"complexity":34,"description":35,"extension":36,"meta":37,"navigation":38,"path":39,"priority":34,"seo":40,"status":34,"stem":41,"__hash__":42},"catalog/catalog/ai-intelligence/index.md","AI & Intelligence",{"type":8,"value":9,"toc":30},"minimark",[10,19],[11,12,13,14,18],"p",{},"Reqcore's AI features follow the ",[15,16,17],"strong",{},"Glass Box"," principle: every AI decision must be explainable and auditable. When the system ranks a candidate, it shows you exactly which skills matched, why the score was assigned, and what data drove the recommendation.",[11,20,21,22,29],{},"This is not just a design preference — the ",[23,24,28],"a",{"href":25,"rel":26},"https://artificialintelligenceact.eu/",[27],"nofollow","EU AI Act"," classifies employment decisions as high-risk AI, meaning opaque ranking algorithms create real legal liability. Reqcore eliminates that risk by making AI reasoning fully visible.",{"title":31,"searchDepth":32,"depth":32,"links":33},"",2,[],null,"Transparent AI that helps recruiters find the best candidates — and shows its reasoning. Privacy-first, with local AI support via Ollama.","md",{},true,"/catalog/ai-intelligence",{"title":6,"description":35},"catalog/ai-intelligence/index","hb9KBkotmgnRa-drEjlTV2y4geiBk_HX2hQAyCeBV_8",{"id":44,"title":45,"body":46,"competitors":199,"complexity":203,"description":204,"extension":36,"meta":205,"navigation":38,"path":206,"priority":207,"seo":208,"status":209,"stem":210,"__hash__":211},"catalog/catalog/ai-intelligence/ai-ranking/index.md","AI Candidate Ranking (Glass Box)",{"type":8,"value":47,"toc":193},[48,54,59,66,70,104,108,186,190],[11,49,50,51,53],{},"AI-powered candidate ranking that matches job requirements against candidate skills — and shows its reasoning for every score. This is the ",[15,52,17],{}," principle: no black-box algorithms making decisions about people.",[55,56,58],"h2",{"id":57},"what-it-solves","What it solves",[11,60,61,62,65],{},"Recruiters reviewing 200+ applications for a single role need help identifying the best candidates quickly. AI ranking can do this — but only if the recruiter can trust the results. Today's commercial ATS platforms rank candidates with proprietary algorithms that provide no explanation. Reqcore gives you the score ",[15,63,64],{},"and"," the proof.",[55,67,69],{"id":68},"planned-implementation","Planned implementation",[71,72,73,80,86,92,98],"ol",{},[74,75,76,79],"li",{},[15,77,78],{},"Ranking criteria schema"," — Configurable per-job criteria that define what \"good\" looks like (required skills, experience years, education, certifications)",[74,81,82,85],{},[15,83,84],{},"AI matching engine"," — Compare job requirements against parsed candidate data, producing a match score",[74,87,88,91],{},[15,89,90],{},"Matching Logic summary"," — A visible, per-candidate explanation showing which criteria matched, which didn't, and why",[74,93,94,97],{},[15,95,96],{},"Highlighted skill matches"," — Visual indicators on pipeline cards showing matched vs. missing skills",[74,99,100,103],{},[15,101,102],{},"Sort and filter by AI score"," — Rank the pipeline by match quality with one click",[55,105,107],{"id":106},"glass-box-vs-black-box","Glass Box vs. Black Box",[109,110,111,127],"table",{},[112,113,114],"thead",{},[115,116,117,121,124],"tr",{},[118,119,120],"th",{},"Aspect",[118,122,123],{},"Glass Box (Reqcore)",[118,125,126],{},"Black Box (Incumbents)",[128,129,130,142,153,164,175],"tbody",{},[115,131,132,136,139],{},[133,134,135],"td",{},"Score visible",[133,137,138],{},"✅ Always",[133,140,141],{},"✅ Usually",[115,143,144,147,150],{},[133,145,146],{},"Reasoning shown",[133,148,149],{},"✅ Per-criterion breakdown",[133,151,152],{},"❌ \"AI confidence score\"",[115,154,155,158,161],{},[133,156,157],{},"Criteria editable",[133,159,160],{},"✅ Per-job configuration",[133,162,163],{},"❌ Fixed algorithm",[115,165,166,169,172],{},[133,167,168],{},"Bias auditable",[133,170,171],{},"✅ Full logic exposed",[133,173,174],{},"❌ Trust the vendor",[115,176,177,180,183],{},[133,178,179],{},"EU AI Act compliant",[133,181,182],{},"✅ By design",[133,184,185],{},"⚠️ Unclear",[55,187,189],{"id":188},"design-notes","Design notes",[11,191,192],{},"The matching logic summary will appear in the candidate detail sidebar, directly below the candidate's parsed resume data. Each criterion shows a green/yellow/red indicator with a one-line explanation (e.g., \"5+ years Python — candidate has 7 years\").",{"title":31,"searchDepth":32,"depth":32,"links":194},[195,196,197,198],{"id":57,"depth":32,"text":58},{"id":68,"depth":32,"text":69},{"id":106,"depth":32,"text":107},{"id":188,"depth":32,"text":189},{"greenhouse":200,"lever":200,"ashby":201,"workable":200,"opencats":202},"okay","good","poor","XL","AI-powered candidate ranking that matches job requirements against candidate skills — and shows its reasoning for every score. This is the Glass Box principle: no black-box algorithms making decisions about people.",{},"/catalog/ai-intelligence/ai-ranking","high",{"title":45,"description":204},"planned","catalog/ai-intelligence/ai-ranking/index","G46LsCjjfDCzIV3fPQw7KNcexBVSZU1ULppjENt-BKw",{"id":213,"title":214,"body":215,"competitors":263,"complexity":264,"description":265,"extension":36,"meta":266,"navigation":38,"path":267,"priority":268,"seo":269,"status":209,"stem":270,"__hash__":271},"catalog/catalog/ai-intelligence/local-ai/index.md","Local AI via Ollama",{"type":8,"value":216,"toc":258},[217,226,228,231,233,251,255],[11,218,219,220,225],{},"Run AI models locally using ",[23,221,224],{"href":222,"rel":223},"https://ollama.ai",[27],"Ollama"," so candidate data never leaves your network. No cloud API keys, no data sharing, no usage fees.",[55,227,58],{"id":57},[11,229,230],{},"Every cloud-based AI service (OpenAI, Anthropic, Google) requires sending candidate PII to external servers. For companies in regulated industries (healthcare, finance, government) or privacy-conscious organizations, this is a non-starter. Local AI via Ollama keeps everything on your infrastructure.",[55,232,69],{"id":68},[234,235,236,239,242,245,248],"ul",{},[74,237,238],{},"Ollama as a Docker Compose service alongside the existing stack",[74,240,241],{},"Model selection configurable (e.g., Llama 3, Mistral) via environment variables",[74,243,244],{},"Used for resume parsing and candidate ranking",[74,246,247],{},"Fallback to cloud APIs for users who prefer speed over privacy",[74,249,250],{},"No usage-based fees — run as many inferences as your hardware supports",[55,252,254],{"id":253},"why-this-is-unique","Why this is unique",[11,256,257],{},"No commercial ATS offers local AI inference. This is a genuine differentiator for Reqcore — the only ATS where sensitive candidate data can be processed by AI without ever touching a third-party server.",{"title":31,"searchDepth":32,"depth":32,"links":259},[260,261,262],{"id":57,"depth":32,"text":58},{"id":68,"depth":32,"text":69},{"id":253,"depth":32,"text":254},{"greenhouse":202,"lever":202,"ashby":202,"workable":202,"opencats":202},"L","Run AI models locally using Ollama so candidate data never leaves your network. No cloud API keys, no data sharing, no usage fees.",{},"/catalog/ai-intelligence/local-ai","medium",{"title":214,"description":265},"catalog/ai-intelligence/local-ai/index","-4nIIh_HB1J1TP_YKAHzpj9jPhpkEVm_pwTFI0HFhj4",{"id":273,"title":274,"body":275,"competitors":348,"complexity":203,"description":279,"extension":36,"meta":350,"navigation":38,"path":351,"priority":207,"seo":352,"status":353,"stem":354,"__hash__":355},"catalog/catalog/ai-intelligence/resume-parsing/index.md","Resume Parsing",{"type":8,"value":276,"toc":342},[277,280,282,285,287,324,328,335,339],[11,278,279],{},"Automatically extract structured data from uploaded PDF resumes — contact information, work experience, education, and skills — and store it as queryable JSON.",[55,281,58],{"id":57},[11,283,284],{},"Manually entering candidate data from resumes is the single biggest time sink for recruiters. A mid-size company processing 200 applications per role spends hours copy-pasting names, emails, job titles, and skills into their ATS. Resume parsing eliminates that manual step entirely.",[55,286,69],{"id":68},[71,288,289,295,301,312,318],{},[74,290,291,294],{},[15,292,293],{},"PDF text extraction"," — Convert uploaded PDF resumes to plain text using a server-side extraction service",[74,296,297,300],{},[15,298,299],{},"Structured data extraction"," — Parse the raw text into a structured JSON schema: contact info, work experience (company, title, dates), education (institution, degree, dates), and skills",[74,302,303,306,307,311],{},[15,304,305],{},"Storage"," — Write parsed output to a ",[308,309,310],"code",{},"parsedContent"," field on the document record",[74,313,314,317],{},[15,315,316],{},"Display"," — Render the parsed resume as a structured card on the candidate detail page, replacing the need to open the PDF",[74,319,320,323],{},[15,321,322],{},"Auto-fill"," — Optionally pre-fill candidate profile fields from parsed data (name, email, phone, location)",[55,325,327],{"id":326},"why-not-use-a-third-party-api","Why not use a third-party API?",[11,329,330,331,334],{},"Most resume parsing services (Sovren, Affinda, etc.) require sending candidate PII to external servers. Reqcore's approach keeps parsing on your own infrastructure. The planned Ollama integration (see ",[23,332,333],{"href":267},"Local AI",") will enable fully private, offline resume parsing.",[55,336,338],{"id":337},"current-status","Current status",[11,340,341],{},"This is the active development focus (Phase 2, Milestone 9). PDF text extraction is in progress.",{"title":31,"searchDepth":32,"depth":32,"links":343},[344,345,346,347],{"id":57,"depth":32,"text":58},{"id":68,"depth":32,"text":69},{"id":326,"depth":32,"text":327},{"id":337,"depth":32,"text":338},{"greenhouse":349,"lever":349,"ashby":349,"workable":201,"opencats":202},"excellent",{},"/catalog/ai-intelligence/resume-parsing",{"title":274,"description":279},"in-progress","catalog/ai-intelligence/resume-parsing/index","PZGwPszbsA9XLfz3fcGIYcLUVrB2apMUgpIWLKSaams",{"id":357,"title":358,"body":359,"competitors":34,"complexity":34,"description":369,"extension":36,"meta":370,"navigation":38,"path":371,"priority":34,"seo":372,"status":34,"stem":373,"__hash__":374},"catalog/catalog/applicant-management/index.md","Applicant Management",{"type":8,"value":360,"toc":367},[361,364],[11,362,363],{},"Applicant Management features give recruiters everything they need to communicate with candidates and manage their journey through the hiring funnel — without leaving Reqcore.",[11,365,366],{},"These features are designed to centralise all candidate-facing interactions inside the platform, creating a full audit trail and eliminating the need to switch between email clients, phones, and the ATS.",{"title":31,"searchDepth":32,"depth":32,"links":368},[],"Tools for communicating with and managing applicants throughout the hiring process — email, phone, SMS, and more.",{},"/catalog/applicant-management",{"title":358,"description":369},"catalog/applicant-management/index","ew88K7zy8a30OoxHXg2JUPhGXx1fzSEDKZl9cpVhsm4",{"id":376,"title":377,"body":378,"competitors":459,"complexity":264,"description":382,"extension":36,"meta":460,"navigation":38,"path":461,"priority":207,"seo":462,"status":209,"stem":463,"__hash__":464},"catalog/catalog/applicant-management/email-communication/index.md","Applicant Email Communication",{"type":8,"value":379,"toc":453},[380,383,385,388,392,437,439,446,450],[11,381,382],{},"Send and receive emails with applicants directly from the ATS — creating a complete, searchable email history attached to every candidate profile.",[55,384,58],{"id":57},[11,386,387],{},"Without in-app email, recruiters switch between their email client and the ATS constantly. Replies get lost, threads get fragmented, and there's no audit trail of what was said to whom. Centralising email inside Reqcore means every message is automatically linked to the right applicant record.",[55,389,391],{"id":390},"planned-scope","Planned scope",[234,393,394,397,400,403,406,422,425,428,431,434],{},[74,395,396],{},"Send and receive emails to/from applicants from the candidate or application detail page",[74,398,399],{},"Bring-your-own-SMTP configuration (Gmail, Outlook, Resend, Postmark, or any SMTP provider)",[74,401,402],{},"Inbound email parsing via a dedicated reply-to address so replies thread back to the correct applicant record automatically",[74,404,405],{},"Pre-built email templates for common touchpoints (application received, interview invitation, rejection, offer)",[74,407,408,409,412,413,412,416,412,419],{},"Template variables for personalisation: ",[308,410,411],{},"{{candidate_name}}",", ",[308,414,415],{},"{{job_title}}",[308,417,418],{},"{{company_name}}",[308,420,421],{},"{{interview_date}}",[74,423,424],{},"Full email thread view on the candidate timeline",[74,426,427],{},"Bulk email for stage-level outreach (e.g., send rejection emails to all declined applicants in one click)",[74,429,430],{},"Notification to recruiter when an applicant replies",[74,432,433],{},"Role-based access: restrict who can initiate outreach",[74,435,436],{},"GDPR-aligned: candidates can request deletion of email records",[55,438,189],{"id":188},[11,440,441,442,445],{},"Email uses a bring-your-own-SMTP approach to keep infrastructure costs at zero and give self-hosters full control over deliverability. Inbound replies are parsed using a dedicated subdomain mailbox (e.g., ",[308,443,444],{},"reply+\u003Ctoken>@yourdomain.com","), similar to how Basecamp and Linear handle email threading.",[55,447,449],{"id":448},"why-this-matters-for-self-hosters","Why this matters for self-hosters",[11,451,452],{},"Self-hosted ATS users often resist cloud tools precisely because candidate data — including private communications — leaves their infrastructure. By routing all email through the self-hosted instance, Reqcore lets teams maintain full data sovereignty without sacrificing recruiter efficiency.",{"title":31,"searchDepth":32,"depth":32,"links":454},[455,456,457,458],{"id":57,"depth":32,"text":58},{"id":390,"depth":32,"text":391},{"id":188,"depth":32,"text":189},{"id":448,"depth":32,"text":449},{"greenhouse":349,"lever":349,"ashby":349,"workable":201,"opencats":202},{},"/catalog/applicant-management/email-communication",{"title":377,"description":382},"catalog/applicant-management/email-communication/index","slA6Bwb98-l3RdXlFeuW7evfQGKhlNwdFPwKvsdQUk0",{"id":466,"title":467,"body":468,"competitors":557,"complexity":264,"description":472,"extension":36,"meta":558,"navigation":38,"path":559,"priority":268,"seo":560,"status":561,"stem":562,"__hash__":563},"catalog/catalog/applicant-management/phone-communication/index.md","Applicant Phone & SMS Communication",{"type":8,"value":469,"toc":547},[470,473,475,478,480,485,503,507,524,528,539,541],[11,471,472],{},"Log calls, send SMS messages, and track phone-based interactions with applicants — all from within the ATS.",[55,474,58],{"id":57},[11,476,477],{},"Phone calls and text messages are a primary channel for candidate outreach, especially for time-sensitive roles. Without a log, those conversations are invisible to the rest of the hiring team. Storing call notes and SMS history alongside the application creates a complete picture of every candidate touchpoint.",[55,479,391],{"id":390},[481,482,484],"h3",{"id":483},"click-to-call","Click-to-call",[234,486,487,490,497,500],{},[74,488,489],{},"Store applicant phone numbers with country code support",[74,491,492,493,496],{},"Click-to-call via ",[308,494,495],{},"tel:"," links for desktop and mobile browsers",[74,498,499],{},"Manual call logging: recruiter records outcome, duration, and notes after each call",[74,501,502],{},"Call log displayed on the candidate timeline",[481,504,506],{"id":505},"in-app-calling-sms-via-twilio","In-app calling & SMS (via Twilio)",[234,508,509,512,515,518,521],{},[74,510,511],{},"Optional Twilio integration for in-app calling without leaving the browser",[74,513,514],{},"Automatic call duration tracking and recording (where legally permitted)",[74,516,517],{},"Outbound SMS using customisable templates (interview reminders, shortlisting updates)",[74,519,520],{},"Inbound SMS replies linked back to the candidate record",[74,522,523],{},"Opt-out handling for SMS in compliance with local regulations",[481,525,527],{"id":526},"shared","Shared",[234,529,530,533,536],{},[74,531,532],{},"Unified communication timeline: calls, SMS, emails, and notes in chronological order",[74,534,535],{},"Role-based access: restrict who can initiate calls or send SMS",[74,537,538],{},"GDPR-aligned: candidates can request deletion of call logs and SMS records",[55,540,189],{"id":188},[11,542,543,544,546],{},"Phone and SMS features will be opt-in via a Twilio integration. Teams without Twilio use click-to-call (",[308,545,495],{}," links) and log calls manually — no degraded experience, just fewer automations. This keeps the base product free of third-party telephony dependencies while still supporting power users who want full in-app communication.",{"title":31,"searchDepth":32,"depth":32,"links":548},[549,550,556],{"id":57,"depth":32,"text":58},{"id":390,"depth":32,"text":391,"children":551},[552,554,555],{"id":483,"depth":553,"text":484},3,{"id":505,"depth":553,"text":506},{"id":526,"depth":553,"text":527},{"id":188,"depth":32,"text":189},{"greenhouse":201,"lever":201,"ashby":349,"workable":201,"opencats":202},{},"/catalog/applicant-management/phone-communication",{"title":467,"description":472},"considering","catalog/applicant-management/phone-communication/index","9MznbE_pKkfVBY6Lp7wdyjqG_pWQa2vqMkFeFawuBEg",{"id":565,"title":566,"body":567,"competitors":34,"complexity":34,"description":577,"extension":36,"meta":578,"navigation":38,"path":579,"priority":34,"seo":580,"status":34,"stem":581,"__hash__":582},"catalog/catalog/collaboration/index.md","Collaboration",{"type":8,"value":568,"toc":575},[569,572],[11,570,571],{},"Hiring is a team sport. Collaboration features let recruiters, hiring managers, and interviewers share context, leave notes, schedule interviews, and communicate with candidates — all from within Reqcore.",[11,573,574],{},"These features are planned for Phase 3 of the roadmap, after the AI intelligence layer is in place.",{"title":31,"searchDepth":32,"depth":32,"links":576},[],"Tools for hiring teams to work together — comments, activity logs, scheduling, and candidate communication.",{},"/catalog/collaboration",{"title":566,"description":577},"catalog/collaboration/index","KadzfwaTuifvGTgEiMxJtkjBblbcrQ4PCNH7yU9DZyM",{"id":584,"title":585,"body":586,"competitors":622,"complexity":264,"description":590,"extension":36,"meta":623,"navigation":38,"path":624,"priority":625,"seo":626,"status":561,"stem":627,"__hash__":628},"catalog/catalog/collaboration/candidate-portal/index.md","Candidate Portal",{"type":8,"value":587,"toc":617},[588,591,593,596,598,612,614],[11,589,590],{},"A self-service portal where candidates can check their application status, update their information, and upload additional documents.",[55,592,58],{"id":57},[11,594,595],{},"Candidates currently have no way to check on their application after submitting. This generates \"status check\" emails that recruiters have to manually respond to. A candidate portal eliminates this overhead while improving the candidate experience.",[55,597,391],{"id":390},[234,599,600,603,606,609],{},[74,601,602],{},"View application status per job (which stage they're in)",[74,604,605],{},"Update contact information",[74,607,608],{},"Upload additional documents (updated resume, portfolio)",[74,610,611],{},"No access to internal notes, scores, or pipeline data",[55,613,189],{"id":188},[11,615,616],{},"The portal would use a magic link authentication flow — candidates receive an email with a secure link, no password required. This keeps the experience frictionless and avoids managing another set of credentials.",{"title":31,"searchDepth":32,"depth":32,"links":618},[619,620,621],{"id":57,"depth":32,"text":58},{"id":390,"depth":32,"text":391},{"id":188,"depth":32,"text":189},{"greenhouse":201,"lever":201,"ashby":201,"workable":200,"opencats":202},{},"/catalog/collaboration/candidate-portal","low",{"title":585,"description":590},"catalog/collaboration/candidate-portal/index","aKRQvy1OAKl2vBUUVxK0IpsgRvGLHQMZWzOROvtv86U",{"id":630,"title":631,"body":632,"competitors":671,"complexity":264,"description":636,"extension":36,"meta":672,"navigation":38,"path":673,"priority":268,"seo":674,"status":561,"stem":675,"__hash__":676},"catalog/catalog/collaboration/email-notifications/index.md","Email Notifications",{"type":8,"value":633,"toc":666},[634,637,639,642,644,661,663],[11,635,636],{},"Automated email notifications for key hiring events — new applications, stage changes, interview reminders — plus email templates for candidate outreach.",[55,638,58],{"id":57},[11,640,641],{},"Without notifications, recruiters have to actively check the dashboard for updates. Email notifications ensure nothing falls through the cracks, especially for high-volume roles where dozens of applications arrive daily.",[55,643,391],{"id":390},[234,645,646,649,652,655,658],{},[74,647,648],{},"Configurable notification triggers (new application, stage change, interview scheduled)",[74,650,651],{},"Email templates for candidate communication (rejection, offer, interview confirmation)",[74,653,654],{},"Template variables for personalization (candidate name, job title, company name)",[74,656,657],{},"SMTP configuration (bring your own email provider)",[74,659,660],{},"Opt-out per notification type",[55,662,189],{"id":188},[11,664,665],{},"We'll use a bring-your-own-SMTP approach rather than building an email service. This keeps infrastructure costs at zero and gives users full control over their email deliverability.",{"title":31,"searchDepth":32,"depth":32,"links":667},[668,669,670],{"id":57,"depth":32,"text":58},{"id":390,"depth":32,"text":391},{"id":188,"depth":32,"text":189},{"greenhouse":349,"lever":349,"ashby":349,"workable":201,"opencats":202},{},"/catalog/collaboration/email-notifications",{"title":631,"description":636},"catalog/collaboration/email-notifications/index","cgvhfFTiZlNEoUldhQuGuFs50n3oiLeZvjSWn2lj83g",{"id":678,"title":679,"body":680,"competitors":726,"complexity":203,"description":684,"extension":36,"meta":727,"navigation":38,"path":728,"priority":268,"seo":729,"status":561,"stem":730,"__hash__":731},"catalog/catalog/collaboration/interview-scheduling/index.md","Interview Scheduling",{"type":8,"value":681,"toc":721},[682,685,687,690,694,698,718],[11,683,684],{},"Schedule interviews with candidates, send calendar invites, and track interview outcomes — all from within the ATS.",[55,686,58],{"id":57},[11,688,689],{},"Interview scheduling is one of the most tedious parts of recruiting. Coordinators spend hours going back and forth between candidates and interviewers to find available slots. An integrated scheduler reduces this to a few clicks.",[55,691,693],{"id":692},"considerationsthis-is-a-complex-feature-with-many-edge-cases-timezone-handling-calendar-sync-rescheduling-panel-interviews-were-evaluating-whether-to-build-a-lightweight-version-in-house-or-integrate-with-existing-scheduling-tools-calendly-calcom-via-api","Considerationsthis is a complex feature with many edge cases (timezone handling, calendar sync, rescheduling, panel interviews). We're evaluating whether to build a lightweight version in-house or integrate with existing scheduling tools (Calendly, Cal.com) via API.",[55,695,697],{"id":696},"potential-approaches","Potential approaches",[71,699,700,706,712],{},[74,701,702,705],{},[15,703,704],{},"Built-in scheduler"," — Full calendar integration with availability management. High effort, maximum control.",[74,707,708,711],{},[15,709,710],{},"Cal.com integration"," — Open-source scheduling tool that aligns with Reqcore's self-hosted philosophy. Medium effort.",[74,713,714,717],{},[15,715,716],{},"Calendar link field"," — Simply add a Calendly/Cal.com link to the interview stage. Low effort, minimal feature.",[11,719,720],{},"We're leaning toward option 2 (Cal.com integration) for the best balance of capability and development effort.",{"title":31,"searchDepth":32,"depth":32,"links":722},[723,724,725],{"id":57,"depth":32,"text":58},{"id":692,"depth":32,"text":693},{"id":696,"depth":32,"text":697},{"greenhouse":349,"lever":201,"ashby":349,"workable":201,"opencats":202},{},"/catalog/collaboration/interview-scheduling",{"title":679,"description":684},"catalog/collaboration/interview-scheduling/index","-lCLCMKEXI8RrHjS5Fd79fKw7nF3SmrqszsmkDctf7M",{"id":733,"title":734,"body":735,"competitors":768,"complexity":769,"description":739,"extension":36,"meta":770,"navigation":38,"path":771,"priority":207,"seo":772,"status":209,"stem":773,"__hash__":774},"catalog/catalog/collaboration/team-comments/index.md","Team Comments & Notes",{"type":8,"value":736,"toc":764},[737,740,742,745,747],[11,738,739],{},"Threaded comments on applications and candidates so hiring team members can share observations, flag concerns, and make collaborative decisions.",[55,741,58],{"id":57},[11,743,744],{},"Without structured comments, feedback lives in Slack threads, email chains, and sticky notes. This makes it impossible to audit hiring decisions or understand why a candidate was rejected six months later. Threaded comments attached directly to the application create a permanent, searchable record.",[55,746,69],{"id":68},[234,748,749,752,755,758,761],{},[74,750,751],{},"Threaded comments on application detail pages",[74,753,754],{},"@mention team members for notifications",[74,756,757],{},"Activity log per candidate showing all status changes, comments, and document uploads",[74,759,760],{},"Role-based visibility (some comments visible to all, others restricted to hiring managers)",[74,762,763],{},"Markdown formatting support in comments",{"title":31,"searchDepth":32,"depth":32,"links":765},[766,767],{"id":57,"depth":32,"text":58},{"id":68,"depth":32,"text":69},{"greenhouse":349,"lever":349,"ashby":349,"workable":201,"opencats":202},"M",{},"/catalog/collaboration/team-comments",{"title":734,"description":739},"catalog/collaboration/team-comments/index","Hee51YUcew4HGE83B0awbW0zrPcW3OPjjhN3vWAijVI",{"id":776,"title":777,"body":778,"competitors":34,"complexity":34,"description":788,"extension":36,"meta":789,"navigation":38,"path":790,"priority":34,"seo":791,"status":34,"stem":792,"__hash__":793},"catalog/catalog/mobile-support/index.md","Mobile Support",{"type":8,"value":779,"toc":786},[780,783],[11,781,782],{},"Mobile support ensures the core hiring workflow works well on phones and tablets, not just desktop screens. Recruiters can quickly review candidates, move applications through stages, and stay responsive when they are away from their primary workstation.",[11,784,785],{},"This category focuses on responsive UX and practical in-the-field hiring operations.",{"title":31,"searchDepth":32,"depth":32,"links":787},[],"Mobile-friendly workflows for recruiters and hiring managers who need to review pipelines and candidates on the go.",{},"/catalog/mobile-support",{"title":777,"description":788},"catalog/mobile-support/index","S2-YVE0qpVcZi8e5GnJj7fzokx7nVBIuEqhIgBo_m64",{"id":795,"title":796,"body":797,"competitors":830,"complexity":769,"description":801,"extension":36,"meta":831,"navigation":38,"path":832,"priority":268,"seo":833,"status":209,"stem":834,"__hash__":835},"catalog/catalog/mobile-support/responsive-dashboard/index.md","Responsive Dashboard & Pipeline Views",{"type":8,"value":798,"toc":826},[799,802,804,807,809],[11,800,801],{},"Use Reqcore comfortably on mobile devices with layouts optimized for smaller screens and touch interactions.",[55,803,58],{"id":57},[11,805,806],{},"Recruiters and hiring managers often need quick updates while commuting, between interviews, or during standups. Desktop-only layouts make this painful, causing missed updates and delayed hiring decisions.",[55,808,69],{"id":68},[234,810,811,814,817,820,823],{},[74,812,813],{},"Responsive dashboard cards and tables with mobile-first breakpoints",[74,815,816],{},"Touch-friendly pipeline stage controls for faster status updates",[74,818,819],{},"Condensed candidate and application views for quick triage",[74,821,822],{},"Sticky action bar for common actions (move stage, open profile, add note)",[74,824,825],{},"Performance optimizations for lower-powered devices and slower mobile networks",{"title":31,"searchDepth":32,"depth":32,"links":827},[828,829],{"id":57,"depth":32,"text":58},{"id":68,"depth":32,"text":69},{"greenhouse":201,"lever":201,"ashby":200,"workable":201,"opencats":202},{},"/catalog/mobile-support/responsive-dashboard",{"title":796,"description":801},"catalog/mobile-support/responsive-dashboard/index","uj3r-5b8pYRfu5WaRzLgbdBVX08O_VzYwmboCFSrwNQ",{"id":837,"title":838,"body":839,"competitors":34,"complexity":34,"description":849,"extension":36,"meta":850,"navigation":38,"path":851,"priority":34,"seo":852,"status":34,"stem":853,"__hash__":854},"catalog/catalog/pipeline-management/index.md","Pipeline Management",{"type":8,"value":840,"toc":847},[841,844],[11,842,843],{},"Pipeline Management is the core of any ATS. Reqcore gives you a visual, drag-and-drop Kanban board for every job, status-based workflows with enforced transitions, and a unified applications view across all jobs.",[11,845,846],{},"Unlike legacy systems that bury candidates in spreadsheets, Reqcore's pipeline is designed for recruiters who need to answer \"what do I do next?\" within three seconds.",{"title":31,"searchDepth":32,"depth":32,"links":848},[],"End-to-end hiring pipeline — from job creation to offer acceptance. Track every candidate through customizable stages with full visibility.",{},"/catalog/pipeline-management",{"title":838,"description":849},"catalog/pipeline-management/index","RmOKFM-h_W5Y17oVZjBzLIcIDf77LcMCwxBqMHfz0b0",{"id":856,"title":857,"body":858,"competitors":898,"complexity":769,"description":862,"extension":36,"meta":899,"navigation":38,"path":900,"priority":207,"seo":901,"status":902,"stem":903,"__hash__":904},"catalog/catalog/pipeline-management/application-tracking/index.md","Application Tracking",{"type":8,"value":859,"toc":894},[860,863,867,887,891],[11,861,862],{},"Track every application across all jobs in a single, filterable list view. Each application links a candidate to a job with a status, notes, score, and custom question responses.",[55,864,866],{"id":865},"what-it-does","What it does",[234,868,869,872,875,878,881,884],{},[74,870,871],{},"Unified applications list across all jobs, filterable by status, job, and candidate",[74,873,874],{},"Application detail page with candidate info, job context, status history, and question responses",[74,876,877],{},"Notes field for recruiter annotations",[74,879,880],{},"Score field for manual or AI-generated ratings",[74,882,883],{},"Unique constraint: one application per candidate per job (no duplicates)",[74,885,886],{},"Status workflow enforced with Zod validation",[55,888,890],{"id":889},"why-it-matters","Why it matters",[11,892,893],{},"Applications are the transactional core of an ATS. Every action a recruiter takes — screening, interviewing, making an offer — is recorded as an application status change. Having a unified view across all jobs means recruiters managing multiple positions can see everything in one place.",{"title":31,"searchDepth":32,"depth":32,"links":895},[896,897],{"id":865,"depth":32,"text":866},{"id":889,"depth":32,"text":890},{"greenhouse":349,"lever":349,"ashby":349,"workable":201,"opencats":200},{},"/catalog/pipeline-management/application-tracking",{"title":857,"description":862},"shipped","catalog/pipeline-management/application-tracking/index","O3ronXm3Z-DRqWkcDTUAkz52lV-C6mWiWvNTA_Sle3k",{"id":906,"title":907,"body":908,"competitors":951,"complexity":769,"description":912,"extension":36,"meta":952,"navigation":38,"path":953,"priority":207,"seo":954,"status":902,"stem":955,"__hash__":956},"catalog/catalog/pipeline-management/candidate-profiles/index.md","Candidate Profiles",{"type":8,"value":909,"toc":946},[910,913,915,932,934,937,939],[11,911,912],{},"Every candidate gets a dedicated profile page with their contact information, application history across all jobs, uploaded documents, and any custom question responses they've submitted.",[55,914,866],{"id":865},[234,916,917,920,923,926,929],{},[74,918,919],{},"Org-scoped candidate pool with automatic deduplication by email address",[74,921,922],{},"Candidate detail page with tabbed sections: info, applications, documents",[74,924,925],{},"Link candidates to multiple jobs simultaneously",[74,927,928],{},"Full search and filtering across the candidate pool",[74,930,931],{},"Inline PDF resume preview directly on the candidate page",[55,933,890],{"id":889},[11,935,936],{},"A candidate should exist once in your system regardless of how many jobs they apply to. Email-based deduplication ensures you never create duplicate records, and the unified profile gives recruiters a complete picture of every interaction with a candidate across all positions.",[55,938,189],{"id":188},[11,940,941,942,945],{},"The candidate detail sidebar (",[308,943,944],{},"CandidateDetailSidebar.vue",") slides over the pipeline view, letting recruiters review candidate details without navigating away from the Kanban board. This pattern is inspired by Supabase's data table rows.",{"title":31,"searchDepth":32,"depth":32,"links":947},[948,949,950],{"id":865,"depth":32,"text":866},{"id":889,"depth":32,"text":890},{"id":188,"depth":32,"text":189},{"greenhouse":349,"lever":201,"ashby":349,"workable":201,"opencats":202},{},"/catalog/pipeline-management/candidate-profiles",{"title":907,"description":912},"catalog/pipeline-management/candidate-profiles/index","bBjDSqqc2Jv8SxouyaFD67BEk5otArMBwE7SIDR1hec",{"id":958,"title":959,"body":960,"competitors":1003,"complexity":769,"description":1004,"extension":36,"meta":1005,"navigation":38,"path":1006,"priority":207,"seo":1007,"status":902,"stem":1008,"__hash__":1009},"catalog/catalog/pipeline-management/job-management/index.md","Job Management",{"type":8,"value":961,"toc":998},[962,969,971,988,990,993,995],[11,963,964,965,968],{},"Full CRUD for jobs with a structured status workflow: ",[15,966,967],{},"Draft → Open → Closed → Archived",". Each status transition is enforced — you can't accidentally publish a draft or reopen an archived position.",[55,970,866],{"id":865},[234,972,973,976,979,982,985],{},[74,974,975],{},"Create, edit, and delete job postings with title, description, location, employment type, and salary range",[74,977,978],{},"Status workflow with validated transitions (e.g., draft → open, but not draft → archived directly)",[74,980,981],{},"Custom URL slugs for public job pages, auto-generated from the title with a short UUID suffix",[74,983,984],{},"Organization-scoped — each org sees only its own jobs",[74,986,987],{},"Real-time job counts on the dashboard",[55,989,890],{"id":889},[11,991,992],{},"Job management is table stakes for an ATS, but most open-source alternatives get it wrong by either making it too simple (no status workflow) or too complex (enterprise-grade approval chains nobody uses). Reqcore lands in the middle — structured enough to prevent mistakes, simple enough to not slow you down.",[55,994,189],{"id":188},[11,996,997],{},"The job detail page uses a tabbed layout with sub-pages for Overview, Pipeline, Candidates, and Application Form. This keeps context tight — you never leave the job to manage its pipeline or questions.",{"title":31,"searchDepth":32,"depth":32,"links":999},[1000,1001,1002],{"id":865,"depth":32,"text":866},{"id":889,"depth":32,"text":890},{"id":188,"depth":32,"text":189},{"greenhouse":349,"lever":349,"ashby":349,"workable":201,"opencats":200},"Full CRUD for jobs with a structured status workflow: Draft → Open → Closed → Archived. Each status transition is enforced — you can't accidentally publish a draft or reopen an archived position.",{},"/catalog/pipeline-management/job-management",{"title":959,"description":1004},"catalog/pipeline-management/job-management/index","oPm8AylKgVNskzRvISI6SynbsgueQYFdwv0vYxSX_JM",{"id":1011,"title":1012,"body":1013,"competitors":1064,"complexity":264,"description":1065,"extension":36,"meta":1066,"navigation":38,"path":1067,"priority":207,"seo":1068,"status":902,"stem":1069,"__hash__":1070},"catalog/catalog/pipeline-management/kanban-board/index.md","Kanban Pipeline Board",{"type":8,"value":1014,"toc":1059},[1015,1022,1024,1047,1049,1052,1056],[11,1016,1017,1018,1021],{},"A visual drag-and-drop Kanban board for each job, showing candidates organized by hiring stage: ",[15,1019,1020],{},"Applied → Screening → Interview → Offer → Hired"," (with Rejected as a terminal state).",[55,1023,866],{"id":865},[234,1025,1026,1032,1035,1038,1041,1044],{},[74,1027,1028,1029],{},"Per-job Kanban board at ",[308,1030,1031],{},"/dashboard/jobs/:id/pipeline",[74,1033,1034],{},"Drag candidates between columns to advance them through stages",[74,1036,1037],{},"Pipeline cards show candidate name, application date, and current status",[74,1039,1040],{},"Click any card to open the candidate detail sidebar without leaving the board",[74,1042,1043],{},"Color-coded status columns for quick visual scanning",[74,1045,1046],{},"Status transition validation — only allowed moves are permitted",[55,1048,890],{"id":889},[11,1050,1051],{},"The pipeline board is where recruiters spend most of their time. It needs to be fast, visual, and not require page reloads. Reqcore's implementation updates the backend on drag and immediately reflects the change in the UI, so there's zero lag between action and feedback.",[55,1053,1055],{"id":1054},"how-it-compares","How it compares",[11,1057,1058],{},"Most commercial ATS platforms have excellent Kanban boards. The gap in open-source is significant — OpenCATS has no pipeline view at all. Reqcore closes this gap with a modern implementation that matches the UX quality of Greenhouse or Lever.",{"title":31,"searchDepth":32,"depth":32,"links":1060},[1061,1062,1063],{"id":865,"depth":32,"text":866},{"id":889,"depth":32,"text":890},{"id":1054,"depth":32,"text":1055},{"greenhouse":349,"lever":349,"ashby":349,"workable":201,"opencats":202},"A visual drag-and-drop Kanban board for each job, showing candidates organized by hiring stage: Applied → Screening → Interview → Offer → Hired (with Rejected as a terminal state).",{},"/catalog/pipeline-management/kanban-board",{"title":1012,"description":1065},"catalog/pipeline-management/kanban-board/index","lQz89ae89VYwhzPY6zqBYCQcksMot0vUMEgix4QHzcs",{"id":1072,"title":1073,"body":1074,"competitors":34,"complexity":34,"description":1084,"extension":36,"meta":1085,"navigation":38,"path":1086,"priority":34,"seo":1087,"status":34,"stem":1088,"__hash__":1089},"catalog/catalog/platform/index.md","Platform & Infrastructure",{"type":8,"value":1075,"toc":1082},[1076,1079],[11,1077,1078],{},"Platform features are the invisible infrastructure that makes everything else work. Multi-tenant organizations isolate data between companies, Better Auth handles authentication with zero vendor lock-in, and the Docker Compose stack lets you deploy the entire system with a single command.",[11,1080,1081],{},"Reqcore runs on your infrastructure — whether that's a $5/month VPS, a corporate Kubernetes cluster, or Docker Desktop on your laptop.",{"title":31,"searchDepth":32,"depth":32,"links":1083},[],"The foundation layer — multi-tenant organizations, authentication, dashboard, deployment, and the tech stack that powers everything.",{},"/catalog/platform",{"title":1073,"description":1084},"catalog/platform/index","02WjV6uI09hKEuNO4h2eP5eDGM2-qWN1AT_XkJ8yTWA",{"id":1091,"title":1092,"body":1093,"competitors":1138,"complexity":769,"description":1097,"extension":36,"meta":1139,"navigation":38,"path":1140,"priority":268,"seo":1141,"status":902,"stem":1142,"__hash__":1143},"catalog/catalog/platform/dashboard/index.md","Recruiter Dashboard",{"type":8,"value":1094,"toc":1134},[1095,1098,1100,1129,1131],[11,1096,1097],{},"An at-a-glance overview showing the metrics that matter — open jobs, pipeline breakdown, recent applications, and top active positions.",[55,1099,866],{"id":865},[234,1101,1102,1105,1108,1111,1114,1117,1120,1123,1126],{},[74,1103,1104],{},"Stat cards: Open Jobs, Total Candidates, Applications, Unreviewed — all clickable, linking to filtered views",[74,1106,1107],{},"Pipeline overview widget — stacked bar visualization of candidates per stage",[74,1109,1110],{},"Jobs by status widget — counts for draft, open, closed, archived",[74,1112,1113],{},"Recent applications — last 10 with candidate name, job, status badge, and relative timestamps",[74,1115,1116],{},"Top active jobs — 5 most active open positions ranked by application count",[74,1118,1119],{},"Quick actions: \"Create Job\" and \"Add Candidate\" buttons",[74,1121,1122],{},"Welcome empty state for new organizations with CTA to create first job",[74,1124,1125],{},"Loading skeleton states for every widget",[74,1127,1128],{},"Responsive 1-column (mobile) to 4-column (desktop) layout",[55,1130,890],{"id":889},[11,1132,1133],{},"Recruiters need to answer \"what needs my attention right now?\" the moment they open the app. The dashboard surfaces the highest-priority items without requiring manual searching or filtering.",{"title":31,"searchDepth":32,"depth":32,"links":1135},[1136,1137],{"id":865,"depth":32,"text":866},{"id":889,"depth":32,"text":890},{"greenhouse":349,"lever":201,"ashby":349,"workable":201,"opencats":202},{},"/catalog/platform/dashboard",{"title":1092,"description":1097},"catalog/platform/dashboard/index","a9k88g2Ayw7-bC2w2-_lhbeWDbrupHPJQMqdSkeYsEc",{"id":1145,"title":1146,"body":1147,"competitors":1245,"complexity":769,"description":1246,"extension":36,"meta":1247,"navigation":38,"path":1248,"priority":207,"seo":1249,"status":902,"stem":1250,"__hash__":1251},"catalog/catalog/platform/deployment/index.md","One-Command Deployment",{"type":8,"value":1148,"toc":1240},[1149,1156,1158,1198,1200,1207,1211,1214],[11,1150,1151,1152,1155],{},"Deploy the entire stack — app, database, and file storage — with a single ",[308,1153,1154],{},"docker compose up"," command. No manual service configuration, no cloud dependencies.",[55,1157,866],{"id":865},[234,1159,1160,1166,1175,1178,1181,1184,1191],{},[74,1161,1162,1165],{},[308,1163,1164],{},"docker-compose.yml"," orchestrates Nuxt app, PostgreSQL 16, MinIO, and optional Adminer",[74,1167,1168,1171,1172],{},[308,1169,1170],{},"setup.sh"," generates all required secrets and writes ",[308,1173,1174],{},".env",[74,1176,1177],{},"Auto-run database migrations on startup via server plugin",[74,1179,1180],{},"Auto-create and secure MinIO bucket on startup",[74,1182,1183],{},"Multi-stage Dockerfile with optimized production builds",[74,1185,1186,1187,1190],{},"Optional ",[308,1188,1189],{},"--profile tools"," for Adminer (database browser)",[74,1192,1193,1194,1197],{},"Ports bound to ",[308,1195,1196],{},"127.0.0.1"," by default for security",[55,1199,254],{"id":253},[11,1201,1202,1203,1206],{},"Commercial ATS platforms don't offer self-hosting at all. Among open-source alternatives, most require manual PostgreSQL setup, environment variable hunting, and multiple installation steps. Reqcore's Docker Compose approach means you go from ",[308,1204,1205],{},"git clone"," to a running ATS in under 5 minutes.",[55,1208,1210],{"id":1209},"production-deployment","Production deployment",[11,1212,1213],{},"The reference production deployment uses:",[234,1215,1216,1222,1228,1234],{},[74,1217,1218,1221],{},[15,1219,1220],{},"Hetzner Cloud CX23"," — 2 vCPU, 4GB RAM (~€5/month)",[74,1223,1224,1227],{},[15,1225,1226],{},"Caddy"," — Reverse proxy with automatic HTTPS",[74,1229,1230,1233],{},[15,1231,1232],{},"Cloudflare"," — DNS and DDoS protection (free tier)",[74,1235,1236,1239],{},[15,1237,1238],{},"systemd"," — Process management with auto-restart",{"title":31,"searchDepth":32,"depth":32,"links":1241},[1242,1243,1244],{"id":865,"depth":32,"text":866},{"id":253,"depth":32,"text":254},{"id":1209,"depth":32,"text":1210},{"greenhouse":202,"lever":202,"ashby":202,"workable":202,"opencats":200},"Deploy the entire stack — app, database, and file storage — with a single docker compose up command. No manual service configuration, no cloud dependencies.",{},"/catalog/platform/deployment",{"title":1146,"description":1246},"catalog/platform/deployment/index","tHhLFyQ1ItuvHd-1-RqcXF8rtqug0U2h_3QeM0Eatyk",{"id":1253,"title":1254,"body":1255,"competitors":1310,"complexity":264,"description":1259,"extension":36,"meta":1311,"navigation":38,"path":1312,"priority":207,"seo":1313,"status":902,"stem":1314,"__hash__":1315},"catalog/catalog/platform/multi-tenant/index.md","Multi-Tenant Organizations",{"type":8,"value":1256,"toc":1305},[1257,1260,1262,1283,1285,1288,1292],[11,1258,1259],{},"Isolated data per organization with role-based membership. Every job, candidate, application, and document is scoped to an organization — no data leakage between tenants.",[55,1261,866],{"id":865},[234,1263,1264,1267,1270,1273,1280],{},[74,1265,1266],{},"Organization creation during onboarding (post-signup)",[74,1268,1269],{},"Organization switcher for users belonging to multiple orgs",[74,1271,1272],{},"All API endpoints are org-scoped — queries automatically filter by the user's active organization",[74,1274,1275,1276,1279],{},"Server-side ",[308,1277,1278],{},"requireAuth()"," utility validates both authentication and org membership",[74,1281,1282],{},"Middleware enforces org creation before accessing the dashboard",[55,1284,890],{"id":889},[11,1286,1287],{},"Multi-tenancy is critical for ATS platforms because recruiting agencies, HR consultancies, and companies with multiple divisions all need isolated data spaces. Without proper tenant isolation, you risk exposing one company's candidates to another — a GDPR nightmare.",[55,1289,1291],{"id":1290},"implementation","Implementation",[11,1293,1294,1295,1300,1301,1304],{},"Built on ",[23,1296,1299],{"href":1297,"rel":1298},"https://www.better-auth.com",[27],"Better Auth's"," organization plugin, which handles member management, role assignment, and session-scoped org context. The Drizzle ORM schema includes ",[308,1302,1303],{},"organizationId"," as a foreign key on every domain table, and all queries filter by it.",{"title":31,"searchDepth":32,"depth":32,"links":1306},[1307,1308,1309],{"id":865,"depth":32,"text":866},{"id":889,"depth":32,"text":890},{"id":1290,"depth":32,"text":1291},{"greenhouse":349,"lever":349,"ashby":349,"workable":201,"opencats":202},{},"/catalog/platform/multi-tenant",{"title":1254,"description":1259},"catalog/platform/multi-tenant/index","9X1m66_EPCTY_BCRyF8-HUj3JcrWnqWZKTN4xVhtDPw",{"id":1317,"title":1318,"body":1319,"competitors":34,"complexity":34,"description":1329,"extension":36,"meta":1330,"navigation":38,"path":1331,"priority":34,"seo":1332,"status":34,"stem":1333,"__hash__":1334},"catalog/catalog/recruitment-tools/index.md","Recruitment Tools",{"type":8,"value":1320,"toc":1327},[1321,1324],[11,1322,1323],{},"Recruitment Tools are the outward-facing surface of your ATS. They're what candidates see and interact with. Reqcore provides a public job board with SEO-optimized pages, customizable application forms with nine field types, and secure document management backed by S3-compatible storage.",[11,1325,1326],{},"Every tool is designed to work without requiring candidates to create an account — reducing friction and increasing application completion rates.",{"title":31,"searchDepth":32,"depth":32,"links":1328},[],"Public-facing pages and tools that connect your hiring pipeline to the outside world — job boards, application forms, and document management.",{},"/catalog/recruitment-tools",{"title":1318,"description":1329},"catalog/recruitment-tools/index","D8wMBmja4fK57B_qcrTnZ9bWHXhF1kG_B8o7FxY_eUg",{"id":1336,"title":1337,"body":1338,"competitors":1410,"complexity":264,"description":1342,"extension":36,"meta":1411,"navigation":38,"path":1412,"priority":207,"seo":1413,"status":902,"stem":1414,"__hash__":1415},"catalog/catalog/recruitment-tools/custom-application-forms/index.md","Custom Application Forms",{"type":8,"value":1339,"toc":1401},[1340,1343,1345,1371,1373,1376,1380,1384,1387,1391,1394,1398],[11,1341,1342],{},"Add custom questions to any job's application form. Supports nine field types including text, select dropdowns, file upload, and more. Questions are reorderable and rendered dynamically on the public apply page.",[55,1344,866],{"id":865},[234,1346,1347,1350,1353,1356,1362,1365,1368],{},[74,1348,1349],{},"Per-job custom questions with CRUD API",[74,1351,1352],{},"Nine question types: short text, long text, email, phone, URL, number, date, select, and file upload",[74,1354,1355],{},"Drag-to-reorder questions with bulk reorder API",[74,1357,1358,1359],{},"Questions rendered dynamically on the public application form via ",[308,1360,1361],{},"DynamicField.vue",[74,1363,1364],{},"Responses stored per application and visible in the application detail and candidate sidebar",[74,1366,1367],{},"Required/optional toggle per question",[74,1369,1370],{},"File upload questions support resume and cover letter attachments with magic byte MIME validation",[55,1372,890],{"id":889},[11,1374,1375],{},"Every job has different requirements. A software engineering role needs a GitHub profile link; a sales role needs territory preferences. Custom forms let recruiters tailor the application experience per job without developer involvement. The file upload type is particularly important — it lets you collect resumes, portfolios, or work samples directly through the form.",[55,1377,1379],{"id":1378},"sub-features","Sub-features",[481,1381,1383],{"id":1382},"question-types","Question Types",[11,1385,1386],{},"Nine built-in types covering the most common recruitment form needs. Each type validates input appropriately (e.g., email validation, URL format checking).",[481,1388,1390],{"id":1389},"reorderable-questions","Reorderable Questions",[11,1392,1393],{},"Questions can be drag-reordered in the dashboard. The order is respected on the public form, so recruiters control the candidate's experience.",[481,1395,1397],{"id":1396},"file-upload-validation","File Upload Validation",[11,1399,1400],{},"Uploaded files go through magic byte MIME type validation (not just file extension checking) to prevent malicious file uploads. Files are stored securely in MinIO with server-proxied access.",{"title":31,"searchDepth":32,"depth":32,"links":1402},[1403,1404,1405],{"id":865,"depth":32,"text":866},{"id":889,"depth":32,"text":890},{"id":1378,"depth":32,"text":1379,"children":1406},[1407,1408,1409],{"id":1382,"depth":553,"text":1383},{"id":1389,"depth":553,"text":1390},{"id":1396,"depth":553,"text":1397},{"greenhouse":349,"lever":201,"ashby":349,"workable":201,"opencats":202},{},"/catalog/recruitment-tools/custom-application-forms",{"title":1337,"description":1342},"catalog/recruitment-tools/custom-application-forms/index","snQ0xqh9ixRgpnFW_FBb2Co-Yy6igqavU94-ltnRKJ4",{"id":1417,"title":1418,"body":1419,"competitors":1480,"complexity":769,"description":1423,"extension":36,"meta":1481,"navigation":38,"path":1482,"priority":207,"seo":1483,"status":902,"stem":1484,"__hash__":1485},"catalog/catalog/recruitment-tools/document-storage/index.md","Document Storage",{"type":8,"value":1420,"toc":1475},[1421,1424,1426,1455,1457,1460,1464],[11,1422,1423],{},"Upload and manage candidate documents (resumes, cover letters, portfolios) via S3-compatible object storage. All document access is server-proxied — no presigned URLs are ever exposed to the client.",[55,1425,866],{"id":865},[234,1427,1428,1431,1434,1437,1440,1443,1446,1449],{},[74,1429,1430],{},"Upload documents to candidates via the dashboard or public application form",[74,1432,1433],{},"Download and inline PDF preview (server-proxied streaming)",[74,1435,1436],{},"Delete documents (removes from both MinIO and database)",[74,1438,1439],{},"MinIO (S3-compatible) as the storage backend — runs locally in Docker",[74,1441,1442],{},"Private bucket policy enforced on startup",[74,1444,1445],{},"Filename sanitization for all uploads",[74,1447,1448],{},"Per-candidate document limit (20) on public submissions",[74,1450,1451,1454],{},[308,1452,1453],{},"storageKey"," filtered from all API responses (internal path never exposed)",[55,1456,890],{"id":889},[11,1458,1459],{},"Resumes are the most sensitive data in an ATS. Unlike cloud platforms where your candidate documents live on someone else's servers, Reqcore stores them in your own MinIO instance. The server-proxy pattern means the client never gets a direct URL to the storage backend — all access goes through authenticated API routes.",[55,1461,1463],{"id":1462},"security-model","Security model",[11,1465,1466,1467,1470,1471,1474],{},"Documents are stored in a private MinIO bucket. The Nitro server streams files to authenticated users via ",[308,1468,1469],{},"GET /api/documents/:id/download"," and ",[308,1472,1473],{},"GET /api/documents/:id/preview",". The S3 storage key is stripped from all API responses, so clients never learn the internal path. This is a deliberate trade-off: slightly more server load in exchange for zero risk of URL leakage.",{"title":31,"searchDepth":32,"depth":32,"links":1476},[1477,1478,1479],{"id":865,"depth":32,"text":866},{"id":889,"depth":32,"text":890},{"id":1462,"depth":32,"text":1463},{"greenhouse":349,"lever":349,"ashby":349,"workable":201,"opencats":200},{},"/catalog/recruitment-tools/document-storage",{"title":1418,"description":1423},"catalog/recruitment-tools/document-storage/index","VO8_5FOnmWEoTLQILybKGogX3ZWkcSl1bmErqFT3vZ0",{"id":1487,"title":1488,"body":1489,"competitors":1553,"complexity":264,"description":1493,"extension":36,"meta":1554,"navigation":38,"path":1555,"priority":207,"seo":1556,"status":902,"stem":1557,"__hash__":1558},"catalog/catalog/recruitment-tools/public-job-board/index.md","Public Job Board",{"type":8,"value":1490,"toc":1548},[1491,1494,1496,1531,1533,1539,1541],[11,1492,1493],{},"A SEO-friendly public job listing page where candidates can browse open positions and apply — no authentication required.",[55,1495,866],{"id":865},[234,1497,1498,1505,1512,1515,1518,1521,1528],{},[74,1499,1500,1501,1504],{},"Public job listing page at ",[308,1502,1503],{},"/jobs"," showing all open positions across all organizations",[74,1506,1507,1508,1511],{},"Individual job detail pages with SEO-friendly slug-based URLs (e.g., ",[308,1509,1510],{},"/jobs/senior-engineer-a1b2c3d4",")",[74,1513,1514],{},"Custom slug support — recruiters can set their own URL slug",[74,1516,1517],{},"Job details rendered with full markdown description support",[74,1519,1520],{},"\"Apply Now\" button linking to the application form",[74,1522,1523,1524,1527],{},"JSON-LD ",[308,1525,1526],{},"JobPosting"," structured data for Google Jobs integration",[74,1529,1530],{},"Salary range, location, remote status, and employment type displayed when available",[55,1532,890],{"id":889},[11,1534,1535,1536,1538],{},"A job board that ranks on Google means candidates find you organically — no job board fees. Reqcore generates proper ",[308,1537,1526],{}," schema markup so your listings can appear directly in Google's job search results, which is free distribution most self-hosted ATS platforms don't offer.",[55,1540,189],{"id":188},[11,1542,1543,1544,1547],{},"Pages are ISR-cached with a 1-hour TTL (",[308,1545,1546],{},"isr: 3600",") so they serve instantly while staying reasonably fresh. The public API intentionally exposes only the fields candidates need — no internal notes, scores, or pipeline data leak.",{"title":31,"searchDepth":32,"depth":32,"links":1549},[1550,1551,1552],{"id":865,"depth":32,"text":866},{"id":889,"depth":32,"text":890},{"id":188,"depth":32,"text":189},{"greenhouse":349,"lever":349,"ashby":349,"workable":349,"opencats":202},{},"/catalog/recruitment-tools/public-job-board",{"title":1488,"description":1493},"catalog/recruitment-tools/public-job-board/index","0PgmflKNXwn9gY1EqCfYuRA2Butnn2RX-gy2EX2CBLY",{"id":1560,"title":1561,"body":1562,"competitors":34,"complexity":34,"description":1572,"extension":36,"meta":1573,"navigation":38,"path":1574,"priority":34,"seo":1575,"status":34,"stem":1576,"__hash__":1577},"catalog/catalog/security-compliance/index.md","Security & Compliance",{"type":8,"value":1563,"toc":1570},[1564,1567],[11,1565,1566],{},"Security in an ATS isn't optional — you're handling people's personal data, resumes, and employment history. Reqcore ships with production-ready security defaults: API rate limiting, comprehensive security headers, server-proxied document access, and input validation on every endpoint.",[11,1568,1569],{},"Every security feature is on by default. You don't have to remember to enable it.",{"title":31,"searchDepth":32,"depth":32,"links":1571},[],"Enterprise-grade security defaults — rate limiting, security headers, server-proxied documents, and data privacy controls.",{},"/catalog/security-compliance",{"title":1561,"description":1572},"catalog/security-compliance/index","TGEnDRWIWSVbfUTiAJG_oLxskWkQW1VrUVQ3QuJ0VJs",{"id":1579,"title":1580,"body":1581,"competitors":1637,"complexity":264,"description":1585,"extension":36,"meta":1638,"navigation":38,"path":1639,"priority":268,"seo":1640,"status":209,"stem":1641,"__hash__":1642},"catalog/catalog/security-compliance/gdpr/index.md","GDPR Data Management",{"type":8,"value":1582,"toc":1632},[1583,1586,1588,1591,1593,1625,1629],[11,1584,1585],{},"Complete GDPR compliance toolkit — data export, right-to-deletion, consent tracking, and data retention policies.",[55,1587,58],{"id":57},[11,1589,1590],{},"Under GDPR, candidates have the right to request a copy of all their data and the right to be forgotten. Most ATS platforms handle this with support tickets. Reqcore will automate it — one click to export, one click to delete.",[55,1592,69],{"id":68},[234,1594,1595,1601,1607,1613,1619],{},[74,1596,1597,1600],{},[15,1598,1599],{},"Data export"," — Generate a JSON/CSV bundle of all data associated with a candidate (profile, applications, documents, question responses)",[74,1602,1603,1606],{},[15,1604,1605],{},"Right to deletion"," — Remove all candidate data across all organizations, including S3 documents",[74,1608,1609,1612],{},[15,1610,1611],{},"Consent tracking"," — Record when and how consent was given for data processing",[74,1614,1615,1618],{},[15,1616,1617],{},"Data retention policies"," — Auto-archive or delete candidate data after configurable time periods",[74,1620,1621,1624],{},[15,1622,1623],{},"Audit log"," — Track who accessed, modified, or deleted candidate data",[55,1626,1628],{"id":1627},"why-self-hosting-helps","Why self-hosting helps",[11,1630,1631],{},"With a self-hosted ATS, GDPR compliance is simpler because you control the entire data path. There are no sub-processors to audit, no third-party data sharing agreements to manage, and deletion means actual deletion — not a \"flag as deleted\" in a vendor's database.",{"title":31,"searchDepth":32,"depth":32,"links":1633},[1634,1635,1636],{"id":57,"depth":32,"text":58},{"id":68,"depth":32,"text":69},{"id":1627,"depth":32,"text":1628},{"greenhouse":201,"lever":201,"ashby":201,"workable":200,"opencats":202},{},"/catalog/security-compliance/gdpr",{"title":1580,"description":1585},"catalog/security-compliance/gdpr/index","0OUkjgVkwupj1lKHOQJZCX79gZpckYT0lcuyUl0O_eM",{"id":1644,"title":1645,"body":1646,"competitors":1697,"complexity":1698,"description":1699,"extension":36,"meta":1700,"navigation":38,"path":1701,"priority":207,"seo":1702,"status":902,"stem":1703,"__hash__":1704},"catalog/catalog/security-compliance/rate-limiting/index.md","API Rate Limiting",{"type":8,"value":1647,"toc":1693},[1648,1655,1657,1688,1690],[11,1649,1650,1651,1654],{},"Global per-IP rate limiting on all ",[308,1652,1653],{},"/api"," endpoints with stricter thresholds for authentication and write operations.",[55,1656,866],{"id":865},[234,1658,1659,1665,1668,1671,1674,1685],{},[74,1660,1661,1662,1511],{},"In-memory sliding window rate limiter (",[308,1663,1664],{},"server/utils/rateLimit.ts",[74,1666,1667],{},"Applied globally via server middleware to all API routes",[74,1669,1670],{},"Stricter limits on authentication endpoints (prevent brute force)",[74,1672,1673],{},"Stricter limits on public application submission (prevent spam)",[74,1675,1676,1677,1680,1681,1684],{},"Returns ",[308,1678,1679],{},"429 Too Many Requests"," with ",[308,1682,1683],{},"Retry-After"," header when exceeded",[74,1686,1687],{},"Per-user rate limiting on feedback submission",[55,1689,890],{"id":889},[11,1691,1692],{},"Without rate limiting, a single bad actor can spam your public application endpoint with thousands of fake applications, or brute-force login credentials. Rate limiting is the first line of defense — it doesn't replace authentication, but it prevents abuse at scale.",{"title":31,"searchDepth":32,"depth":32,"links":1694},[1695,1696],{"id":865,"depth":32,"text":866},{"id":889,"depth":32,"text":890},{"greenhouse":201,"lever":201,"ashby":201,"workable":201,"opencats":202},"S","Global per-IP rate limiting on all /api endpoints with stricter thresholds for authentication and write operations.",{},"/catalog/security-compliance/rate-limiting",{"title":1645,"description":1699},"catalog/security-compliance/rate-limiting/index","BkPHZSVeRrANJV0ikK8_arGkhKbsghmam30-Hov1vq0",{"id":1706,"title":1707,"body":1708,"competitors":1745,"complexity":769,"description":1712,"extension":36,"meta":1746,"navigation":38,"path":1747,"priority":207,"seo":1748,"status":902,"stem":1749,"__hash__":1750},"catalog/catalog/security-compliance/server-proxied-documents/index.md","Server-Proxied Documents",{"type":8,"value":1709,"toc":1741},[1710,1713,1715,1736,1738],[11,1711,1712],{},"All document access (resumes, cover letters, uploads) is streamed through the Nitro server. No presigned URLs, no direct S3 access from the client.",[55,1714,866],{"id":865},[234,1716,1717,1724,1727,1730,1733],{},[74,1718,1719,1720,1470,1722],{},"Documents served via ",[308,1721,1469],{},[308,1723,1473],{},[74,1725,1726],{},"Server validates authentication and org membership before streaming",[74,1728,1729],{},"S3 storage keys are stripped from all API responses",[74,1731,1732],{},"PDF inline preview uses same-origin iframe with restrictive CSP headers",[74,1734,1735],{},"Private bucket policy prevents anonymous access even if URLs leak",[55,1737,890],{"id":889},[11,1739,1740],{},"Presigned URLs are the standard approach for serving S3 objects, but they have a fundamental flaw: anyone with the URL can access the file until it expires. For candidate resumes containing personal addresses, phone numbers, and employment history, this is unacceptable. Server-proxied access means every file request goes through authentication — no shortcuts, no leaked URLs.",{"title":31,"searchDepth":32,"depth":32,"links":1742},[1743,1744],{"id":865,"depth":32,"text":866},{"id":889,"depth":32,"text":890},{"greenhouse":201,"lever":201,"ashby":201,"workable":200,"opencats":202},{},"/catalog/security-compliance/server-proxied-documents",{"title":1707,"description":1712},"catalog/security-compliance/server-proxied-documents/index","s5G8usqy7Dn7IFeWL5msiswsPS5NJCrSWkIXWYSb12g",1789704108459]