Tailor your Google Docs CV to any job using Ollama and Groq
Go to WorkflowDescription
šÆ CV Keyword Optimizer
An AI-powered n8n workflow that automatically tailors your resume to any job description by injecting relevant keywords ā without touching your formatting, layout, or design.
How It Works
Architecture
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā User Input (Form) ā
ā CV Google Docs Link + Job URL or Pasted JD ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā
ā¼
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā 1. Read CV from Google Docs API ā
ā 2. Extract full CV text (handles tables, paragraphs, etc.) ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā
ā¼
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā 3. Get Job Description ā
ā āāā URL provided? ā Scrape job page, strip HTML to text ā
ā ā āāā Scrape failed? ā Fall back to manual JD ā
ā āāā No URL? ā Use manually pasted JD directly ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā
ā¼
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā 4. š Local Ollama (llama3.1:8b) ā
ā Analyzes JD + CV ā Extracts & ranks 10-20 ATS keywords ā
ā Output: keyword, priority, target bullet, reason ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā
ā¼
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā 5. āļø Groq API (Llama 3.3 70B) ā
ā Takes ranked keywords + CV ā Produces find/replace pairs ā
ā Naturally weaves keywords into experience bullet points ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā
ā¼
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā 6. Copy original CV via Google Drive API ā
ā (preserves ALL formatting, tables, styles) ā
ā ā
ā 7. Apply replacements via Google Docs batchUpdate API ā
ā (replaceAllText ā formatting stays intact) ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā
ā¼
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā 8. Output ā
ā ā
New Google Doc link ā
ā š Changelog: original text ā updated text + keywords added ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Why Two AI Models?
| Step | Model | Why |
|------|-------|-----|
| Keyword Extraction | Ollama llama3.1:8b (local) | Free, private, no API costs. Reasoning about which keywords actually matter for ATS |
| Text Rewriting | Groq llama-3.3-70b-versatile (cloud) | Larger model = better at natural language. Produces find/replace pairs that read naturally |
What Gets Modified
ā
Experience/work bullet points
ā
Skills/technical skills lines
ā Name, contact info, education, dates, company names, job titles ā never touched
Formatting Preservation
The workflow copies your original Google Doc (not recreates it), then uses replaceAllText to swap text in-place. This means:
ā
Tables, columns, fonts, colors ā all preserved
ā
Bold, italic, underline ā all preserved
ā
Custom spacing, margins ā all preserved
ā
Original doc is untouched (changes go to the copy)
Setup Steps
Prerequisites
Docker installed
Ollama installed locally
A Groq API key (free tier works)
Google account with Docs & Drive access
1. Install & Start Ollama
macOS
brew install ollama
Start the Ollama server
ollama serve
Pull the model (in another terminal)
ollama pull llama3.1:8b
Verify it's running:
curl http://localhost:11434/api/tags
2. Get a Groq API Key
Go to console.groq.com
Sign up / log in
Navigate to API Keys ā Create a new key
Copy the key (starts with gsk_...)
3. Configure Environment
cd cv-generator
Create .env from template
cp .env.example .env
Edit .env and add your Groq key
GROQ_API_KEY=gsk_your_key_here
4. Start n8n
docker compose up -d
n8n will be available at http://localhost:5678
Default credentials:
Username: admin
Password: changeme
> ā ļø Change these in docker-compose.yml for production use.
5. Import the Workflow
Open n8n at http://localhost:5678
Go to Workflows ā Import from File
Select cv-keyword-optimizer.json
You'll see credential warnings on some nodes ā that's expected
6. Set Up Google Credentials
In n8n, go to Settings ā Credentials
Create a Google Docs OAuth2 credential
Follow n8n's OAuth2 setup guide for Google
Required scopes: https://www.googleapis.com/auth/documents
Create a Google Drive OAuth2 credential
Required scopes: https://www.googleapis.com/auth/drive
Click each node with a ā ļø warning ā select your credential from the dropdown
7. Activate & Use
Toggle the workflow Active
Open the form URL shown in the trigger node (or go to http://localhost:5678/form/cv-keyword-optimizer-form)
Fill in:
Google Docs CV Link (required)
Job Posting URL or Job Description (at least one)
Submit and wait ~30-60 seconds
Get your optimized CV link + detailed changelog
Project Structure
cv-generator/
āāā cv-keyword-optimizer.json # n8n workflow definition
āāā docker-compose.yml # n8n container config
āāā .env # Environment variables (not committed)
āāā .env.example # Template for .env
āāā .gitignore # Ignores .env
āāā README.md # This file
Troubleshooting
| Issue | Solution |
|-------|----------|
| Ollama connection refused | Make sure ollama serve is running. n8n reaches it via host.docker.internal:11434 |
| Groq 429 rate limit | Free tier has limits. Wait a minute and retry |
| Scraping fails on LinkedIn | LinkedIn blocks scrapers. Paste the JD manually instead |
| Google Docs auth error | Re-check OAuth2 credentials in n8n. Ensure correct scopes |
| Replacements don't apply | The AI's "find" text must exactly match the CV. Check the Changes Summary for what was attempted |
| Empty response from Ollama | Model may still be loading. First run takes longer. Timeout is set to 5 min |