惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
I
InfoQ
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
IT之家
IT之家
云风的 BLOG
云风的 BLOG
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
The GitHub Blog
The GitHub Blog
博客园_首页
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
G
Google Developers Blog
WordPress大学
WordPress大学
B
Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
Apple Machine Learning Research
Apple Machine Learning Research
N
Netflix TechBlog - Medium
Last Week in AI
Last Week in AI
博客园 - 聂微东
Jina AI
Jina AI

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Building a Zero-Touch Resume Pipeline: Overleaf + GitHub ...
Md Shaifur Rahman · 2026-06-25 · via DEV Community

Md Shaifur Rahman

As a developer, keeping your resume updated across multiple platforms is a classic friction point. You tweak a bullet point or add a new project in your LaTeX source file, and suddenly you have to recompile, download the PDF, log into your portfolio site, delete the old file, and upload the new one.

I wanted a single source of truth: Edit in Overleaf, click push, and have my personal Google Site portfolio instantly update with the newly compiled PDF in under 60 seconds.

Here is how I chained Overleaf, GitHub Actions, and a clever proxy trick to build a zero-maintenance, automated CV deployment pipeline.


The Architecture

The data flow is entirely hands-off once configured:
Overleaf (Editor) ➔ GitHub Repo (Trigger) ➔ GitHub Actions (Compile) ➔ Live Google Site (Embed)


Step 1: Syncing Overleaf with GitHub

Overleaf allows you to link a project directly to a GitHub repository.

  1. I created a blank resume repository on GitHub.
  2. Inside Overleaf, I selected Import from GitHub to link the two.

Now, whenever I make edits to my .tex files inside Overleaf, I can use the Overleaf Git menu to cleanly push those commits straight back to my GitHub main branch.


Step 2: Automating the LaTeX Compilation via GitHub Actions

Instead of manually compiling the PDF and tracking binary files in source control, I offloaded the compilation to a CI/CD runner.

I created a workflow file at .github/workflows/compile.yml that triggers on every push. It compiles the LaTeX files cleanly and pushes the fresh PDF right back into the repo directory.

name: Build and Deploy LaTeX Resume

on:
push:
branches: [ main ]

jobs:
build_latex:
runs-on: ubuntu-latest
steps:
- name: Set up Git Repository
uses: actions/checkout@v4

  - name: Compile LaTeX Document
    uses: xu-cheng/latex-action@v3
    with:
      root_file: generic/main.pdf

  - name: Commit and Push Compiled PDF
    run: |
      git config --global user.name "github-actions[bot]"
      git config --global user.email "github-actions[bot]@users.noreply.github.com"
      git add generic/main.pdf
      git commit -m "Automated CI/CD PDF Compilation [skip ci]" || echo "No changes"
      git push

Note on Edge Cases: Notice the [skip ci] tag in the commit message? This is critical. It ensures that when GitHub Actions pushes the compiled PDF back to the repo, it doesn't trigger an infinite workflow loop.


Step 3: Bypassing the Google Sites CORS Block

This is where things got interesting. Google Sites allows you to embed assets via URLs, but if you attempt to paste a raw GitHub URL (raw.githubusercontent.com), Google Sites strips the PDF rendering and displays a grumpy page preview or a broken GitHub header wrapper. This happens due to strict cross-origin security headers (CORS).

To solve this, I leveraged raw.githack.com—a proxy service that streams raw files directly from GitHub repos with the correct Content-Type: application/pdf parameters.

I took my raw asset path and mapped it like this:
https://raw.githack.com/shaifurcodes/resume/main/generic/main.pdf

The Ultimate Fix for Mobile/Desktop Rendering

To guarantee that the document acts exactly like a native Google Doc PDF viewer across both desktop and mobile browsers, I wrapped the raw Git proxy link inside the official Google Docs viewer parameters:

https://docs.google.com/viewer?url=https://raw.githack.com/shaifurcodes/resume/main/generic/main.pdf&embedded=true


Step 4: The Live Embed

  1. Open the Google Sites editor dashboard.
  2. Select Embed from the right side panel.
  3. Paste the complete Google Docs viewer URL from Step 3 into the By URL input.
  4. Hit Insert and stretch the bounding canvas boxes so the layout flows cleanly down the page.

The Result

Now, my resume maintenance stack is completely decoupled. I can optimize system-level descriptions, change formatting parameters, or update project statuses inside a high-end LaTeX environment on Overleaf. The moment I hit push, the automation takes over, hot-swapping the live PDF asset on my portfolio dynamically.

Have you automated your portfolio or documentation workflows? Let's talk about alternative CI/CD configurations or caching optimizations in the comments!