Selected work
ApplyCraft
A work-in-progress project that generates a cover letter, LinkedIn message, and cold email, with optional company research and streamed output.
Overview
ApplyCraft combines a reusable candidate profile with application-specific inputs to prepare three distinct documents. The browser stores the profile locally, including experience, education, and contact details; each application adds the company, role, language, tone, optional job posting, and extra instructions.
Tailoring an application
Each application specifies the company, target role, output language, tone, and model. You can also name a contact, paste a job posting, and add instructions to emphasize specific experience. Without a posting, the LinkedIn message becomes a spontaneous connection request.
Generation and research
The cover letter, LinkedIn message, and cold email are generated in parallel and streamed independently into the interface. Each result can be regenerated on its own. An optional earlier step uses Gemini with web-search grounding to build a factual company brief; generation continues without that context when research is unavailable or fails.
- Output in Catalan, Spanish, English, or French.
- Different LinkedIn-message behavior depending on whether a job posting is provided.
- Browser-persisted profile with application-specific controls.
Provider abstraction
Gemini, OpenAI, and DeepSeek implement the same streaming text-provider interface. OpenAI and DeepSeek share an OpenAI-compatible chat-completions implementation, while Gemini has its own implementation and grounded-search option. The model list is filtered to providers configured on the server.
Secrets and deployment
Model calls run in Next.js Route Handlers. Keys are read only from server environment variables without a public prefix, and the browser communicates solely with the application's internal endpoints. The repository explicitly presents this as a local work in progress: rate limiting and abuse protection would be required before any public deployment using shared keys.





