A modern, desktop-based GUI application built in PySide6 (Qt) designed to streamline the creation of highly tailored job applications (motivation letters and resumes). It wraps your existing modular LaTeX + Python compiling pipeline and harnesses the Google Gemini API (supporting fast, high-quality models) to write compelling content that matches your own writing voice.
- AI Generation with Google Gemini: Utilizes the official
google-generativeaiSDK to connect to Google's advanced model suites (e.g.gemini-2.5-flash,gemini-2.5-pro). - Deep Voice Profiling ("Re-learn"): Automatically reads cover letters and resume bullets from your previously generated applications (
generated/Application_*.pdf) using PyMuPDF to extract text. It feeds these examples to Gemini to build a personalized style profile stored indata/style_profile.txtso new content matches your phrasing, rhythm, and DACH register perfectly. - Responsive Async Workers: Generation and document compilation are executed in background
QThreadprocesses, keeping the UI silky-smooth and fully responsive. - Rich Multi-Tab LaTeX Editors: Allows full manual tweaks for each section (
ML Subject,ML Recipient,ML Body,Resume Experience,Resume Competencies) with built-in Undo/Redo and a "Reset to Generated" capability. - Integrated PDF Preview: Displays your compiled output instantly side-by-side using high-fidelity rendering from
PyMuPDF. Supports multi-document switching (Letter, Resume, Full Bundle), interactive zooming, page navigation, and enforces target page limits with clear warnings. - Flexible Settings Panel: Exposes adjustable sliders for generation temperature, spinboxes for token limits, editable dropdowns for Gemini model selection, and secure API credential storage to a local
.envfile. - Preset Manager: Stores form parameters under custom names to let you instantly apply similar profiles for Metrology, Semiconductor, R&D, or Machine Vision roles.
- Asynchronous Recipient Extractor: Input a job URL or description, click "Fetch & Parse Info", and watch the company, hiring manager, address, and target title get instantly filled in!
To bypass macOS Homebrew python restrictions and ensure system stability, follow these steps to run the application in a local virtual environment:
Run the following commands in the repository root directory:
# Create the virtual environment
python3 -m venv .venv
# Activate the virtual environment
source .venv/bin/activateInstall all package requirements directly inside the active virtual environment:
pip install -r requirements.txtCreate a .env file in the root directory (or let the app read your existing one) and add your key:
GEMINI_API_KEY=your_actual_gemini_api_key_hereThe application will read this on startup. It never hardcodes your credentials.
Ensure the virtual environment is active (or call its python binary directly) and execute:
# Run with active venv
python app.py
# Or run directly via path
.venv/bin/python app.pyThe "Learn from my past applications" engine establishes a powerful feedback loop to automate a personalized writing style:
- Startup Scan: On launch, the app scans your
generated/directory for any completed application bundles matchingApplication_*.pdf. - Text Extraction: Using
pypdf, it isolates the Cover Letter (Page 1) and Resume (Pages 2-3) texts from each PDF and caches them insidedata/style_cache.jsonwith timestamp tracking. - Style Profile Generation ("Re-learn"): When you click the "Re-learn Voice Profile" button in the Tools menu, the app selects the Cover Letter texts and asks Gemini to conduct a professional analysis of your phrasing rhythm, DACH-region register, greeting hooks, closing structures, and technical framings.
- Integration: The result is saved as a persistent style document at
data/style_profile.txt. When creating new letters, this profile is fed into the Gemini generation system prompt to force it to replicate your exact tone. - Feedback Loop (Manual Corrections):
If you manually edit the generated LaTeX text in the revision pane and click "Recompile",
src/main.pybuilds the new PDF directly into yourgenerated/folder. The next time you click "Re-learn", this updated PDF is automatically ingested, folding your manual corrections back into your persistent style profile!
app.py: Application loader and UI QSS stylesheet.requirements.txt: Project dependency listing.src/gui/: Core GUI implementation package:main_window.py: Window controller, menus, status indicators, and threads.form_tab.py: Dynamic parameter form, asset lists, custom skills, and async URL fetcher.editor_tab.py: Split screen LaTeX editors and high-fidelity fitz-based PDF viewer.settings_dialog.py: Model tuner, token limits, and secure API key writer.generator.py: System prompts, XML response parser, and Gemini caller.preset_manager.py: JSON loader/saver for saved forms.style_learner.py: PDF text extractor and voice analysis engine.