Resume builder was added
This commit is contained in:
@@ -7,15 +7,15 @@
|
|||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
I am a passionate technophile with over 27 years of hands-on experience in software engineering, web design, database engineering, IT management, computer repair, and user experience design. My primary skills revolve around full-stack Python and Javascript development, with a focus on web application development.
|
Senior software engineer with over 27 years of hands-on technology experience spanning software engineering, web design, database engineering, IT management, computer repair, and user experience design. My primary focus is full-stack web application development with Python and JavaScript.
|
||||||
|
|
||||||
Throughout my career I have constantly honed and expanded my skills with freelance work and side projects to stay up to date on the latest technologies. Lately this has brought me into the world of DevOps, Docker, Kubernetes, and advanced resource management across many systems, and also to begin to explore building Web3, Machine Learning and AI technologies into my work. I hope to take this unique perspective on software engineering into the future and help build the Web3 world of tomorrow that is slowly taking shape around us. My goal—and dream—is to apply my skills in a growth-oriented technology company that shares my enthusiasm and belief that the next big idea is always right around the corner.
|
Through professional roles, freelance work, and side projects, I have expanded my skills in DevOps, Docker, Kubernetes, cloud deployment, and resource management. Recent projects include membership platforms, Android applications with machine learning and AI, and financial technology. I continue to explore Web3 and emerging technologies, and I am seeking a software engineering role where I can build reliable applications and contribute across the development lifecycle.
|
||||||
|
|
||||||
## Experience
|
## Experience
|
||||||
|
|
||||||
### Independent Software Developer / Freelancer
|
### Independent Software Developer / Freelancer
|
||||||
|
|
||||||
*June 2024 – Present*
|
*June 2024 - Present*
|
||||||
|
|
||||||
I develop web and mobile applications for long-term clients sourced through Upwork, agency partnerships, and professional referrals. Working directly with clients and distributed teams, I turn early-stage ideas and complex business requirements into production-ready software. I own projects from discovery and architecture through implementation, cloud deployment, feedback cycles, and ongoing support. Recent work spans membership management, AI-powered safety systems, and financial technology.
|
I develop web and mobile applications for long-term clients sourced through Upwork, agency partnerships, and professional referrals. Working directly with clients and distributed teams, I turn early-stage ideas and complex business requirements into production-ready software. I own projects from discovery and architecture through implementation, cloud deployment, feedback cycles, and ongoing support. Recent work spans membership management, AI-powered safety systems, and financial technology.
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ I develop web and mobile applications for long-term clients sourced through Upwo
|
|||||||
|
|
||||||
##### [IIPM.ie](https://iipm.ie)
|
##### [IIPM.ie](https://iipm.ie)
|
||||||
|
|
||||||
*April 2025 – March 2026*
|
*April 2025 - March 2026*
|
||||||
|
|
||||||
- Developed a membership platform for the Irish Institute of Pensions Management through an Upwork engagement, collaborating with an Australia-based agency and Daniel Steven.
|
- Developed a membership platform for the Irish Institute of Pensions Management through an Upwork engagement, collaborating with an Australia-based agency and Daniel Steven.
|
||||||
- Expanded an initial set of WordPress landing pages into a larger PHP and PostgreSQL platform supporting individual and organisational membership applications, qualification requirements, annual payments, monthly course-progress reviews, and downloadable PDF certificates.
|
- Expanded an initial set of WordPress landing pages into a larger PHP and PostgreSQL platform supporting individual and organisational membership applications, qualification requirements, annual payments, monthly course-progress reviews, and downloadable PDF certificates.
|
||||||
@@ -33,7 +33,7 @@ I develop web and mobile applications for long-term clients sourced through Upwo
|
|||||||
|
|
||||||
##### [SafeSchoolz](https://heroeyez.com)
|
##### [SafeSchoolz](https://heroeyez.com)
|
||||||
|
|
||||||
*June 2024 – June 2025*
|
*June 2024 - June 2025*
|
||||||
|
|
||||||
- Worked with David Gray, VP of Grays Communications in Los Angeles, to develop a safety platform that detects firearms and communicates potential incidents to first responders.
|
- Worked with David Gray, VP of Grays Communications in Los Angeles, to develop a safety platform that detects firearms and communicates potential incidents to first responders.
|
||||||
- Built the Media Pipe and Aegis Android applications and integrated them with the existing .NET-based HeroEyez portal. Media Pipe detects firearms in device or IP-camera feeds; Aegis receives alerts with screenshots and a one-minute evidence clip, initiates a Twilio-powered call workflow, and forwards incident information to HeroEyez for monitoring and response coordination.
|
- Built the Media Pipe and Aegis Android applications and integrated them with the existing .NET-based HeroEyez portal. Media Pipe detects firearms in device or IP-camera feeds; Aegis receives alerts with screenshots and a one-minute evidence clip, initiates a Twilio-powered call workflow, and forwards incident information to HeroEyez for monitoring and response coordination.
|
||||||
@@ -41,11 +41,10 @@ I develop web and mobile applications for long-term clients sourced through Upwo
|
|||||||
- Completed the end-to-end alert workflow and deployed the application in June 2025. Broader commercial rollout was later paused because of market and regulatory constraints.
|
- Completed the end-to-end alert workflow and deployed the application in June 2025. Broader commercial rollout was later paused because of market and regulatory constraints.
|
||||||
|
|
||||||
**Technologies:** Android, Java, Kotlin, object detection, TensorFlow Lite
|
**Technologies:** Android, Java, Kotlin, object detection, TensorFlow Lite
|
||||||
**Source code:** [Media Pipe](https://github.com/StormRunner06106/SS-MediaPipe) · [Aegis](https://github.com/StormRunner06106/SS-Aegis)
|
|
||||||
|
|
||||||
##### [Equity Funding Source](https://equityfundingsource.com)
|
##### [Equity Funding Source](https://equityfundingsource.com)
|
||||||
|
|
||||||
*April 2026 – July 2026*
|
*April 2026 - July 2026*
|
||||||
|
|
||||||
- Built a mortgage-lending platform for a Los Angeles-based mortgage-loan broker, using Preact for a lightweight frontend and Bun for the backend.
|
- Built a mortgage-lending platform for a Los Angeles-based mortgage-loan broker, using Preact for a lightweight frontend and Bun for the backend.
|
||||||
- Analyzed United States mortgage and private-lending workflows, including the forms and information exchanged throughout the loan process, to support borrower applications, lender collaboration, administrative oversight, and secure document handling.
|
- Analyzed United States mortgage and private-lending workflows, including the forms and information exchanged throughout the loan process, to support borrower applications, lender collaboration, administrative oversight, and secure document handling.
|
||||||
@@ -53,72 +52,72 @@ I develop web and mobile applications for long-term clients sourced through Upwo
|
|||||||
|
|
||||||
**Technologies:** Preact, Bun, Cloudflare Workers, Cloudflare D1, Durable Objects, Cloudflare R2
|
**Technologies:** Preact, Bun, Cloudflare Workers, Cloudflare D1, Durable Objects, Cloudflare R2
|
||||||
|
|
||||||
### Covius, LLC — Senior Software Engineer
|
### Covius, LLC / Senior Software Engineer
|
||||||
|
|
||||||
*January 2022 – April 2024 · Pompano Beach, FL*
|
*January 2022 - April 2024 · Pompano Beach, FL*
|
||||||
|
|
||||||
At Covius, a nationwide real estate technology and holdings company, I worked on the Senior Software Engineer's team of their RealtyBid.com unit, and helped bring a full redesign of the frontend and backend systems to reality. This real time, online, Real Estate Auction platform includes a modern REST API backend, modern responsive javascript powered front end, and many asynchronous feedback mechanisms, providing user's real time feedback about the current states of ongoing auctions. I was also responsible for building backend tools for the internal teams to use, so they can effectively administer the website and provider customer support with ease.
|
At Covius, a nationwide real estate technology and holdings company, I contributed to the frontend and backend redesign of RealtyBid.com, an online real estate auction platform. The platform combined a REST API backend, a responsive JavaScript frontend, and asynchronous updates to provide users with real-time auction status. I also built internal tools for website administration and customer support.
|
||||||
|
|
||||||
#### Accomplishments
|
#### Accomplishments
|
||||||
|
|
||||||
- Participated in the complete redesign of a major legacy website, with tons of historical and legacy data
|
- Contributed to the complete redesign of a major legacy website containing extensive historical data.
|
||||||
- Helped manage and adapt a legacy database to a modern design
|
- Helped manage and adapt a legacy database to support the redesigned platform.
|
||||||
- Created a responsive web application front end that functions just as well in a Desktop web browser as it does on a Phone
|
- Built a responsive web application frontend for desktop and mobile browsers.
|
||||||
- Refined the user experience with QA testers and business partners over many sprints and testing sessions utilizing effective communication
|
- Refined the user experience with QA testers and business partners through iterative sprints and testing sessions.
|
||||||
- Utilized a modern technology stack including RxJS and Angular to keep the website ready for tomorrow
|
- Developed frontend functionality using Angular and RxJS.
|
||||||
|
|
||||||
### SEAD Software — Software Engineer
|
### SEAD Software / Software Engineer
|
||||||
|
|
||||||
*April 2021 – July 2022 · Delray Beach, FL*
|
*April 2021 - July 2022 · Delray Beach, FL*
|
||||||
|
|
||||||
At SEAD Software I employ python and web development skills to design web applications and deliver business analytics for the healthcare industry and legal field. I also enriched company wide development operations by employing Azure DevOps and development pipelines to streamline team coordination.
|
At SEAD Software, I used Python and web development skills to build web applications and deliver business analytics for healthcare and legal clients. I also improved company-wide development operations with Azure DevOps and development pipelines to streamline team coordination.
|
||||||
|
|
||||||
#### Accomplishments
|
#### Accomplishments
|
||||||
|
|
||||||
- Designed and implemented python code using Google's cloud based AI Computer Vision API to recognize and digitally categorize physical laboratory documents.
|
- Designed and implemented Python code using the Google Cloud Vision API to recognize and digitally categorize physical laboratory documents.
|
||||||
- Developed text messaging web application to autonomously communicate and respond to customer interactions and generate leads for law firms using the Twilio API.
|
- Developed a text messaging web application using the Twilio API to automate customer responses and generate leads for law firms.
|
||||||
- Maintained and implemented Amazon Web Services infrastructure to support multiple projects
|
- Maintained and implemented Amazon Web Services infrastructure to support multiple projects
|
||||||
- Implemented and trained staff on Microsoft Azure DevOps development platform infrastructure
|
- Implemented and trained staff on Microsoft Azure DevOps development platform infrastructure
|
||||||
- Maintained a large GIT code repository for multiple clients
|
- Maintained a large Git code repository for multiple clients
|
||||||
|
|
||||||
### Clarity Diagnostics & Lab Solutions — Director of IT
|
### Clarity Diagnostics & Lab Solutions / Director of IT
|
||||||
|
|
||||||
*September 2020 – January 2022 · Boca Raton, FL*
|
*September 2020 - January 2022 · Boca Raton, FL*
|
||||||
|
|
||||||
Managed all IT needs and decision making for a boutique medical testing Laboratory and their Diagnostics test manufacturing business. Here I helped expand the company from its small sized roots to doing business with multiple outside entities across the country, including many local and state governments. I also managed software quality control, deployment and training for the company's sister company SEAD Software.
|
Managed IT operations and technology decisions for a medical testing laboratory and diagnostics test manufacturing business. Supported the company's expansion to work with organizations nationwide, including local and state governments. I also managed software quality control, deployment, and training for its sister company, SEAD Software.
|
||||||
|
|
||||||
#### Accomplishments
|
#### Accomplishments
|
||||||
|
|
||||||
- Implemented physical keycard/badge access security system for the entire laboratory facility
|
- Implemented a physical keycard/badge access security system for the entire laboratory facility
|
||||||
- Implemented and maintained security standards for email and cloud based applications in Google Workspace and Microsoft 365
|
- Implemented and maintained security standards for email and cloud-based applications in Google Workspace and Microsoft 365
|
||||||
- Maintained client facing websites
|
- Maintained client-facing websites
|
||||||
- Expanded laboratory infrastructure and assisted in the QAing of medical testing equipment
|
- Expanded laboratory infrastructure and assisted with quality assurance testing of medical equipment
|
||||||
- Managed and instructed other IT staff in their daily responsibilities
|
- Managed and instructed other IT staff in their daily responsibilities
|
||||||
|
|
||||||
### MyTap, aka Which Craft — Lead Developer
|
### MyTap, aka Which Craft / Lead Developer
|
||||||
|
|
||||||
*January 2016 – April 2020 · Albuquerque, NM*
|
*January 2016 - April 2020 · Albuquerque, NM*
|
||||||
|
|
||||||
At this small start up I worked in collaboration with a team of designers to create a craft beer recommendation engine that was based on web scraping and natural language processing of online beer reviews. This is where I got my first taste of what was to come with the power of Machine Learning and AI.
|
At this startup, I collaborated with a team of designers to build a craft beer recommendation engine using web scraping and natural language processing (NLP) of online beer reviews. This work introduced me to practical applications of machine learning and AI.
|
||||||
|
|
||||||
#### Accomplishments
|
#### Accomplishments
|
||||||
|
|
||||||
- Implemented a robust web scraper in Python using the Scrapy python library
|
- Implemented a robust web scraper in Python using the Scrapy Python library
|
||||||
- Created a responsive web application front end that functioned as a browser based phone application
|
- Created a responsive web application frontend for mobile browsers
|
||||||
- Designed custom natural language processing code in python to create craft beer flavor profiles based on adjective frequency in craft beer review text.
|
- Designed custom natural language processing code in Python to create craft beer flavor profiles based on adjective frequency in craft beer review text.
|
||||||
- Maintained a Django based web server backend to serve data from a PostgreSQL database backend
|
- Maintained a Django backend serving data from a PostgreSQL database
|
||||||
|
|
||||||
### TriCore Reference Laboratories — Production Support Specialist
|
### TriCore Reference Laboratories / Production Support Specialist
|
||||||
|
|
||||||
*April 2013 – January 2017 · Albuquerque, NM*
|
*April 2013 - January 2017 · Albuquerque, NM*
|
||||||
|
|
||||||
I worked as a technology specialist in the medical field, assisting multiple regional hospital staff with their daily technology needs, in the fast paced industry of health care. I would help with everything from urgent patient critical password resets, to troubleshooting of industry specific vertical applications like SunQuest, assisting in the retrieval of patient medical records and diagnostic information, while monitoring for performance and errors.
|
Provided technology support to staff across multiple regional hospitals. Responsibilities included urgent password resets, troubleshooting healthcare applications such as Sunquest, retrieving patient medical records and diagnostic information, and monitoring systems for performance issues and errors.
|
||||||
|
|
||||||
#### Accomplishments
|
#### Accomplishments
|
||||||
|
|
||||||
- Being responsible on the nightshift for the entire company production environment. Usually supported by 60 staff during the day, I was solely responsible for monitoring, troubleshooting, and escalating issues to the appropriate parties at night.
|
- Solely monitored and supported the company production environment overnight, handling troubleshooting and escalation for an environment supported by 60 staff during the day.
|
||||||
- Proficient in multiple industry specific vertical applications, monitoring the transmission of patient records between multiple hospital's varied medical record systems.
|
- Monitored the transmission of patient records between hospitals using different medical record systems and healthcare applications.
|
||||||
- Walked medical staff through time sensitive, patient critical, IT related troubleshooting.
|
- Guided medical staff through time-sensitive IT troubleshooting affecting patient care.
|
||||||
- Monitored critical hospital infrastructure for performance and errors, correcting them promptly.
|
- Monitored critical hospital infrastructure for performance and errors, correcting them promptly.
|
||||||
- Trained new help desk employees on their daily tasks and responsibilities
|
- Trained new help desk employees on their daily tasks and responsibilities
|
||||||
- Remained on-call off hours for emergency assistance.
|
- Remained on-call off hours for emergency assistance.
|
||||||
@@ -127,7 +126,7 @@ I worked as a technology specialist in the medical field, assisting multiple reg
|
|||||||
|
|
||||||
### Programming Languages
|
### Programming Languages
|
||||||
|
|
||||||
Python (including Flask and Django frameworks), Go, PHP, NodeJS, C and C++, JavaScript (including jQuery and AngularJS), TypeScript, CoffeeScript, HTML5, CSS3, SASS
|
Python (Flask, Django), JavaScript (Node.js, jQuery, Angular, AngularJS, RxJS, Preact, Bun), TypeScript, Go, PHP, Java, Kotlin, C, C++, CoffeeScript, HTML5, CSS3, Sass
|
||||||
|
|
||||||
### Database Technologies
|
### Database Technologies
|
||||||
|
|
||||||
@@ -137,23 +136,24 @@ Python (including Flask and Django frameworks), Go, PHP, NodeJS, C and C++, Java
|
|||||||
|
|
||||||
### Applications
|
### Applications
|
||||||
|
|
||||||
- **Programming:** Microsoft Visual Studio, Visual Studio Code, PyCharm, Sublime Text 3, Devart dbForge, Microsoft SQL Studio, VIM, Eclipse, GIT
|
- **Programming:** Microsoft Visual Studio, Visual Studio Code, PyCharm, Sublime Text 3, Devart dbForge, Microsoft SQL Studio, Vim, Eclipse, Git
|
||||||
- **Design:** Adobe Photoshop, Adobe Dreamweaver, Adobe Illustrator, Adobe Edge, Adobe InDesign
|
- **Design:** Adobe Photoshop, Adobe Dreamweaver, Adobe Illustrator, Adobe Edge, Adobe InDesign
|
||||||
- **Productivity:** Microsoft Office, Google Docs (Drive), WordPerfect Suite
|
- **Productivity:** Microsoft Office, Google Docs (Drive), WordPerfect Suite
|
||||||
- **Virtualization:** VMWare, VirtualBox, Docker, Kubernettes
|
- **Virtualization:** VMware, VirtualBox, Docker, Kubernetes
|
||||||
|
|
||||||
### Cloud Technologies
|
### Cloud Technologies
|
||||||
|
|
||||||
- Microsoft 365 and Google Workspace Administration
|
- Microsoft 365 and Google Workspace Administration
|
||||||
- Amazon Web Services Administration
|
- Amazon Web Services (AWS) Administration
|
||||||
- Microsoft Azure DevOps Administration
|
- Microsoft Azure DevOps Administration
|
||||||
|
- Cloudflare Workers, D1, Durable Objects, and R2
|
||||||
|
|
||||||
### Other
|
### Other
|
||||||
|
|
||||||
- Jira Agile Project Management skills
|
- Jira Agile Project Management skills
|
||||||
- Responsive Web design
|
- Responsive web design
|
||||||
- Advanced (and remote) Linux administration
|
- Advanced (and remote) Linux administration
|
||||||
- Search Engine Optimization for Google and Bing search engines
|
- Search engine optimization (SEO) for Google and Bing
|
||||||
- Social media presence implementation (Facebook, Twitter, Instagram, etc.)
|
- Social media presence implementation (Facebook, Twitter, Instagram, etc.)
|
||||||
|
|
||||||
## Education
|
## Education
|
||||||
|
|||||||
@@ -16,8 +16,37 @@ frontend/
|
|||||||
src/ React pages, components, and custom CSS
|
src/ React pages, components, and custom CSS
|
||||||
Alexander Herlan Resume 2024.pdf
|
Alexander Herlan Resume 2024.pdf
|
||||||
Alexander Herlan Resume 2024.md
|
Alexander Herlan Resume 2024.md
|
||||||
|
scripts/generate_resume.py Single-file Markdown → HTML → PDF generator
|
||||||
|
resumes/ Matching HTML/PDF files for each generated version
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Generate a resume
|
||||||
|
|
||||||
|
The standalone generator reads `Alexander Herlan Resume 2024.md`, creates a self-contained HTML document, and prints that exact HTML to PDF using Python Playwright. The template and CSS are in `scripts/generate_resume.py`. It follows the original PDF's Letter page size, narrow left column for section labels, right column for content, black dividers, and green header accents. It uses local Raleway/Lato fonts when available and Arial otherwise; updated content flows across as many pages as needed. The original PDF is only a design reference, and is not needed to run the generator.
|
||||||
|
|
||||||
|
Install the generator dependencies separately from the web backend:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
.venv/Scripts/python.exe -m pip install Markdown==3.10.3 playwright==1.62.0
|
||||||
|
.venv/Scripts/python.exe -m playwright install chromium
|
||||||
|
.venv/Scripts/python.exe scripts/generate_resume.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Each run creates the next unused pair, such as `resumes/resume-v1.html` and `resumes/resume-v1.pdf`, then `resume-v2.html` and `resume-v2.pdf`. Existing versions are never overwritten. To choose a version or Markdown source:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
.venv/Scripts/python.exe scripts/generate_resume.py --version 2026-09
|
||||||
|
.venv/Scripts/python.exe scripts/generate_resume.py "path/to/resume.md" --version v3
|
||||||
|
```
|
||||||
|
|
||||||
|
Use `--browser msedge` or `--browser chrome` to render with an already installed browser instead of installing Chromium. `--output-dir` changes the destination; by default, output goes to the repository's `resumes` directory regardless of your working directory. You can also run the script with `uv run`, using its embedded dependency metadata (a supported browser is still required).
|
||||||
|
|
||||||
|
Markdown format: start with one `# Name`, optionally follow with a bold professional title, then contact details. Use `##` for sections, `###` for roles/categories, and smaller headings for accomplishments/projects. Italic-only paragraphs become date/location lines. Lists, links, and tables are supported; the four-column References table is formatted as individual contact lines to match the original. All resume content is read from Markdown. Generation is local and does not publish the files or change the website's existing `/api/resume` download.
|
||||||
|
|
||||||
|
Package references: [Python-Markdown](https://python-markdown.github.io/reference/) and [Playwright PDF rendering](https://playwright.dev/python/docs/api/class-page#page-pdf).
|
||||||
|
|
||||||
|
For content updates, edit the Markdown first and rerun the generator to create a new matching HTML/PDF pair. Do not edit generated content directly. Each HTML file records the SHA-256 of its source text in a `source-sha256` meta tag, so its source revision can be checked. The generator rejects long dashes in visible Markdown text instead of silently rewriting them in the output. Earlier versions remain historical snapshots; regenerate after each Markdown edit to keep the latest pair current.
|
||||||
|
|
||||||
## Run locally
|
## Run locally
|
||||||
|
|
||||||
Create and install the Python environment from the repository root:
|
Create and install the Python environment from the repository root:
|
||||||
|
|||||||
@@ -0,0 +1,194 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Alexander Herlan — Resume</title><style>
|
||||||
|
@page { size: Letter; margin: 50pt 55.5pt 50pt 57.75pt; }
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
html { background: #e8e8e8; }
|
||||||
|
body {
|
||||||
|
width: 612pt; margin: 24px auto; padding: 50pt 55.5pt 50pt 57.75pt;
|
||||||
|
background: white; color: #111; font: 10pt/1.2 Lato, Arial, sans-serif;
|
||||||
|
-webkit-print-color-adjust: exact; print-color-adjust: exact;
|
||||||
|
}
|
||||||
|
header { display: grid; grid-template-columns: 166.5pt 1fr; gap: 18pt;
|
||||||
|
min-height: 124pt; break-inside: avoid; }
|
||||||
|
h1, h2, h3, h5, .contact-name { font-family: Raleway, Arial, sans-serif; }
|
||||||
|
h1 { font-size: 24pt; line-height: 1.16; margin: 0 0 5pt; }
|
||||||
|
.subtitle { font-size: 16pt; font-weight: bold; line-height: 1.2;
|
||||||
|
color: #38761d; margin: 0; }
|
||||||
|
.subtitle span { display: block; color: #6aa84f; }
|
||||||
|
.contact { border-top: 3pt solid #000; padding-top: 9pt; }
|
||||||
|
.contact-name { font-size: 12pt; font-weight: bold; margin: 0 0 3pt; }
|
||||||
|
.contact p { margin: 0 0 9pt; }
|
||||||
|
.contact a { display: inline-block; }
|
||||||
|
a { color: #38761d; text-decoration: none; overflow-wrap: anywhere; }
|
||||||
|
section { position: relative; margin: 0 0 18pt 184.5pt; }
|
||||||
|
.section-start { position: relative; border-top: 3pt solid #000;
|
||||||
|
padding-top: 10pt; break-inside: avoid; break-after: avoid; }
|
||||||
|
h2 { position: absolute; top: -3pt; left: -184.5pt; width: 166.5pt;
|
||||||
|
font-size: 12pt; line-height: 1.2; margin: 0; }
|
||||||
|
h2::before { content: ''; display: block; width: 12pt;
|
||||||
|
border-top: 1.5pt solid #111; margin-bottom: 12pt; }
|
||||||
|
h3 { font-size: 12pt; line-height: 1.2; margin: 16pt 0 4pt; }
|
||||||
|
.section-start > h3 { margin-top: 0; }
|
||||||
|
h4 { color: #666; font-size: 10pt; margin: 8pt 0 4pt; }
|
||||||
|
h5, h6 { font-size: 11pt; margin: 12pt 0 4pt; }
|
||||||
|
h3, h4, h5, h6 { break-after: avoid; }
|
||||||
|
p { margin: 0 0 6pt; orphans: 3; widows: 3; }
|
||||||
|
p.dates { color: #666; font-size: 9pt; text-transform: uppercase;
|
||||||
|
margin-bottom: 8pt; break-after: avoid; }
|
||||||
|
p.dates em { font-style: normal; }
|
||||||
|
ul, ol { margin: 4pt 0 8pt; padding-left: 35pt; }
|
||||||
|
li { padding-left: 0; margin-bottom: 2pt; orphans: 2; widows: 2; }
|
||||||
|
li > p { margin-bottom: 2pt; }
|
||||||
|
.references { list-style: none; padding: 0; }
|
||||||
|
.references li { margin-bottom: 6pt; break-inside: avoid; }
|
||||||
|
table { width: 100%; border-collapse: collapse; font-size: 9pt; }
|
||||||
|
th, td { text-align: left; vertical-align: top; padding: 4pt;
|
||||||
|
border-bottom: 1px solid #ddd; overflow-wrap: anywhere; }
|
||||||
|
tr { break-inside: avoid; }
|
||||||
|
img { max-width: 100%; }
|
||||||
|
pre { white-space: pre-wrap; overflow-wrap: anywhere; }
|
||||||
|
@media print {
|
||||||
|
html { background: white; }
|
||||||
|
body { width: auto; margin: 0; padding: 0; }
|
||||||
|
}
|
||||||
|
</style></head><body><header><div><h1>Alexander Herlan</h1>
|
||||||
|
<p class="subtitle">Senior Software Engineer<span>DevOps & IT Manager</span></p></div><div class="contact"><p class="contact-name">Alexander Herlan</p><p>1207 El Portal NW, Albuquerque, NM 87107<br>
|
||||||
|
<a href="tel:+18134028692">813-402-8692</a> · <a href="mailto:alexwherlan@gmail.com">alexwherlan@gmail.com</a> · <a href="https://alex.herlan.dev">alex.herlan.dev</a> · <a href="https://linkedin.com/in/alexander-herlan">LinkedIn</a> · <a href="https://github.com/AlexanderHerlan">GitHub</a></p>
|
||||||
|
</div></header><main><section><div class="section-start"><h2>Overview</h2>
|
||||||
|
<p>I am a passionate technophile with over 27 years of hands-on experience in software engineering, web design, database engineering, IT management, computer repair, and user experience design. My primary skills revolve around full-stack Python and Javascript development, with a focus on web application development.</p>
|
||||||
|
</div><p>Throughout my career I have constantly honed and expanded my skills with freelance work and side projects to stay up to date on the latest technologies. Lately this has brought me into the world of DevOps, Docker, Kubernetes, and advanced resource management across many systems, and also to begin to explore building Web3, Machine Learning and AI technologies into my work. I hope to take this unique perspective on software engineering into the future and help build the Web3 world of tomorrow that is slowly taking shape around us. My goal—and dream—is to apply my skills in a growth-oriented technology company that shares my enthusiasm and belief that the next big idea is always right around the corner.</p>
|
||||||
|
</section><section><div class="section-start"><h2>Experience</h2>
|
||||||
|
<h3>Independent Software Developer / Freelancer</h3>
|
||||||
|
</div><p class="dates"><em>June 2024 – Present</em></p>
|
||||||
|
<p>I develop web and mobile applications for long-term clients sourced through Upwork, agency partnerships, and professional referrals. Working directly with clients and distributed teams, I turn early-stage ideas and complex business requirements into production-ready software. I own projects from discovery and architecture through implementation, cloud deployment, feedback cycles, and ongoing support. Recent work spans membership management, AI-powered safety systems, and financial technology.</p>
|
||||||
|
<h4>Selected Projects</h4>
|
||||||
|
<h5><a href="https://iipm.ie">IIPM.ie</a></h5>
|
||||||
|
<p class="dates"><em>April 2025 – March 2026</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Developed a membership platform for the Irish Institute of Pensions Management through an Upwork engagement, collaborating with an Australia-based agency and Daniel Steven.</li>
|
||||||
|
<li>Expanded an initial set of WordPress landing pages into a larger PHP and PostgreSQL platform supporting individual and organisational membership applications, qualification requirements, annual payments, monthly course-progress reviews, and downloadable PDF certificates.</li>
|
||||||
|
<li>Built an administrative portal with statistical dashboards for membership, onboarding, qualifications, payments, and course progress. Automated programme-timeline calculations, approved-leave handling, certificate issuance, and several previously manual documentation workflows.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> WordPress, PHP, PostgreSQL</p>
|
||||||
|
<h5><a href="https://heroeyez.com">SafeSchoolz</a></h5>
|
||||||
|
<p class="dates"><em>June 2024 – June 2025</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Worked with David Gray, VP of Grays Communications in Los Angeles, to develop a safety platform that detects firearms and communicates potential incidents to first responders.</li>
|
||||||
|
<li>Built the Media Pipe and Aegis Android applications and integrated them with the existing .NET-based HeroEyez portal. Media Pipe detects firearms in device or IP-camera feeds; Aegis receives alerts with screenshots and a one-minute evidence clip, initiates a Twilio-powered call workflow, and forwards incident information to HeroEyez for monitoring and response coordination.</li>
|
||||||
|
<li>Evaluated YOLO before adopting TensorFlow Lite to improve object-detection accuracy within mobile hardware constraints. Trained and tested the model using more than 10,000 firearm images from Roboflow and custom-captured samples.</li>
|
||||||
|
<li>Completed the end-to-end alert workflow and deployed the application in June 2025. Broader commercial rollout was later paused because of market and regulatory constraints.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> Android, Java, Kotlin, object detection, TensorFlow Lite<br>
|
||||||
|
<strong>Source code:</strong> <a href="https://github.com/StormRunner06106/SS-MediaPipe">Media Pipe</a> · <a href="https://github.com/StormRunner06106/SS-Aegis">Aegis</a></p>
|
||||||
|
<h5><a href="https://equityfundingsource.com">Equity Funding Source</a></h5>
|
||||||
|
<p class="dates"><em>April 2026 – July 2026</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Built a mortgage-lending platform for a Los Angeles-based mortgage-loan broker, using Preact for a lightweight frontend and Bun for the backend.</li>
|
||||||
|
<li>Analyzed United States mortgage and private-lending workflows, including the forms and information exchanged throughout the loan process, to support borrower applications, lender collaboration, administrative oversight, and secure document handling.</li>
|
||||||
|
<li>Deployed the platform on Cloudflare using Workers for server-side execution, D1 for relational data, Durable Objects for real-time messaging, and R2 for document storage. Used AI-assisted development with Codex to accelerate implementation and iteration while maintaining system stability.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> Preact, Bun, Cloudflare Workers, Cloudflare D1, Durable Objects, Cloudflare R2</p>
|
||||||
|
<h3>Covius, LLC — Senior Software Engineer</h3>
|
||||||
|
<p class="dates"><em>January 2022 – April 2024 · Pompano Beach, FL</em></p>
|
||||||
|
<p>At Covius, a nationwide real estate technology and holdings company, I worked on the Senior Software Engineer's team of their RealtyBid.com unit, and helped bring a full redesign of the frontend and backend systems to reality. This real time, online, Real Estate Auction platform includes a modern REST API backend, modern responsive javascript powered front end, and many asynchronous feedback mechanisms, providing user's real time feedback about the current states of ongoing auctions. I was also responsible for building backend tools for the internal teams to use, so they can effectively administer the website and provider customer support with ease.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Participated in the complete redesign of a major legacy website, with tons of historical and legacy data</li>
|
||||||
|
<li>Helped manage and adapt a legacy database to a modern design</li>
|
||||||
|
<li>Created a responsive web application front end that functions just as well in a Desktop web browser as it does on a Phone</li>
|
||||||
|
<li>Refined the user experience with QA testers and business partners over many sprints and testing sessions utilizing effective communication</li>
|
||||||
|
<li>Utilized a modern technology stack including RxJS and Angular to keep the website ready for tomorrow</li>
|
||||||
|
</ul>
|
||||||
|
<h3>SEAD Software — Software Engineer</h3>
|
||||||
|
<p class="dates"><em>April 2021 – July 2022 · Delray Beach, FL</em></p>
|
||||||
|
<p>At SEAD Software I employ python and web development skills to design web applications and deliver business analytics for the healthcare industry and legal field. I also enriched company wide development operations by employing Azure DevOps and development pipelines to streamline team coordination.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Designed and implemented python code using Google's cloud based AI Computer Vision API to recognize and digitally categorize physical laboratory documents.</li>
|
||||||
|
<li>Developed text messaging web application to autonomously communicate and respond to customer interactions and generate leads for law firms using the Twilio API.</li>
|
||||||
|
<li>Maintained and implemented Amazon Web Services infrastructure to support multiple projects</li>
|
||||||
|
<li>Implemented and trained staff on Microsoft Azure DevOps development platform infrastructure</li>
|
||||||
|
<li>Maintained a large GIT code repository for multiple clients</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Clarity Diagnostics & Lab Solutions — Director of IT</h3>
|
||||||
|
<p class="dates"><em>September 2020 – January 2022 · Boca Raton, FL</em></p>
|
||||||
|
<p>Managed all IT needs and decision making for a boutique medical testing Laboratory and their Diagnostics test manufacturing business. Here I helped expand the company from its small sized roots to doing business with multiple outside entities across the country, including many local and state governments. I also managed software quality control, deployment and training for the company's sister company SEAD Software.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Implemented physical keycard/badge access security system for the entire laboratory facility</li>
|
||||||
|
<li>Implemented and maintained security standards for email and cloud based applications in Google Workspace and Microsoft 365</li>
|
||||||
|
<li>Maintained client facing websites</li>
|
||||||
|
<li>Expanded laboratory infrastructure and assisted in the QAing of medical testing equipment</li>
|
||||||
|
<li>Managed and instructed other IT staff in their daily responsibilities</li>
|
||||||
|
</ul>
|
||||||
|
<h3>MyTap, aka Which Craft — Lead Developer</h3>
|
||||||
|
<p class="dates"><em>January 2016 – April 2020 · Albuquerque, NM</em></p>
|
||||||
|
<p>At this small start up I worked in collaboration with a team of designers to create a craft beer recommendation engine that was based on web scraping and natural language processing of online beer reviews. This is where I got my first taste of what was to come with the power of Machine Learning and AI.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Implemented a robust web scraper in Python using the Scrapy python library</li>
|
||||||
|
<li>Created a responsive web application front end that functioned as a browser based phone application</li>
|
||||||
|
<li>Designed custom natural language processing code in python to create craft beer flavor profiles based on adjective frequency in craft beer review text.</li>
|
||||||
|
<li>Maintained a Django based web server backend to serve data from a PostgreSQL database backend</li>
|
||||||
|
</ul>
|
||||||
|
<h3>TriCore Reference Laboratories — Production Support Specialist</h3>
|
||||||
|
<p class="dates"><em>April 2013 – January 2017 · Albuquerque, NM</em></p>
|
||||||
|
<p>I worked as a technology specialist in the medical field, assisting multiple regional hospital staff with their daily technology needs, in the fast paced industry of health care. I would help with everything from urgent patient critical password resets, to troubleshooting of industry specific vertical applications like SunQuest, assisting in the retrieval of patient medical records and diagnostic information, while monitoring for performance and errors.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Being responsible on the nightshift for the entire company production environment. Usually supported by 60 staff during the day, I was solely responsible for monitoring, troubleshooting, and escalating issues to the appropriate parties at night.</li>
|
||||||
|
<li>Proficient in multiple industry specific vertical applications, monitoring the transmission of patient records between multiple hospital's varied medical record systems.</li>
|
||||||
|
<li>Walked medical staff through time sensitive, patient critical, IT related troubleshooting.</li>
|
||||||
|
<li>Monitored critical hospital infrastructure for performance and errors, correcting them promptly.</li>
|
||||||
|
<li>Trained new help desk employees on their daily tasks and responsibilities</li>
|
||||||
|
<li>Remained on-call off hours for emergency assistance.</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>Skills</h2>
|
||||||
|
<h3>Programming Languages</h3>
|
||||||
|
</div><p>Python (including Flask and Django frameworks), Go, PHP, NodeJS, C and C++, JavaScript (including jQuery and AngularJS), TypeScript, CoffeeScript, HTML5, CSS3, SASS</p>
|
||||||
|
<h3>Database Technologies</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>SQL:</strong> Microsoft SQL Server, MySQL Server, PostgreSQL Server</li>
|
||||||
|
<li><strong>NoSQL:</strong> MongoDB, CouchDB, Redis</li>
|
||||||
|
<li><strong>Other:</strong> Microsoft Access, Microsoft Excel</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Applications</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Programming:</strong> Microsoft Visual Studio, Visual Studio Code, PyCharm, Sublime Text 3, Devart dbForge, Microsoft SQL Studio, VIM, Eclipse, GIT</li>
|
||||||
|
<li><strong>Design:</strong> Adobe Photoshop, Adobe Dreamweaver, Adobe Illustrator, Adobe Edge, Adobe InDesign</li>
|
||||||
|
<li><strong>Productivity:</strong> Microsoft Office, Google Docs (Drive), WordPerfect Suite</li>
|
||||||
|
<li><strong>Virtualization:</strong> VMWare, VirtualBox, Docker, Kubernettes</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Cloud Technologies</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Microsoft 365 and Google Workspace Administration</li>
|
||||||
|
<li>Amazon Web Services Administration</li>
|
||||||
|
<li>Microsoft Azure DevOps Administration</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Other</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Jira Agile Project Management skills</li>
|
||||||
|
<li>Responsive Web design</li>
|
||||||
|
<li>Advanced (and remote) Linux administration</li>
|
||||||
|
<li>Search Engine Optimization for Google and Bing search engines</li>
|
||||||
|
<li>Social media presence implementation (Facebook, Twitter, Instagram, etc.)</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>Education</h2>
|
||||||
|
<h3>University of New Mexico</h3>
|
||||||
|
</div><h4>Certifications</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Beginning Programming in C++</li>
|
||||||
|
<li>Intermediate Programming in C++</li>
|
||||||
|
<li>Advanced Visual C++</li>
|
||||||
|
<li>Beginning Visual Basic</li>
|
||||||
|
<li>Intermediate Visual Basic</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Central New Mexico Community College (aka TVI)</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Beginning Photoshop</li>
|
||||||
|
<li>Intermediate Photoshop</li>
|
||||||
|
<li>Advanced Photoshop</li>
|
||||||
|
<li>Introduction to Lightwave 3D</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>References</h2>
|
||||||
|
<ul class="references"><li><strong>David Foy</strong> — <span>Senior Software Engineer</span> — <span>Covius</span>: <span><a href="tel:+14079541245">407-954-1245</a></span></li><li><strong>Warren Wright</strong> — <span>CEO</span> — <span>SEAD Software</span>: <span><a href="tel:+12019881513">201-988-1513</a></span></li><li><strong>Ashley Park</strong> — <span>Director</span> — <span>Clarity Diagnostics</span>: <span><a href="tel:+15083415387">508-341-5387</a></span></li><li><strong>Douglas Radecki</strong> — <span>CEO</span> — <span>MyTap / Which Craft</span>: <span><a href="tel:+15054004636">505-400-4636</a></span></li></ul></div></section></main></body></html>
|
||||||
Binary file not shown.
@@ -0,0 +1,194 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Alexander Herlan — Resume</title><style>
|
||||||
|
@page { size: Letter; margin: 50pt 55.5pt 50pt 57.75pt; }
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
html { background: #e8e8e8; }
|
||||||
|
body {
|
||||||
|
width: 612pt; margin: 24px auto; padding: 50pt 55.5pt 50pt 57.75pt;
|
||||||
|
background: white; color: #111; font: 10pt/1.2 Lato, Arial, sans-serif;
|
||||||
|
-webkit-print-color-adjust: exact; print-color-adjust: exact;
|
||||||
|
}
|
||||||
|
header { display: grid; grid-template-columns: 166.5pt 1fr; gap: 18pt;
|
||||||
|
min-height: 124pt; break-inside: avoid; }
|
||||||
|
h1, h2, h3, h5, .contact-name { font-family: Raleway, Arial, sans-serif; }
|
||||||
|
h1 { font-size: 24pt; line-height: 1.16; margin: 0 0 5pt; }
|
||||||
|
.subtitle { font-size: 16pt; font-weight: bold; line-height: 1.2;
|
||||||
|
color: #38761d; margin: 0; }
|
||||||
|
.subtitle span { display: block; color: #6aa84f; }
|
||||||
|
.contact { border-top: 3pt solid #000; padding-top: 9pt; }
|
||||||
|
.contact-name { font-size: 12pt; font-weight: bold; margin: 0 0 3pt; }
|
||||||
|
.contact p { margin: 0 0 9pt; }
|
||||||
|
.contact a { display: inline-block; }
|
||||||
|
a { color: #38761d; text-decoration: none; overflow-wrap: anywhere; }
|
||||||
|
section { position: relative; margin: 0 0 18pt 184.5pt; }
|
||||||
|
.section-start { position: relative; border-top: 3pt solid #000;
|
||||||
|
padding-top: 10pt; break-inside: avoid; break-after: avoid; }
|
||||||
|
h2 { position: absolute; top: -3pt; left: -184.5pt; width: 166.5pt;
|
||||||
|
font-size: 12pt; line-height: 1.2; margin: 0; }
|
||||||
|
h2::before { content: ''; display: block; width: 12pt;
|
||||||
|
border-top: 1.5pt solid #111; margin-bottom: 12pt; }
|
||||||
|
h3 { font-size: 12pt; line-height: 1.2; margin: 16pt 0 4pt; }
|
||||||
|
.section-start > h3 { margin-top: 0; }
|
||||||
|
h4 { color: #666; font-size: 10pt; margin: 8pt 0 4pt; }
|
||||||
|
h5, h6 { font-size: 11pt; margin: 12pt 0 4pt; }
|
||||||
|
h3, h4, h5, h6 { break-after: avoid; }
|
||||||
|
p { margin: 0 0 6pt; orphans: 3; widows: 3; }
|
||||||
|
p.dates { color: #666; font-size: 9pt; text-transform: uppercase;
|
||||||
|
margin-bottom: 8pt; break-after: avoid; }
|
||||||
|
p.dates em { font-style: normal; }
|
||||||
|
ul, ol { margin: 4pt 0 8pt; padding-left: 35pt; }
|
||||||
|
li { padding-left: 0; margin-bottom: 2pt; orphans: 2; widows: 2; }
|
||||||
|
li > p { margin-bottom: 2pt; }
|
||||||
|
.references { list-style: none; padding: 0; }
|
||||||
|
.references li { margin-bottom: 6pt; break-inside: avoid; }
|
||||||
|
table { width: 100%; border-collapse: collapse; font-size: 9pt; }
|
||||||
|
th, td { text-align: left; vertical-align: top; padding: 4pt;
|
||||||
|
border-bottom: 1px solid #ddd; overflow-wrap: anywhere; }
|
||||||
|
tr { break-inside: avoid; }
|
||||||
|
img { max-width: 100%; }
|
||||||
|
pre { white-space: pre-wrap; overflow-wrap: anywhere; }
|
||||||
|
@media print {
|
||||||
|
html { background: white; }
|
||||||
|
body { width: auto; margin: 0; padding: 0; }
|
||||||
|
}
|
||||||
|
</style></head><body><header><div><h1>Alexander Herlan</h1>
|
||||||
|
<p class="subtitle">Senior Software Engineer<span>DevOps & IT Manager</span></p></div><div class="contact"><p class="contact-name">Alexander Herlan</p><p>1207 El Portal NW, Albuquerque, NM 87107<br>
|
||||||
|
<a href="tel:+18134028692">813-402-8692</a> · <a href="mailto:alexwherlan@gmail.com">alexwherlan@gmail.com</a> · <a href="https://alex.herlan.dev">alex.herlan.dev</a> · <a href="https://linkedin.com/in/alexander-herlan">LinkedIn</a> · <a href="https://github.com/AlexanderHerlan">GitHub</a></p>
|
||||||
|
</div></header><main><section><div class="section-start"><h2>Overview</h2>
|
||||||
|
<p>I am a passionate technophile with over 27 years of hands-on experience in software engineering, web design, database engineering, IT management, computer repair, and user experience design. My primary skills revolve around full-stack Python and Javascript development, with a focus on web application development.</p>
|
||||||
|
</div><p>Throughout my career I have constantly honed and expanded my skills with freelance work and side projects to stay up to date on the latest technologies. Lately this has brought me into the world of DevOps, Docker, Kubernetes, and advanced resource management across many systems, and also to begin to explore building Web3, Machine Learning and AI technologies into my work. I hope to take this unique perspective on software engineering into the future and help build the Web3 world of tomorrow that is slowly taking shape around us. My goal—and dream—is to apply my skills in a growth-oriented technology company that shares my enthusiasm and belief that the next big idea is always right around the corner.</p>
|
||||||
|
</section><section><div class="section-start"><h2>Experience</h2>
|
||||||
|
<h3>Independent Software Developer / Freelancer</h3>
|
||||||
|
</div><p class="dates"><em>June 2024 – Present</em></p>
|
||||||
|
<p>I develop web and mobile applications for long-term clients sourced through Upwork, agency partnerships, and professional referrals. Working directly with clients and distributed teams, I turn early-stage ideas and complex business requirements into production-ready software. I own projects from discovery and architecture through implementation, cloud deployment, feedback cycles, and ongoing support. Recent work spans membership management, AI-powered safety systems, and financial technology.</p>
|
||||||
|
<h4>Selected Projects</h4>
|
||||||
|
<h5><a href="https://iipm.ie">IIPM.ie</a></h5>
|
||||||
|
<p class="dates"><em>April 2025 – March 2026</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Developed a membership platform for the Irish Institute of Pensions Management through an Upwork engagement, collaborating with an Australia-based agency and Daniel Steven.</li>
|
||||||
|
<li>Expanded an initial set of WordPress landing pages into a larger PHP and PostgreSQL platform supporting individual and organisational membership applications, qualification requirements, annual payments, monthly course-progress reviews, and downloadable PDF certificates.</li>
|
||||||
|
<li>Built an administrative portal with statistical dashboards for membership, onboarding, qualifications, payments, and course progress. Automated programme-timeline calculations, approved-leave handling, certificate issuance, and several previously manual documentation workflows.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> WordPress, PHP, PostgreSQL</p>
|
||||||
|
<h5><a href="https://heroeyez.com">SafeSchoolz</a></h5>
|
||||||
|
<p class="dates"><em>June 2024 – June 2025</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Worked with David Gray, VP of Grays Communications in Los Angeles, to develop a safety platform that detects firearms and communicates potential incidents to first responders.</li>
|
||||||
|
<li>Built the Media Pipe and Aegis Android applications and integrated them with the existing .NET-based HeroEyez portal. Media Pipe detects firearms in device or IP-camera feeds; Aegis receives alerts with screenshots and a one-minute evidence clip, initiates a Twilio-powered call workflow, and forwards incident information to HeroEyez for monitoring and response coordination.</li>
|
||||||
|
<li>Evaluated YOLO before adopting TensorFlow Lite to improve object-detection accuracy within mobile hardware constraints. Trained and tested the model using more than 10,000 firearm images from Roboflow and custom-captured samples.</li>
|
||||||
|
<li>Completed the end-to-end alert workflow and deployed the application in June 2025. Broader commercial rollout was later paused because of market and regulatory constraints.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> Android, Java, Kotlin, object detection, TensorFlow Lite<br>
|
||||||
|
<strong>Source code:</strong> <a href="https://github.com/StormRunner06106/SS-MediaPipe">Media Pipe</a> · <a href="https://github.com/StormRunner06106/SS-Aegis">Aegis</a></p>
|
||||||
|
<h5><a href="https://equityfundingsource.com">Equity Funding Source</a></h5>
|
||||||
|
<p class="dates"><em>April 2026 – July 2026</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Built a mortgage-lending platform for a Los Angeles-based mortgage-loan broker, using Preact for a lightweight frontend and Bun for the backend.</li>
|
||||||
|
<li>Analyzed United States mortgage and private-lending workflows, including the forms and information exchanged throughout the loan process, to support borrower applications, lender collaboration, administrative oversight, and secure document handling.</li>
|
||||||
|
<li>Deployed the platform on Cloudflare using Workers for server-side execution, D1 for relational data, Durable Objects for real-time messaging, and R2 for document storage. Used AI-assisted development with Codex to accelerate implementation and iteration while maintaining system stability.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> Preact, Bun, Cloudflare Workers, Cloudflare D1, Durable Objects, Cloudflare R2</p>
|
||||||
|
<h3>Covius, LLC — Senior Software Engineer</h3>
|
||||||
|
<p class="dates"><em>January 2022 – April 2024 · Pompano Beach, FL</em></p>
|
||||||
|
<p>At Covius, a nationwide real estate technology and holdings company, I worked on the Senior Software Engineer's team of their RealtyBid.com unit, and helped bring a full redesign of the frontend and backend systems to reality. This real time, online, Real Estate Auction platform includes a modern REST API backend, modern responsive javascript powered front end, and many asynchronous feedback mechanisms, providing user's real time feedback about the current states of ongoing auctions. I was also responsible for building backend tools for the internal teams to use, so they can effectively administer the website and provider customer support with ease.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Participated in the complete redesign of a major legacy website, with tons of historical and legacy data</li>
|
||||||
|
<li>Helped manage and adapt a legacy database to a modern design</li>
|
||||||
|
<li>Created a responsive web application front end that functions just as well in a Desktop web browser as it does on a Phone</li>
|
||||||
|
<li>Refined the user experience with QA testers and business partners over many sprints and testing sessions utilizing effective communication</li>
|
||||||
|
<li>Utilized a modern technology stack including RxJS and Angular to keep the website ready for tomorrow</li>
|
||||||
|
</ul>
|
||||||
|
<h3>SEAD Software — Software Engineer</h3>
|
||||||
|
<p class="dates"><em>April 2021 – July 2022 · Delray Beach, FL</em></p>
|
||||||
|
<p>At SEAD Software I employ python and web development skills to design web applications and deliver business analytics for the healthcare industry and legal field. I also enriched company wide development operations by employing Azure DevOps and development pipelines to streamline team coordination.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Designed and implemented python code using Google's cloud based AI Computer Vision API to recognize and digitally categorize physical laboratory documents.</li>
|
||||||
|
<li>Developed text messaging web application to autonomously communicate and respond to customer interactions and generate leads for law firms using the Twilio API.</li>
|
||||||
|
<li>Maintained and implemented Amazon Web Services infrastructure to support multiple projects</li>
|
||||||
|
<li>Implemented and trained staff on Microsoft Azure DevOps development platform infrastructure</li>
|
||||||
|
<li>Maintained a large GIT code repository for multiple clients</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Clarity Diagnostics & Lab Solutions — Director of IT</h3>
|
||||||
|
<p class="dates"><em>September 2020 – January 2022 · Boca Raton, FL</em></p>
|
||||||
|
<p>Managed all IT needs and decision making for a boutique medical testing Laboratory and their Diagnostics test manufacturing business. Here I helped expand the company from its small sized roots to doing business with multiple outside entities across the country, including many local and state governments. I also managed software quality control, deployment and training for the company's sister company SEAD Software.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Implemented physical keycard/badge access security system for the entire laboratory facility</li>
|
||||||
|
<li>Implemented and maintained security standards for email and cloud based applications in Google Workspace and Microsoft 365</li>
|
||||||
|
<li>Maintained client facing websites</li>
|
||||||
|
<li>Expanded laboratory infrastructure and assisted in the QAing of medical testing equipment</li>
|
||||||
|
<li>Managed and instructed other IT staff in their daily responsibilities</li>
|
||||||
|
</ul>
|
||||||
|
<h3>MyTap, aka Which Craft — Lead Developer</h3>
|
||||||
|
<p class="dates"><em>January 2016 – April 2020 · Albuquerque, NM</em></p>
|
||||||
|
<p>At this small start up I worked in collaboration with a team of designers to create a craft beer recommendation engine that was based on web scraping and natural language processing of online beer reviews. This is where I got my first taste of what was to come with the power of Machine Learning and AI.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Implemented a robust web scraper in Python using the Scrapy python library</li>
|
||||||
|
<li>Created a responsive web application front end that functioned as a browser based phone application</li>
|
||||||
|
<li>Designed custom natural language processing code in python to create craft beer flavor profiles based on adjective frequency in craft beer review text.</li>
|
||||||
|
<li>Maintained a Django based web server backend to serve data from a PostgreSQL database backend</li>
|
||||||
|
</ul>
|
||||||
|
<h3>TriCore Reference Laboratories — Production Support Specialist</h3>
|
||||||
|
<p class="dates"><em>April 2013 – January 2017 · Albuquerque, NM</em></p>
|
||||||
|
<p>I worked as a technology specialist in the medical field, assisting multiple regional hospital staff with their daily technology needs, in the fast paced industry of health care. I would help with everything from urgent patient critical password resets, to troubleshooting of industry specific vertical applications like SunQuest, assisting in the retrieval of patient medical records and diagnostic information, while monitoring for performance and errors.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Being responsible on the nightshift for the entire company production environment. Usually supported by 60 staff during the day, I was solely responsible for monitoring, troubleshooting, and escalating issues to the appropriate parties at night.</li>
|
||||||
|
<li>Proficient in multiple industry specific vertical applications, monitoring the transmission of patient records between multiple hospital's varied medical record systems.</li>
|
||||||
|
<li>Walked medical staff through time sensitive, patient critical, IT related troubleshooting.</li>
|
||||||
|
<li>Monitored critical hospital infrastructure for performance and errors, correcting them promptly.</li>
|
||||||
|
<li>Trained new help desk employees on their daily tasks and responsibilities</li>
|
||||||
|
<li>Remained on-call off hours for emergency assistance.</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>Skills</h2>
|
||||||
|
<h3>Programming Languages</h3>
|
||||||
|
</div><p>Python (including Flask and Django frameworks), Go, PHP, NodeJS, C and C++, JavaScript (including jQuery and AngularJS), TypeScript, CoffeeScript, HTML5, CSS3, SASS</p>
|
||||||
|
<h3>Database Technologies</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>SQL:</strong> Microsoft SQL Server, MySQL Server, PostgreSQL Server</li>
|
||||||
|
<li><strong>NoSQL:</strong> MongoDB, CouchDB, Redis</li>
|
||||||
|
<li><strong>Other:</strong> Microsoft Access, Microsoft Excel</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Applications</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Programming:</strong> Microsoft Visual Studio, Visual Studio Code, PyCharm, Sublime Text 3, Devart dbForge, Microsoft SQL Studio, VIM, Eclipse, GIT</li>
|
||||||
|
<li><strong>Design:</strong> Adobe Photoshop, Adobe Dreamweaver, Adobe Illustrator, Adobe Edge, Adobe InDesign</li>
|
||||||
|
<li><strong>Productivity:</strong> Microsoft Office, Google Docs (Drive), WordPerfect Suite</li>
|
||||||
|
<li><strong>Virtualization:</strong> VMWare, VirtualBox, Docker, Kubernettes</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Cloud Technologies</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Microsoft 365 and Google Workspace Administration</li>
|
||||||
|
<li>Amazon Web Services Administration</li>
|
||||||
|
<li>Microsoft Azure DevOps Administration</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Other</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Jira Agile Project Management skills</li>
|
||||||
|
<li>Responsive Web design</li>
|
||||||
|
<li>Advanced (and remote) Linux administration</li>
|
||||||
|
<li>Search Engine Optimization for Google and Bing search engines</li>
|
||||||
|
<li>Social media presence implementation (Facebook, Twitter, Instagram, etc.)</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>Education</h2>
|
||||||
|
<h3>University of New Mexico</h3>
|
||||||
|
</div><h4>Certifications</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Beginning Programming in C++</li>
|
||||||
|
<li>Intermediate Programming in C++</li>
|
||||||
|
<li>Advanced Visual C++</li>
|
||||||
|
<li>Beginning Visual Basic</li>
|
||||||
|
<li>Intermediate Visual Basic</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Central New Mexico Community College (aka TVI)</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Beginning Photoshop</li>
|
||||||
|
<li>Intermediate Photoshop</li>
|
||||||
|
<li>Advanced Photoshop</li>
|
||||||
|
<li>Introduction to Lightwave 3D</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>References</h2>
|
||||||
|
<ul class="references"><li><strong>David Foy</strong> — <span>Senior Software Engineer</span> — <span>Covius</span>: <span><a href="tel:+14079541245">407-954-1245</a></span></li><li><strong>Warren Wright</strong> — <span>CEO</span> — <span>SEAD Software</span>: <span><a href="tel:+12019881513">201-988-1513</a></span></li><li><strong>Ashley Park</strong> — <span>Director</span> — <span>Clarity Diagnostics</span>: <span><a href="tel:+15083415387">508-341-5387</a></span></li><li><strong>Douglas Radecki</strong> — <span>CEO</span> — <span>MyTap / Which Craft</span>: <span><a href="tel:+15054004636">505-400-4636</a></span></li></ul></div></section></main></body></html>
|
||||||
Binary file not shown.
@@ -0,0 +1,202 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Alexander Herlan | Resume</title><style>
|
||||||
|
@page { size: Letter; margin: 50pt 55.5pt 50pt 57.75pt; }
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
html { background: #e8e8e8; }
|
||||||
|
body {
|
||||||
|
width: 612pt; margin: 24px auto; padding: 50pt 55.5pt 50pt 57.75pt;
|
||||||
|
background: white; color: #111; font: 10pt/1.2 Lato, Arial, sans-serif;
|
||||||
|
-webkit-print-color-adjust: exact; print-color-adjust: exact;
|
||||||
|
}
|
||||||
|
header { display: grid; grid-template-columns: 166.5pt 1fr; gap: 18pt;
|
||||||
|
min-height: 124pt; break-inside: avoid; }
|
||||||
|
h1, h2, h3, h5, .contact-name { font-family: Raleway, Arial, sans-serif; }
|
||||||
|
h1 { font-size: 24pt; line-height: 1.16; margin: 0 0 5pt; }
|
||||||
|
.subtitle { font-size: 16pt; font-weight: bold; line-height: 1.2;
|
||||||
|
color: #38761d; margin: 0; }
|
||||||
|
.subtitle > span { display: block; }
|
||||||
|
.gradient-word { white-space: nowrap; }
|
||||||
|
.contact { border-top: 3pt solid #000; padding-top: 9pt; }
|
||||||
|
.contact-name { font-size: 12pt; font-weight: bold; margin: 0 0 3pt; }
|
||||||
|
.contact p { margin: 0 0 7pt; }
|
||||||
|
.contact-grid { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr));
|
||||||
|
gap: 9pt 10pt; margin-top: 10pt; }
|
||||||
|
.contact-grid a { grid-column: span 2; display: block; min-width: 0;
|
||||||
|
border-left: 2pt solid #d6e7cb; padding-left: 7pt; font-size: 9pt;
|
||||||
|
line-height: 1.3; }
|
||||||
|
.contact-grid a.direct { grid-column: span 3; }
|
||||||
|
.contact-label { display: block; color: #72796d; font-size: 7pt;
|
||||||
|
letter-spacing: .8pt; text-transform: uppercase; margin-bottom: 2pt; }
|
||||||
|
.contact-value { display: inline-block; }
|
||||||
|
a { color: #38761d; text-decoration: none; overflow-wrap: anywhere; }
|
||||||
|
section { position: relative; margin: 0 0 18pt 184.5pt; }
|
||||||
|
.section-start { position: relative; border-top: 3pt solid #000;
|
||||||
|
padding-top: 10pt; break-inside: avoid; break-after: avoid; }
|
||||||
|
h2 { position: absolute; top: -3pt; left: -184.5pt; width: 166.5pt;
|
||||||
|
font-size: 12pt; line-height: 1.2; margin: 0; }
|
||||||
|
h2::before { content: ''; display: block; width: 12pt;
|
||||||
|
border-top: 1.5pt solid #111; margin-bottom: 12pt; }
|
||||||
|
h3 { font-size: 12pt; line-height: 1.2; margin: 16pt 0 4pt; }
|
||||||
|
.section-start > h3 { margin-top: 0; }
|
||||||
|
h4 { color: #666; font-size: 10pt; margin: 8pt 0 4pt; }
|
||||||
|
h5, h6 { font-size: 11pt; margin: 12pt 0 4pt; }
|
||||||
|
h3, h4, h5, h6 { break-after: avoid; }
|
||||||
|
p { margin: 0 0 6pt; orphans: 3; widows: 3; }
|
||||||
|
p.dates { color: #666; font-size: 9pt; text-transform: uppercase;
|
||||||
|
margin-bottom: 8pt; break-after: avoid; }
|
||||||
|
p.dates em { font-style: normal; }
|
||||||
|
ul, ol { margin: 4pt 0 8pt; padding-left: 35pt; }
|
||||||
|
li { padding-left: 0; margin-bottom: 2pt; orphans: 2; widows: 2; }
|
||||||
|
li > p { margin-bottom: 2pt; }
|
||||||
|
.references { list-style: none; padding: 0; }
|
||||||
|
.references li { margin-bottom: 6pt; break-inside: avoid; }
|
||||||
|
table { width: 100%; border-collapse: collapse; font-size: 9pt; }
|
||||||
|
th, td { text-align: left; vertical-align: top; padding: 4pt;
|
||||||
|
border-bottom: 1px solid #ddd; overflow-wrap: anywhere; }
|
||||||
|
tr { break-inside: avoid; }
|
||||||
|
img { max-width: 100%; }
|
||||||
|
pre { white-space: pre-wrap; overflow-wrap: anywhere; }
|
||||||
|
@media print {
|
||||||
|
html { background: white; }
|
||||||
|
body { width: auto; margin: 0; padding: 0; }
|
||||||
|
}
|
||||||
|
</style></head><body><header><div><h1>Alexander Herlan</h1>
|
||||||
|
<p class="subtitle"><span><span class="gradient-word"><span style="color:#286414">S</span><span style="color:#2c6818">e</span><span style="color:#316c1b">n</span><span style="color:#35701f">i</span><span style="color:#397423">o</span><span style="color:#3d7826">r</span></span> <span class="gradient-word"><span style="color:#46802e">S</span><span style="color:#4a8432">o</span><span style="color:#4e8835">f</span><span style="color:#538c39">t</span><span style="color:#57903d">w</span><span style="color:#5b9340">a</span><span style="color:#5f9744">r</span><span style="color:#649b48">e</span></span> <span class="gradient-word"><span style="color:#6ca34f">E</span><span style="color:#70a753">n</span><span style="color:#75ab57">g</span><span style="color:#79af5a">i</span><span style="color:#7db35e">n</span><span style="color:#81b762">e</span><span style="color:#86bb65">e</span><span style="color:#8abf69">r</span></span></span><span><span class="gradient-word"><span style="color:#286414">D</span><span style="color:#2d6919">e</span><span style="color:#336e1d">v</span><span style="color:#387322">O</span><span style="color:#3e7827">p</span><span style="color:#437d2c">s</span></span> <span class="gradient-word"><span style="color:#4e8735">&</span></span> <span class="gradient-word"><span style="color:#59923e">I</span><span style="color:#5e9743">T</span></span> <span class="gradient-word"><span style="color:#69a14d">M</span><span style="color:#6fa651">a</span><span style="color:#74ab56">n</span><span style="color:#7ab05b">a</span><span style="color:#7fb560">g</span><span style="color:#85ba64">e</span><span style="color:#8abf69">r</span></span></span></p></div><div class="contact"><p class="contact-name">Alexander Herlan</p><p>1207 El Portal NW, Albuquerque, NM 87107</p>
|
||||||
|
<nav class="contact-grid" aria-label="Contact and social links"><a href="tel:+18134028692" class="direct"><span class="contact-label">Phone</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">8</span><span style="color:#316c1c">1</span><span style="color:#3a7523">3</span><span style="color:#437d2b">-</span><span style="color:#4c8533">4</span><span style="color:#558d3b">0</span><span style="color:#5d9642">2</span><span style="color:#669e4a">-</span><span style="color:#6fa652">8</span><span style="color:#78ae5a">6</span><span style="color:#81b761">9</span><span style="color:#8abf69">2</span></span></span></a><a href="mailto:alexwherlan@gmail.com" class="direct"><span class="contact-label">Email</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">a</span><span style="color:#2d6918">l</span><span style="color:#326d1c">e</span><span style="color:#377221">x</span><span style="color:#3c7625">w</span><span style="color:#407b29">h</span><span style="color:#457f2e">e</span><span style="color:#4a8432">r</span><span style="color:#4f8836">l</span><span style="color:#548d3a">a</span><span style="color:#59923e">n</span><span style="color:#5e9643">@</span><span style="color:#639b47">g</span><span style="color:#689f4b">m</span><span style="color:#6da450">a</span><span style="color:#72a854">i</span><span style="color:#76ad58">l</span><span style="color:#7bb15c">.</span><span style="color:#80b660">c</span><span style="color:#85ba65">o</span><span style="color:#8abf69">m</span></span></span></a><a href="https://alex.herlan.dev"><span class="contact-label">Website</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">a</span><span style="color:#2f6a1a">l</span><span style="color:#367120">e</span><span style="color:#3d7826">x</span><span style="color:#447e2c">.</span><span style="color:#4b8432">h</span><span style="color:#528b38">e</span><span style="color:#59923e">r</span><span style="color:#609845">l</span><span style="color:#679e4b">a</span><span style="color:#6ea551">n</span><span style="color:#75ac57">.</span><span style="color:#7cb25d">d</span><span style="color:#83b863">e</span><span style="color:#8abf69">v</span></span></span></a><a href="https://linkedin.com/in/alexander-herlan"><span class="contact-label">Profile</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">L</span><span style="color:#367120">i</span><span style="color:#447e2c">n</span><span style="color:#528b38">k</span><span style="color:#609845">e</span><span style="color:#6ea551">d</span><span style="color:#7cb25d">I</span><span style="color:#8abf69">n</span></span></span></a><a href="https://github.com/AlexanderHerlan"><span class="contact-label">Code</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">G</span><span style="color:#3c7625">i</span><span style="color:#4f8836">t</span><span style="color:#639b47">H</span><span style="color:#76ad58">u</span><span style="color:#8abf69">b</span></span></span></a></nav></div></header><main><section><div class="section-start"><h2>Overview</h2>
|
||||||
|
<p>I am a passionate technophile with over 27 years of hands-on experience in software engineering, web design, database engineering, IT management, computer repair, and user experience design. My primary skills revolve around full-stack Python and Javascript development, with a focus on web application development.</p>
|
||||||
|
</div><p>Throughout my career I have constantly honed and expanded my skills with freelance work and side projects to stay up to date on the latest technologies. Lately this has brought me into the world of DevOps, Docker, Kubernetes, and advanced resource management across many systems, and also to begin to explore building Web3, Machine Learning and AI technologies into my work. I hope to take this unique perspective on software engineering into the future and help build the Web3 world of tomorrow that is slowly taking shape around us. My goal and dream is to apply my skills in a growth-oriented technology company that shares my enthusiasm and belief that the next big idea is always right around the corner.</p>
|
||||||
|
</section><section><div class="section-start"><h2>Experience</h2>
|
||||||
|
<h3>Independent Software Developer / Freelancer</h3>
|
||||||
|
</div><p class="dates"><em>June 2024 - Present</em></p>
|
||||||
|
<p>I develop web and mobile applications for long-term clients sourced through Upwork, agency partnerships, and professional referrals. Working directly with clients and distributed teams, I turn early-stage ideas and complex business requirements into production-ready software. I own projects from discovery and architecture through implementation, cloud deployment, feedback cycles, and ongoing support. Recent work spans membership management, AI-powered safety systems, and financial technology.</p>
|
||||||
|
<h4>Selected Projects</h4>
|
||||||
|
<h5><a href="https://iipm.ie">IIPM.ie</a></h5>
|
||||||
|
<p class="dates"><em>April 2025 - March 2026</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Developed a membership platform for the Irish Institute of Pensions Management through an Upwork engagement, collaborating with an Australia-based agency and Daniel Steven.</li>
|
||||||
|
<li>Expanded an initial set of WordPress landing pages into a larger PHP and PostgreSQL platform supporting individual and organisational membership applications, qualification requirements, annual payments, monthly course-progress reviews, and downloadable PDF certificates.</li>
|
||||||
|
<li>Built an administrative portal with statistical dashboards for membership, onboarding, qualifications, payments, and course progress. Automated programme-timeline calculations, approved-leave handling, certificate issuance, and several previously manual documentation workflows.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> WordPress, PHP, PostgreSQL</p>
|
||||||
|
<h5><a href="https://heroeyez.com">SafeSchoolz</a></h5>
|
||||||
|
<p class="dates"><em>June 2024 - June 2025</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Worked with David Gray, VP of Grays Communications in Los Angeles, to develop a safety platform that detects firearms and communicates potential incidents to first responders.</li>
|
||||||
|
<li>Built the Media Pipe and Aegis Android applications and integrated them with the existing .NET-based HeroEyez portal. Media Pipe detects firearms in device or IP-camera feeds; Aegis receives alerts with screenshots and a one-minute evidence clip, initiates a Twilio-powered call workflow, and forwards incident information to HeroEyez for monitoring and response coordination.</li>
|
||||||
|
<li>Evaluated YOLO before adopting TensorFlow Lite to improve object-detection accuracy within mobile hardware constraints. Trained and tested the model using more than 10,000 firearm images from Roboflow and custom-captured samples.</li>
|
||||||
|
<li>Completed the end-to-end alert workflow and deployed the application in June 2025. Broader commercial rollout was later paused because of market and regulatory constraints.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> Android, Java, Kotlin, object detection, TensorFlow Lite<br>
|
||||||
|
<strong>Source code:</strong> <a href="https://github.com/StormRunner06106/SS-MediaPipe">Media Pipe</a> · <a href="https://github.com/StormRunner06106/SS-Aegis">Aegis</a></p>
|
||||||
|
<h5><a href="https://equityfundingsource.com">Equity Funding Source</a></h5>
|
||||||
|
<p class="dates"><em>April 2026 - July 2026</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Built a mortgage-lending platform for a Los Angeles-based mortgage-loan broker, using Preact for a lightweight frontend and Bun for the backend.</li>
|
||||||
|
<li>Analyzed United States mortgage and private-lending workflows, including the forms and information exchanged throughout the loan process, to support borrower applications, lender collaboration, administrative oversight, and secure document handling.</li>
|
||||||
|
<li>Deployed the platform on Cloudflare using Workers for server-side execution, D1 for relational data, Durable Objects for real-time messaging, and R2 for document storage. Used AI-assisted development with Codex to accelerate implementation and iteration while maintaining system stability.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> Preact, Bun, Cloudflare Workers, Cloudflare D1, Durable Objects, Cloudflare R2</p>
|
||||||
|
<h3>Covius, LLC / Senior Software Engineer</h3>
|
||||||
|
<p class="dates"><em>January 2022 - April 2024 · Pompano Beach, FL</em></p>
|
||||||
|
<p>At Covius, a nationwide real estate technology and holdings company, I worked on the Senior Software Engineer's team of their RealtyBid.com unit, and helped bring a full redesign of the frontend and backend systems to reality. This real time, online, Real Estate Auction platform includes a modern REST API backend, modern responsive javascript powered front end, and many asynchronous feedback mechanisms, providing user's real time feedback about the current states of ongoing auctions. I was also responsible for building backend tools for the internal teams to use, so they can effectively administer the website and provider customer support with ease.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Participated in the complete redesign of a major legacy website, with tons of historical and legacy data</li>
|
||||||
|
<li>Helped manage and adapt a legacy database to a modern design</li>
|
||||||
|
<li>Created a responsive web application front end that functions just as well in a Desktop web browser as it does on a Phone</li>
|
||||||
|
<li>Refined the user experience with QA testers and business partners over many sprints and testing sessions utilizing effective communication</li>
|
||||||
|
<li>Utilized a modern technology stack including RxJS and Angular to keep the website ready for tomorrow</li>
|
||||||
|
</ul>
|
||||||
|
<h3>SEAD Software / Software Engineer</h3>
|
||||||
|
<p class="dates"><em>April 2021 - July 2022 · Delray Beach, FL</em></p>
|
||||||
|
<p>At SEAD Software I employ python and web development skills to design web applications and deliver business analytics for the healthcare industry and legal field. I also enriched company wide development operations by employing Azure DevOps and development pipelines to streamline team coordination.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Designed and implemented python code using Google's cloud based AI Computer Vision API to recognize and digitally categorize physical laboratory documents.</li>
|
||||||
|
<li>Developed text messaging web application to autonomously communicate and respond to customer interactions and generate leads for law firms using the Twilio API.</li>
|
||||||
|
<li>Maintained and implemented Amazon Web Services infrastructure to support multiple projects</li>
|
||||||
|
<li>Implemented and trained staff on Microsoft Azure DevOps development platform infrastructure</li>
|
||||||
|
<li>Maintained a large GIT code repository for multiple clients</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Clarity Diagnostics & Lab Solutions / Director of IT</h3>
|
||||||
|
<p class="dates"><em>September 2020 - January 2022 · Boca Raton, FL</em></p>
|
||||||
|
<p>Managed all IT needs and decision making for a boutique medical testing Laboratory and their Diagnostics test manufacturing business. Here I helped expand the company from its small sized roots to doing business with multiple outside entities across the country, including many local and state governments. I also managed software quality control, deployment and training for the company's sister company SEAD Software.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Implemented physical keycard/badge access security system for the entire laboratory facility</li>
|
||||||
|
<li>Implemented and maintained security standards for email and cloud based applications in Google Workspace and Microsoft 365</li>
|
||||||
|
<li>Maintained client facing websites</li>
|
||||||
|
<li>Expanded laboratory infrastructure and assisted in the QAing of medical testing equipment</li>
|
||||||
|
<li>Managed and instructed other IT staff in their daily responsibilities</li>
|
||||||
|
</ul>
|
||||||
|
<h3>MyTap, aka Which Craft / Lead Developer</h3>
|
||||||
|
<p class="dates"><em>January 2016 - April 2020 · Albuquerque, NM</em></p>
|
||||||
|
<p>At this small start up I worked in collaboration with a team of designers to create a craft beer recommendation engine that was based on web scraping and natural language processing of online beer reviews. This is where I got my first taste of what was to come with the power of Machine Learning and AI.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Implemented a robust web scraper in Python using the Scrapy python library</li>
|
||||||
|
<li>Created a responsive web application front end that functioned as a browser based phone application</li>
|
||||||
|
<li>Designed custom natural language processing code in python to create craft beer flavor profiles based on adjective frequency in craft beer review text.</li>
|
||||||
|
<li>Maintained a Django based web server backend to serve data from a PostgreSQL database backend</li>
|
||||||
|
</ul>
|
||||||
|
<h3>TriCore Reference Laboratories / Production Support Specialist</h3>
|
||||||
|
<p class="dates"><em>April 2013 - January 2017 · Albuquerque, NM</em></p>
|
||||||
|
<p>I worked as a technology specialist in the medical field, assisting multiple regional hospital staff with their daily technology needs, in the fast paced industry of health care. I would help with everything from urgent patient critical password resets, to troubleshooting of industry specific vertical applications like SunQuest, assisting in the retrieval of patient medical records and diagnostic information, while monitoring for performance and errors.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Being responsible on the nightshift for the entire company production environment. Usually supported by 60 staff during the day, I was solely responsible for monitoring, troubleshooting, and escalating issues to the appropriate parties at night.</li>
|
||||||
|
<li>Proficient in multiple industry specific vertical applications, monitoring the transmission of patient records between multiple hospital's varied medical record systems.</li>
|
||||||
|
<li>Walked medical staff through time sensitive, patient critical, IT related troubleshooting.</li>
|
||||||
|
<li>Monitored critical hospital infrastructure for performance and errors, correcting them promptly.</li>
|
||||||
|
<li>Trained new help desk employees on their daily tasks and responsibilities</li>
|
||||||
|
<li>Remained on-call off hours for emergency assistance.</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>Skills</h2>
|
||||||
|
<h3>Programming Languages</h3>
|
||||||
|
</div><p>Python (including Flask and Django frameworks), Go, PHP, NodeJS, C and C++, JavaScript (including jQuery and AngularJS), TypeScript, CoffeeScript, HTML5, CSS3, SASS</p>
|
||||||
|
<h3>Database Technologies</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>SQL:</strong> Microsoft SQL Server, MySQL Server, PostgreSQL Server</li>
|
||||||
|
<li><strong>NoSQL:</strong> MongoDB, CouchDB, Redis</li>
|
||||||
|
<li><strong>Other:</strong> Microsoft Access, Microsoft Excel</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Applications</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Programming:</strong> Microsoft Visual Studio, Visual Studio Code, PyCharm, Sublime Text 3, Devart dbForge, Microsoft SQL Studio, VIM, Eclipse, GIT</li>
|
||||||
|
<li><strong>Design:</strong> Adobe Photoshop, Adobe Dreamweaver, Adobe Illustrator, Adobe Edge, Adobe InDesign</li>
|
||||||
|
<li><strong>Productivity:</strong> Microsoft Office, Google Docs (Drive), WordPerfect Suite</li>
|
||||||
|
<li><strong>Virtualization:</strong> VMWare, VirtualBox, Docker, Kubernettes</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Cloud Technologies</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Microsoft 365 and Google Workspace Administration</li>
|
||||||
|
<li>Amazon Web Services Administration</li>
|
||||||
|
<li>Microsoft Azure DevOps Administration</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Other</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Jira Agile Project Management skills</li>
|
||||||
|
<li>Responsive Web design</li>
|
||||||
|
<li>Advanced (and remote) Linux administration</li>
|
||||||
|
<li>Search Engine Optimization for Google and Bing search engines</li>
|
||||||
|
<li>Social media presence implementation (Facebook, Twitter, Instagram, etc.)</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>Education</h2>
|
||||||
|
<h3>University of New Mexico</h3>
|
||||||
|
</div><h4>Certifications</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Beginning Programming in C++</li>
|
||||||
|
<li>Intermediate Programming in C++</li>
|
||||||
|
<li>Advanced Visual C++</li>
|
||||||
|
<li>Beginning Visual Basic</li>
|
||||||
|
<li>Intermediate Visual Basic</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Central New Mexico Community College (aka TVI)</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Beginning Photoshop</li>
|
||||||
|
<li>Intermediate Photoshop</li>
|
||||||
|
<li>Advanced Photoshop</li>
|
||||||
|
<li>Introduction to Lightwave 3D</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>References</h2>
|
||||||
|
<ul class="references"><li><strong>David Foy</strong> · <span>Senior Software Engineer</span> · <span>Covius</span>: <span><a href="tel:+14079541245">407-954-1245</a></span></li><li><strong>Warren Wright</strong> · <span>CEO</span> · <span>SEAD Software</span>: <span><a href="tel:+12019881513">201-988-1513</a></span></li><li><strong>Ashley Park</strong> · <span>Director</span> · <span>Clarity Diagnostics</span>: <span><a href="tel:+15083415387">508-341-5387</a></span></li><li><strong>Douglas Radecki</strong> · <span>CEO</span> · <span>MyTap / Which Craft</span>: <span><a href="tel:+15054004636">505-400-4636</a></span></li></ul></div></section></main></body></html>
|
||||||
Binary file not shown.
@@ -0,0 +1,203 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="source-sha256" content="8e09c7a1e129e734b89a227a168e28cdb8d4b4347eab04f5193bf62c8189d271"><title>Alexander Herlan | Resume</title><style>
|
||||||
|
@page { size: Letter; margin: 50pt 55.5pt 50pt 57.75pt; }
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
html { background: #e8e8e8; }
|
||||||
|
body {
|
||||||
|
width: 612pt; margin: 24px auto; padding: 50pt 55.5pt 50pt 57.75pt;
|
||||||
|
background: white; color: #111; font: 10pt/1.2 Lato, Arial, sans-serif;
|
||||||
|
-webkit-print-color-adjust: exact; print-color-adjust: exact;
|
||||||
|
}
|
||||||
|
header { display: grid; grid-template-columns: 166.5pt 1fr; gap: 18pt;
|
||||||
|
min-height: 124pt; break-inside: avoid; }
|
||||||
|
h1, h2, h3, h5, .contact-name { font-family: Raleway, Arial, sans-serif; }
|
||||||
|
h1 { font-size: 24pt; line-height: 1.16; margin: 0 0 5pt; }
|
||||||
|
.subtitle { font-size: 16pt; font-weight: bold; line-height: 1.2;
|
||||||
|
color: #38761d; margin: 0; }
|
||||||
|
.subtitle > span { display: block; }
|
||||||
|
.gradient-word { white-space: nowrap; }
|
||||||
|
.contact { border-top: 3pt solid #000; padding-top: 9pt; }
|
||||||
|
.contact-name { font-size: 12pt; font-weight: bold; margin: 0 0 3pt; }
|
||||||
|
.contact p { margin: 0 0 7pt; }
|
||||||
|
.contact-grid { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr));
|
||||||
|
gap: 9pt 10pt; margin-top: 10pt; }
|
||||||
|
.contact-grid a { grid-column: span 2; display: block; min-width: 0;
|
||||||
|
border-left: 2pt solid #d6e7cb; padding-left: 7pt; font-size: 9pt;
|
||||||
|
line-height: 1.3; }
|
||||||
|
.contact-grid a.direct { grid-column: span 3; }
|
||||||
|
.contact-label { display: block; color: #72796d; font-size: 7pt;
|
||||||
|
letter-spacing: .8pt; text-transform: uppercase; margin-bottom: 2pt; }
|
||||||
|
.contact-value { display: inline-block; }
|
||||||
|
a { color: #38761d; text-decoration: none; overflow-wrap: anywhere; }
|
||||||
|
section { position: relative; margin: 0 0 18pt 184.5pt; }
|
||||||
|
.section-start { position: relative; border-top: 3pt solid #000;
|
||||||
|
padding-top: 10pt; break-inside: avoid; break-after: avoid; }
|
||||||
|
h2 { position: absolute; top: -3pt; left: -184.5pt; width: 166.5pt;
|
||||||
|
font-size: 12pt; line-height: 1.2; margin: 0; }
|
||||||
|
h2::before { content: ''; display: block; width: 12pt;
|
||||||
|
border-top: 1.5pt solid #111; margin-bottom: 12pt; }
|
||||||
|
h3 { font-size: 12pt; line-height: 1.2; margin: 16pt 0 4pt; }
|
||||||
|
.section-start > h3 { margin-top: 0; }
|
||||||
|
h4 { color: #666; font-size: 10pt; margin: 8pt 0 4pt; }
|
||||||
|
h5, h6 { font-size: 11pt; margin: 12pt 0 4pt; }
|
||||||
|
h3, h4, h5, h6 { break-after: avoid; }
|
||||||
|
p { margin: 0 0 6pt; orphans: 3; widows: 3; }
|
||||||
|
p.dates { color: #666; font-size: 9pt; text-transform: uppercase;
|
||||||
|
margin-bottom: 8pt; break-after: avoid; }
|
||||||
|
p.dates em { font-style: normal; }
|
||||||
|
ul, ol { margin: 4pt 0 8pt; padding-left: 35pt; }
|
||||||
|
li { padding-left: 0; margin-bottom: 2pt; orphans: 2; widows: 2; }
|
||||||
|
li > p { margin-bottom: 2pt; }
|
||||||
|
.references { list-style: none; padding: 0; }
|
||||||
|
.references li { margin-bottom: 6pt; break-inside: avoid; }
|
||||||
|
table { width: 100%; border-collapse: collapse; font-size: 9pt; }
|
||||||
|
th, td { text-align: left; vertical-align: top; padding: 4pt;
|
||||||
|
border-bottom: 1px solid #ddd; overflow-wrap: anywhere; }
|
||||||
|
tr { break-inside: avoid; }
|
||||||
|
img { max-width: 100%; }
|
||||||
|
pre { white-space: pre-wrap; overflow-wrap: anywhere; }
|
||||||
|
@media print {
|
||||||
|
html { background: white; }
|
||||||
|
body { width: auto; margin: 0; padding: 0; }
|
||||||
|
}
|
||||||
|
</style></head><body><header><div><h1>Alexander Herlan</h1>
|
||||||
|
<p class="subtitle"><span><span class="gradient-word"><span style="color:#286414">S</span><span style="color:#2c6818">e</span><span style="color:#316c1b">n</span><span style="color:#35701f">i</span><span style="color:#397423">o</span><span style="color:#3d7826">r</span></span> <span class="gradient-word"><span style="color:#46802e">S</span><span style="color:#4a8432">o</span><span style="color:#4e8835">f</span><span style="color:#538c39">t</span><span style="color:#57903d">w</span><span style="color:#5b9340">a</span><span style="color:#5f9744">r</span><span style="color:#649b48">e</span></span> <span class="gradient-word"><span style="color:#6ca34f">E</span><span style="color:#70a753">n</span><span style="color:#75ab57">g</span><span style="color:#79af5a">i</span><span style="color:#7db35e">n</span><span style="color:#81b762">e</span><span style="color:#86bb65">e</span><span style="color:#8abf69">r</span></span></span><span><span class="gradient-word"><span style="color:#286414">D</span><span style="color:#2d6919">e</span><span style="color:#336e1d">v</span><span style="color:#387322">O</span><span style="color:#3e7827">p</span><span style="color:#437d2c">s</span></span> <span class="gradient-word"><span style="color:#4e8735">&</span></span> <span class="gradient-word"><span style="color:#59923e">I</span><span style="color:#5e9743">T</span></span> <span class="gradient-word"><span style="color:#69a14d">M</span><span style="color:#6fa651">a</span><span style="color:#74ab56">n</span><span style="color:#7ab05b">a</span><span style="color:#7fb560">g</span><span style="color:#85ba64">e</span><span style="color:#8abf69">r</span></span></span></p></div><div class="contact"><p class="contact-name">Alexander Herlan</p><p>1207 El Portal NW, Albuquerque, NM 87107</p>
|
||||||
|
<nav class="contact-grid" aria-label="Contact and social links"><a href="tel:+18134028692" class="direct"><span class="contact-label">Phone</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">8</span><span style="color:#316c1c">1</span><span style="color:#3a7523">3</span><span style="color:#437d2b">-</span><span style="color:#4c8533">4</span><span style="color:#558d3b">0</span><span style="color:#5d9642">2</span><span style="color:#669e4a">-</span><span style="color:#6fa652">8</span><span style="color:#78ae5a">6</span><span style="color:#81b761">9</span><span style="color:#8abf69">2</span></span></span></a><a href="mailto:alexwherlan@gmail.com" class="direct"><span class="contact-label">Email</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">a</span><span style="color:#2d6918">l</span><span style="color:#326d1c">e</span><span style="color:#377221">x</span><span style="color:#3c7625">w</span><span style="color:#407b29">h</span><span style="color:#457f2e">e</span><span style="color:#4a8432">r</span><span style="color:#4f8836">l</span><span style="color:#548d3a">a</span><span style="color:#59923e">n</span><span style="color:#5e9643">@</span><span style="color:#639b47">g</span><span style="color:#689f4b">m</span><span style="color:#6da450">a</span><span style="color:#72a854">i</span><span style="color:#76ad58">l</span><span style="color:#7bb15c">.</span><span style="color:#80b660">c</span><span style="color:#85ba65">o</span><span style="color:#8abf69">m</span></span></span></a><a href="https://alex.herlan.dev"><span class="contact-label">Website</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">a</span><span style="color:#2f6a1a">l</span><span style="color:#367120">e</span><span style="color:#3d7826">x</span><span style="color:#447e2c">.</span><span style="color:#4b8432">h</span><span style="color:#528b38">e</span><span style="color:#59923e">r</span><span style="color:#609845">l</span><span style="color:#679e4b">a</span><span style="color:#6ea551">n</span><span style="color:#75ac57">.</span><span style="color:#7cb25d">d</span><span style="color:#83b863">e</span><span style="color:#8abf69">v</span></span></span></a><a href="https://linkedin.com/in/alexander-herlan"><span class="contact-label">Profile</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">L</span><span style="color:#367120">i</span><span style="color:#447e2c">n</span><span style="color:#528b38">k</span><span style="color:#609845">e</span><span style="color:#6ea551">d</span><span style="color:#7cb25d">I</span><span style="color:#8abf69">n</span></span></span></a><a href="https://github.com/AlexanderHerlan"><span class="contact-label">Code</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">G</span><span style="color:#3c7625">i</span><span style="color:#4f8836">t</span><span style="color:#639b47">H</span><span style="color:#76ad58">u</span><span style="color:#8abf69">b</span></span></span></a></nav></div></header><main><section><div class="section-start"><h2>Overview</h2>
|
||||||
|
<p>Senior software engineer with over 27 years of hands-on technology experience spanning software engineering, web design, database engineering, IT management, computer repair, and user experience design. My primary focus is full-stack web application development with Python and JavaScript.</p>
|
||||||
|
</div><p>Through professional roles, freelance work, and side projects, I have expanded my skills in DevOps, Docker, Kubernetes, cloud deployment, and resource management. Recent projects include membership platforms, Android applications with machine learning and AI, and financial technology. I continue to explore Web3 and emerging technologies, and I am seeking a software engineering role where I can build reliable applications and contribute across the development lifecycle.</p>
|
||||||
|
</section><section><div class="section-start"><h2>Experience</h2>
|
||||||
|
<h3>Independent Software Developer / Freelancer</h3>
|
||||||
|
</div><p class="dates"><em>June 2024 - Present</em></p>
|
||||||
|
<p>I develop web and mobile applications for long-term clients sourced through Upwork, agency partnerships, and professional referrals. Working directly with clients and distributed teams, I turn early-stage ideas and complex business requirements into production-ready software. I own projects from discovery and architecture through implementation, cloud deployment, feedback cycles, and ongoing support. Recent work spans membership management, AI-powered safety systems, and financial technology.</p>
|
||||||
|
<h4>Selected Projects</h4>
|
||||||
|
<h5><a href="https://iipm.ie">IIPM.ie</a></h5>
|
||||||
|
<p class="dates"><em>April 2025 - March 2026</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Developed a membership platform for the Irish Institute of Pensions Management through an Upwork engagement, collaborating with an Australia-based agency and Daniel Steven.</li>
|
||||||
|
<li>Expanded an initial set of WordPress landing pages into a larger PHP and PostgreSQL platform supporting individual and organisational membership applications, qualification requirements, annual payments, monthly course-progress reviews, and downloadable PDF certificates.</li>
|
||||||
|
<li>Built an administrative portal with statistical dashboards for membership, onboarding, qualifications, payments, and course progress. Automated programme-timeline calculations, approved-leave handling, certificate issuance, and several previously manual documentation workflows.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> WordPress, PHP, PostgreSQL</p>
|
||||||
|
<h5><a href="https://heroeyez.com">SafeSchoolz</a></h5>
|
||||||
|
<p class="dates"><em>June 2024 - June 2025</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Worked with David Gray, VP of Grays Communications in Los Angeles, to develop a safety platform that detects firearms and communicates potential incidents to first responders.</li>
|
||||||
|
<li>Built the Media Pipe and Aegis Android applications and integrated them with the existing .NET-based HeroEyez portal. Media Pipe detects firearms in device or IP-camera feeds; Aegis receives alerts with screenshots and a one-minute evidence clip, initiates a Twilio-powered call workflow, and forwards incident information to HeroEyez for monitoring and response coordination.</li>
|
||||||
|
<li>Evaluated YOLO before adopting TensorFlow Lite to improve object-detection accuracy within mobile hardware constraints. Trained and tested the model using more than 10,000 firearm images from Roboflow and custom-captured samples.</li>
|
||||||
|
<li>Completed the end-to-end alert workflow and deployed the application in June 2025. Broader commercial rollout was later paused because of market and regulatory constraints.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> Android, Java, Kotlin, object detection, TensorFlow Lite<br>
|
||||||
|
<strong>Source code:</strong> <a href="https://github.com/StormRunner06106/SS-MediaPipe">Media Pipe</a> · <a href="https://github.com/StormRunner06106/SS-Aegis">Aegis</a></p>
|
||||||
|
<h5><a href="https://equityfundingsource.com">Equity Funding Source</a></h5>
|
||||||
|
<p class="dates"><em>April 2026 - July 2026</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Built a mortgage-lending platform for a Los Angeles-based mortgage-loan broker, using Preact for a lightweight frontend and Bun for the backend.</li>
|
||||||
|
<li>Analyzed United States mortgage and private-lending workflows, including the forms and information exchanged throughout the loan process, to support borrower applications, lender collaboration, administrative oversight, and secure document handling.</li>
|
||||||
|
<li>Deployed the platform on Cloudflare using Workers for server-side execution, D1 for relational data, Durable Objects for real-time messaging, and R2 for document storage. Used AI-assisted development with Codex to accelerate implementation and iteration while maintaining system stability.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> Preact, Bun, Cloudflare Workers, Cloudflare D1, Durable Objects, Cloudflare R2</p>
|
||||||
|
<h3>Covius, LLC / Senior Software Engineer</h3>
|
||||||
|
<p class="dates"><em>January 2022 - April 2024 · Pompano Beach, FL</em></p>
|
||||||
|
<p>At Covius, a nationwide real estate technology and holdings company, I contributed to the frontend and backend redesign of RealtyBid.com, an online real estate auction platform. The platform combined a REST API backend, a responsive JavaScript frontend, and asynchronous updates to provide users with real-time auction status. I also built internal tools for website administration and customer support.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Contributed to the complete redesign of a major legacy website containing extensive historical data.</li>
|
||||||
|
<li>Helped manage and adapt a legacy database to support the redesigned platform.</li>
|
||||||
|
<li>Built a responsive web application frontend for desktop and mobile browsers.</li>
|
||||||
|
<li>Refined the user experience with QA testers and business partners through iterative sprints and testing sessions.</li>
|
||||||
|
<li>Developed frontend functionality using Angular and RxJS.</li>
|
||||||
|
</ul>
|
||||||
|
<h3>SEAD Software / Software Engineer</h3>
|
||||||
|
<p class="dates"><em>April 2021 - July 2022 · Delray Beach, FL</em></p>
|
||||||
|
<p>At SEAD Software, I used Python and web development skills to build web applications and deliver business analytics for healthcare and legal clients. I also improved company-wide development operations with Azure DevOps and development pipelines to streamline team coordination.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Designed and implemented Python code using the Google Cloud Vision API to recognize and digitally categorize physical laboratory documents.</li>
|
||||||
|
<li>Developed a text messaging web application using the Twilio API to automate customer responses and generate leads for law firms.</li>
|
||||||
|
<li>Maintained and implemented Amazon Web Services infrastructure to support multiple projects</li>
|
||||||
|
<li>Implemented and trained staff on Microsoft Azure DevOps development platform infrastructure</li>
|
||||||
|
<li>Maintained a large Git code repository for multiple clients</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Clarity Diagnostics & Lab Solutions / Director of IT</h3>
|
||||||
|
<p class="dates"><em>September 2020 - January 2022 · Boca Raton, FL</em></p>
|
||||||
|
<p>Managed IT operations and technology decisions for a medical testing laboratory and diagnostics test manufacturing business. Supported the company's expansion to work with organizations nationwide, including local and state governments. I also managed software quality control, deployment, and training for its sister company, SEAD Software.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Implemented a physical keycard/badge access security system for the entire laboratory facility</li>
|
||||||
|
<li>Implemented and maintained security standards for email and cloud-based applications in Google Workspace and Microsoft 365</li>
|
||||||
|
<li>Maintained client-facing websites</li>
|
||||||
|
<li>Expanded laboratory infrastructure and assisted with quality assurance testing of medical equipment</li>
|
||||||
|
<li>Managed and instructed other IT staff in their daily responsibilities</li>
|
||||||
|
</ul>
|
||||||
|
<h3>MyTap, aka Which Craft / Lead Developer</h3>
|
||||||
|
<p class="dates"><em>January 2016 - April 2020 · Albuquerque, NM</em></p>
|
||||||
|
<p>At this startup, I collaborated with a team of designers to build a craft beer recommendation engine using web scraping and natural language processing (NLP) of online beer reviews. This work introduced me to practical applications of machine learning and AI.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Implemented a robust web scraper in Python using the Scrapy Python library</li>
|
||||||
|
<li>Created a responsive web application frontend for mobile browsers</li>
|
||||||
|
<li>Designed custom natural language processing code in Python to create craft beer flavor profiles based on adjective frequency in craft beer review text.</li>
|
||||||
|
<li>Maintained a Django backend serving data from a PostgreSQL database</li>
|
||||||
|
</ul>
|
||||||
|
<h3>TriCore Reference Laboratories / Production Support Specialist</h3>
|
||||||
|
<p class="dates"><em>April 2013 - January 2017 · Albuquerque, NM</em></p>
|
||||||
|
<p>Provided technology support to staff across multiple regional hospitals. Responsibilities included urgent password resets, troubleshooting healthcare applications such as Sunquest, retrieving patient medical records and diagnostic information, and monitoring systems for performance issues and errors.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Solely monitored and supported the company production environment overnight, handling troubleshooting and escalation for an environment supported by 60 staff during the day.</li>
|
||||||
|
<li>Monitored the transmission of patient records between hospitals using different medical record systems and healthcare applications.</li>
|
||||||
|
<li>Guided medical staff through time-sensitive IT troubleshooting affecting patient care.</li>
|
||||||
|
<li>Monitored critical hospital infrastructure for performance and errors, correcting them promptly.</li>
|
||||||
|
<li>Trained new help desk employees on their daily tasks and responsibilities</li>
|
||||||
|
<li>Remained on-call off hours for emergency assistance.</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>Skills</h2>
|
||||||
|
<h3>Programming Languages</h3>
|
||||||
|
</div><p>Python (Flask, Django), JavaScript (Node.js, jQuery, Angular, AngularJS, RxJS, Preact, Bun), TypeScript, Go, PHP, Java, Kotlin, C, C++, CoffeeScript, HTML5, CSS3, Sass</p>
|
||||||
|
<h3>Database Technologies</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>SQL:</strong> Microsoft SQL Server, MySQL Server, PostgreSQL Server</li>
|
||||||
|
<li><strong>NoSQL:</strong> MongoDB, CouchDB, Redis</li>
|
||||||
|
<li><strong>Other:</strong> Microsoft Access, Microsoft Excel</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Applications</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Programming:</strong> Microsoft Visual Studio, Visual Studio Code, PyCharm, Sublime Text 3, Devart dbForge, Microsoft SQL Studio, Vim, Eclipse, Git</li>
|
||||||
|
<li><strong>Design:</strong> Adobe Photoshop, Adobe Dreamweaver, Adobe Illustrator, Adobe Edge, Adobe InDesign</li>
|
||||||
|
<li><strong>Productivity:</strong> Microsoft Office, Google Docs (Drive), WordPerfect Suite</li>
|
||||||
|
<li><strong>Virtualization:</strong> VMware, VirtualBox, Docker, Kubernetes</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Cloud Technologies</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Microsoft 365 and Google Workspace Administration</li>
|
||||||
|
<li>Amazon Web Services (AWS) Administration</li>
|
||||||
|
<li>Microsoft Azure DevOps Administration</li>
|
||||||
|
<li>Cloudflare Workers, D1, Durable Objects, and R2</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Other</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Jira Agile Project Management skills</li>
|
||||||
|
<li>Responsive web design</li>
|
||||||
|
<li>Advanced (and remote) Linux administration</li>
|
||||||
|
<li>Search engine optimization (SEO) for Google and Bing</li>
|
||||||
|
<li>Social media presence implementation (Facebook, Twitter, Instagram, etc.)</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>Education</h2>
|
||||||
|
<h3>University of New Mexico</h3>
|
||||||
|
</div><h4>Certifications</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Beginning Programming in C++</li>
|
||||||
|
<li>Intermediate Programming in C++</li>
|
||||||
|
<li>Advanced Visual C++</li>
|
||||||
|
<li>Beginning Visual Basic</li>
|
||||||
|
<li>Intermediate Visual Basic</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Central New Mexico Community College (aka TVI)</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Beginning Photoshop</li>
|
||||||
|
<li>Intermediate Photoshop</li>
|
||||||
|
<li>Advanced Photoshop</li>
|
||||||
|
<li>Introduction to Lightwave 3D</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>References</h2>
|
||||||
|
<ul class="references"><li><strong>David Foy</strong> · <span>Senior Software Engineer</span> · <span>Covius</span>: <span><a href="tel:+14079541245">407-954-1245</a></span></li><li><strong>Warren Wright</strong> · <span>CEO</span> · <span>SEAD Software</span>: <span><a href="tel:+12019881513">201-988-1513</a></span></li><li><strong>Ashley Park</strong> · <span>Director</span> · <span>Clarity Diagnostics</span>: <span><a href="tel:+15083415387">508-341-5387</a></span></li><li><strong>Douglas Radecki</strong> · <span>CEO</span> · <span>MyTap / Which Craft</span>: <span><a href="tel:+15054004636">505-400-4636</a></span></li></ul></div></section></main></body></html>
|
||||||
Binary file not shown.
@@ -0,0 +1,202 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="source-sha256" content="a6c54489f6fcaad44e222538e4d34c0ab8453414897a0ea0c8bdf22e09e7c7f9"><title>Alexander Herlan | Resume</title><style>
|
||||||
|
@page { size: Letter; margin: 50pt 55.5pt 50pt 57.75pt; }
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
html { background: #e8e8e8; }
|
||||||
|
body {
|
||||||
|
width: 612pt; margin: 24px auto; padding: 50pt 55.5pt 50pt 57.75pt;
|
||||||
|
background: white; color: #111; font: 10pt/1.2 Lato, Arial, sans-serif;
|
||||||
|
-webkit-print-color-adjust: exact; print-color-adjust: exact;
|
||||||
|
}
|
||||||
|
header { display: grid; grid-template-columns: 166.5pt 1fr; gap: 18pt;
|
||||||
|
min-height: 124pt; break-inside: avoid; }
|
||||||
|
h1, h2, h3, h5, .contact-name { font-family: Raleway, Arial, sans-serif; }
|
||||||
|
h1 { font-size: 24pt; line-height: 1.16; margin: 0 0 5pt; }
|
||||||
|
.subtitle { font-size: 16pt; font-weight: bold; line-height: 1.2;
|
||||||
|
color: #38761d; margin: 0; }
|
||||||
|
.subtitle > span { display: block; }
|
||||||
|
.gradient-word { white-space: nowrap; }
|
||||||
|
.contact { border-top: 3pt solid #000; padding-top: 9pt; }
|
||||||
|
.contact-name { font-size: 12pt; font-weight: bold; margin: 0 0 3pt; }
|
||||||
|
.contact p { margin: 0 0 7pt; }
|
||||||
|
.contact-grid { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr));
|
||||||
|
gap: 9pt 10pt; margin-top: 10pt; }
|
||||||
|
.contact-grid a { grid-column: span 2; display: block; min-width: 0;
|
||||||
|
border-left: 2pt solid #d6e7cb; padding-left: 7pt; font-size: 9pt;
|
||||||
|
line-height: 1.3; }
|
||||||
|
.contact-grid a.direct { grid-column: span 3; }
|
||||||
|
.contact-label { display: block; color: #72796d; font-size: 7pt;
|
||||||
|
letter-spacing: .8pt; text-transform: uppercase; margin-bottom: 2pt; }
|
||||||
|
.contact-value { display: inline-block; }
|
||||||
|
a { color: #38761d; text-decoration: none; overflow-wrap: anywhere; }
|
||||||
|
section { position: relative; margin: 0 0 18pt 184.5pt; }
|
||||||
|
.section-start { position: relative; border-top: 3pt solid #000;
|
||||||
|
padding-top: 10pt; break-inside: avoid; break-after: avoid; }
|
||||||
|
h2 { position: absolute; top: -3pt; left: -184.5pt; width: 166.5pt;
|
||||||
|
font-size: 12pt; line-height: 1.2; margin: 0; }
|
||||||
|
h2::before { content: ''; display: block; width: 12pt;
|
||||||
|
border-top: 1.5pt solid #111; margin-bottom: 12pt; }
|
||||||
|
h3 { font-size: 12pt; line-height: 1.2; margin: 16pt 0 4pt; }
|
||||||
|
.section-start > h3 { margin-top: 0; }
|
||||||
|
h4 { color: #666; font-size: 10pt; margin: 8pt 0 4pt; }
|
||||||
|
h5, h6 { font-size: 11pt; margin: 12pt 0 4pt; }
|
||||||
|
h3, h4, h5, h6 { break-after: avoid; }
|
||||||
|
p { margin: 0 0 6pt; orphans: 3; widows: 3; }
|
||||||
|
p.dates { color: #666; font-size: 9pt; text-transform: uppercase;
|
||||||
|
margin-bottom: 8pt; break-after: avoid; }
|
||||||
|
p.dates em { font-style: normal; }
|
||||||
|
ul, ol { margin: 4pt 0 8pt; padding-left: 35pt; }
|
||||||
|
li { padding-left: 0; margin-bottom: 2pt; orphans: 2; widows: 2; }
|
||||||
|
li > p { margin-bottom: 2pt; }
|
||||||
|
.references { list-style: none; padding: 0; }
|
||||||
|
.references li { margin-bottom: 6pt; break-inside: avoid; }
|
||||||
|
table { width: 100%; border-collapse: collapse; font-size: 9pt; }
|
||||||
|
th, td { text-align: left; vertical-align: top; padding: 4pt;
|
||||||
|
border-bottom: 1px solid #ddd; overflow-wrap: anywhere; }
|
||||||
|
tr { break-inside: avoid; }
|
||||||
|
img { max-width: 100%; }
|
||||||
|
pre { white-space: pre-wrap; overflow-wrap: anywhere; }
|
||||||
|
@media print {
|
||||||
|
html { background: white; }
|
||||||
|
body { width: auto; margin: 0; padding: 0; }
|
||||||
|
}
|
||||||
|
</style></head><body><header><div><h1>Alexander Herlan</h1>
|
||||||
|
<p class="subtitle"><span><span class="gradient-word"><span style="color:#286414">S</span><span style="color:#2c6818">e</span><span style="color:#316c1b">n</span><span style="color:#35701f">i</span><span style="color:#397423">o</span><span style="color:#3d7826">r</span></span> <span class="gradient-word"><span style="color:#46802e">S</span><span style="color:#4a8432">o</span><span style="color:#4e8835">f</span><span style="color:#538c39">t</span><span style="color:#57903d">w</span><span style="color:#5b9340">a</span><span style="color:#5f9744">r</span><span style="color:#649b48">e</span></span> <span class="gradient-word"><span style="color:#6ca34f">E</span><span style="color:#70a753">n</span><span style="color:#75ab57">g</span><span style="color:#79af5a">i</span><span style="color:#7db35e">n</span><span style="color:#81b762">e</span><span style="color:#86bb65">e</span><span style="color:#8abf69">r</span></span></span><span><span class="gradient-word"><span style="color:#286414">D</span><span style="color:#2d6919">e</span><span style="color:#336e1d">v</span><span style="color:#387322">O</span><span style="color:#3e7827">p</span><span style="color:#437d2c">s</span></span> <span class="gradient-word"><span style="color:#4e8735">&</span></span> <span class="gradient-word"><span style="color:#59923e">I</span><span style="color:#5e9743">T</span></span> <span class="gradient-word"><span style="color:#69a14d">M</span><span style="color:#6fa651">a</span><span style="color:#74ab56">n</span><span style="color:#7ab05b">a</span><span style="color:#7fb560">g</span><span style="color:#85ba64">e</span><span style="color:#8abf69">r</span></span></span></p></div><div class="contact"><p class="contact-name">Alexander Herlan</p><p>1207 El Portal NW, Albuquerque, NM 87107</p>
|
||||||
|
<nav class="contact-grid" aria-label="Contact and social links"><a href="tel:+18134028692" class="direct"><span class="contact-label">Phone</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">8</span><span style="color:#316c1c">1</span><span style="color:#3a7523">3</span><span style="color:#437d2b">-</span><span style="color:#4c8533">4</span><span style="color:#558d3b">0</span><span style="color:#5d9642">2</span><span style="color:#669e4a">-</span><span style="color:#6fa652">8</span><span style="color:#78ae5a">6</span><span style="color:#81b761">9</span><span style="color:#8abf69">2</span></span></span></a><a href="mailto:alexwherlan@gmail.com" class="direct"><span class="contact-label">Email</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">a</span><span style="color:#2d6918">l</span><span style="color:#326d1c">e</span><span style="color:#377221">x</span><span style="color:#3c7625">w</span><span style="color:#407b29">h</span><span style="color:#457f2e">e</span><span style="color:#4a8432">r</span><span style="color:#4f8836">l</span><span style="color:#548d3a">a</span><span style="color:#59923e">n</span><span style="color:#5e9643">@</span><span style="color:#639b47">g</span><span style="color:#689f4b">m</span><span style="color:#6da450">a</span><span style="color:#72a854">i</span><span style="color:#76ad58">l</span><span style="color:#7bb15c">.</span><span style="color:#80b660">c</span><span style="color:#85ba65">o</span><span style="color:#8abf69">m</span></span></span></a><a href="https://alex.herlan.dev"><span class="contact-label">Website</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">a</span><span style="color:#2f6a1a">l</span><span style="color:#367120">e</span><span style="color:#3d7826">x</span><span style="color:#447e2c">.</span><span style="color:#4b8432">h</span><span style="color:#528b38">e</span><span style="color:#59923e">r</span><span style="color:#609845">l</span><span style="color:#679e4b">a</span><span style="color:#6ea551">n</span><span style="color:#75ac57">.</span><span style="color:#7cb25d">d</span><span style="color:#83b863">e</span><span style="color:#8abf69">v</span></span></span></a><a href="https://linkedin.com/in/alexander-herlan"><span class="contact-label">Profile</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">L</span><span style="color:#367120">i</span><span style="color:#447e2c">n</span><span style="color:#528b38">k</span><span style="color:#609845">e</span><span style="color:#6ea551">d</span><span style="color:#7cb25d">I</span><span style="color:#8abf69">n</span></span></span></a><a href="https://github.com/AlexanderHerlan"><span class="contact-label">Code</span><span class="contact-value"><span class="gradient-word"><span style="color:#286414">G</span><span style="color:#3c7625">i</span><span style="color:#4f8836">t</span><span style="color:#639b47">H</span><span style="color:#76ad58">u</span><span style="color:#8abf69">b</span></span></span></a></nav></div></header><main><section><div class="section-start"><h2>Overview</h2>
|
||||||
|
<p>Senior software engineer with over 27 years of hands-on technology experience spanning software engineering, web design, database engineering, IT management, computer repair, and user experience design. My primary focus is full-stack web application development with Python and JavaScript.</p>
|
||||||
|
</div><p>Through professional roles, freelance work, and side projects, I have expanded my skills in DevOps, Docker, Kubernetes, cloud deployment, and resource management. Recent projects include membership platforms, Android applications with machine learning and AI, and financial technology. I continue to explore Web3 and emerging technologies, and I am seeking a software engineering role where I can build reliable applications and contribute across the development lifecycle.</p>
|
||||||
|
</section><section><div class="section-start"><h2>Experience</h2>
|
||||||
|
<h3>Independent Software Developer / Freelancer</h3>
|
||||||
|
</div><p class="dates"><em>June 2024 - Present</em></p>
|
||||||
|
<p>I develop web and mobile applications for long-term clients sourced through Upwork, agency partnerships, and professional referrals. Working directly with clients and distributed teams, I turn early-stage ideas and complex business requirements into production-ready software. I own projects from discovery and architecture through implementation, cloud deployment, feedback cycles, and ongoing support. Recent work spans membership management, AI-powered safety systems, and financial technology.</p>
|
||||||
|
<h4>Selected Projects</h4>
|
||||||
|
<h5><a href="https://iipm.ie">IIPM.ie</a></h5>
|
||||||
|
<p class="dates"><em>April 2025 - March 2026</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Developed a membership platform for the Irish Institute of Pensions Management through an Upwork engagement, collaborating with an Australia-based agency and Daniel Steven.</li>
|
||||||
|
<li>Expanded an initial set of WordPress landing pages into a larger PHP and PostgreSQL platform supporting individual and organisational membership applications, qualification requirements, annual payments, monthly course-progress reviews, and downloadable PDF certificates.</li>
|
||||||
|
<li>Built an administrative portal with statistical dashboards for membership, onboarding, qualifications, payments, and course progress. Automated programme-timeline calculations, approved-leave handling, certificate issuance, and several previously manual documentation workflows.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> WordPress, PHP, PostgreSQL</p>
|
||||||
|
<h5><a href="https://heroeyez.com">SafeSchoolz</a></h5>
|
||||||
|
<p class="dates"><em>June 2024 - June 2025</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Worked with David Gray, VP of Grays Communications in Los Angeles, to develop a safety platform that detects firearms and communicates potential incidents to first responders.</li>
|
||||||
|
<li>Built the Media Pipe and Aegis Android applications and integrated them with the existing .NET-based HeroEyez portal. Media Pipe detects firearms in device or IP-camera feeds; Aegis receives alerts with screenshots and a one-minute evidence clip, initiates a Twilio-powered call workflow, and forwards incident information to HeroEyez for monitoring and response coordination.</li>
|
||||||
|
<li>Evaluated YOLO before adopting TensorFlow Lite to improve object-detection accuracy within mobile hardware constraints. Trained and tested the model using more than 10,000 firearm images from Roboflow and custom-captured samples.</li>
|
||||||
|
<li>Completed the end-to-end alert workflow and deployed the application in June 2025. Broader commercial rollout was later paused because of market and regulatory constraints.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> Android, Java, Kotlin, object detection, TensorFlow Lite</p>
|
||||||
|
<h5><a href="https://equityfundingsource.com">Equity Funding Source</a></h5>
|
||||||
|
<p class="dates"><em>April 2026 - July 2026</em></p>
|
||||||
|
<ul>
|
||||||
|
<li>Built a mortgage-lending platform for a Los Angeles-based mortgage-loan broker, using Preact for a lightweight frontend and Bun for the backend.</li>
|
||||||
|
<li>Analyzed United States mortgage and private-lending workflows, including the forms and information exchanged throughout the loan process, to support borrower applications, lender collaboration, administrative oversight, and secure document handling.</li>
|
||||||
|
<li>Deployed the platform on Cloudflare using Workers for server-side execution, D1 for relational data, Durable Objects for real-time messaging, and R2 for document storage. Used AI-assisted development with Codex to accelerate implementation and iteration while maintaining system stability.</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Technologies:</strong> Preact, Bun, Cloudflare Workers, Cloudflare D1, Durable Objects, Cloudflare R2</p>
|
||||||
|
<h3>Covius, LLC / Senior Software Engineer</h3>
|
||||||
|
<p class="dates"><em>January 2022 - April 2024 · Pompano Beach, FL</em></p>
|
||||||
|
<p>At Covius, a nationwide real estate technology and holdings company, I contributed to the frontend and backend redesign of RealtyBid.com, an online real estate auction platform. The platform combined a REST API backend, a responsive JavaScript frontend, and asynchronous updates to provide users with real-time auction status. I also built internal tools for website administration and customer support.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Contributed to the complete redesign of a major legacy website containing extensive historical data.</li>
|
||||||
|
<li>Helped manage and adapt a legacy database to support the redesigned platform.</li>
|
||||||
|
<li>Built a responsive web application frontend for desktop and mobile browsers.</li>
|
||||||
|
<li>Refined the user experience with QA testers and business partners through iterative sprints and testing sessions.</li>
|
||||||
|
<li>Developed frontend functionality using Angular and RxJS.</li>
|
||||||
|
</ul>
|
||||||
|
<h3>SEAD Software / Software Engineer</h3>
|
||||||
|
<p class="dates"><em>April 2021 - July 2022 · Delray Beach, FL</em></p>
|
||||||
|
<p>At SEAD Software, I used Python and web development skills to build web applications and deliver business analytics for healthcare and legal clients. I also improved company-wide development operations with Azure DevOps and development pipelines to streamline team coordination.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Designed and implemented Python code using the Google Cloud Vision API to recognize and digitally categorize physical laboratory documents.</li>
|
||||||
|
<li>Developed a text messaging web application using the Twilio API to automate customer responses and generate leads for law firms.</li>
|
||||||
|
<li>Maintained and implemented Amazon Web Services infrastructure to support multiple projects</li>
|
||||||
|
<li>Implemented and trained staff on Microsoft Azure DevOps development platform infrastructure</li>
|
||||||
|
<li>Maintained a large Git code repository for multiple clients</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Clarity Diagnostics & Lab Solutions / Director of IT</h3>
|
||||||
|
<p class="dates"><em>September 2020 - January 2022 · Boca Raton, FL</em></p>
|
||||||
|
<p>Managed IT operations and technology decisions for a medical testing laboratory and diagnostics test manufacturing business. Supported the company's expansion to work with organizations nationwide, including local and state governments. I also managed software quality control, deployment, and training for its sister company, SEAD Software.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Implemented a physical keycard/badge access security system for the entire laboratory facility</li>
|
||||||
|
<li>Implemented and maintained security standards for email and cloud-based applications in Google Workspace and Microsoft 365</li>
|
||||||
|
<li>Maintained client-facing websites</li>
|
||||||
|
<li>Expanded laboratory infrastructure and assisted with quality assurance testing of medical equipment</li>
|
||||||
|
<li>Managed and instructed other IT staff in their daily responsibilities</li>
|
||||||
|
</ul>
|
||||||
|
<h3>MyTap, aka Which Craft / Lead Developer</h3>
|
||||||
|
<p class="dates"><em>January 2016 - April 2020 · Albuquerque, NM</em></p>
|
||||||
|
<p>At this startup, I collaborated with a team of designers to build a craft beer recommendation engine using web scraping and natural language processing (NLP) of online beer reviews. This work introduced me to practical applications of machine learning and AI.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Implemented a robust web scraper in Python using the Scrapy Python library</li>
|
||||||
|
<li>Created a responsive web application frontend for mobile browsers</li>
|
||||||
|
<li>Designed custom natural language processing code in Python to create craft beer flavor profiles based on adjective frequency in craft beer review text.</li>
|
||||||
|
<li>Maintained a Django backend serving data from a PostgreSQL database</li>
|
||||||
|
</ul>
|
||||||
|
<h3>TriCore Reference Laboratories / Production Support Specialist</h3>
|
||||||
|
<p class="dates"><em>April 2013 - January 2017 · Albuquerque, NM</em></p>
|
||||||
|
<p>Provided technology support to staff across multiple regional hospitals. Responsibilities included urgent password resets, troubleshooting healthcare applications such as Sunquest, retrieving patient medical records and diagnostic information, and monitoring systems for performance issues and errors.</p>
|
||||||
|
<h4>Accomplishments</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Solely monitored and supported the company production environment overnight, handling troubleshooting and escalation for an environment supported by 60 staff during the day.</li>
|
||||||
|
<li>Monitored the transmission of patient records between hospitals using different medical record systems and healthcare applications.</li>
|
||||||
|
<li>Guided medical staff through time-sensitive IT troubleshooting affecting patient care.</li>
|
||||||
|
<li>Monitored critical hospital infrastructure for performance and errors, correcting them promptly.</li>
|
||||||
|
<li>Trained new help desk employees on their daily tasks and responsibilities</li>
|
||||||
|
<li>Remained on-call off hours for emergency assistance.</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>Skills</h2>
|
||||||
|
<h3>Programming Languages</h3>
|
||||||
|
</div><p>Python (Flask, Django), JavaScript (Node.js, jQuery, Angular, AngularJS, RxJS, Preact, Bun), TypeScript, Go, PHP, Java, Kotlin, C, C++, CoffeeScript, HTML5, CSS3, Sass</p>
|
||||||
|
<h3>Database Technologies</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>SQL:</strong> Microsoft SQL Server, MySQL Server, PostgreSQL Server</li>
|
||||||
|
<li><strong>NoSQL:</strong> MongoDB, CouchDB, Redis</li>
|
||||||
|
<li><strong>Other:</strong> Microsoft Access, Microsoft Excel</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Applications</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Programming:</strong> Microsoft Visual Studio, Visual Studio Code, PyCharm, Sublime Text 3, Devart dbForge, Microsoft SQL Studio, Vim, Eclipse, Git</li>
|
||||||
|
<li><strong>Design:</strong> Adobe Photoshop, Adobe Dreamweaver, Adobe Illustrator, Adobe Edge, Adobe InDesign</li>
|
||||||
|
<li><strong>Productivity:</strong> Microsoft Office, Google Docs (Drive), WordPerfect Suite</li>
|
||||||
|
<li><strong>Virtualization:</strong> VMware, VirtualBox, Docker, Kubernetes</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Cloud Technologies</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Microsoft 365 and Google Workspace Administration</li>
|
||||||
|
<li>Amazon Web Services (AWS) Administration</li>
|
||||||
|
<li>Microsoft Azure DevOps Administration</li>
|
||||||
|
<li>Cloudflare Workers, D1, Durable Objects, and R2</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Other</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Jira Agile Project Management skills</li>
|
||||||
|
<li>Responsive web design</li>
|
||||||
|
<li>Advanced (and remote) Linux administration</li>
|
||||||
|
<li>Search engine optimization (SEO) for Google and Bing</li>
|
||||||
|
<li>Social media presence implementation (Facebook, Twitter, Instagram, etc.)</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>Education</h2>
|
||||||
|
<h3>University of New Mexico</h3>
|
||||||
|
</div><h4>Certifications</h4>
|
||||||
|
<ul>
|
||||||
|
<li>Beginning Programming in C++</li>
|
||||||
|
<li>Intermediate Programming in C++</li>
|
||||||
|
<li>Advanced Visual C++</li>
|
||||||
|
<li>Beginning Visual Basic</li>
|
||||||
|
<li>Intermediate Visual Basic</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Central New Mexico Community College (aka TVI)</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Beginning Photoshop</li>
|
||||||
|
<li>Intermediate Photoshop</li>
|
||||||
|
<li>Advanced Photoshop</li>
|
||||||
|
<li>Introduction to Lightwave 3D</li>
|
||||||
|
</ul>
|
||||||
|
</section><section><div class="section-start"><h2>References</h2>
|
||||||
|
<ul class="references"><li><strong>David Foy</strong> · <span>Senior Software Engineer</span> · <span>Covius</span>: <span><a href="tel:+14079541245">407-954-1245</a></span></li><li><strong>Warren Wright</strong> · <span>CEO</span> · <span>SEAD Software</span>: <span><a href="tel:+12019881513">201-988-1513</a></span></li><li><strong>Ashley Park</strong> · <span>Director</span> · <span>Clarity Diagnostics</span>: <span><a href="tel:+15083415387">508-341-5387</a></span></li><li><strong>Douglas Radecki</strong> · <span>CEO</span> · <span>MyTap / Which Craft</span>: <span><a href="tel:+15054004636">505-400-4636</a></span></li></ul></div></section></main></body></html>
|
||||||
Binary file not shown.
@@ -0,0 +1,300 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# /// script
|
||||||
|
# requires-python = ">=3.10"
|
||||||
|
# dependencies = ["Markdown==3.10.3", "playwright==1.62.0"]
|
||||||
|
# ///
|
||||||
|
"""Generate a versioned HTML/PDF resume pair from Markdown.
|
||||||
|
|
||||||
|
Install: python -m pip install Markdown==3.10.3 playwright==1.62.0
|
||||||
|
python -m playwright install chromium
|
||||||
|
Run: python scripts/generate_resume.py
|
||||||
|
python scripts/generate_resume.py --version 2026-09 --browser msedge
|
||||||
|
|
||||||
|
The template and print styles live in this file. The original PDF is a layout
|
||||||
|
reference only; all generated resume content comes from the Markdown input.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
from copy import deepcopy
|
||||||
|
from html import escape
|
||||||
|
import hashlib
|
||||||
|
from pathlib import Path
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
import tempfile
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
DEFAULT_SOURCE = ROOT / "Alexander Herlan Resume 2024.md"
|
||||||
|
CSS = """
|
||||||
|
@page { size: Letter; margin: 50pt 55.5pt 50pt 57.75pt; }
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
html { background: #e8e8e8; }
|
||||||
|
body {
|
||||||
|
width: 612pt; margin: 24px auto; padding: 50pt 55.5pt 50pt 57.75pt;
|
||||||
|
background: white; color: #111; font: 10pt/1.2 Lato, Arial, sans-serif;
|
||||||
|
-webkit-print-color-adjust: exact; print-color-adjust: exact;
|
||||||
|
}
|
||||||
|
header { display: grid; grid-template-columns: 166.5pt 1fr; gap: 18pt;
|
||||||
|
min-height: 124pt; break-inside: avoid; }
|
||||||
|
h1, h2, h3, h5, .contact-name { font-family: Raleway, Arial, sans-serif; }
|
||||||
|
h1 { font-size: 24pt; line-height: 1.16; margin: 0 0 5pt; }
|
||||||
|
.subtitle { font-size: 16pt; font-weight: bold; line-height: 1.2;
|
||||||
|
color: #38761d; margin: 0; }
|
||||||
|
.subtitle > span { display: block; }
|
||||||
|
.gradient-word { white-space: nowrap; }
|
||||||
|
.contact { border-top: 3pt solid #000; padding-top: 9pt; }
|
||||||
|
.contact-name { font-size: 12pt; font-weight: bold; margin: 0 0 3pt; }
|
||||||
|
.contact p { margin: 0 0 7pt; }
|
||||||
|
.contact-grid { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr));
|
||||||
|
gap: 9pt 10pt; margin-top: 10pt; }
|
||||||
|
.contact-grid a { grid-column: span 2; display: block; min-width: 0;
|
||||||
|
border-left: 2pt solid #d6e7cb; padding-left: 7pt; font-size: 9pt;
|
||||||
|
line-height: 1.3; }
|
||||||
|
.contact-grid a.direct { grid-column: span 3; }
|
||||||
|
.contact-label { display: block; color: #72796d; font-size: 7pt;
|
||||||
|
letter-spacing: .8pt; text-transform: uppercase; margin-bottom: 2pt; }
|
||||||
|
.contact-value { display: inline-block; }
|
||||||
|
a { color: #38761d; text-decoration: none; overflow-wrap: anywhere; }
|
||||||
|
section { position: relative; margin: 0 0 18pt 184.5pt; }
|
||||||
|
.section-start { position: relative; border-top: 3pt solid #000;
|
||||||
|
padding-top: 10pt; break-inside: avoid; break-after: avoid; }
|
||||||
|
h2 { position: absolute; top: -3pt; left: -184.5pt; width: 166.5pt;
|
||||||
|
font-size: 12pt; line-height: 1.2; margin: 0; }
|
||||||
|
h2::before { content: ''; display: block; width: 12pt;
|
||||||
|
border-top: 1.5pt solid #111; margin-bottom: 12pt; }
|
||||||
|
h3 { font-size: 12pt; line-height: 1.2; margin: 16pt 0 4pt; }
|
||||||
|
.section-start > h3 { margin-top: 0; }
|
||||||
|
h4 { color: #666; font-size: 10pt; margin: 8pt 0 4pt; }
|
||||||
|
h5, h6 { font-size: 11pt; margin: 12pt 0 4pt; }
|
||||||
|
h3, h4, h5, h6 { break-after: avoid; }
|
||||||
|
p { margin: 0 0 6pt; orphans: 3; widows: 3; }
|
||||||
|
p.dates { color: #666; font-size: 9pt; text-transform: uppercase;
|
||||||
|
margin-bottom: 8pt; break-after: avoid; }
|
||||||
|
p.dates em { font-style: normal; }
|
||||||
|
ul, ol { margin: 4pt 0 8pt; padding-left: 35pt; }
|
||||||
|
li { padding-left: 0; margin-bottom: 2pt; orphans: 2; widows: 2; }
|
||||||
|
li > p { margin-bottom: 2pt; }
|
||||||
|
.references { list-style: none; padding: 0; }
|
||||||
|
.references li { margin-bottom: 6pt; break-inside: avoid; }
|
||||||
|
table { width: 100%; border-collapse: collapse; font-size: 9pt; }
|
||||||
|
th, td { text-align: left; vertical-align: top; padding: 4pt;
|
||||||
|
border-bottom: 1px solid #ddd; overflow-wrap: anywhere; }
|
||||||
|
tr { break-inside: avoid; }
|
||||||
|
img { max-width: 100%; }
|
||||||
|
pre { white-space: pre-wrap; overflow-wrap: anywhere; }
|
||||||
|
@media print {
|
||||||
|
html { background: white; }
|
||||||
|
body { width: auto; margin: 0; padding: 0; }
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def serialize(element):
|
||||||
|
return ET.tostring(element, encoding="unicode", method="html")
|
||||||
|
|
||||||
|
|
||||||
|
def gradient_text(text: str) -> str:
|
||||||
|
"""Use colored text runs so gradients print cleanly and remain selectable."""
|
||||||
|
start, end = (40, 100, 20), (138, 191, 105)
|
||||||
|
result = []
|
||||||
|
offset = 0
|
||||||
|
for word in re.split(r"(\s+)", text):
|
||||||
|
if word.isspace():
|
||||||
|
result.append(escape(word))
|
||||||
|
offset += len(word)
|
||||||
|
continue
|
||||||
|
letters = []
|
||||||
|
for character in word:
|
||||||
|
fraction = offset / max(len(text) - 1, 1)
|
||||||
|
color = "#" + "".join(f"{round(a + (b - a) * fraction):02x}" for a, b in zip(start, end))
|
||||||
|
letters.append(f'<span style="color:{color}">{escape(character)}</span>')
|
||||||
|
offset += 1
|
||||||
|
result.append('<span class="gradient-word">' + "".join(letters) + '</span>')
|
||||||
|
return "".join(result)
|
||||||
|
|
||||||
|
|
||||||
|
def build_html(source: str) -> str:
|
||||||
|
"""Keep Markdown order and inline formatting in the reference's two columns."""
|
||||||
|
import markdown
|
||||||
|
|
||||||
|
try:
|
||||||
|
document = ET.fromstring(
|
||||||
|
"<div>" + markdown.markdown(source, extensions=["extra"], output_format="xhtml") + "</div>"
|
||||||
|
)
|
||||||
|
except ET.ParseError as exc:
|
||||||
|
raise ValueError("Markdown contains malformed raw HTML; use Markdown or valid XHTML.") from exc
|
||||||
|
# Content edits belong in Markdown, never silently in a generated version.
|
||||||
|
for node in document.iter():
|
||||||
|
for attribute in ("text", "tail"):
|
||||||
|
value = getattr(node, attribute)
|
||||||
|
if value and ("\u2014" in value or "\u2013" in value):
|
||||||
|
raise ValueError("Replace long dashes in the source Markdown before generating the resume.")
|
||||||
|
nodes = list(document)
|
||||||
|
if not nodes or nodes[0].tag != "h1":
|
||||||
|
raise ValueError("Start the Markdown with a single # heading containing the name.")
|
||||||
|
name_node = nodes.pop(0)
|
||||||
|
name = "".join(name_node.itertext()).strip()
|
||||||
|
if not name or any(node.tag == "h1" for node in nodes):
|
||||||
|
raise ValueError("The resume must have exactly one nonempty # name heading.")
|
||||||
|
intro = []
|
||||||
|
while nodes and nodes[0].tag != "h2":
|
||||||
|
intro.append(nodes.pop(0))
|
||||||
|
if not nodes:
|
||||||
|
raise ValueError("Add resume sections using ## headings.")
|
||||||
|
|
||||||
|
subtitle = ""
|
||||||
|
if intro and intro[0].tag == "p" and intro[0].find("strong") is not None:
|
||||||
|
title = "".join(intro.pop(0).itertext())
|
||||||
|
primary, separator, secondary = title.partition("·")
|
||||||
|
subtitle = '<p class="subtitle"><span>' + gradient_text(primary.strip()) + '</span>'
|
||||||
|
if separator:
|
||||||
|
subtitle += '<span>' + gradient_text(secondary.strip()) + "</span>"
|
||||||
|
subtitle += "</p>"
|
||||||
|
contact_links = []
|
||||||
|
for node in intro:
|
||||||
|
for parent in node.iter():
|
||||||
|
for child in list(parent):
|
||||||
|
if child.tag != "a":
|
||||||
|
continue
|
||||||
|
href = child.get("href", "")
|
||||||
|
label = ("Phone" if href.startswith("tel:") else
|
||||||
|
"Email" if href.startswith("mailto:") else
|
||||||
|
"Profile" if "linkedin.com/" in href else
|
||||||
|
"Code" if "github.com/" in href else "Website")
|
||||||
|
direct = ' class="direct"' if label in ("Phone", "Email") else ""
|
||||||
|
contact_links.append(
|
||||||
|
f'<a href="{escape(href, quote=True)}"{direct}>'
|
||||||
|
f'<span class="contact-label">{label}</span>'
|
||||||
|
'<span class="contact-value">'
|
||||||
|
+ gradient_text("".join(child.itertext())) + '</span></a>'
|
||||||
|
)
|
||||||
|
tail = (child.tail or "").strip(" ·|\n\t")
|
||||||
|
if tail:
|
||||||
|
position = list(parent).index(child)
|
||||||
|
if position:
|
||||||
|
previous = parent[position - 1]
|
||||||
|
previous.tail = (previous.tail or "") + tail
|
||||||
|
else:
|
||||||
|
parent.text = (parent.text or "") + tail
|
||||||
|
parent.remove(child)
|
||||||
|
for br in list(node):
|
||||||
|
if br.tag == "br" and not (br.tail or "").strip():
|
||||||
|
node.remove(br)
|
||||||
|
contact_details = "".join(serialize(node) for node in intro if "".join(node.itertext()).strip())
|
||||||
|
contact_grid = '<nav class="contact-grid" aria-label="Contact and social links">' + "".join(contact_links) + '</nav>' if contact_links else ""
|
||||||
|
header = (
|
||||||
|
"<header><div>" + serialize(name_node) + subtitle + '</div><div class="contact">'
|
||||||
|
+ '<p class="contact-name">' + escape(name) + "</p>"
|
||||||
|
+ contact_details + contact_grid + "</div></header>"
|
||||||
|
)
|
||||||
|
|
||||||
|
sections = []
|
||||||
|
for node in nodes:
|
||||||
|
if node.tag == "h2":
|
||||||
|
sections.append((node, []))
|
||||||
|
else:
|
||||||
|
sections[-1][1].append(node)
|
||||||
|
rendered = []
|
||||||
|
for heading, content in sections:
|
||||||
|
if not content:
|
||||||
|
raise ValueError(f"Section {''.join(heading.itertext())!r} has no content.")
|
||||||
|
for node in content:
|
||||||
|
# Dates follow role/project headings in the source Markdown.
|
||||||
|
if node.tag == "p" and len(node) == 1 and node[0].tag == "em" and not (node.text or "").strip() and not (node[0].tail or "").strip():
|
||||||
|
node.set("class", "dates")
|
||||||
|
# The reference lists each contact on its own line, rather than a grid.
|
||||||
|
if "".join(heading.itertext()).strip().lower() == "references":
|
||||||
|
for index, node in enumerate(content):
|
||||||
|
if node.tag != "table":
|
||||||
|
continue
|
||||||
|
rows = node.findall("./tbody/tr")
|
||||||
|
if not rows or any(len(row) != 4 for row in rows):
|
||||||
|
continue
|
||||||
|
listing = ET.Element("ul", {"class": "references"})
|
||||||
|
for row in rows:
|
||||||
|
item = ET.SubElement(listing, "li")
|
||||||
|
for column, cell in enumerate(row):
|
||||||
|
span = ET.SubElement(item, "strong" if column == 0 else "span")
|
||||||
|
span.text = cell.text
|
||||||
|
span.extend(deepcopy(list(cell)))
|
||||||
|
span.tail = " · " if column < 2 else (": " if column == 2 else "")
|
||||||
|
content[index] = listing
|
||||||
|
# Keep the label with the first content block when a section crosses pages.
|
||||||
|
start = '<div class="section-start">' + serialize(heading) + serialize(content[0]) + "</div>"
|
||||||
|
rendered.append("<section>" + start + "".join(serialize(node) for node in content[1:]) + "</section>")
|
||||||
|
return (
|
||||||
|
'<!doctype html>\n<html lang="en"><head><meta charset="utf-8">'
|
||||||
|
'<meta name="viewport" content="width=device-width, initial-scale=1">'
|
||||||
|
f'<meta name="source-sha256" content="{hashlib.sha256(source.encode("utf-8")).hexdigest()}">'
|
||||||
|
f"<title>{escape(name)} | Resume</title><style>{CSS}</style></head>"
|
||||||
|
+ "<body>" + header + "<main>" + "".join(rendered) + "</main></body></html>\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def generate(source: Path, output: Path, version: str | None, browser: str):
|
||||||
|
from playwright.sync_api import sync_playwright
|
||||||
|
|
||||||
|
html = build_html(source.read_text(encoding="utf-8-sig"))
|
||||||
|
output.mkdir(parents=True, exist_ok=True)
|
||||||
|
if version is None:
|
||||||
|
number = 1
|
||||||
|
while any((output / f"resume-v{number}.{ext}").exists() for ext in ("html", "pdf")):
|
||||||
|
number += 1
|
||||||
|
version = f"v{number}"
|
||||||
|
if not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._-]{0,79}", version):
|
||||||
|
raise ValueError("Version must be 1–80 letters, digits, dots, underscores or hyphens, starting with a letter or digit.")
|
||||||
|
targets = [output / f"resume-{version}.{ext}" for ext in ("html", "pdf")]
|
||||||
|
if any(path.exists() for path in targets):
|
||||||
|
raise ValueError(f"Version {version!r} already exists. Choose a new version.")
|
||||||
|
|
||||||
|
with tempfile.TemporaryDirectory(prefix="resume-") as temporary:
|
||||||
|
html_path = Path(temporary) / targets[0].name
|
||||||
|
pdf_path = Path(temporary) / targets[1].name
|
||||||
|
html_path.write_text(html, encoding="utf-8")
|
||||||
|
with sync_playwright() as playwright:
|
||||||
|
options = {} if browser == "chromium" else {"channel": browser}
|
||||||
|
chromium = playwright.chromium.launch(headless=True, **options)
|
||||||
|
try:
|
||||||
|
page = chromium.new_page(java_script_enabled=False)
|
||||||
|
page.goto(html_path.as_uri(), wait_until="load")
|
||||||
|
page.pdf(path=str(pdf_path), print_background=True, prefer_css_page_size=True,
|
||||||
|
display_header_footer=False, tagged=True, outline=True)
|
||||||
|
finally:
|
||||||
|
chromium.close()
|
||||||
|
# Publish only a complete pair, and never overwrite an earlier version.
|
||||||
|
created = []
|
||||||
|
try:
|
||||||
|
for target, staged in zip(targets, (html_path, pdf_path)):
|
||||||
|
with target.open("xb") as handle:
|
||||||
|
created.append(target)
|
||||||
|
handle.write(staged.read_bytes())
|
||||||
|
except Exception:
|
||||||
|
for target in created:
|
||||||
|
target.unlink(missing_ok=True)
|
||||||
|
raise
|
||||||
|
return targets
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
|
||||||
|
parser.add_argument("source", nargs="?", type=Path, default=DEFAULT_SOURCE, help="UTF-8 Markdown input")
|
||||||
|
parser.add_argument("--output-dir", type=Path, default=ROOT / "resumes")
|
||||||
|
parser.add_argument("--version", help="Version label; defaults to the next available v1, v2, ...")
|
||||||
|
parser.add_argument("--browser", choices=["chromium", "msedge", "chrome"], default="chromium")
|
||||||
|
args = parser.parse_args()
|
||||||
|
try:
|
||||||
|
paths = generate(args.source.resolve(), args.output_dir.resolve(), args.version, args.browser)
|
||||||
|
except ImportError as exc:
|
||||||
|
parser.exit(1, f"Missing dependency: {exc}. Install Markdown==3.10.3 and playwright==1.62.0.\n")
|
||||||
|
except (ValueError, OSError) as exc:
|
||||||
|
parser.exit(1, f"Resume generation failed: {exc}\n")
|
||||||
|
except Exception as exc:
|
||||||
|
parser.exit(1, f"PDF rendering failed: {exc}\nInstall Chromium with: {sys.executable} -m playwright install chromium\nOr select an installed browser with --browser msedge or --browser chrome.\n")
|
||||||
|
for path in paths:
|
||||||
|
print(path)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user