Skip to content

Instantly share code, notes, and snippets.

@danielbodnar
Last active December 31, 2025 02:54
Show Gist options
  • Select an option

  • Save danielbodnar/7b985ade7cdc7b5da17f6fe73750ca70 to your computer and use it in GitHub Desktop.

Select an option

Save danielbodnar/7b985ade7cdc7b5da17f6fe73750ca70 to your computer and use it in GitHub Desktop.
{
"$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"
}
]
}
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