![]()
An extension that generates custom cover letters for UBC Co-op jobs in a single click, including SCOPE, PD Portal, and more!
| Layer | Technology |
|---|---|
| Extension platform | Chrome Extensions Manifest V3 |
| Language | Vanilla JavaScript (ES Modules) |
| AI backend | Google Gemini API |
SCOPEOut/
βββ src/
β βββ manifest.json # Extension manifest (MV3)
β βββ assets/
β β βββ scope_out_icon_128.png # 128x128 Extension icon
β β βββ scope_out_icon_2048.png # Full resolution extension icon
β β βββ science_coop_footer.png # Footer image used in the cover letter preview
β βββ api/
β β βββ gemini.js # Gemini API client: builds prompt & calls generateContent
β β βββ default-prompt.js # Default cover letter prompt template with placeholders
β βββ background/
β β βββ service-worker.js # MV3 service worker: orchestrates scraping, generation & preview
β βββ content/
β β βββ scraper.js # Content script injected into job posting pages to extract job data
β βββ popup/
β β βββ popup.html # Extension popup UI
β β βββ popup.css
β β βββ popup.js # Popup controller: settings, model picker, generation trigger
β βββ preview/
β β βββ preview.html # Cover letter preview page
β β βββ preview.css
β β βββ preview.js # Renders paginated, editable letter; handles PDF download
β βββ prompt-editor/
β βββ prompt-editor.html # Full-page prompt editor
β βββ prompt-editor.css
β βββ prompt-editor.js # Prompt editor controller: load, save, restore default
βββ README.md
git clone https://github.com/ExxML/SCOPEOut.git
Open Chrome and navigate to chrome://extensions/.
Enable Developer mode (toggle in the top-right corner).
src/ folder inside the cloned repository.Use the Model dropdown under Settings in the popup to choose a Gemini model. Each option shows the rate limits for the free tier:
| Model | Requests / min | Requests / day |
|---|---|---|
| Gemini 2.5 Flash Lite | 10 | 20 |
| Gemini 2.5 Flash (default) | 5 | 20 |
| Gemini 3 Flash Preview | 5 | 20 |
Based on personal experimentation, these three models work well enough for generating cover letters, but you can clone this project and experiment with different models yourself (edit only model-select in popup.html).
{companyName} : the organisation name scraped from the posting{jobTitle} : the cleaned job title scraped from the posting{jobDescription} : the full job description scraped from the posting(*) while there are unsaved changes.[!NOTE] This prompt is saved in your browserβs local storage. However, clearing your browser data or uninstalling SCOPEOut will delete your prompt, so we recommend keeping a backup in a separate document.
User clicks "Generate cover letter"
β
βΌ
popup.js validates active tab URL
β
βΌ
Sends "startGeneration" message β service-worker.js
β
βΌ
chrome.scripting.executeScript injects content/scraper.js
β Extracts: companyName, jobTitle, jobDescription
βΌ
gemini.js builds prompt (replaces placeholders in stored/default template)
β
βΌ
POST to Gemini API (generateContent endpoint)
β
βΌ
Cover letter body returned β stored in chrome.storage.session
β
βΌ
preview/preview.html opened in new tab
β Renders paginated, editable letter
βΌ
User edits in-browser β clicks "Download PDF" β window.print()
Generation progress is written to chrome.storage.session at each stage (generating β complete / error), so the popup displays live status updates even if it is closed and reopened during generation.
This project is licensed under the GNU General Public License v3.0.