DEV Community

Cover image for How I Built an ATS-Optimized AI Portfolio with Antigravity: From Nginx Hell to Cloud Run
Veríssimo Cassange
Veríssimo Cassange

Posted on

How I Built an ATS-Optimized AI Portfolio with Antigravity: From Nginx Hell to Cloud Run

New Year, New You Portfolio Challenge Submission

This is a submission for the New Year, New You Portfolio Challenge Presented by Google AI

About Me

I’m Veríssimo Cassange, an AI Software Engineer based in Luanda, Angola 🇦🇴. I’ve always been obsessed with how technical architecture can drive social impact. My day-to-day usually involves Python, Machine Learning, and trying to explain to my family why "Infrastructure as Code" is actually exciting.

For this challenge, I didn't just want a "pretty" site. I wanted a portfolio that acts like a Trojan Horse—looking premium to human recruiters while being perfectly tuned for the ATS (Applicant Tracking Systems) that often filter out talented engineers before they even get a chance.

Portfolio

I deployed the app to Google Cloud Run. You can check the live version here:

🔗 Live Portfolio: vec21-portfolio.europe-west1.run.app

How I Built It

The "ATS Algorithm" Strategy

I decided to treat the portfolio as a data-rich document. Instead of just listing projects, I integrated specific keywords—Generative AI, RAG, Docker, CI/CD—directly into the metadata and descriptions.

But I hit a wall early on: the GitHub API doesn't give you the "why" behind a project. I realized that if I wanted to impress both the algorithm and the human recruiter, I had to manually augment my repository data with custom objectives and technology tags. So, I built a local manifest system to enrich the data fetched from GitHub.

The Tech Stack

  • Frontend: React 19 + Vite (Fast is an understatement).
  • Styling: Tailwind CSS 4. I wanted that "glassmorphism" look that feels premium but isn't a nightmare for accessibility.
  • Animations: Framer Motion for those subtle micro-animations (like the smooth scroll progress bar I called BPROGRESS).
  • Deployment: Docker + Google Cloud Run.

The Google AI Copilot

I used Antigravity (Google’s AI-first dev environment) as my second brain. It wasn't about "click a button, get a site." It was more like having a senior engineer sitting next to me.

For instance, Antigravity was crucial when I decided to use nanobanana Pro to generate consistent, professional thumbnails for all my projects. I wanted a specific aesthetic, and the AI helped me iterate on those visuals until they felt like part of a unified brand.

What I'm Most Proud Of

1. Breaking (and Fixing) Docker for Cloud Run

To be honest, the deployment was the biggest headache. I wanted to follow security best practices by running Nginx as a non-root user.

If you've ever tried this on Cloud Run, you know the pain: permission errors everywhere once you touch /var/cache/nginx. I spent hours debugging why my container would crash on startup. I eventually had to rewrite the nginx.conf to use /tmp for PIDs and temp files.

# The human struggle: fixing permissions for a non-root user
RUN mkdir -p /var/cache/nginx /tmp/nginx && \
    chown -R nginx:nginx /var/cache/nginx /tmp/nginx && \
    chmod -R 755 /var/cache/nginx /tmp/nginx
Enter fullscreen mode Exit fullscreen mode

It was frustrating, but seeing that "Service is Healthy" checkmark in the Google Cloud Console was the best feeling of the entire week.

2. The Project Modal System

Instead of redirecting people away from my site to GitHub immediately, I built a modal system. It gives a quick technical deep-dive (Technologies, Objectives, Challenges) before the user decides to jump into the code. It keeps the engagement high.

3. Localization and Impact

As someone from Luanda, I made sure to highlight my work with Frontier Tech Leaders - Angola. It’s important to me that my portfolio reflects my local context while showcasing global technical standards.

Key Learnings

  • IA as a Copilot: Using Antigravity changed how I debug. Instead of just searching StackOverflow, I had a context-aware assistant helping me optimize my Docker multi-stage builds.
  • Structure Matters: ATS optimization isn't just "keyword stuffing"—it's about semantic HTML. Using <h1> to <h6> correctly and keeping the DOM lean matters more than I thought.
  • Trade-offs: I chose Nginx over a simple Node server because I wanted better control over headers and compression, even if it meant fighting with Cloud Run's filesystem restrictions.

Top comments (1)

Collapse
 
pravesh_sudha_3c2b0c2b5e0 profile image
Pravesh Sudha

Looks Great!!