Changes
Build and Push Docker Images / build (push) Successful in 16s

This commit is contained in:
2026-05-12 11:22:34 +03:00
parent 6fceeb4481
commit be1dec7171
3 changed files with 25 additions and 25 deletions
+4 -4
View File
@@ -60,7 +60,7 @@
<div class="hero-copy"> <div class="hero-copy">
<span class="eyebrow" data-i18n="cv.eyebrow">AI CV Matcher</span> <span class="eyebrow" data-i18n="cv.eyebrow">AI CV Matcher</span>
<h1 data-i18n="cv.title">Upload your CV, add a job link, and see how well they match.</h1> <h1 data-i18n="cv.title">Upload your CV, add a job link, and see how well they match.</h1>
<p class="hero-text" data-i18n="cv.text">The backend should extract text from the PDF, create RAG context from your CV, retrieve relevant experience for the job, then score strengths, gaps and next actions.</p> <p class="hero-text" data-i18n="cv.text">We read your CV, find the parts most relevant to the job, then produce a match score with strengths, gaps and suggested next steps.</p>
<div class="hero-actions"> <div class="hero-actions">
<a class="btn btn-primary" href="#matcher" data-i18n="cv.try">Try matcher</a> <a class="btn btn-primary" href="#matcher" data-i18n="cv.try">Try matcher</a>
<a class="btn btn-secondary" href="/" data-i18n="cv.back">Back to navigator</a> <a class="btn btn-secondary" href="/" data-i18n="cv.back">Back to navigator</a>
@@ -94,7 +94,7 @@
<h2 data-i18n="cv.details">CV and job details</h2> <h2 data-i18n="cv.details">CV and job details</h2>
<label class="file-drop" for="cvFile"> <label class="file-drop" for="cvFile">
<strong data-i18n="cv.upload">Upload CV PDF</strong> <strong data-i18n="cv.upload">Upload CV PDF</strong>
<span id="cvFileName" data-i18n="cv.fileHint">PDF only, max size handled by backend</span> <span id="cvFileName" data-i18n="cv.fileHint">PDF only.</span>
<input type="file" id="cvFile" accept="application/pdf" required /> <input type="file" id="cvFile" accept="application/pdf" required />
</label> </label>
<small class="field-error" id="cvFileError"></small> <small class="field-error" id="cvFileError"></small>
@@ -104,7 +104,7 @@
</label> </label>
<label> <label>
<span data-i18n="cv.jobDescription">Or paste job description</span> <span data-i18n="cv.jobDescription">Or paste job description</span>
<textarea id="jobDescription" rows="8" data-i18n-placeholder="cv.jobPlaceholder" placeholder="Paste the job description if the page cannot be crawled."></textarea> <textarea id="jobDescription" rows="8" data-i18n-placeholder="cv.jobPlaceholder" placeholder="Paste the job description if the page can't be read automatically."></textarea>
<small class="field-error" id="cvJobError"></small> <small class="field-error" id="cvJobError"></small>
</label> </label>
<label> <label>
@@ -131,7 +131,7 @@
<div> <div>
<span class="eyebrow" data-i18n="nav.contact">Contact</span> <span class="eyebrow" data-i18n="nav.contact">Contact</span>
<h2 data-i18n="cv.contactTitle">Want this adapted for your workflow?</h2> <h2 data-i18n="cv.contactTitle">Want this adapted for your workflow?</h2>
<p data-i18n="cv.contactText">This form uses the existing template contact API endpoint.</p> <p data-i18n="cv.contactText">Send a quick note and we'll get back to you.</p>
<div class="contact-list"> <div class="contact-list">
<div> <div>
<span data-i18n="contact.person">Contact person</span> <span data-i18n="contact.person">Contact person</span>
+2 -2
View File
@@ -97,7 +97,7 @@
<a class="demo-card active" href="/cv-matcher/"> <a class="demo-card active" href="/cv-matcher/">
<span class="product-tag" data-i18n="tag.available">Available</span> <span class="product-tag" data-i18n="tag.available">Available</span>
<h3 data-i18n="demo.cv.title">CV Matcher</h3> <h3 data-i18n="demo.cv.title">CV Matcher</h3>
<p data-i18n="demo.cv.text">Upload a CV PDF, provide a job link or description, extract RAG context and generate a match score with strengths and gaps.</p> <p data-i18n="demo.cv.text">Upload a CV PDF, add a job link or description, and get a match score with strengths and gaps.</p>
<strong data-i18n="demo.open">Open demo →</strong> <strong data-i18n="demo.open">Open demo →</strong>
</a> </a>
<article class="demo-card muted-card"> <article class="demo-card muted-card">
@@ -118,7 +118,7 @@
<div> <div>
<span class="eyebrow" data-i18n="nav.contact">Contact</span> <span class="eyebrow" data-i18n="nav.contact">Contact</span>
<h2 data-i18n="contact.title">Discuss an AI integration or custom software project</h2> <h2 data-i18n="contact.title">Discuss an AI integration or custom software project</h2>
<p data-i18n="contact.text">Use the form and it will submit through the existing contact API endpoint from the template.</p> <p data-i18n="contact.text">Fill in the form and we'll get back to you.</p>
<div class="contact-list"> <div class="contact-list">
<div> <div>
<span data-i18n="contact.person">Contact person</span> <span data-i18n="contact.person">Contact person</span>
+19 -19
View File
@@ -27,14 +27,14 @@
"tag.available": "Available", "tag.available": "Available",
"tag.next": "Next", "tag.next": "Next",
"demo.cv.title": "CV Matcher", "demo.cv.title": "CV Matcher",
"demo.cv.text": "Upload a CV PDF, provide a job link or description, extract RAG context and generate a match score with strengths and gaps.", "demo.cv.text": "Upload a CV PDF, add a job link or description, and get a match score with strengths and gaps.",
"demo.open": "Open demo →", "demo.open": "Open demo →",
"demo.rag.title": "RAG Playground", "demo.rag.title": "RAG Playground",
"demo.rag.text": "Experiment with chunk size, retrieval count and source context transparency.", "demo.rag.text": "Experiment with chunk size, retrieval count and source context transparency.",
"demo.agent.title": "Agent Automation", "demo.agent.title": "Agent Automation",
"demo.agent.text": "Job discovery, filtering, ranking and notification workflows.", "demo.agent.text": "Job discovery, filtering, ranking and notification workflows.",
"contact.title": "Discuss an AI integration or custom software project", "contact.title": "Discuss an AI integration or custom software project",
"contact.text": "Fill in the form fields and will contact you.", "contact.text": "Fill in the form and we'll get back to you.",
"contact.person": "Contact person", "contact.person": "Contact person",
"contact.phone": "Phone", "contact.phone": "Phone",
"form.name": "Name", "form.name": "Name",
@@ -76,7 +76,7 @@
"cv.brand": "CV Matcher", "cv.brand": "CV Matcher",
"cv.eyebrow": "AI CV Matcher", "cv.eyebrow": "AI CV Matcher",
"cv.title": "Upload your CV, add a job link, and see how well they match.", "cv.title": "Upload your CV, add a job link, and see how well they match.",
"cv.text": "The backend should extract text from the PDF, create RAG context from your CV, retrieve relevant experience for the job, then score strengths, gaps and next actions.", "cv.text": "We read your CV, find the parts most relevant to the job, then produce a match score with strengths, gaps and suggested next steps.",
"cv.try": "Try matcher", "cv.try": "Try matcher",
"cv.back": "Back to navigator", "cv.back": "Back to navigator",
"cv.step1": "PDF text extraction", "cv.step1": "PDF text extraction",
@@ -86,17 +86,17 @@
"cv.input": "Input", "cv.input": "Input",
"cv.details": "CV and job details", "cv.details": "CV and job details",
"cv.upload": "Upload CV PDF", "cv.upload": "Upload CV PDF",
"cv.fileHint": "PDF only, max size handled by backend", "cv.fileHint": "PDF only.",
"cv.jobLink": "Job link", "cv.jobLink": "Job link",
"cv.jobDescription": "Or paste job description", "cv.jobDescription": "Or paste job description",
"cv.jobPlaceholder": "Paste the job description if the page cannot be crawled.", "cv.jobPlaceholder": "Paste the job description if the page can't be read automatically.",
"cv.gdpr": "I agree that my CV is processed and stored.", "cv.gdpr": "I agree that my CV is processed and stored.",
"cv.submit": "Extract CV and match job", "cv.submit": "Extract CV and match job",
"cv.result": "Result", "cv.result": "Result",
"cv.analysis": "Match analysis", "cv.analysis": "Match analysis",
"cv.empty": "Upload a CV and provide a job link or description to generate a result.", "cv.empty": "Upload a CV and provide a job link or description to generate a result.",
"cv.contactTitle": "Want this adapted for your workflow?", "cv.contactTitle": "Want this adapted for your workflow?",
"cv.contactText": "This form uses the existing template contact API endpoint.", "cv.contactText": "Send a quick note and we'll get back to you.",
"cv.noFile": "Please upload a CV PDF.", "cv.noFile": "Please upload a CV PDF.",
"cv.noJob": "Add a job link or paste a job description.", "cv.noJob": "Add a job link or paste a job description.",
"cv.noConsent": "GDPR consent is required.", "cv.noConsent": "GDPR consent is required.",
@@ -110,11 +110,11 @@
"cv.backendMissing": "There was an error while processing the CV.", "cv.backendMissing": "There was an error while processing the CV.",
"cv.loaderTitle": "Working on your CV", "cv.loaderTitle": "Working on your CV",
"cv.loaderText": "Extracting text, retrieving context and scoring the match. This can take a moment.", "cv.loaderText": "Extracting text, retrieving context and scoring the match. This can take a moment.",
"cv.noSummary": "No summary returned.", "cv.noSummary": "No summary available.",
"cv.noItems": "No items returned.", "cv.noItems": "No items yet.",
"cv.strengths": "Strengths", "cv.strengths": "Strengths",
"cv.gaps": "Gaps", "cv.gaps": "Gaps",
"cv.evidence": "Retrieved CV evidence" "cv.evidence": "Supporting CV excerpts"
}, },
ro: { ro: {
"brand.subtitle": "prezentare inginerie AI", "brand.subtitle": "prezentare inginerie AI",
@@ -136,12 +136,12 @@
"tag.available": "Disponibil", "tag.available": "Disponibil",
"tag.next": "Urmează", "tag.next": "Urmează",
"demo.cv.title": "CV Matcher", "demo.cv.title": "CV Matcher",
"demo.cv.text": "Încarcă un CV PDF, adaugă un link sau o descriere de job, extrage context RAG și generează un scor de potrivire cu puncte forte și lipsuri.", "demo.cv.text": "Încarcă un CV PDF, adaugă un link sau o descriere de job și primește un scor de potrivire cu puncte forte și lipsuri.",
"demo.open": "Deschide demo →", "demo.open": "Deschide demo →",
"demo.rag.title": "RAG Playground", "demo.rag.title": "RAG Playground",
"demo.rag.text": "Experimentează cu dimensiunea chunk-urilor, numărul de rezultate și transparența surselor.", "demo.rag.text": "Experimentează cu dimensiunea chunk-urilor, numărul de rezultate și transparența surselor.",
"demo.agent.title": "Automatizare cu agenți", "demo.agent.title": "Automatizare cu agenți",
"demo.agent.text": "Fluxuri pentru descoperire joburi, filtrare, ranking și notificări.", "demo.agent.text": "Fluxuri pentru descoperire joburi, filtrare, ordonare și notificări.",
"contact.title": "Discută o integrare AI sau un proiect software custom", "contact.title": "Discută o integrare AI sau un proiect software custom",
"contact.text": "Completează formularul și te vom contacta.", "contact.text": "Completează formularul și te vom contacta.",
"contact.person": "Persoană de contact", "contact.person": "Persoană de contact",
@@ -185,7 +185,7 @@
"cv.brand": "CV Matcher", "cv.brand": "CV Matcher",
"cv.eyebrow": "AI CV Matcher", "cv.eyebrow": "AI CV Matcher",
"cv.title": "Încarcă CV-ul, adaugă un link de job și vezi cât de bine se potrivesc.", "cv.title": "Încarcă CV-ul, adaugă un link de job și vezi cât de bine se potrivesc.",
"cv.text": "Backend-ul ar trebui să extragă textul din PDF, să creeze context RAG din CV, să recupereze experiența relevantă pentru job, apoi să calculeze punctele forte, lipsurile și pașii următori.", "cv.text": "Îți citim CV-ul, găsim părțile cele mai relevante pentru job și calculăm un scor de potrivire cu puncte forte, lipsuri și pași următori sugerați.",
"cv.try": "Încearcă matcherul", "cv.try": "Încearcă matcherul",
"cv.back": "Înapoi la navigator", "cv.back": "Înapoi la navigator",
"cv.step1": "Extragere text PDF", "cv.step1": "Extragere text PDF",
@@ -195,7 +195,7 @@
"cv.input": "Date de intrare", "cv.input": "Date de intrare",
"cv.details": "CV și detalii job", "cv.details": "CV și detalii job",
"cv.upload": "Încarcă CV PDF", "cv.upload": "Încarcă CV PDF",
"cv.fileHint": "Doar PDF, limita de mărime este gestionată de backend", "cv.fileHint": "Doar PDF.",
"cv.jobLink": "Link job", "cv.jobLink": "Link job",
"cv.jobDescription": "Sau lipește descrierea jobului", "cv.jobDescription": "Sau lipește descrierea jobului",
"cv.jobPlaceholder": "Lipește descrierea jobului dacă pagina nu poate fi citită automat.", "cv.jobPlaceholder": "Lipește descrierea jobului dacă pagina nu poate fi citită automat.",
@@ -204,8 +204,8 @@
"cv.result": "Rezultat", "cv.result": "Rezultat",
"cv.analysis": "Analiză potrivire", "cv.analysis": "Analiză potrivire",
"cv.empty": "Încarcă un CV și adaugă un link sau o descriere de job pentru a genera rezultatul.", "cv.empty": "Încarcă un CV și adaugă un link sau o descriere de job pentru a genera rezultatul.",
"cv.contactTitle": "Vrei să adaptezi asta pentru workflow-ul tău?", "cv.contactTitle": "Vrei o variantă adaptată fluxului tău de lucru?",
"cv.contactText": "Formularul folosește endpoint-ul existent de contact din template.", "cv.contactText": "Lasă-ne un mesaj și revenim cu detalii.",
"cv.noFile": "Te rog încarcă un CV PDF.", "cv.noFile": "Te rog încarcă un CV PDF.",
"cv.noJob": "Adaugă un link de job sau lipește descrierea jobului.", "cv.noJob": "Adaugă un link de job sau lipește descrierea jobului.",
"cv.noConsent": "Consimțământul GDPR este obligatoriu.", "cv.noConsent": "Consimțământul GDPR este obligatoriu.",
@@ -213,17 +213,17 @@
"cv.extracting": "Se extrage CV-ul și se compară jobul...", "cv.extracting": "Se extrage CV-ul și se compară jobul...",
"cv.processingLong": "Se procesează PDF-ul și informațiile despre job.", "cv.processingLong": "Se procesează PDF-ul și informațiile despre job.",
"cv.cvFailed": "Extragerea CV-ului a eșuat", "cv.cvFailed": "Extragerea CV-ului a eșuat",
"cv.matchFailed": "Matching-ul jobului a eșuat", "cv.matchFailed": "Potrivirea jobului a eșuat",
"cv.rateLimited": "Prea multe cereri către CV matcher din rețeaua ta. Te rugăm să încerci din nou peste câteva minute.", "cv.rateLimited": "Prea multe cereri către CV matcher din rețeaua ta. Te rugăm să încerci din nou peste câteva minute.",
"cv.completed": "Matching finalizat.", "cv.completed": "Matching finalizat.",
"cv.backendMissing": "A apărut o eroare la procesarea CV-ului.", "cv.backendMissing": "A apărut o eroare la procesarea CV-ului.",
"cv.loaderTitle": "Procesăm CV-ul tău", "cv.loaderTitle": "Procesăm CV-ul tău",
"cv.loaderText": "Extragem textul, recuperăm contextul și calculăm scorul potrivirii. Poate dura câteva momente.", "cv.loaderText": "Extragem textul, recuperăm contextul și calculăm scorul potrivirii. Poate dura câteva momente.",
"cv.noSummary": "Nu a fost returnat niciun sumar.", "cv.noSummary": "Niciun sumar disponibil.",
"cv.noItems": "Nu au fost returnate elemente.", "cv.noItems": "Niciun element.",
"cv.strengths": "Puncte forte", "cv.strengths": "Puncte forte",
"cv.gaps": "Lipsuri", "cv.gaps": "Lipsuri",
"cv.evidence": "Dovezi recuperate din CV" "cv.evidence": "Fragmente relevante din CV"
} }
}; };