Tomàs Puig i Font
Back to projects

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.

ApplyCraft profile dialog with an English-language example showing summary, experience, education, and contact details.ApplyCraft profile dialog with an English-language example showing summary, experience, education, and contact details.
Reusable profile: screenshots show the English interface in light and dark modes.

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.

English ApplyCraft application form with company, role, language, tone, model, job posting, and extra instructions.English ApplyCraft application form with company, role, language, tone, model, job posting, and extra instructions.
Setting up a specific application in the English-language interface.

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.

Three sample English ApplyCraft results: cover letter, LinkedIn message, and cold email, with copy and regenerate controls.Three sample English ApplyCraft results: cover letter, LinkedIn message, and cold email, with copy and regenerate controls.
Three independent texts for the same application, shown in English.
  • 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.