diff --git a/.vercelignore b/.vercelignore index 7109bab..94a0916 100644 --- a/.vercelignore +++ b/.vercelignore @@ -15,6 +15,6 @@ backend/seed_*.py backend/connect_dropbox.py backend/migrate_media_dropbox.py resumes/* -!resumes/resume-v5.pdf +!resumes/resume-v11.pdf Alexander Herlan Resume 2024.md Alexander Herlan Resume 2024.pdf diff --git a/Alexander Herlan Resume 2024.md b/Alexander Herlan Resume 2024.md index 72dac49..0bfbddc 100644 --- a/Alexander Herlan Resume 2024.md +++ b/Alexander Herlan Resume 2024.md @@ -3,7 +3,7 @@ **Senior Software Engineer · DevOps & IT Manager** 1207 El Portal NW, Albuquerque, NM 87107 -[813-402-8692](tel:+18134028692) · [alexwherlan@gmail.com](mailto:alexwherlan@gmail.com) · [alex.herlan.dev](https://alex.herlan.dev) · [LinkedIn](https://linkedin.com/in/alexander-herlan) · [GitHub](https://github.com/AlexanderHerlan) +[813-402-8692](tel:+18134028692) · [alex@herlan.dev](mailto:alex@herlan.dev) · [alex.herlan.dev](https://alex.herlan.dev) · [LinkedIn](https://linkedin.com/in/alexander-herlan) · [GitHub](https://github.com/AlexanderHerlan) ## Overview diff --git a/README.md b/README.md index f03d2c7..4661be5 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ resumes/ Matching HTML/PDF files for each generated version 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`. The default `--layout original` retains the sidebar design with left-column section labels, right-column content, Letter pages, and green header accents. Section starts use normal-flow grid layout to preserve the PDF text reading order. Use `--layout ats` for the optional single-column layout. Both layouts use the same Markdown and local Raleway/Lato fonts when available, with Arial as a fallback. The original PDF is only a design reference, and is not needed to run the generator. -**Selected website resume: version 5.** `/api/resume` serves the exact `resumes/resume-v5.pdf` file as `Alexander-Herlan-Resume-v5.pdf`. The root Markdown has been restored to the source revision recorded in `resumes/resume-v5.html`. New generated versions remain drafts until the selected path in `backend/main.py` is deliberately changed; include the selected PDF when deploying the backend. The experience content in both local JSON and Supabase has been aligned with version 5. +**Selected website resume: version 11.** `/api/resume` serves the exact `resumes/resume-v11.pdf` file as `Alexander-Herlan-Resume-v11.pdf`. Version 11 preserves version 5's content and layout, changing only the email to `alex@herlan.dev`. The root Markdown matches the source hash recorded in `resumes/resume-v11.html`. New generated versions remain drafts until the selected path in `backend/main.py` is deliberately changed; include the selected PDF when deploying the backend. The experience content in both local JSON and Supabase has been aligned with version 5. Install the generator dependencies separately from the web backend: @@ -250,7 +250,7 @@ npx.cmd vercel --prod After deployment, check `/`, a direct link such as `/experience`, `/api/health`, `/api/posts`, and `/api/resume`. Check admin sign-in and upload a small file before publishing new content. The project retains the selected -`resumes/resume-v5.pdf`; local secrets, upload backups, and draft resumes are +`resumes/resume-v11.pdf`; local secrets, upload backups, and draft resumes are excluded from deployment by `.vercelignore`. Vercel uploads are limited to **4 MB per file** in both the UI and API, below diff --git a/backend/data/profile.json b/backend/data/profile.json index f082b25..0259119 100644 --- a/backend/data/profile.json +++ b/backend/data/profile.json @@ -11,8 +11,8 @@ "socials": [ { "label": "Email", - "value": "alexwherlan@gmail.com", - "href": "mailto:alexwherlan@gmail.com", + "value": "alex@herlan.dev", + "href": "mailto:alex@herlan.dev", "kind": "email" }, { diff --git a/backend/main.py b/backend/main.py index 33d6233..d02113e 100644 --- a/backend/main.py +++ b/backend/main.py @@ -35,7 +35,7 @@ PROJECT_DIR = BASE_DIR.parent DATA_DIR = BASE_DIR / "data" FRONTEND_DIST = PROJECT_DIR / "frontend" / "dist" # Pin the website to the selected resume; generating a draft must not publish it. -RESUME_PATH = PROJECT_DIR / "resumes" / "resume-v5.pdf" +RESUME_PATH = PROJECT_DIR / "resumes" / "resume-v11.pdf" POSTS_PATH = DATA_DIR / "posts.json" POSTS_LOCK = threading.Lock() ADMIN_TOKEN_TTL = 60 * 60 * 4 @@ -620,7 +620,7 @@ def resume() -> FileResponse: return FileResponse( RESUME_PATH, media_type="application/pdf", - filename="Alexander-Herlan-Resume-v5.pdf", + filename="Alexander-Herlan-Resume-v11.pdf", content_disposition_type="inline", ) @@ -631,7 +631,7 @@ def deliver_contact_email(payload: ContactPayload) -> None: smtp_username = os.getenv("SMTP_USERNAME") smtp_password = os.getenv("SMTP_PASSWORD") from_email = os.getenv("SMTP_FROM_EMAIL") or smtp_username - to_email = os.getenv("CONTACT_TO_EMAIL", "alexwherlan@gmail.com") + to_email = os.getenv("CONTACT_TO_EMAIL", "alex@herlan.dev") use_tls = os.getenv("SMTP_USE_TLS", "true").casefold() == "true" use_ssl = os.getenv("SMTP_USE_SSL", "false").casefold() == "true" diff --git a/resumes/resume-v11.html b/resumes/resume-v11.html new file mode 100644 index 0000000..014a585 --- /dev/null +++ b/resumes/resume-v11.html @@ -0,0 +1,202 @@ + +Alexander Herlan | Resume

Alexander Herlan

+

Senior Software EngineerDevOps & IT Manager

Alexander Herlan

1207 El Portal NW, Albuquerque, NM 87107

+

Overview

+

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.

+

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

+

Independent Software Developer / Freelancer

+

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.

+

Selected Projects

+
IIPM.ie
+

April 2025 - March 2026

+ +

Technologies: WordPress, PHP, PostgreSQL

+
SafeSchoolz
+

June 2024 - June 2025

+ +

Technologies: Android, Java, Kotlin, object detection, TensorFlow Lite

+
Equity Funding Source
+

April 2026 - July 2026

+ +

Technologies: Preact, Bun, Cloudflare Workers, Cloudflare D1, Durable Objects, Cloudflare R2

+

Covius, LLC / Senior Software Engineer

+

January 2022 - April 2024 · Pompano Beach, FL

+

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

+ +

SEAD Software / Software Engineer

+

April 2021 - July 2022 · Delray Beach, FL

+

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

+ +

Clarity Diagnostics & Lab Solutions / Director of IT

+

September 2020 - January 2022 · Boca Raton, FL

+

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

+ +

MyTap, aka Which Craft / Lead Developer

+

January 2016 - April 2020 · Albuquerque, NM

+

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

+ +

TriCore Reference Laboratories / Production Support Specialist

+

April 2013 - January 2017 · Albuquerque, NM

+

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

+ +

Skills

+

Programming Languages

+

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

+ +

Applications

+ +

Cloud Technologies

+ +

Other

+ +

Education

+

University of New Mexico

+

Certifications

+ +

Central New Mexico Community College (aka TVI)

+ +

References

+
diff --git a/resumes/resume-v11.pdf b/resumes/resume-v11.pdf new file mode 100644 index 0000000..46a80d0 Binary files /dev/null and b/resumes/resume-v11.pdf differ diff --git a/vercel.json b/vercel.json index a5b5332..7bb0730 100644 --- a/vercel.json +++ b/vercel.json @@ -7,7 +7,7 @@ "functions": { "api/index.py": { "maxDuration": 60, - "includeFiles": "{backend/**,resumes/resume-v5.pdf}", + "includeFiles": "{backend/**,resumes/resume-v11.pdf}", "excludeFiles": "{frontend/**,node_modules/**,.venv/**,scripts/**,backend/test_*.py,backend/.env*,backend/data/uploads/**}" } },