because I got bored of customising my CV for every job
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

wip(CVG-15): capabilities endpoint and new templates

+220
+14
apps/server/src/modules/cv-template/seed/cv-template.seed.ts
··· 39 39 ...readTemplate("creative-portfolio"), 40 40 engine: "handlebars", 41 41 }, 42 + { 43 + name: "Minimal Clean", 44 + description: 45 + "Ultra-clean, whitespace-heavy Swiss design for tech and design roles", 46 + ...readTemplate("minimal-clean"), 47 + engine: "handlebars", 48 + }, 49 + { 50 + name: "Technical Resume", 51 + description: 52 + "Dense two-column layout with skills sidebar for developers", 53 + ...readTemplate("technical-resume"), 54 + engine: "handlebars", 55 + }, 42 56 ]; 43 57 44 58 @Injectable()
+27
apps/server/src/modules/cv-template/seed/templates/minimal-clean.css
··· 1 + body { 2 + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 3 + color: #1a1a1a; 4 + line-height: 1.7; 5 + font-size: 15px; 6 + padding: 3rem; 7 + font-weight: 300; 8 + } 9 + .cv { max-width: 700px; margin: 0 auto; } 10 + .header { margin-bottom: 3rem; } 11 + .header h1 { font-size: 2.4rem; font-weight: 200; letter-spacing: 0.04em; margin-bottom: 0.15rem; } 12 + .headline { font-size: 1rem; color: #666; font-weight: 300; margin-bottom: 0.75rem; } 13 + .contact { display: flex; flex-wrap: wrap; gap: 1.5rem; font-size: 0.8rem; color: #888; letter-spacing: 0.02em; } 14 + .summary { color: #444; font-size: 0.95rem; line-height: 1.8; } 15 + .section { margin-bottom: 2.5rem; } 16 + .section h2 { font-size: 0.75rem; font-weight: 500; text-transform: uppercase; letter-spacing: 0.2em; color: #999; margin-bottom: 1.5rem; } 17 + .entry { margin-bottom: 2rem; } 18 + .entry h3 { font-size: 1.05rem; font-weight: 400; margin-bottom: 0.1rem; } 19 + .meta { font-size: 0.8rem; color: #999; letter-spacing: 0.02em; margin-bottom: 0.2rem; } 20 + .org { font-size: 0.9rem; color: #666; margin-bottom: 0.4rem; } 21 + .description { color: #444; font-size: 0.9rem; white-space: pre-line; } 22 + .skills { font-size: 0.85rem; color: #777; margin-top: 0.3rem; } 23 + @media print { 24 + body { padding: 0; font-size: 10.5pt; } 25 + .section { break-inside: avoid; } 26 + .entry { break-inside: avoid; } 27 + }
+61
apps/server/src/modules/cv-template/seed/templates/minimal-clean.hbs
··· 1 + <div class="cv"> 2 + <header class="header"> 3 + <h1>{{profile.name}}</h1> 4 + {{#if profile.headline}}<p class="headline">{{profile.headline}}</p>{{/if}} 5 + <div class="contact"> 6 + {{#if profile.email}}<span>{{profile.email}}</span>{{/if}} 7 + {{#if profile.phone}}<span>{{profile.phone}}</span>{{/if}} 8 + {{#if profile.city}}<span>{{profile.city}}{{#if profile.country}}, {{profile.country}}{{/if}}</span>{{/if}} 9 + {{#if profile.website}}<span>{{profile.website}}</span>{{/if}} 10 + {{#if profile.linkedInUrl}}<span>{{profile.linkedInUrl}}</span>{{/if}} 11 + </div> 12 + </header> 13 + 14 + {{#if profile.summary}} 15 + <section class="section"> 16 + <p class="summary">{{profile.summary}}</p> 17 + </section> 18 + {{/if}} 19 + 20 + {{#if cv.introduction}} 21 + <section class="section"> 22 + <p class="summary">{{cv.introduction}}</p> 23 + </section> 24 + {{/if}} 25 + 26 + {{#if (hasItems experience)}} 27 + <section class="section"> 28 + <h2>Experience</h2> 29 + {{#each experience}} 30 + <div class="entry"> 31 + <p class="meta">{{this.startDate}} &ndash; {{#if this.endDate}}{{this.endDate}}{{else}}Present{{/if}}</p> 32 + <h3>{{this.role}}</h3> 33 + <p class="org">{{this.company}}{{#if this.level}} / {{this.level}}{{/if}}</p> 34 + {{#if this.description}}<p class="description">{{this.description}}</p>{{/if}} 35 + {{#if (hasItems this.skills)}}<p class="skills">{{join this.skills ", "}}</p>{{/if}} 36 + </div> 37 + {{/each}} 38 + </section> 39 + {{/if}} 40 + 41 + {{#if (hasItems education)}} 42 + <section class="section"> 43 + <h2>Education</h2> 44 + {{#each education}} 45 + <div class="entry"> 46 + <p class="meta">{{this.startDate}} &ndash; {{#if this.endDate}}{{this.endDate}}{{else}}Present{{/if}}</p> 47 + <h3>{{this.degree}}{{#if this.fieldOfStudy}} &mdash; {{this.fieldOfStudy}}{{/if}}</h3> 48 + <p class="org">{{this.institution}}</p> 49 + {{#if this.description}}<p class="description">{{this.description}}</p>{{/if}} 50 + </div> 51 + {{/each}} 52 + </section> 53 + {{/if}} 54 + 55 + {{#if (hasItems allSkills)}} 56 + <section class="section"> 57 + <h2>Skills</h2> 58 + <p class="skills">{{join allSkills ", "}}</p> 59 + </section> 60 + {{/if}} 61 + </div>
+42
apps/server/src/modules/cv-template/seed/templates/technical-resume.css
··· 1 + body { 2 + font-family: 'Inter', 'Segoe UI', system-ui, -apple-system, sans-serif; 3 + color: #1e1e1e; 4 + line-height: 1.45; 5 + font-size: 13px; 6 + padding: 1.5rem; 7 + } 8 + .cv { max-width: 900px; margin: 0 auto; } 9 + .header { display: flex; justify-content: space-between; align-items: flex-start; padding-bottom: 0.75rem; border-bottom: 2px solid #2a2a2a; margin-bottom: 0.75rem; } 10 + .header h1 { font-size: 1.6rem; font-weight: 700; margin-bottom: 0.1rem; } 11 + .headline { font-size: 0.9rem; color: #555; } 12 + .header-right { text-align: right; font-size: 0.8rem; color: #555; line-height: 1.6; } 13 + .summary-bar { background: #f5f5f5; padding: 0.6rem 0.8rem; margin-bottom: 0.75rem; font-size: 0.85rem; color: #444; line-height: 1.5; border-left: 3px solid #2a2a2a; } 14 + .columns { display: grid; grid-template-columns: 220px 1fr; gap: 1.5rem; } 15 + .sidebar-section { margin-bottom: 1.25rem; } 16 + .sidebar-section h2 { font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em; color: #2a2a2a; border-bottom: 1px solid #ddd; padding-bottom: 0.2rem; margin-bottom: 0.5rem; } 17 + .skill-list { list-style: none; padding: 0; display: flex; flex-wrap: wrap; gap: 0.25rem; } 18 + .skill-list li { background: #eee; padding: 0.15rem 0.5rem; font-size: 0.75rem; color: #333; border-radius: 2px; } 19 + .sidebar-entry { margin-bottom: 0.75rem; } 20 + .sidebar-title { font-weight: 600; font-size: 0.85rem; } 21 + .sidebar-detail { font-size: 0.8rem; color: #555; } 22 + .sidebar-dates { font-size: 0.75rem; color: #888; } 23 + .sidebar-desc { font-size: 0.8rem; color: #555; margin-top: 0.2rem; white-space: pre-line; } 24 + .main-section { margin-bottom: 1.25rem; } 25 + .main-section h2 { font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em; color: #2a2a2a; border-bottom: 1px solid #ddd; padding-bottom: 0.2rem; margin-bottom: 0.5rem; } 26 + .exp-entry { margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid #eee; } 27 + .exp-entry:last-child { border-bottom: none; } 28 + .exp-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 0.25rem; } 29 + .exp-header h3 { font-size: 0.95rem; font-weight: 600; } 30 + .exp-company { font-size: 0.85rem; color: #555; } 31 + .exp-dates { text-align: right; font-size: 0.8rem; color: #555; white-space: nowrap; } 32 + .exp-duration { font-size: 0.75rem; color: #888; } 33 + .exp-desc { font-size: 0.85rem; color: #333; margin-top: 0.25rem; white-space: pre-line; } 34 + .exp-skills { display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.3rem; } 35 + .chip { background: #e8e8e8; padding: 0.1rem 0.4rem; font-size: 0.7rem; color: #444; border-radius: 2px; } 36 + @media print { 37 + body { padding: 0; font-size: 9.5pt; } 38 + .summary-bar { background: #f5f5f5 !important; } 39 + .skill-list li, .chip { background: #eee !important; } 40 + .exp-entry { break-inside: avoid; } 41 + .sidebar-entry { break-inside: avoid; } 42 + }
+76
apps/server/src/modules/cv-template/seed/templates/technical-resume.hbs
··· 1 + <div class="cv"> 2 + <header class="header"> 3 + <div class="header-left"> 4 + <h1>{{profile.name}}</h1> 5 + {{#if profile.headline}}<p class="headline">{{profile.headline}}</p>{{/if}} 6 + </div> 7 + <div class="header-right"> 8 + {{#if profile.email}}<p>{{profile.email}}</p>{{/if}} 9 + {{#if profile.phone}}<p>{{profile.phone}}</p>{{/if}} 10 + {{#if profile.city}}<p>{{profile.city}}{{#if profile.country}}, {{profile.country}}{{/if}}</p>{{/if}} 11 + {{#if profile.website}}<p>{{profile.website}}</p>{{/if}} 12 + {{#if profile.linkedInUrl}}<p>{{profile.linkedInUrl}}</p>{{/if}} 13 + </div> 14 + </header> 15 + 16 + {{#if profile.summary}} 17 + <div class="summary-bar"> 18 + <p>{{profile.summary}}</p> 19 + </div> 20 + {{/if}} 21 + 22 + {{#if cv.introduction}} 23 + <div class="summary-bar"> 24 + <p>{{cv.introduction}}</p> 25 + </div> 26 + {{/if}} 27 + 28 + <div class="columns"> 29 + <aside class="sidebar"> 30 + {{#if (hasItems allSkills)}} 31 + <section class="sidebar-section"> 32 + <h2>Technical Skills</h2> 33 + <ul class="skill-list"> 34 + {{#each allSkills}}<li>{{this}}</li>{{/each}} 35 + </ul> 36 + </section> 37 + {{/if}} 38 + 39 + {{#if (hasItems education)}} 40 + <section class="sidebar-section"> 41 + <h2>Education</h2> 42 + {{#each education}} 43 + <div class="sidebar-entry"> 44 + <p class="sidebar-title">{{this.degree}}</p> 45 + {{#if this.fieldOfStudy}}<p class="sidebar-detail">{{this.fieldOfStudy}}</p>{{/if}} 46 + <p class="sidebar-detail">{{this.institution}}</p> 47 + <p class="sidebar-dates">{{this.startDate}} &ndash; {{#if this.endDate}}{{this.endDate}}{{else}}Present{{/if}}</p> 48 + {{#if this.description}}<p class="sidebar-desc">{{this.description}}</p>{{/if}} 49 + </div> 50 + {{/each}} 51 + </section> 52 + {{/if}} 53 + </aside> 54 + 55 + <main class="main"> 56 + {{#if (hasItems experience)}} 57 + <section class="main-section"> 58 + <h2>Professional Experience</h2> 59 + {{#each experience}} 60 + <div class="exp-entry"> 61 + <div class="exp-header"> 62 + <div> 63 + <h3>{{this.role}}</h3> 64 + <p class="exp-company">{{this.company}}{{#if this.level}} &middot; {{this.level}}{{/if}}</p> 65 + </div> 66 + <p class="exp-dates">{{this.startDate}} &ndash; {{#if this.endDate}}{{this.endDate}}{{else}}Present{{/if}}<br><span class="exp-duration">{{this.duration}}</span></p> 67 + </div> 68 + {{#if this.description}}<p class="exp-desc">{{this.description}}</p>{{/if}} 69 + {{#if (hasItems this.skills)}}<div class="exp-skills">{{#each this.skills}}<span class="chip">{{this}}</span>{{/each}}</div>{{/if}} 70 + </div> 71 + {{/each}} 72 + </section> 73 + {{/if}} 74 + </main> 75 + </div> 76 + </div>