mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-10-03 10:13:47 +10:00
* feat(ats): add ATS checker and replace resume analysis Adds a public, browser-only ATS checker at /ats-checker and an ATS Check section in the builder's right sidebar. PDFs are parsed locally: text extraction, reading order, contact and date recovery, section detection, and file-level readability are scored deterministically, with evidence cited per finding and skipped checks reported rather than counted as passes. Removes the AI-scored resume analysis it supersedes: the resume_analysis table (dropped via migration), the get_resume_analysis MCP tool, and POST /ai/analyze-resume. The replacement, POST /ai/ats-review, reviews extracted resume text and returns qualitative feedback with no score. Also bumps the version to 5.2.9 and adds the changelog entry. * chore(deps): bump workspace dependencies * fix(ats-checker): keep negation inside each 'what this does not do' bullet The three bullets were bare fragments whose negation came from the section heading, which translators never see. A dozen locales rendered them as affirmative assertions or imperatives, so the page claimed the checker enforces a one-page rule and predicts rejection -- the opposite of the source, and directly contradicted by the sentence beside it. Each bullet now carries its own negation, so the polarity cannot be lost in translation. Re-extracted and refilled across all 53 target locales.
79 lines
1.9 KiB
TypeScript
79 lines
1.9 KiB
TypeScript
import { env } from "@reactive-resume/env/server";
|
|
|
|
const DOCS_URL = "https://docs.rxresu.me";
|
|
|
|
type StaticSeoOptions = {
|
|
head?: boolean;
|
|
};
|
|
|
|
function appUrl() {
|
|
return env.APP_URL.replace(/\/+$/, "");
|
|
}
|
|
|
|
function textResponse(body: string, options: StaticSeoOptions = {}) {
|
|
return new Response(options.head ? null : body, {
|
|
headers: { "Content-Type": "text/plain; charset=UTF-8" },
|
|
});
|
|
}
|
|
|
|
export function handleRobots(options?: StaticSeoOptions) {
|
|
const baseUrl = appUrl();
|
|
const body = [
|
|
"User-agent: *",
|
|
"Allow: /",
|
|
"Disallow: /api/rpc",
|
|
"Disallow: /api/auth",
|
|
"Disallow: /mcp",
|
|
"Disallow: /.well-known",
|
|
"",
|
|
`Sitemap: ${baseUrl}/sitemap.xml`,
|
|
`Sitemap: ${DOCS_URL}/sitemap.xml`,
|
|
"",
|
|
].join("\n");
|
|
|
|
return textResponse(body, options);
|
|
}
|
|
|
|
export function handleSitemap(options?: StaticSeoOptions) {
|
|
const baseUrl = appUrl();
|
|
const body = [
|
|
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
|
|
" <url>",
|
|
` <loc>${baseUrl}/</loc>`,
|
|
" </url>",
|
|
" <url>",
|
|
` <loc>${baseUrl}/ats-checker</loc>`,
|
|
" </url>",
|
|
"</urlset>",
|
|
"",
|
|
].join("\n");
|
|
|
|
return new Response(options?.head ? null : body, {
|
|
headers: { "Content-Type": "application/xml; charset=UTF-8" },
|
|
});
|
|
}
|
|
|
|
export function handleLlms(options?: StaticSeoOptions) {
|
|
const baseUrl = appUrl();
|
|
const body = [
|
|
"# Reactive Resume",
|
|
"",
|
|
"Reactive Resume is an open-source resume builder for creating, managing, and exporting resumes.",
|
|
"",
|
|
"## Links",
|
|
"",
|
|
`- Product: ${baseUrl}`,
|
|
`- Documentation: ${DOCS_URL}`,
|
|
`- Documentation sitemap: ${DOCS_URL}/sitemap.xml`,
|
|
`- Documentation llms.txt: ${DOCS_URL}/llms.txt`,
|
|
`- API documentation: ${DOCS_URL}/api-reference`,
|
|
`- Resume schema: ${baseUrl}/schema.json`,
|
|
`- MCP documentation: ${DOCS_URL}/guides/using-the-mcp-server`,
|
|
`- OpenAPI specification: ${baseUrl}/api/openapi/spec.json`,
|
|
"",
|
|
].join("\n");
|
|
|
|
return textResponse(body, options);
|
|
}
|