Skip to content

Instantly share code, notes, and snippets.

@danielbodnar
Last active January 20, 2026 19:22
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": "https://avatars.githubusercontent.com/u/1790726?v=4",
"email": "daniel@bodnar.sh",
"phone": "(940) 247-0019",
"url": "https://daniel.bodnar.sh",
"summary": "A full stack software engineer, sysadmin, platforms engineer and cloud architect who has been building web applications since February of 2000. My greatest strength isn't my current knowledge or prior experience, but my ability to quickly grasp new concepts by diving into the deep end and bringing order out of chaos. I've spent my career refusing to stay in one lane; my expertise spans the entire software engineering ecosystem, from low-level systems programming and infrastructure automation to application development and enterprise architecture. This breadth lets me identify solutions that specialists confined to a single domain cannot. I thrive in fast-paced environments that demand continual learning, and I enjoy identifying abstract connections. This has served me well in high-pressure situations where understanding root cause quickly means the difference between a minor incident and a major outage.\n",
"location": {
"city": "Corinth",
"region": "Texas",
"countryCode": "US",
"postalCode": "76210"
},
"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 & Consulting, LLC",
"location": "Remote",
"description": "Cloud Hosting and Consulting SaaS",
"position": "Founder, Cloud Architect, CIO",
"url": "https://bitbuilder.cloud",
"startDate": "2021-06-01",
"summary": "Founded a cloud hosting and consulting SaaS company providing vendor-agnostic, end-to-end encrypted, highly-available infrastructure for organizations requiring resilient, security-first platforms.",
"highlights": [
"Containerized and load-balanced several high-profile organizations with 1M+ global visitors/day",
"Multi-cloud hybrid overlay layer based on custom Kubernetes distribution and immutable Linux systems",
"Comprehensive observability stack using Grafana, Prometheus, VictoriaMetrics, NetData, and Jaeger",
"Manage consulting accounts for small businesses: Neal & Neal Insurance and Maybach Systems, including systems and infrastructure architecture, security and incident mitigation",
"Technologies: Proxmox, Kubernetes, Docker, Linux, Bare Metal, ZFS, NVMe, Grafana, Prometheus, VictoriaMetrics, NetData, Jaeger, Load Balancing, Multi-cloud, Hybrid Infrastructure, E2E Encryption"
]
},
{
"name": "Fidelity Investments",
"location": "Westlake, Tx",
"description": "Financial Services",
"position": "Principal Software, DevOps, and Cloud Engineer",
"url": "https://www.fidelity.com",
"startDate": "2023-07-10",
"endDate": "2025-04-01",
"summary": "Served as technical leader and cloud architect for the Cloud and DevOps Engineering team, designing and implementing enterprise-scale cloud solutions while mentoring teams on AWS best practices and modern DevOps methodologies.",
"highlights": [
"Designed and built a full AWS CDK platform enabling various teams to rapidly deploy standardized, compliant infrastructure, reducing provisioning time",
"Rebuilt and optimized the Jenkins Core platform, increasing build efficiency and reducing pipeline execution times",
"Architected comprehensive AWS solutions for enterprise applications, including secure networking topologies and multi-account strategies adhering to strict financial industry security standards",
"Engineered Kubernetes-based deployment solutions leveraging EKS, Helm charts, and custom operators, supporting production applications",
"Created a cloud orchestration CLI tool that simplified cross-account resource management, eliminating manual processes and bottlenecks",
"Implemented infrastructure-as-code practices across several teams, 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",
"Technologies: AWS, AWS CDK, CloudFormation, Kubernetes, EKS, Helm, Jenkins, Docker, IAM, Terraform, Python, Node.js, Infrastructure-as-Code, CI/CD"
]
},
{
"name": "Animal Care Technologies, INC",
"location": "Dallas, Texas",
"description": "Non-profit Organization",
"position": "SRE, SysAdmin, and Platforms Engineer",
"startDate": "2019-04-01",
"endDate": "2021-06-01",
"summary": "Owned responsibility for all infrastructure, security, and platform engineering for one of the largest technology solutions and support companies serving the veterinary industry. Dual role spanning Site Reliability Engineering and Systems Administration.",
"highlights": [
"Architected, deployed, and managed dynamically scaling bare-metal Kubernetes clusters; led all migrations from legacy systems to Kubernetes",
"Managed and performance-tuned 3.5TB+ PostgreSQL database cluster, plus numerous MySQL and SQLite databases",
"Mitigated two ransomware attacks within the first month of employment, then implemented organization-wide security measures including Wireguard VPN, VLANs, and zero-trust access for third-party developers",
"Deployed self-hosted GitLab with DevOps pipelines and automatic blue-green deployments, implementing Infrastructure-as-Code using Terraform, Packer, and Ansible",
"Consolidated disparate hypervisors into a centralized Proxmox cluster on ZFS with 56G InfiniBand FC SAN",
"Implemented comprehensive observability (Grafana, Loki, Prometheus, Jaeger, ELK, Zabbix) to preemptively identify bottlenecks and capacity constraints",
"Technologies: Kubernetes, PostgreSQL, GitLab, Docker, Proxmox, ZFS, InfiniBand, Ansible, Terraform, Wireguard, cri-o, containerd, haproxy, nginx, traefik, Helm"
],
"url": "https://home.4act.com"
},
{
"name": "Perspectives.org",
"location": "Remote",
"description": "International Non-profit Educational Organization",
"position": "IT Director",
"url": "https://www.perspectives.org",
"startDate": "2017-06-01",
"endDate": "2019-04-01",
"summary": "Led IT operations for an international non-profit providing in person college-level courses serving 10,000+ students annually across 250+ classes worldwide.",
"highlights": [
"Increased cloud hosting capacity by 10x while reducing budget by 50%",
"Reduced page load times from 5 seconds to 0.8 seconds average",
"Developed 5-year roadmap to rebuild legacy monolithic .NET 3.5 application into micro-service architecture",
"Built a DRM-secured, offline-enabled streaming video player desktop app in Go for classes with unreliable internet",
"Led IT team, support department, and India-based development team",
"Volunteer Contributions (2012-2014): Created an online Learning Management System from scratch, reducing administrative overhead by 90% and Architected horizontally scaling container orchestration platform (Docker, Rancher, AWS Spot Instances) to handle traffic spikes",
"Technologies: Go, Docker, Rancher, AWS, iPXE, .NET, Performance Optimization, LMS"
]
},
{
"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 engineer building internal tools and services, managing the complete project lifecycle from requirements gathering through production deployment.",
"highlights": [
"Architected and built a large-scale external Order Status application aggregating data from 12+ legacy sources (including screen-scraped systems)",
"Led team-wide migration from Rails/MySQL to Node.js, Angular.js, and MongoDB, reducing prototype development time significantly",
"Engineered Docker-based DevOps pipeline that improved deployment reliability and developer productivity",
"Mastered functional programming in JavaScript to build high-performance, parallel-worker pipelines in an asynchronous language",
"Technologies: Node.js, Angular.js, MongoDB, Docker, Rails, MySQL, JavaScript, Functional Programming, Microservices, REST APIs"
]
},
{
"name": "TACC Support",
"location": "Denton, Texas",
"description": "IT Consulting and Managed Services Provider",
"position": "Owner / IT Consultant",
"startDate": "2007-01-01",
"endDate": "2014-01-31",
"summary": "Owned and operated a local computer repair, IT consulting, and MSP company with physical storefront for 5+ years, managing a staff of 5 employees. Later evolved into small business IT and Systems Architect Consulting. ",
"highlights": [
"Full company name: Technicians Against Computer Cruelty",
"Provided computer repair, network administration, and infrastructure systems architecting for several small businesses accounts: Babes Chicken, Justin Boots, Paddock Farms, DIAB Inc.",
"Virtualized the entire US-based multi-site server infrastructure (~30 bare-metal servers) onto ESXi for international plastics manufacturing company, DIAB Inc."
]
}
],
"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": "sidebar",
"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": []
}
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