Last active
December 31, 2025 02:54
-
-
Save danielbodnar/7b985ade7cdc7b5da17f6fe73750ca70 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "$schema": "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json", | |
| "basics": { | |
| "name": "Daniel Bodnar", | |
| "label": "Platform Engineer | Systems Architect | SRE | Linux Evangelist | Emerging Technologist", | |
| "image": "", | |
| "email": "daniel@bodnar.sh", | |
| "phone": "(940) 247-0019", | |
| "url": "https://daniel.bodnar.sh", | |
| "summary": "I bring three decades of cross-domain expertise spanning the entire software engineering ecosystem, from low-level systems programming and infrastructure automation to application development and enterprise architecture. This breadth enables me to identify solutions and optimize systems in ways that specialists confined to a single domain cannot. I thrive in high-pace, rapidly evolving environments that require continual learning and absorbing large amounts of information, and really enjoy identifying abstract connections. This has served me well in time-sensitive, high-pressure situations where understanding the underlying root cause quickly can mean the difference between a minor incident and a major outage.", | |
| "location": { | |
| "city": "Denton", | |
| "region": "Texas", | |
| "countryCode": "US" | |
| }, | |
| "profiles": [ | |
| { | |
| "network": "GitHub", | |
| "username": "danielbodnar", | |
| "url": "https://github.com/danielbodnar" | |
| }, | |
| { | |
| "network": "Website", | |
| "username": "bodnar.sh", | |
| "url": "https://bodnar.sh" | |
| }, | |
| { | |
| "network": "Website", | |
| "username": "bitbuilder.cloud", | |
| "url": "https://bitbuilder.cloud" | |
| } | |
| ] | |
| }, | |
| "work": [ | |
| { | |
| "name": "BitBuilder Cloud, LLC", | |
| "location": "Remote", | |
| "description": "Cloud Hosting and Consulting SaaS", | |
| "position": "Founder, Cloud Architect, CIO", | |
| "url": "https://bitbuilder.cloud", | |
| "startDate": "2021-06-01", | |
| "summary": "Launched a Cloud Hosting and Consulting private SaaS company with a focus on providing a vendor-agnostic, e2e encrypted, highly-available, and globally distributed hyper-converged platform for cost-efficient resiliency against hostile attackers.", | |
| "highlights": [ | |
| "Launched a web hosting and cloud consulting private SaaS company using 5 highly customized AMD & Dell based co-located servers", | |
| "Containerized and load-balanced several high-profile organizations with 1M+ global visitors/day", | |
| "Single-handedly built core services on co-located custom bare metal 3rd-gen AMD-based servers with over 2TB RAM, 320 cores, 64TB enterprise-grade NVMe storage, and quad-port 25Gb/s ethernet + dual-port 100Gbe mellanox connectx-5 (OCP) NICs", | |
| "Orchestrated global scaling via a multi-cloud hybrid overlay layer based on custom k8s distribution and buildroot and WolfiOS (alpine-based) immutable linux operating systems", | |
| "Implemented constant monitoring and observability using Grafana, Prometheus, VictoriaMetrics, NetData, Jaeger" | |
| ] | |
| }, | |
| { | |
| "name": "Fidelity Investments", | |
| "location": "Remote", | |
| "description": "Financial Services", | |
| "position": "Principal Software, DevOps, and Cloud Engineer", | |
| "url": "https://www.fidelity.com", | |
| "startDate": "2023-07-01", | |
| "endDate": "2025-01-01", | |
| "summary": "Served as a technical leader and cloud architect, designing and implementing enterprise-scale cloud solutions while mentoring teams on AWS best practices and modern DevOps methodologies.", | |
| "highlights": [ | |
| "Architected comprehensive AWS solutions for enterprise applications, including designing secure networking topologies and multi-account strategies", | |
| "Developed and implemented robust IAM policies and CloudFormation templates adhering to strict financial industry security standards", | |
| "Designed and built a full AWS CDK platform enabling teams to rapidly deploy standardized, compliant infrastructure", | |
| "Engineered Kubernetes-based deployment solutions leveraging EKS, Helm charts, and custom operators for application management", | |
| "Rebuilt and optimized the Jenkins Core platform, increasing build efficiency and reducing pipeline execution times", | |
| "Created a cloud orchestration CLI tool that simplified cross-account resource management and deployment workflows", | |
| "Successfully deployed and managed Discourse forums on Alpine Linux containers in Kubernetes, ensuring high availability and performance", | |
| "Implemented infrastructure-as-code practices across multiple teams, significantly reducing configuration drift and deployment errors", | |
| "Designed and implemented automated security scanning and compliance checking within CI/CD pipelines", | |
| "Led knowledge-sharing sessions and developed documentation to elevate team capabilities in cloud-native technologies" | |
| ] | |
| }, | |
| { | |
| "name": "RSVP & ACT, Inc", | |
| "location": "Dallas, Texas", | |
| "description": "Non-profit Organization", | |
| "position": "SRE, SysAdmin, and Platforms Engineer", | |
| "startDate": "2019-04-01", | |
| "endDate": "2021-06-01", | |
| "summary": "Directly responsible for identifying capacity and efficiency constraints, as well as engineering secure, highly-available, horizontally scalable platforms to run production environment apps, services, databases, and infrastructure.", | |
| "highlights": [ | |
| "Managed and performance-tuned +3.5TB postgresql database cluster, MySql and SQLite databases", | |
| "Architected, deployed, and managed dynamically scaling, secure, and fully version-controlled hybrid and bare-metal kubernetes clusters", | |
| "Deployed and managed self-hosted gitlab instance with DevOps build pipelines and automatic blue-green deployments", | |
| "Implemented monitoring, alerting, logging, tracing, and observability tools", | |
| "Implemented and enforced gitlab-based Infrastructure-as-Code procedures and pipelines", | |
| "Deployed and managed multiple host, network, and container security tools and vulnerability scanners", | |
| "Simplified and standardized hypervisors with a centralized Proxmox cluster on ZFS and a 56G InfiniBand FC SAN", | |
| "Deployed W2019 AD server environment for centralized user account management", | |
| "Implemented organization-wide VPN, VLANS, and security measures", | |
| "Provided training to address knowledge-gaps and mitigated ransomware hacks" | |
| ] | |
| }, | |
| { | |
| "name": "Perspectives.org", | |
| "location": "Remote", | |
| "description": "International Non-profit Educational Organization", | |
| "position": "IT Director", | |
| "url": "https://www.perspectives.org", | |
| "startDate": "2018-01-01", | |
| "endDate": "2019-04-01", | |
| "summary": "Led the IT team to support existing infrastructure while developing a 5 year vision roadmap to rebuild legacy monolithic .NET 3.5 application into 18 modern department and role-based portals.", | |
| "highlights": [ | |
| "Developed 5 year vision, roadmap, and project plan to rebuild legacy monolithic .NET 3.5 application", | |
| "Increased cloud hosting capacity by 10x while reducing budget by 50%", | |
| "Reduced minimum page load time from 5 sec to an avg of 0.8s", | |
| "Built a DRM-secured offline-enabled streaming video player desktop app in Go" | |
| ] | |
| }, | |
| { | |
| "name": "AT&T Corp.", | |
| "location": "Dallas, Texas", | |
| "description": "Telecommunications", | |
| "position": "Professional Application Developer", | |
| "url": "https://www.att.com", | |
| "startDate": "2014-03-01", | |
| "endDate": "2017-06-01", | |
| "summary": "Full stack application engineer building custom web-based tools and services for various internal departments.", | |
| "highlights": [ | |
| "Full stack application engineer building custom web-based tools and services", | |
| "Managed entire project pipeline, from requirements gathering to production deployment", | |
| "Led team-wide migration from rails/mysql stack to node.js, angular.js, and mongodb", | |
| "Engineered a docker-based devops and deployment pipeline", | |
| "Architected and built a large-scale external \"Order Status\" application and a decoupled \"microservice\" pipeline" | |
| ] | |
| }, | |
| { | |
| "name": "TicketDashboard", | |
| "location": "Denton, Texas", | |
| "description": "SaaS Ticket Management Platform", | |
| "position": "Founder", | |
| "startDate": "2013-01-01", | |
| "endDate": "2014-03-01", | |
| "summary": "Launched a business around a redesigned and re-engineered version of the homegrown ticket manager into a multi-tenant SaaS solution.", | |
| "highlights": [ | |
| "Built multi-tenant SaaS ticket management platform", | |
| "Tech stack: MongoDB, Node.js, Python, Angular, Bootstrap" | |
| ] | |
| }, | |
| { | |
| "name": "TACC Support", | |
| "location": "Denton, Texas", | |
| "description": "IT Consulting and Managed Services Provider", | |
| "position": "Owner", | |
| "startDate": "2007-01-01", | |
| "endDate": "2013-01-01", | |
| "summary": "Owned and operated a computer repair, IT consulting, and MSP company for 5+ years, with as many as 5 employees at a time.", | |
| "highlights": [ | |
| "Operated IT consulting / MSP company for 5+ years", | |
| "Managed up to 5 employees", | |
| "Full company name: Technicians Against Computer Cruelty" | |
| ] | |
| } | |
| ], | |
| "skills": [ | |
| { | |
| "name": "Linux Ecosystem", | |
| "level": "Expert", | |
| "keywords": [ | |
| "Linux", | |
| "Shell Scripting", | |
| "Containerization", | |
| "Kernel-level Optimizations", | |
| "SRE", | |
| "Platform Engineering", | |
| "Network Engineering" | |
| ] | |
| }, | |
| { | |
| "name": "Operating Systems", | |
| "level": "Expert", | |
| "keywords": ["Alpine", "Debian", "Ubuntu Server", "Arch", "FreeBSD", "WolfiOS"] | |
| }, | |
| { | |
| "name": "Containerization/Orchestration", | |
| "level": "Expert", | |
| "keywords": ["Docker", "Linux containers", "Kubernetes", "Buildroot", "DevContainers", "LocalStack"] | |
| }, | |
| { | |
| "name": "Languages", | |
| "level": "Expert", | |
| "keywords": ["Rust", "JavaScript", "TypeScript", "Bash", "Shell"] | |
| }, | |
| { | |
| "name": "Frontend Frameworks", | |
| "level": "Expert", | |
| "keywords": ["Vue.js", "Nuxt.js", "Svelte", "SolidJS", "Alpine.js"] | |
| }, | |
| { | |
| "name": "Backend", | |
| "level": "Expert", | |
| "keywords": ["Node.js", "Rust"] | |
| }, | |
| { | |
| "name": "Infrastructure", | |
| "level": "Expert", | |
| "keywords": ["Terraform", "Ansible", "GitLab CI/CD", "GitHub Actions"] | |
| }, | |
| { | |
| "name": "Databases", | |
| "level": "Expert", | |
| "keywords": ["PostgreSQL", "SQLite", "DuckDB", "MongoDB", "MySQL"] | |
| }, | |
| { | |
| "name": "Networking", | |
| "level": "Expert", | |
| "keywords": ["WireGuard", "ZeroTier", "Tailscale", "OpenVPN", "Layer 2/3", "BGP"] | |
| }, | |
| { | |
| "name": "API Development", | |
| "level": "Expert", | |
| "keywords": ["OpenAPI", "JSON Schema", "RESTful API design"] | |
| }, | |
| { | |
| "name": "Configuration Languages", | |
| "level": "Expert", | |
| "keywords": ["Cue", "Dhall", "YAML"] | |
| }, | |
| { | |
| "name": "Cloud Platforms", | |
| "level": "Expert", | |
| "keywords": ["AWS", "AWS CDK", "CloudFormation", "IAM", "EKS", "GCP", "Multi-cloud strategy"] | |
| }, | |
| { | |
| "name": "Monitoring & Observability", | |
| "level": "Expert", | |
| "keywords": ["Grafana", "Prometheus", "VictoriaMetrics", "NetData", "Jaeger", "ELK Stack", "Distributed Tracing"] | |
| }, | |
| { | |
| "name": "Security", | |
| "level": "Expert", | |
| "keywords": [ | |
| "Zero-trust architecture", | |
| "Vulnerability Scanning", | |
| "Intrusion Detection", | |
| "VPN", | |
| "Traffic Analysis" | |
| ] | |
| }, | |
| { | |
| "name": "Architecture Patterns", | |
| "level": "Expert", | |
| "keywords": [ | |
| "Microservices", | |
| "Distributed Systems", | |
| "API Gateway", | |
| "Service Mesh", | |
| "Event-Driven Architecture", | |
| "CQRS" | |
| ] | |
| }, | |
| { | |
| "name": "DevOps & Automation", | |
| "level": "Expert", | |
| "keywords": ["CI/CD Pipelines", "GitOps", "Infrastructure as Code", "Self-healing Systems", "Auto-scaling"] | |
| } | |
| ], | |
| "meta": { | |
| "theme": "techStack", | |
| "version": "v1.0.0", | |
| "canonical": "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json", | |
| "lastModified": "2025-01-01" | |
| }, | |
| "interests": [ | |
| { | |
| "name": "Low-level Linux", | |
| "keywords": ["Embedded Development", "FPGA", "Programmable Hardware"] | |
| }, | |
| { | |
| "name": "System Architecture", | |
| "keywords": ["Distributed Systems", "Microservice Architecture", "Scalable Systems"] | |
| }, | |
| { | |
| "name": "Innovation", | |
| "keywords": ["Early Technology Adoption", "Emerging Technologies"] | |
| } | |
| ], | |
| "languages": [ | |
| { | |
| "language": "English", | |
| "fluency": "Native" | |
| } | |
| ], | |
| "education": [], | |
| "volunteer": [ | |
| { | |
| "organization": "Perspectives.org", | |
| "position": "IT Volunteer", | |
| "url": "https://www.perspectives.org", | |
| "startDate": "2012-01-01", | |
| "endDate": "2014-01-01", | |
| "summary": "Volunteer web development and IT support before joining as IT Director.", | |
| "highlights": [ | |
| "Redesigned and developed a modern-replacement for perspectives.org home page", | |
| "Created a simple, highly streamlined and intuitive online Learning Management System from scratch", | |
| "Reduced overhead by over 90%", | |
| "Deployed LMS tool to all Texas-based classes and architected automatic container orchestration platform" | |
| ] | |
| } | |
| ], | |
| "awards": [], | |
| "publications": [], | |
| "references": [], | |
| "projects": [ | |
| { | |
| "name": "BitBuilder Cloud", | |
| "description": "Vendor-agnostic, e2e encrypted, highly-available cloud hosting platform", | |
| "highlights": [ | |
| "Custom bare metal infrastructure with 2TB+ RAM, 320 cores", | |
| "Multi-cloud hybrid overlay layer", | |
| "Immutable Linux-based orchestration" | |
| ], | |
| "keywords": ["Kubernetes", "Bare Metal", "Cloud", "Infrastructure"], | |
| "startDate": "2021-06-01", | |
| "url": "https://bitbuilder.cloud", | |
| "roles": ["Founder", "Architect"], | |
| "type": "application" | |
| } | |
| ] | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import { z } from "zod"; | |
| // ============================================ | |
| // Greenhouse Quick Apply Form Zod Schema | |
| // Mapped to JSON Resume structure | |
| // ============================================ | |
| // Month options for date selectors | |
| const monthEnum = z.enum([ | |
| "January", "February", "March", "April", "May", "June", | |
| "July", "August", "September", "October", "November", "December" | |
| ]); | |
| // Education Entry Schema | |
| const EducationEntrySchema = z.object({ | |
| school: z.string().optional(), // Maps to: education[].institution | |
| degree: z.string().optional(), // Maps to: education[].studyType | |
| discipline: z.string().optional(), // Maps to: education[].area | |
| startDateMonth: monthEnum.optional(), // Derived from: education[].startDate | |
| startDateYear: z.number().int().min(1900).max(2100).optional(), | |
| endDateMonth: monthEnum.optional(), // Derived from: education[].endDate | |
| endDateYear: z.number().int().min(1900).max(2100).optional(), | |
| }); | |
| // Employment Entry Schema | |
| const EmploymentEntrySchema = z.object({ | |
| company: z.string(), // Maps to: work[].company | |
| title: z.string(), // Maps to: work[].position | |
| startDateMonth: monthEnum.optional(), // Derived from: work[].startDate | |
| startDateYear: z.number().int().min(1900).max(2100).optional(), | |
| endDateMonth: monthEnum.optional(), // Derived from: work[].endDate | |
| endDateYear: z.number().int().min(1900).max(2100).optional(), | |
| currentRole: z.boolean().default(false), // True if work[].endDate is undefined/null | |
| }); | |
| // Online Profiles Schema | |
| const OnlineProfilesSchema = z.object({ | |
| linkedin: z.string().url().optional(), // Maps to: basics.profiles (find network: "LinkedIn") | |
| github: z.string().url().optional(), // Maps to: basics.profiles (find network: "GitHub") | |
| portfolio: z.string().url().optional(), // Could map to: basics.url or a portfolio profile | |
| website: z.string().url().optional(), // Maps to: basics.url | |
| }); | |
| // Voluntary Self-Identification Schema | |
| const VoluntarySelfIdentificationSchema = z.object({ | |
| gender: z.enum([ | |
| "Male", | |
| "Female", | |
| "Decline To Self Identify", | |
| // Add other options as needed based on form | |
| ]).optional(), | |
| hispanicOrLatino: z.enum([ | |
| "Yes", | |
| "No", | |
| "Decline To Self Identify", | |
| ]).optional(), | |
| veteranStatus: z.enum([ | |
| "I am a veteran", | |
| "I am not a veteran", | |
| "Decline To Self Identify", | |
| ]).optional(), | |
| disabilityStatus: z.enum([ | |
| "Yes, I have a disability (or previously had a disability)", | |
| "No, I don't have a disability", | |
| "I don't wish to answer", | |
| ]).optional(), | |
| }); | |
| // Phone Schema with country code | |
| const PhoneSchema = z.object({ | |
| countryCode: z.string().default("+1"), // Derived from phone parsing | |
| phoneNumber: z.string(), // Maps to: basics.phone (normalized) | |
| }); | |
| // Location Schema | |
| const LocationSchema = z.object({ | |
| location: z.string(), // Formatted as "City, Region, Country" from basics.location | |
| }); | |
| // Main Greenhouse Quick Apply Form Schema | |
| export const GreenhouseQuickApplySchema = z.object({ | |
| // Personal Information | |
| firstName: z.string().min(1, "First name is required"), // Derived from: basics.name (split) | |
| lastName: z.string().min(1, "Last name is required"), // Derived from: basics.name (split) | |
| preferredFirstName: z.string().optional(), // Not in JSON Resume - user input | |
| // Contact | |
| phone: PhoneSchema, | |
| location: z.string(), // Maps to: basics.location (formatted string) | |
| // Education (array, form shows one at a time with "Add another school" button) | |
| education: z.array(EducationEntrySchema).default([]), | |
| // Employment (form supports up to 5 visible, with "Add another role" button) | |
| employment: z.array(EmploymentEntrySchema).max(20).default([]), | |
| // Online Profiles | |
| onlineProfiles: OnlineProfilesSchema, | |
| // Voluntary Self-Identification (EEOC fields - sensitive, optional) | |
| voluntarySelfIdentification: VoluntarySelfIdentificationSchema.optional(), | |
| }); | |
| // Type inference | |
| export type GreenhouseQuickApply = z.infer<typeof GreenhouseQuickApplySchema>; | |
| export type EducationEntry = z.infer<typeof EducationEntrySchema>; | |
| export type EmploymentEntry = z.infer<typeof EmploymentEntrySchema>; | |
| // ============================================ | |
| // Transformer: JSON Resume -> Greenhouse Form | |
| // ============================================ | |
| // Helper to parse date string (supports "YYYY-MM" and "YYYY-MM-DD") | |
| function parseDateString(dateStr: string | undefined): { month?: string; year?: number } { | |
| if (!dateStr) return {}; | |
| const months = ["January", "February", "March", "April", "May", "June", | |
| "July", "August", "September", "October", "November", "December"]; | |
| const match = dateStr.match(/^(\\d{4})-(\\d{2})/); | |
| if (match) { | |
| const year = parseInt(match[1], 10); | |
| const monthIndex = parseInt(match[2], 10) - 1; | |
| return { | |
| month: months[monthIndex], | |
| year, | |
| }; | |
| } | |
| return {}; | |
| } | |
| // Helper to split full name | |
| function splitName(fullName: string): { firstName: string; lastName: string } { | |
| const parts = fullName.trim().split(/\\s+/); | |
| if (parts.length === 1) { | |
| return { firstName: parts[0], lastName: "" }; | |
| } | |
| return { | |
| firstName: parts[0], | |
| lastName: parts.slice(1).join(" "), | |
| }; | |
| } | |
| // Helper to parse phone number | |
| function parsePhone(phoneStr: string): { countryCode: string; phoneNumber: string } { | |
| // Handle format like "(940) 247-0019" | |
| const cleaned = phoneStr.replace(/[\\s\\-\\(\\)]/g, ""); | |
| // If it starts with +, extract country code | |
| if (cleaned.startsWith("+")) { | |
| const match = cleaned.match(/^\\+(\\d{1,3})(\\d+)$/); | |
| if (match) { | |
| return { countryCode: `+${match[1]}`, phoneNumber: match[2] }; | |
| } | |
| } | |
| // Default to US | |
| return { countryCode: "+1", phoneNumber: cleaned }; | |
| } | |
| // JSON Resume Schema (simplified for the fields we need) | |
| const JsonResumeBasicsSchema = z.object({ | |
| name: z.string(), | |
| email: z.string().email().optional(), | |
| phone: z.string().optional(), | |
| url: z.string().url().optional(), | |
| location: z.object({ | |
| city: z.string().optional(), | |
| region: z.string().optional(), | |
| countryCode: z.string().optional(), | |
| address: z.string().optional(), | |
| }).optional(), | |
| profiles: z.array(z.object({ | |
| network: z.string(), | |
| url: z.string().optional(), | |
| username: z.string().optional(), | |
| })).optional(), | |
| }); | |
| const JsonResumeWorkSchema = z.object({ | |
| company: z.string(), | |
| position: z.string(), | |
| startDate: z.string().optional(), | |
| endDate: z.string().optional(), | |
| website: z.string().optional(), | |
| summary: z.string().optional(), | |
| highlights: z.array(z.string()).optional(), | |
| }); | |
| const JsonResumeEducationSchema = z.object({ | |
| institution: z.string().optional(), | |
| area: z.string().optional(), | |
| studyType: z.string().optional(), | |
| startDate: z.string().optional(), | |
| endDate: z.string().optional(), | |
| }); | |
| export const JsonResumeSchema = z.object({ | |
| basics: JsonResumeBasicsSchema, | |
| work: z.array(JsonResumeWorkSchema).optional(), | |
| education: z.array(JsonResumeEducationSchema).optional(), | |
| }); | |
| export type JsonResume = z.infer<typeof JsonResumeSchema>; | |
| // Main transformer function | |
| export function transformJsonResumeToGreenhouse(resume: JsonResume): GreenhouseQuickApply { | |
| const { firstName, lastName } = splitName(resume.basics.name); | |
| const phone = parsePhone(resume.basics.phone || ""); | |
| // Format location string | |
| const loc = resume.basics.location; | |
| const locationParts = [loc?.city, loc?.region, loc?.countryCode].filter(Boolean); | |
| const locationString = locationParts.join(", "); | |
| // Find LinkedIn and GitHub profiles | |
| const linkedinProfile = resume.basics.profiles?.find( | |
| p => p.network.toLowerCase() === "linkedin" | |
| ); | |
| const githubProfile = resume.basics.profiles?.find( | |
| p => p.network.toLowerCase() === "github" | |
| ); | |
| // Transform work entries | |
| const employment: EmploymentEntry[] = (resume.work || []).map(job => { | |
| const startDate = parseDateString(job.startDate); | |
| const endDate = parseDateString(job.endDate); | |
| return { | |
| company: job.company, | |
| title: job.position, | |
| startDateMonth: startDate.month as any, | |
| startDateYear: startDate.year, | |
| endDateMonth: endDate.month as any, | |
| endDateYear: endDate.year, | |
| currentRole: !job.endDate, | |
| }; | |
| }); | |
| // Transform education entries | |
| const education: EducationEntry[] = (resume.education || []).map(edu => { | |
| const startDate = parseDateString(edu.startDate); | |
| const endDate = parseDateString(edu.endDate); | |
| return { | |
| school: edu.institution, | |
| degree: edu.studyType, | |
| discipline: edu.area, | |
| startDateMonth: startDate.month as any, | |
| startDateYear: startDate.year, | |
| endDateMonth: endDate.month as any, | |
| endDateYear: endDate.year, | |
| }; | |
| }); | |
| return { | |
| firstName, | |
| lastName, | |
| preferredFirstName: undefined, | |
| phone, | |
| location: locationString, | |
| education, | |
| employment, | |
| onlineProfiles: { | |
| linkedin: linkedinProfile?.url, | |
| github: githubProfile?.url, | |
| portfolio: undefined, | |
| website: resume.basics.url, | |
| }, | |
| voluntarySelfIdentification: undefined, | |
| }; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment